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;