Split vk::Sampler state off into a structure
This enables deriving the state structure from Memset<> so we can ensure
it is fully zero-initialized and becomes comparable, while vk::Sampler
holds the identifier for the state.
Bug: b/151235334
Change-Id: I23a09eda9b50409c761bdd6ed10911ec159dc3ba
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/42768
Presubmit-Ready: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Pipeline/SpirvShaderSampling.cpp b/src/Pipeline/SpirvShaderSampling.cpp
index 23acd23..5434645 100644
--- a/src/Pipeline/SpirvShaderSampling.cpp
+++ b/src/Pipeline/SpirvShaderSampling.cpp
@@ -84,12 +84,9 @@
samplerState.compareOp = sampler->compareOp;
samplerState.unnormalizedCoordinates = (sampler->unnormalizedCoordinates != VK_FALSE);
- if(sampler->ycbcrConversion)
- {
- samplerState.ycbcrModel = sampler->ycbcrConversion->ycbcrModel;
- samplerState.studioSwing = (sampler->ycbcrConversion->ycbcrRange == VK_SAMPLER_YCBCR_RANGE_ITU_NARROW);
- samplerState.swappedChroma = (sampler->ycbcrConversion->components.r != VK_COMPONENT_SWIZZLE_R);
- }
+ samplerState.ycbcrModel = sampler->ycbcrModel;
+ samplerState.studioSwing = sampler->studioSwing;
+ samplerState.swappedChroma = sampler->swappedChroma;
samplerState.mipLodBias = sampler->mipLodBias;
samplerState.maxAnisotropy = sampler->maxAnisotropy;
@@ -270,7 +267,7 @@
return MIPMAP_POINT; // Samplerless operations (OpImageFetch) can take an integer Lod operand.
}
- if(sampler->ycbcrConversion)
+ if(sampler->ycbcrModel != VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY)
{
// TODO(b/151263485): Check image view level count instead.
return MIPMAP_NONE;
diff --git a/src/Vulkan/VkSampler.cpp b/src/Vulkan/VkSampler.cpp
index df62cc2..e5adb19 100644
--- a/src/Vulkan/VkSampler.cpp
+++ b/src/Vulkan/VkSampler.cpp
@@ -18,4 +18,35 @@
std::atomic<uint32_t> Sampler::nextID(1);
+SamplerState::SamplerState(const VkSamplerCreateInfo *pCreateInfo, const vk::SamplerYcbcrConversion *ycbcrConversion)
+ : Memset(this, 0)
+ , magFilter(pCreateInfo->magFilter)
+ , minFilter(pCreateInfo->minFilter)
+ , mipmapMode(pCreateInfo->mipmapMode)
+ , addressModeU(pCreateInfo->addressModeU)
+ , addressModeV(pCreateInfo->addressModeV)
+ , addressModeW(pCreateInfo->addressModeW)
+ , mipLodBias(pCreateInfo->mipLodBias)
+ , anisotropyEnable(pCreateInfo->anisotropyEnable)
+ , maxAnisotropy(pCreateInfo->maxAnisotropy)
+ , compareEnable(pCreateInfo->compareEnable)
+ , compareOp(pCreateInfo->compareOp)
+ , minLod(ClampLod(pCreateInfo->minLod))
+ , maxLod(ClampLod(pCreateInfo->maxLod))
+ , borderColor(pCreateInfo->borderColor)
+ , unnormalizedCoordinates(pCreateInfo->unnormalizedCoordinates)
+{
+ if(ycbcrConversion)
+ {
+ ycbcrModel = ycbcrConversion->ycbcrModel;
+ studioSwing = (ycbcrConversion->ycbcrRange == VK_SAMPLER_YCBCR_RANGE_ITU_NARROW);
+ swappedChroma = (ycbcrConversion->components.r != VK_COMPONENT_SWIZZLE_R);
+ }
+}
+
+Sampler::Sampler(const VkSamplerCreateInfo *pCreateInfo, void *mem, const vk::SamplerYcbcrConversion *ycbcrConversion)
+ : SamplerState(pCreateInfo, ycbcrConversion)
+{
+}
+
} // namespace vk
diff --git a/src/Vulkan/VkSampler.hpp b/src/Vulkan/VkSampler.hpp
index 5a6ecf0..84d3373 100644
--- a/src/Vulkan/VkSampler.hpp
+++ b/src/Vulkan/VkSampler.hpp
@@ -15,42 +15,18 @@
#ifndef VK_SAMPLER_HPP_
#define VK_SAMPLER_HPP_
-#include "VkDevice.hpp"
#include "VkImageView.hpp" // For ResolveIdentityMapping()
#include "Device/Config.hpp"
+#include "Device/Memset.hpp"
#include "System/Math.hpp"
#include <atomic>
namespace vk {
-class Sampler : public Object<Sampler, VkSampler>
+struct SamplerState : sw::Memset<SamplerState>
{
-public:
- Sampler(const VkSamplerCreateInfo *pCreateInfo, void *mem, const vk::SamplerYcbcrConversion *ycbcrConversion)
- : magFilter(pCreateInfo->magFilter)
- , minFilter(pCreateInfo->minFilter)
- , mipmapMode(pCreateInfo->mipmapMode)
- , addressModeU(pCreateInfo->addressModeU)
- , addressModeV(pCreateInfo->addressModeV)
- , addressModeW(pCreateInfo->addressModeW)
- , mipLodBias(pCreateInfo->mipLodBias)
- , anisotropyEnable(pCreateInfo->anisotropyEnable)
- , maxAnisotropy(pCreateInfo->maxAnisotropy)
- , compareEnable(pCreateInfo->compareEnable)
- , compareOp(pCreateInfo->compareOp)
- , minLod(ClampLod(pCreateInfo->minLod))
- , maxLod(ClampLod(pCreateInfo->maxLod))
- , borderColor(pCreateInfo->borderColor)
- , unnormalizedCoordinates(pCreateInfo->unnormalizedCoordinates)
- , ycbcrConversion(ycbcrConversion)
- {
- }
-
- static size_t ComputeRequiredAllocationSize(const VkSamplerCreateInfo *pCreateInfo)
- {
- return 0;
- }
+ SamplerState(const VkSamplerCreateInfo *pCreateInfo, const vk::SamplerYcbcrConversion *ycbcrConversion);
// Prevents accessing mipmap levels out of range.
static float ClampLod(float lod)
@@ -58,7 +34,6 @@
return sw::clamp(lod, 0.0f, (float)(sw::MAX_TEXTURE_LOD));
}
- const uint32_t id = nextID++;
const VkFilter magFilter = VK_FILTER_NEAREST;
const VkFilter minFilter = VK_FILTER_NEAREST;
const VkSamplerMipmapMode mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
@@ -75,7 +50,22 @@
const VkBorderColor borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;
const VkBool32 unnormalizedCoordinates = VK_FALSE;
- const vk::SamplerYcbcrConversion *ycbcrConversion = nullptr;
+ VkSamplerYcbcrModelConversion ycbcrModel = VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY;
+ bool studioSwing = false; // Narrow range
+ bool swappedChroma = false; // Cb/Cr components in reverse order
+};
+
+class Sampler : public Object<Sampler, VkSampler>, public SamplerState
+{
+public:
+ Sampler(const VkSamplerCreateInfo *pCreateInfo, void *mem, const vk::SamplerYcbcrConversion *ycbcrConversion);
+
+ static size_t ComputeRequiredAllocationSize(const VkSamplerCreateInfo *pCreateInfo)
+ {
+ return 0;
+ }
+
+ const uint32_t id = nextID++;
private:
static std::atomic<uint32_t> nextID;