Fix 'continue' in GLSL loops.
The test expression of a loop is placed between the TEST and ENDWHILE
shader assembly instructions, and should no longer be affected by the
cleared execution mask of a continue statement. Thus TEST should always
be emitted, even for non-deterministic loops.
Other masks should still apply, and work recursively, so the
'whileTest' boolean to disable all masks during the test expression
evaluation has been replaced with a stack to restore the continue mask
at the TEST instruction.
Bug swiftshader:93
Bug b/118009174
Change-Id: I505c48f0344e61a6c31f81d26e93bc1217a105a2
Reviewed-on: https://swiftshader-review.googlesource.com/c/22248
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/OpenGL/compiler/OutputASM.cpp b/src/OpenGL/compiler/OutputASM.cpp
index 5fa69f1..5a8bcdf 100644
--- a/src/OpenGL/compiler/OutputASM.cpp
+++ b/src/OpenGL/compiler/OutputASM.cpp
@@ -1859,8 +1859,6 @@
if(loop.isDeterministic())
{
deterministicVariables.insert(loop.index->getId());
-
- emit(sw::Shader::OPCODE_TEST);
}
if(node->getType() == ELoopDoWhile)
@@ -1926,10 +1924,7 @@
body->traverse(this);
}
- if(loop.isDeterministic())
- {
- emit(sw::Shader::OPCODE_TEST);
- }
+ emit(sw::Shader::OPCODE_TEST);
if(expression)
{