Pipeline: Store builtins on SpirvRoutine...

... even if they're not directly used by the SPIR-V shader code.
This will let the debugger display these values in the locals window.

Bug: b/145351270
Change-Id: I1d390e95bf38e89b072ef374e6a35cd8222a45c6
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/38912
Tested-by: Ben Clayton <bclayton@google.com>
Presubmit-Ready: Ben Clayton <bclayton@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Pipeline/PixelProgram.cpp b/src/Pipeline/PixelProgram.cpp
index 21296ed..0bfd0b0 100644
--- a/src/Pipeline/PixelProgram.cpp
+++ b/src/Pipeline/PixelProgram.cpp
@@ -60,17 +60,33 @@
 {
 	routine.setImmutableInputBuiltins(spirvShader);
 
+	// TODO(b/146486064): Consider only assigning these to the SpirvRoutine iff
+	// they are ever going to be read.
+	routine.fragCoord[0] = SIMD::Float(Float(x)) + SIMD::Float(0.5f, 1.5f, 0.5f, 1.5f);
+	routine.fragCoord[1] = SIMD::Float(Float(y)) + SIMD::Float(0.5f, 0.5f, 1.5f, 1.5f);
+	routine.fragCoord[2] = z[0];  // sample 0
+	routine.fragCoord[3] = w;
+	routine.pointCoord[0] = SIMD::Float(0.5f) +
+	                        SIMD::Float(Float(x) - (*Pointer<Float>(primitive + OFFSET(Primitive, pointCoordX))));
+	routine.pointCoord[1] = SIMD::Float(0.5f) +
+	                        SIMD::Float(Float(y) - (*Pointer<Float>(primitive + OFFSET(Primitive, pointCoordY))));
+	routine.invocationsPerSubgroup = SIMD::Width;
+	routine.helperInvocation = ~maskAny(cMask);
+	routine.windowSpacePosition[0] = x + SIMD::Int(0, 1, 0, 1);
+	routine.windowSpacePosition[1] = y + SIMD::Int(0, 0, 1, 1);
+	routine.viewID = *Pointer<Int>(data + OFFSET(DrawData, viewID));
+
 	routine.setInputBuiltin(spirvShader, spv::BuiltInViewIndex, [&](const SpirvShader::BuiltinMapping &builtin, Array<SIMD::Float> &value) {
 		assert(builtin.SizeInComponents == 1);
-		value[builtin.FirstComponent] = As<Float4>(Int4((*Pointer<Int>(data + OFFSET(DrawData, viewID)))));
+		value[builtin.FirstComponent] = As<SIMD::Float>(SIMD::Int(routine.viewID));
 	});
 
 	routine.setInputBuiltin(spirvShader, spv::BuiltInFragCoord, [&](const SpirvShader::BuiltinMapping &builtin, Array<SIMD::Float> &value) {
 		assert(builtin.SizeInComponents == 4);
-		value[builtin.FirstComponent + 0] = SIMD::Float(Float(x)) + SIMD::Float(0.5f, 1.5f, 0.5f, 1.5f);
-		value[builtin.FirstComponent + 1] = SIMD::Float(Float(y)) + SIMD::Float(0.5f, 0.5f, 1.5f, 1.5f);
-		value[builtin.FirstComponent + 2] = z[0];  // sample 0
-		value[builtin.FirstComponent + 3] = w;
+		value[builtin.FirstComponent + 0] = routine.fragCoord[0];
+		value[builtin.FirstComponent + 1] = routine.fragCoord[1];
+		value[builtin.FirstComponent + 2] = routine.fragCoord[2];
+		value[builtin.FirstComponent + 3] = routine.fragCoord[3];
 	});
 
 	routine.setInputBuiltin(spirvShader, spv::BuiltInPointCoord, [&](const SpirvShader::BuiltinMapping &builtin, Array<SIMD::Float> &value) {
@@ -88,12 +104,8 @@
 
 	routine.setInputBuiltin(spirvShader, spv::BuiltInHelperInvocation, [&](const SpirvShader::BuiltinMapping &builtin, Array<SIMD::Float> &value) {
 		assert(builtin.SizeInComponents == 1);
-		value[builtin.FirstComponent] = As<SIMD::Float>(~maskAny(cMask));
+		value[builtin.FirstComponent] = As<SIMD::Float>(routine.helperInvocation);
 	});
-
-	routine.windowSpacePosition[0] = x + SIMD::Int(0, 1, 0, 1);
-	routine.windowSpacePosition[1] = y + SIMD::Int(0, 0, 1, 1);
-	routine.viewID = *Pointer<Int>(data + OFFSET(DrawData, viewID));
 }
 
 void PixelProgram::applyShader(Int cMask[4], Int sMask[4], Int zMask[4])