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