Use correct values for sampleStandardLocations
Bug: b/141380498
Change-Id: I25c6bf769c558fb4bc3a3a64f66289cf5dbfb879
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/36595
Tested-by: Antonio Maiorano <amaiorano@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Device/Blitter.cpp b/src/Device/Blitter.cpp
index b366b72..629b5be 100644
--- a/src/Device/Blitter.cpp
+++ b/src/Device/Blitter.cpp
@@ -1295,7 +1295,7 @@
void Blitter::ApplyScaleAndClamp(Float4 &value, const State &state, bool preScaled)
{
- float4 scale, unscale;
+ float4 scale{}, unscale{};
if(state.clearOperation &&
state.sourceFormat.isNonNormalizedInteger() &&
diff --git a/src/Pipeline/Constants.cpp b/src/Pipeline/Constants.cpp
index 5902c4b..5095cbe 100644
--- a/src/Pipeline/Constants.cpp
+++ b/src/Pipeline/Constants.cpp
@@ -290,17 +290,43 @@
sRGBtoLinear12_16[i] = (unsigned short)(clamp(sw::sRGBtoLinear((float)i / 0x0FFF) * 0xFFFF + 0.5f, 0.0f, (float)0xFFFF));
}
+ // VK_SAMPLE_COUNT_4_BIT
+ // https://www.khronos.org/registry/vulkan/specs/1.1/html/vkspec.html#primsrast-multisampling
+ constexpr float sampleLocations4[][2] = {
+ {0.375, 0.125},
+ {0.875, 0.375},
+ {0.125, 0.625},
+ {0.625, 0.875},
+ };
+
+ // Vulkan spec sample positions are relative to 0,0 in top left corner, with Y+ going down.
+ // Convert to our space, with 0,0 in center, and Y+ going up.
+ constexpr float4 X[4] = {
+ sw::replicate(sampleLocations4[0][0] - 0.5f), // -0.125
+ sw::replicate(sampleLocations4[1][0] - 0.5f), // +0.375
+ sw::replicate(sampleLocations4[2][0] - 0.5f), // -0.375
+ sw::replicate(sampleLocations4[3][0] - 0.5f), // +0.125
+ };
+
+ constexpr float4 Y[4] = {
+ sw::replicate(-(sampleLocations4[0][1] - 0.5f)), // +0.375
+ sw::replicate(-(sampleLocations4[1][1] - 0.5f)), // +0.125
+ sw::replicate(-(sampleLocations4[2][1] - 0.5f)), // -0.125
+ sw::replicate(-(sampleLocations4[3][1] - 0.5f)), // -0.375
+ };
+
for(int q = 0; q < 4; q++)
{
for(int c = 0; c < 16; c++)
{
for(int i = 0; i < 4; i++)
{
- const float X[4] = {+0.3125f, -0.3125f, -0.1250f, +0.1250f};
- const float Y[4] = {+0.1250f, -0.1250f, +0.3125f, -0.3125f};
+ // Reorder sample points for centroid computation
+ const float Xs[4] = { X[1][0], X[2][0], X[0][0], X[3][0] };
+ const float Ys[4] = { Y[1][0], Y[2][0], Y[0][0], Y[3][0] };
- sampleX[q][c][i] = c & (1 << i) ? X[q] : 0.0f;
- sampleY[q][c][i] = c & (1 << i) ? Y[q] : 0.0f;
+ sampleX[q][c][i] = c & (1 << i) ? Xs[q] : 0.0f;
+ sampleY[q][c][i] = c & (1 << i) ? Ys[q] : 0.0f;
weight[c][i] = c & (1 << i) ? 1.0f : 0.0f;
}
}
@@ -312,16 +338,6 @@
memcpy(&this->Xf, &Xf, sizeof(Xf));
memcpy(&this->Yf, &Yf, sizeof(Yf));
- static const float4 X[4] = {{-0.3125f, -0.3125f, -0.3125f, -0.3125f},
- {+0.3125f, +0.3125f, +0.3125f, +0.3125f},
- {+0.1250f, +0.1250f, +0.1250f, +0.1250f},
- {-0.1250f, -0.1250f, -0.1250f, -0.1250f}};
-
- static const float4 Y[4] = {{-0.1250f, -0.1250f, -0.1250f, -0.1250f},
- {+0.1250f, +0.1250f, +0.1250f, +0.1250f},
- {-0.3125f, -0.3125f, -0.3125f, -0.3125f},
- {+0.3125f, +0.3125f, +0.3125f, +0.3125f}};
-
memcpy(&this->X, &X, sizeof(X));
memcpy(&this->Y, &Y, sizeof(Y));
diff --git a/src/System/Types.hpp b/src/System/Types.hpp
index cd08ed5..70c084d 100644
--- a/src/System/Types.hpp
+++ b/src/System/Types.hpp
@@ -127,28 +127,14 @@
}
});
- inline float4 vector(float x, float y, float z, float w)
+ inline constexpr float4 vector(float x, float y, float z, float w)
{
- float4 v;
-
- v.x = x;
- v.y = y;
- v.z = z;
- v.w = w;
-
- return v;
+ return { x, y, z, w };
}
- inline float4 replicate(float f)
+ inline constexpr float4 replicate(float f)
{
- float4 v;
-
- v.x = f;
- v.y = f;
- v.z = f;
- v.w = f;
-
- return v;
+ return vector(f, f, f, f);
}
#define OFFSET(s,m) (int)(size_t)&reinterpret_cast<const volatile char&>((((s*)0)->m))