Commit 3a2dfcbe by Ben Clayton

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/+/40832Reviewed-by: 's avatarAntonio Maiorano <amaiorano@google.com> Tested-by: 's avatarBen Clayton <bclayton@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
parent 59a29e3c
...@@ -2058,7 +2058,11 @@ namespace glsl ...@@ -2058,7 +2058,11 @@ namespace glsl
// If there's a default case, traverse it here // If there's a default case, traverse it here
if(defaultIt != sequence.end()) if(defaultIt != sequence.end())
{ {
emit(sw::Shader::OPCODE_ELSE); if(nbCases != 0)
{
emit(sw::Shader::OPCODE_ELSE);
}
for(++defaultIt; defaultIt != sequence.end(); ++defaultIt) for(++defaultIt; defaultIt != sequence.end(); ++defaultIt)
{ {
(*defaultIt)->traverse(this); (*defaultIt)->traverse(this);
......
...@@ -2066,6 +2066,18 @@ TEST_F(SwiftShaderTest, BadNegation) ...@@ -2066,6 +2066,18 @@ TEST_F(SwiftShaderTest, BadNegation)
float F (float f) { return G(-m); })"); 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 #ifndef EGL_ANGLE_iosurface_client_buffer
# define EGL_ANGLE_iosurface_client_buffer 1 # define EGL_ANGLE_iosurface_client_buffer 1
# define EGL_IOSURFACE_ANGLE 0x3454 # define EGL_IOSURFACE_ANGLE 0x3454
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment