Produce correct `one` value for integer textures
Test: dEQP-VK.texture.swizzle.component_mapping.*
Bug: b/129523279
Change-Id: Ib4f7cd6c90fe7bde7d1abd2ecf77e3abbe121438
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/29949
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/SamplerCore.cpp b/src/Pipeline/SamplerCore.cpp
index a6971b9..2d675d6 100644
--- a/src/Pipeline/SamplerCore.cpp
+++ b/src/Pipeline/SamplerCore.cpp
@@ -20,7 +20,7 @@
namespace
{
- void applySwizzle(VkComponentSwizzle swizzle, sw::Float4& f, const sw::Vector4f& c)
+ void applySwizzle(VkComponentSwizzle swizzle, sw::Float4& f, const sw::Vector4f& c, bool integer)
{
switch(swizzle)
{
@@ -29,7 +29,15 @@
case VK_COMPONENT_SWIZZLE_B: f = c.z; break;
case VK_COMPONENT_SWIZZLE_A: f = c.w; break;
case VK_COMPONENT_SWIZZLE_ZERO: f = sw::Float4(0.0f, 0.0f, 0.0f, 0.0f); break;
- case VK_COMPONENT_SWIZZLE_ONE: f = sw::Float4(1.0f, 1.0f, 1.0f, 1.0f); break;
+ case VK_COMPONENT_SWIZZLE_ONE:
+ if (integer)
+ {
+ f = rr::As<sw::Float4>(sw::Int4(1.0f, 1.0f, 1.0f, 1.0f));
+ } else
+ {
+ f = sw::Float4(1.0f, 1.0f, 1.0f, 1.0f);
+ }
+ break;
default: ASSERT(false);
}
}
@@ -202,10 +210,11 @@
(state.swizzle.a != VK_COMPONENT_SWIZZLE_A))
{
const Vector4f col(c);
- applySwizzle(state.swizzle.r, c.x, col);
- applySwizzle(state.swizzle.g, c.y, col);
- applySwizzle(state.swizzle.b, c.z, col);
- applySwizzle(state.swizzle.a, c.w, col);
+ auto integer = hasUnnormalizedIntegerTexture();
+ applySwizzle(state.swizzle.r, c.x, col, integer);
+ applySwizzle(state.swizzle.g, c.y, col, integer);
+ applySwizzle(state.swizzle.b, c.z, col, integer);
+ applySwizzle(state.swizzle.a, c.w, col, integer);
}
return c;