Add --strip-atomic-counter-memory (#2413)
Adds an optimization pass to remove usages of AtomicCounterMemory
bit. This bit is ignored in Vulkan environments and outright forbidden
in WebGPU ones.
Fixes #2242
diff --git a/source/opcode.cpp b/source/opcode.cpp
index da096a4..ddf2deb 100644
--- a/source/opcode.cpp
+++ b/source/opcode.cpp
@@ -605,3 +605,35 @@
return false;
}
}
+
+std::vector<uint32_t> spvOpcodeMemorySemanticsOperandIndices(SpvOp opcode) {
+ switch (opcode) {
+ case SpvOpMemoryBarrier:
+ return {1};
+ case SpvOpAtomicStore:
+ case SpvOpControlBarrier:
+ case SpvOpAtomicFlagClear:
+ case SpvOpMemoryNamedBarrier:
+ return {2};
+ case SpvOpAtomicLoad:
+ case SpvOpAtomicExchange:
+ case SpvOpAtomicIIncrement:
+ case SpvOpAtomicIDecrement:
+ case SpvOpAtomicIAdd:
+ case SpvOpAtomicISub:
+ case SpvOpAtomicSMin:
+ case SpvOpAtomicUMin:
+ case SpvOpAtomicSMax:
+ case SpvOpAtomicUMax:
+ case SpvOpAtomicAnd:
+ case SpvOpAtomicOr:
+ case SpvOpAtomicXor:
+ case SpvOpAtomicFlagTestAndSet:
+ return {4};
+ case SpvOpAtomicCompareExchange:
+ case SpvOpAtomicCompareExchangeWeak:
+ return {4, 5};
+ default:
+ return {};
+ }
+}