Fix processing OpExecutionMode for the requested entry point
Previously any SPIR-V OpExecutionMode instruction would override the
execution mode parameters, so a shader module with multiple entry points
with different execution modes would not work as intended.
Bug: b/155550449
Change-Id: I86211e66a3cef5a3bbf9e535e9be8415b5d69d4b
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45249
Presubmit-Ready: Nicolas Capens <nicolascapens@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Kokoro-Result: kokoro <noreply+kokoro@google.com>
diff --git a/src/Pipeline/SpirvShader.cpp b/src/Pipeline/SpirvShader.cpp
index 3ffc4c4..848eefe 100644
--- a/src/Pipeline/SpirvShader.cpp
+++ b/src/Pipeline/SpirvShader.cpp
@@ -189,7 +189,7 @@
case spv::OpBranchConditional:
case spv::OpSwitch:
case spv::OpReturn:
- // fallthrough
+ // [[fallthrough]]
// Termination instruction:
case spv::OpKill:
@@ -874,6 +874,12 @@
void SpirvShader::ProcessExecutionMode(InsnIterator insn)
{
+ Function::ID function = insn.word(1);
+ if(function != entryPoint)
+ {
+ return;
+ }
+
auto mode = static_cast<spv::ExecutionMode>(insn.word(2));
switch(mode)
{
diff --git a/src/Pipeline/SpirvShader.hpp b/src/Pipeline/SpirvShader.hpp
index 40efada..34f9b03 100644
--- a/src/Pipeline/SpirvShader.hpp
+++ b/src/Pipeline/SpirvShader.hpp
@@ -555,7 +555,9 @@
bool NeedsCentroid : 1;
// Compute workgroup dimensions
- int WorkgroupSizeX = 1, WorkgroupSizeY = 1, WorkgroupSizeZ = 1;
+ int WorkgroupSizeX = 1;
+ int WorkgroupSizeY = 1;
+ int WorkgroupSizeZ = 1;
};
Modes const &getModes() const