Correctly determine whether we need to compute centroids
Bug: b/124177079
Change-Id: I20132ffd5f73c19715393740c27f77e71a3c3c88
Reviewed-on: https://swiftshader-review.googlesource.com/c/24594
Reviewed-by: Ben Clayton <bclayton@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Chris Forbes <chrisforbes@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/src/Device/PixelProcessor.cpp b/src/Device/PixelProcessor.cpp
index fcbee9f..5ccc70a 100644
--- a/src/Device/PixelProcessor.cpp
+++ b/src/Device/PixelProcessor.cpp
@@ -702,7 +702,7 @@
if(state.multiSample > 1 && context->pixelShader)
{
- state.centroid = false;//context->pixelShader->containsCentroid();
+ state.centroid = context->pixelShader->getModes().NeedsCentroid;
}
state.frontFaceCCW = context->frontFacingCCW;
diff --git a/src/Pipeline/SpirvShader.cpp b/src/Pipeline/SpirvShader.cpp
index 36227b9..92439a0 100644
--- a/src/Pipeline/SpirvShader.cpp
+++ b/src/Pipeline/SpirvShader.cpp
@@ -42,9 +42,13 @@
case spv::OpDecorate:
{
auto targetId = insn.word(1);
+ auto decoration = static_cast<spv::Decoration>(insn.word(2));
decorations[targetId].Apply(
- static_cast<spv::Decoration>(insn.word(2)),
+ decoration,
insn.wordCount() > 3 ? insn.word(3) : 0);
+
+ if (decoration == spv::DecorationCentroid)
+ modes.NeedsCentroid = true;
break;
}
@@ -55,9 +59,13 @@
auto &d = memberDecorations[targetId];
if (memberIndex >= d.size())
d.resize(memberIndex + 1); // on demand; exact size would require another pass...
+ auto decoration = static_cast<spv::Decoration>(insn.word(3));
d[memberIndex].Apply(
- static_cast<spv::Decoration>(insn.word(3)),
+ decoration,
insn.wordCount() > 4 ? insn.word(4) : 0);
+
+ if (decoration == spv::DecorationCentroid)
+ modes.NeedsCentroid = true;
break;
}
diff --git a/src/Pipeline/SpirvShader.hpp b/src/Pipeline/SpirvShader.hpp
index d39a4c7..7382061 100644
--- a/src/Pipeline/SpirvShader.hpp
+++ b/src/Pipeline/SpirvShader.hpp
@@ -143,6 +143,7 @@
bool DepthLess : 1;
bool DepthUnchanged : 1;
bool ContainsKill : 1;
+ bool NeedsCentroid : 1;
// Compute workgroup dimensions
int LocalSizeX, LocalSizeY, LocalSizeZ;