Various fixes for VS-only pipeline

Bug: b/118386749
Test: dEQP-VK.memory_model.*
Change-Id: Ie0962df8e17264ec93265cd56b4a79e0d5f37c33
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/31528
Tested-by: Chris Forbes <chrisforbes@google.com>
Presubmit-Ready: Chris Forbes <chrisforbes@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Device/QuadRasterizer.cpp b/src/Device/QuadRasterizer.cpp
index 17de699..b56a393 100644
--- a/src/Device/QuadRasterizer.cpp
+++ b/src/Device/QuadRasterizer.cpp
@@ -164,15 +164,19 @@
 					Dw = *Pointer<Float4>(primitive + OFFSET(Primitive,w.C), 16) + yyyy * *Pointer<Float4>(primitive + OFFSET(Primitive,w.B), 16);
 				}
 
-				for (int interpolant = 0; interpolant < MAX_INTERFACE_COMPONENTS; interpolant++)
+				if (spirvShader)
 				{
-					if (spirvShader->inputs[interpolant].Type == SpirvShader::ATTRIBTYPE_UNUSED)
-						continue;
-
-					Dv[interpolant] = *Pointer<Float4>(primitive + OFFSET(Primitive, V[interpolant].C), 16);
-					if (!spirvShader->inputs[interpolant].Flat)
+					for (int interpolant = 0; interpolant < MAX_INTERFACE_COMPONENTS; interpolant++)
 					{
-						Dv[interpolant] += yyyy * *Pointer<Float4>(primitive + OFFSET(Primitive, V[interpolant].B), 16);
+						if (spirvShader->inputs[interpolant].Type == SpirvShader::ATTRIBTYPE_UNUSED)
+							continue;
+
+						Dv[interpolant] = *Pointer<Float4>(primitive + OFFSET(Primitive, V[interpolant].C), 16);
+						if (!spirvShader->inputs[interpolant].Flat)
+						{
+							Dv[interpolant] +=
+									yyyy * *Pointer<Float4>(primitive + OFFSET(Primitive, V[interpolant].B), 16);
+						}
 					}
 				}
 
diff --git a/src/Device/SetupProcessor.cpp b/src/Device/SetupProcessor.cpp
index 836e9a2..f0c370e 100644
--- a/src/Device/SetupProcessor.cpp
+++ b/src/Device/SetupProcessor.cpp
@@ -89,9 +89,12 @@
 		state.multiSample = context->sampleCount;
 		state.rasterizerDiscard = context->rasterizerDiscard;
 
-		for (int interpolant = 0; interpolant < MAX_INTERFACE_COMPONENTS; interpolant++)
+		if (context->pixelShader)
 		{
-			state.gradient[interpolant] = context->pixelShader->inputs[interpolant];
+			for (int interpolant = 0; interpolant < MAX_INTERFACE_COMPONENTS; interpolant++)
+			{
+				state.gradient[interpolant] = context->pixelShader->inputs[interpolant];
+			}
 		}
 
 		state.hash = state.computeHash();
diff --git a/src/Pipeline/PixelRoutine.cpp b/src/Pipeline/PixelRoutine.cpp
index eeb2116..cc69777 100644
--- a/src/Pipeline/PixelRoutine.cpp
+++ b/src/Pipeline/PixelRoutine.cpp
@@ -37,13 +37,15 @@
 		  routine(pipelineLayout),
 		  descriptorSets(descriptorSets)
 	{
-		spirvShader->emitProlog(&routine);
-
-		if (forceClearRegisters)
+		if (spirvShader)
 		{
-			for (int i = 0; i < MAX_INTERFACE_COMPONENTS; i++)
+			spirvShader->emitProlog(&routine);
+			if (forceClearRegisters)
 			{
-				routine.inputs[i] = Float4(0.0f);
+				for (int i = 0; i < MAX_INTERFACE_COMPONENTS; i++)
+				{
+					routine.inputs[i] = Float4(0.0f);
+				}
 			}
 		}
 	}
@@ -59,7 +61,7 @@
 		#endif
 
 		// TODO: consider shader which modifies sample mask in general
-		const bool earlyDepthTest = !spirvShader->getModes().DepthReplacing && !state.alphaToCoverage;
+		const bool earlyDepthTest = !spirvShader || (!spirvShader->getModes().DepthReplacing && !state.alphaToCoverage);
 
 		Int zMask[4];   // Depth mask
 		Int sMask[4];   // Stencil mask
@@ -147,29 +149,32 @@
 				}
 			}
 
-			for (int interpolant = 0; interpolant < MAX_INTERFACE_COMPONENTS; interpolant++)
+			if (spirvShader)
 			{
-				auto const & input = spirvShader->inputs[interpolant];
-				if (input.Type != SpirvShader::ATTRIBTYPE_UNUSED)
+				for (int interpolant = 0; interpolant < MAX_INTERFACE_COMPONENTS; interpolant++)
 				{
-					if (input.Centroid && state.multiSample > 1)
+					auto const &input = spirvShader->inputs[interpolant];
+					if (input.Type != SpirvShader::ATTRIBTYPE_UNUSED)
 					{
-						routine.inputs[interpolant] =
-								interpolateCentroid(XXXX, YYYY, rhwCentroid,
-													primitive + OFFSET(Primitive, V[interpolant]),
-													input.Flat, !input.NoPerspective);
-					}
-					else
-					{
-						routine.inputs[interpolant] =
-								interpolate(xxxx, Dv[interpolant], rhw,
-											primitive + OFFSET(Primitive, V[interpolant]),
-											input.Flat, !input.NoPerspective, false);
+						if (input.Centroid && state.multiSample > 1)
+						{
+							routine.inputs[interpolant] =
+									interpolateCentroid(XXXX, YYYY, rhwCentroid,
+														primitive + OFFSET(Primitive, V[interpolant]),
+														input.Flat, !input.NoPerspective);
+						}
+						else
+						{
+							routine.inputs[interpolant] =
+									interpolate(xxxx, Dv[interpolant], rhw,
+												primitive + OFFSET(Primitive, V[interpolant]),
+												input.Flat, !input.NoPerspective, false);
+						}
 					}
 				}
-			}
 
-			setBuiltins(x, y, z, w);
+				setBuiltins(x, y, z, w);
+			}
 
 			#if PERF_PROFILE
 				cycles[PERF_INTERP] += Ticks() - interpTime;