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))