Plumb constants through to the sampler, and make sRGB work
Change-Id: Ib4974a5f0dea325e198905cb94bae138ccac4c6e
Test: dEQP-VK.texture.swizzle.component_mapping.*
Bug: b/129523279
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/29950
Tested-by: Chris Forbes <chrisforbes@google.com>
Presubmit-Ready: Chris Forbes <chrisforbes@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/src/Pipeline/ComputeProgram.cpp b/src/Pipeline/ComputeProgram.cpp
index 50445b7..f0c7d61 100644
--- a/src/Pipeline/ComputeProgram.cpp
+++ b/src/Pipeline/ComputeProgram.cpp
@@ -13,6 +13,7 @@
// limitations under the License.
#include "ComputeProgram.hpp"
+#include "Constants.hpp"
#include "Vulkan/VkDebug.hpp"
#include "Vulkan/VkPipelineLayout.hpp"
@@ -49,6 +50,7 @@
routine.descriptorSets = data + OFFSET(Data, descriptorSets);
routine.descriptorDynamicOffsets = data + OFFSET(Data, descriptorDynamicOffsets);
routine.pushConstants = data + OFFSET(Data, pushConstants);
+ routine.constants = *Pointer<Pointer<Byte>>(data + OFFSET(Data, constants));
auto &modes = shader->getModes();
@@ -189,6 +191,7 @@
data.numWorkgroups[Z] = groupCountZ;
data.numWorkgroups[3] = 0;
data.pushConstants = pushConstants;
+ data.constants = &sw::constants;
// TODO(bclayton): Split work across threads.
for (uint32_t groupZ = 0; groupZ < groupCountZ; groupZ++)
diff --git a/src/Pipeline/ComputeProgram.hpp b/src/Pipeline/ComputeProgram.hpp
index ab50592..61892b4 100644
--- a/src/Pipeline/ComputeProgram.hpp
+++ b/src/Pipeline/ComputeProgram.hpp
@@ -34,6 +34,7 @@
using namespace rr;
class DescriptorSetsLayout;
+ struct Constants;
// ComputeProgram builds a SPIR-V compute shader.
class ComputeProgram : public Function<Void(Pointer<Byte>)>
@@ -69,6 +70,7 @@
uint4 numWorkgroups;
uint4 workgroupID;
PushConstantStorage pushConstants;
+ const Constants *constants;
};
SpirvRoutine routine;
diff --git a/src/Pipeline/PixelProgram.cpp b/src/Pipeline/PixelProgram.cpp
index c7e54fa..dca8704 100644
--- a/src/Pipeline/PixelProgram.cpp
+++ b/src/Pipeline/PixelProgram.cpp
@@ -57,6 +57,7 @@
routine.descriptorSets = data + OFFSET(DrawData, descriptorSets);
routine.descriptorDynamicOffsets = data + OFFSET(DrawData, descriptorDynamicOffsets);
routine.pushConstants = data + OFFSET(DrawData, pushConstants);
+ routine.constants = *Pointer<Pointer<Byte>>(data + OFFSET(DrawData, constants));
auto it = spirvShader->inputBuiltins.find(spv::BuiltInFrontFacing);
if (it != spirvShader->inputBuiltins.end())
diff --git a/src/Pipeline/SpirvShader.cpp b/src/Pipeline/SpirvShader.cpp
index 049d7f9..ff6c164 100644
--- a/src/Pipeline/SpirvShader.cpp
+++ b/src/Pipeline/SpirvShader.cpp
@@ -4517,7 +4517,7 @@
}
Array<SIMD::Float> out(4);
- Call<ImageSampler>(samplerFunc, sampledImage.base, &in[0], &out[0]);
+ Call<ImageSampler>(samplerFunc, sampledImage.base, &in[0], &out[0], state->routine->constants);
for (int i = 0; i < 4; i++) { result.move(i, out[i]); }
diff --git a/src/Pipeline/SpirvShader.hpp b/src/Pipeline/SpirvShader.hpp
index 4910954..73e3e4a 100644
--- a/src/Pipeline/SpirvShader.hpp
+++ b/src/Pipeline/SpirvShader.hpp
@@ -258,7 +258,7 @@
using InsnStore = std::vector<uint32_t>;
InsnStore insns;
- using ImageSampler = void(void* image, void* uvsIn, void* texelOut);
+ using ImageSampler = void(void* image, void* uvsIn, void* texelOut, void* constants);
using GetImageSampler = ImageSampler*(const vk::ImageView *imageView, const vk::Sampler *sampler);
/* Pseudo-iterator over SPIRV instructions, designed to support range-based-for. */
@@ -868,7 +868,7 @@
static void emitSamplerFunction(
SamplerMethod samplerMethod,
const vk::ImageView *imageView, const vk::Sampler *sampler,
- Pointer<Byte> image, Pointer<SIMD::Float> in, Pointer<Byte> out);
+ Pointer<Byte> image, Pointer<SIMD::Float> in, Pointer<Byte> out, Pointer<Byte> constants);
// TODO(b/129523279): Eliminate conversion and use vk::Sampler members directly.
static sw::TextureType convertTextureType(VkImageViewType imageViewType);
@@ -898,6 +898,7 @@
Pointer<Pointer<Byte>> descriptorSets;
Pointer<Int> descriptorDynamicOffsets;
Pointer<Byte> pushConstants;
+ Pointer<Byte> constants;
Int killMask = Int{0};
SIMD::Int windowSpacePosition[2];
diff --git a/src/Pipeline/SpirvShaderSampling.cpp b/src/Pipeline/SpirvShaderSampling.cpp
index 8709464..5d978d2 100644
--- a/src/Pipeline/SpirvShaderSampling.cpp
+++ b/src/Pipeline/SpirvShaderSampling.cpp
@@ -63,11 +63,12 @@
if (it != cache.end()) { return it->second; }
// TODO: Hold a separate mutex lock for the sampler being built.
- auto function = rr::Function<Void(Pointer<Byte> image, Pointer<SIMD::Float>, Pointer<SIMD::Float>)>();
+ auto function = rr::Function<Void(Pointer<Byte> image, Pointer<SIMD::Float>, Pointer<SIMD::Float>, Pointer<Byte>)>();
Pointer<Byte> image = function.Arg<0>();
Pointer<SIMD::Float> in = function.Arg<1>();
Pointer<SIMD::Float> out = function.Arg<2>();
- emitSamplerFunction(samplerMethod, imageView, sampler, image, in, out);
+ Pointer<Byte> constants = function.Arg<3>();
+ emitSamplerFunction(samplerMethod, imageView, sampler, image, in, out, constants);
auto fptr = reinterpret_cast<ImageSampler*>((void *)function("sampler")->getEntry());
cache.emplace(key, fptr);
return fptr;
@@ -76,10 +77,8 @@
void SpirvShader::emitSamplerFunction(
SamplerMethod samplerMethod,
const vk::ImageView *imageView, const vk::Sampler *sampler,
- Pointer<Byte> image, Pointer<SIMD::Float> in, Pointer<Byte> out)
+ Pointer<Byte> image, Pointer<SIMD::Float> in, Pointer<Byte> out, Pointer<Byte> constants)
{
- Pointer<Byte> constants; // FIXME(b/129523279)
-
Sampler::State samplerState;
samplerState.textureType = convertTextureType(imageView->getType());
samplerState.textureFormat = imageView->getFormat();
@@ -89,7 +88,7 @@
samplerState.addressingModeV = convertAddressingMode(sampler->addressModeV);
samplerState.addressingModeW = convertAddressingMode(sampler->addressModeW);
samplerState.mipmapFilter = convertMipmapMode(sampler);
- samplerState.sRGB = false; ASSERT(imageView->getFormat().isSRGBformat() == false); // TODO(b/129523279)
+ samplerState.sRGB = imageView->getFormat().isSRGBformat();
samplerState.swizzle = imageView->getComponentMapping();
samplerState.highPrecisionFiltering = false;
samplerState.compare = COMPARE_BYPASS; ASSERT(sampler->compareEnable == VK_FALSE); // TODO(b/129523279)
diff --git a/src/Pipeline/VertexProgram.cpp b/src/Pipeline/VertexProgram.cpp
index 63c890f..686db48 100644
--- a/src/Pipeline/VertexProgram.cpp
+++ b/src/Pipeline/VertexProgram.cpp
@@ -44,6 +44,7 @@
routine.descriptorSets = data + OFFSET(DrawData, descriptorSets);
routine.descriptorDynamicOffsets = data + OFFSET(DrawData, descriptorDynamicOffsets);
routine.pushConstants = data + OFFSET(DrawData, pushConstants);
+ routine.constants = *Pointer<Pointer<Byte>>(data + OFFSET(DrawData, constants));
it = spirvShader->inputBuiltins.find(spv::BuiltInSubgroupSize);
if (it != spirvShader->inputBuiltins.end())