Fix switch statements in loops.
Switch statements were resetting the 'enable' execution mask stack to
all lanes, which caused us to execute the switch operations even for
lanes that were already done looping.
Change-Id: Ie5a525e8de8d5e61d4c61bcee81bd81fa862d917
Reviewed-on: https://swiftshader-review.googlesource.com/15828
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Shader/VertexProgram.cpp b/src/Shader/VertexProgram.cpp
index 02b699b..c497902 100644
--- a/src/Shader/VertexProgram.cpp
+++ b/src/Shader/VertexProgram.cpp
@@ -1038,12 +1038,12 @@
switch(control)
{
- case Shader::CONTROL_GT: condition = CmpNLE(src0.x, src1.x); break;
- case Shader::CONTROL_EQ: condition = CmpEQ(src0.x, src1.x); break;
- case Shader::CONTROL_GE: condition = CmpNLT(src0.x, src1.x); break;
- case Shader::CONTROL_LT: condition = CmpLT(src0.x, src1.x); break;
- case Shader::CONTROL_NE: condition = CmpNEQ(src0.x, src1.x); break;
- case Shader::CONTROL_LE: condition = CmpLE(src0.x, src1.x); break;
+ case Shader::CONTROL_GT: condition = CmpNLE(src0.x, src1.x); break;
+ case Shader::CONTROL_EQ: condition = CmpEQ(src0.x, src1.x); break;
+ case Shader::CONTROL_GE: condition = CmpNLT(src0.x, src1.x); break;
+ case Shader::CONTROL_LT: condition = CmpLT(src0.x, src1.x); break;
+ case Shader::CONTROL_NE: condition = CmpNEQ(src0.x, src1.x); break;
+ case Shader::CONTROL_LE: condition = CmpLE(src0.x, src1.x); break;
default:
ASSERT(false);
}
@@ -1277,10 +1277,9 @@
BasicBlock *endBlock = loopRepEndBlock[loopRepDepth];
- Nucleus::createBr(loopRepEndBlock[loopRepDepth]);
+ Nucleus::createBr(endBlock);
Nucleus::setInsertBlock(endBlock);
- enableIndex--;
enableBreak = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
}
@@ -1341,12 +1340,12 @@
switch(control)
{
- case Shader::CONTROL_GT: condition = CmpNLE(src0.x, src1.x); break;
- case Shader::CONTROL_EQ: condition = CmpEQ(src0.x, src1.x); break;
- case Shader::CONTROL_GE: condition = CmpNLT(src0.x, src1.x); break;
- case Shader::CONTROL_LT: condition = CmpLT(src0.x, src1.x); break;
- case Shader::CONTROL_NE: condition = CmpNEQ(src0.x, src1.x); break;
- case Shader::CONTROL_LE: condition = CmpLE(src0.x, src1.x); break;
+ case Shader::CONTROL_GT: condition = CmpNLE(src0.x, src1.x); break;
+ case Shader::CONTROL_EQ: condition = CmpEQ(src0.x, src1.x); break;
+ case Shader::CONTROL_GE: condition = CmpNLT(src0.x, src1.x); break;
+ case Shader::CONTROL_LT: condition = CmpLT(src0.x, src1.x); break;
+ case Shader::CONTROL_NE: condition = CmpNEQ(src0.x, src1.x); break;
+ case Shader::CONTROL_LE: condition = CmpLE(src0.x, src1.x); break;
default:
ASSERT(false);
}
@@ -1486,9 +1485,6 @@
void VertexProgram::SWITCH()
{
- enableIndex++;
- enableStack[enableIndex] = Int4(0xFFFFFFFF);
-
BasicBlock *endBlock = Nucleus::createBasicBlock();
loopRepTestBlock[loopRepDepth] = nullptr;