Detect OpImageWrite in the analysis pass
This refactoring moves detection of OpImageWrite SPIR-V instructions
out of EmitImageWrite(). The latter method will be moved to EmitState,
so static analysis needs to happen in the SpirvShader constructor, which
we were already doing for other bits of analysis.
Bug: b/247020580
Change-Id: I53ef9ac9f9bb78a03634724ab90fa8124d51e95a
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/68908
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Pipeline/SpirvShader.cpp b/src/Pipeline/SpirvShader.cpp
index 26ec28f..972ec15 100644
--- a/src/Pipeline/SpirvShader.cpp
+++ b/src/Pipeline/SpirvShader.cpp
@@ -785,12 +785,15 @@
case spv::OpStore:
case spv::OpAtomicStore:
- case spv::OpImageWrite:
case spv::OpCopyMemory:
case spv::OpMemoryBarrier:
// Don't need to do anything during analysis pass
break;
+ case spv::OpImageWrite:
+ analysis.ContainsImageWrite = true;
+ break;
+
case spv::OpControlBarrier:
analysis.ContainsControlBarriers = true;
break;
diff --git a/src/Pipeline/SpirvShader.hpp b/src/Pipeline/SpirvShader.hpp
index ebfceb2..f4b7d62 100644
--- a/src/Pipeline/SpirvShader.hpp
+++ b/src/Pipeline/SpirvShader.hpp
@@ -681,12 +681,11 @@
bool ContainsControlBarriers : 1;
bool NeedsCentroid : 1;
bool ContainsSampleQualifier : 1;
+ bool ContainsImageWrite : 1;
};
- const Analysis &getAnalysis() const
- {
- return analysis;
- }
+ const Analysis &getAnalysis() const { return analysis; }
+ bool containsImageWrite() const { return analysis.ContainsImageWrite; }
bool coverageModified() const
{
@@ -943,7 +942,6 @@
uint32_t getWorkgroupSizeY() const;
uint32_t getWorkgroupSizeZ() const;
- bool containsImageWrite() const { return imageWriteEmitted; }
bool getRobustBufferAccess() const { return robustBufferAccess; }
using BuiltInHash = std::hash<std::underlying_type<spv::BuiltIn>::type>;
@@ -964,7 +962,6 @@
std::unordered_set<uint32_t> extensionsImported;
Analysis analysis = {};
- mutable bool imageWriteEmitted = false;
HandleMap<Type> types;
HandleMap<Object> defs;
diff --git a/src/Pipeline/SpirvShaderImage.cpp b/src/Pipeline/SpirvShaderImage.cpp
index ea79184..04e5873 100644
--- a/src/Pipeline/SpirvShaderImage.cpp
+++ b/src/Pipeline/SpirvShaderImage.cpp
@@ -1249,8 +1249,6 @@
SpirvShader::EmitResult SpirvShader::EmitImageWrite(const ImageInstruction &instruction, EmitState *state) const
{
- imageWriteEmitted = true;
-
auto &image = getObject(instruction.imageId);
auto &imageType = getType(image);