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;