OpenGL: Fix switch with only a default case. The compiler would produce an `OPCODE_ELSE` with no preceeding `OPCODE_IF`, causing hilarity downstream in the VertexProgram and PixelProgram. Credit to Dan Sinclair who did all the hard work here. Bug: None - surfaced when rolling a new version of SPIR-V cross. Change-Id: I8a937a4d24768dbcc125c3fff834342bd8d0ef29 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/40832 Reviewed-by: Antonio Maiorano <amaiorano@google.com> Tested-by: Ben Clayton <bclayton@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/src/OpenGL/compiler/OutputASM.cpp b/src/OpenGL/compiler/OutputASM.cpp index 8d82eca..9e9d885 100644 --- a/src/OpenGL/compiler/OutputASM.cpp +++ b/src/OpenGL/compiler/OutputASM.cpp
@@ -2058,7 +2058,11 @@ // If there's a default case, traverse it here if(defaultIt != sequence.end()) { - emit(sw::Shader::OPCODE_ELSE); + if(nbCases != 0) + { + emit(sw::Shader::OPCODE_ELSE); + } + for(++defaultIt; defaultIt != sequence.end(); ++defaultIt) { (*defaultIt)->traverse(this);
diff --git a/tests/GLESUnitTests/unittests.cpp b/tests/GLESUnitTests/unittests.cpp index ee9693e..92987c6 100644 --- a/tests/GLESUnitTests/unittests.cpp +++ b/tests/GLESUnitTests/unittests.cpp
@@ -2066,6 +2066,18 @@ float F (float f) { return G(-m); })"); } +TEST_F(SwiftShaderTest, SwitchDefaultOnly) +{ + checkCompiles(R"( + float F (float f) { + switch (0u) { + default: + return -f; + } + return f; + })"); +} + #ifndef EGL_ANGLE_iosurface_client_buffer # define EGL_ANGLE_iosurface_client_buffer 1 # define EGL_IOSURFACE_ANGLE 0x3454