Commit ac6d5050 by Nicolas Capens Committed by Nicolas Capens

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/15828Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 152997c9
...@@ -34,8 +34,8 @@ namespace sw ...@@ -34,8 +34,8 @@ namespace sw
int shaderID; int shaderID;
bool depthOverride : 1; // FIXME: Eliminate by querying shader. bool depthOverride : 1; // TODO: Eliminate by querying shader.
bool shaderContainsKill : 1; // FIXME: Eliminate by querying shader. bool shaderContainsKill : 1; // TODO: Eliminate by querying shader.
DepthCompareMode depthCompareMode : BITS(DEPTH_LAST); DepthCompareMode depthCompareMode : BITS(DEPTH_LAST);
AlphaCompareMode alphaCompareMode : BITS(ALPHA_LAST); AlphaCompareMode alphaCompareMode : BITS(ALPHA_LAST);
......
...@@ -50,10 +50,10 @@ namespace sw ...@@ -50,10 +50,10 @@ namespace sw
uint64_t shaderID; uint64_t shaderID;
bool fixedFunction : 1; bool fixedFunction : 1; // TODO: Eliminate by querying shader.
bool textureSampling : 1; bool textureSampling : 1; // TODO: Eliminate by querying shader.
unsigned int positionRegister : BITS(MAX_VERTEX_OUTPUTS); unsigned int positionRegister : BITS(MAX_VERTEX_OUTPUTS); // TODO: Eliminate by querying shader.
unsigned int pointSizeRegister : BITS(MAX_VERTEX_OUTPUTS); unsigned int pointSizeRegister : BITS(MAX_VERTEX_OUTPUTS); // TODO: Eliminate by querying shader.
unsigned int vertexBlendMatrixCount : 3; unsigned int vertexBlendMatrixCount : 3;
bool indexedVertexBlendEnable : 1; bool indexedVertexBlendEnable : 1;
......
...@@ -1517,10 +1517,9 @@ namespace sw ...@@ -1517,10 +1517,9 @@ namespace sw
BasicBlock *endBlock = loopRepEndBlock[loopRepDepth]; BasicBlock *endBlock = loopRepEndBlock[loopRepDepth];
Nucleus::createBr(loopRepEndBlock[loopRepDepth]); Nucleus::createBr(endBlock);
Nucleus::setInsertBlock(endBlock); Nucleus::setInsertBlock(endBlock);
enableIndex--;
enableBreak = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF); enableBreak = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
} }
...@@ -1725,9 +1724,6 @@ namespace sw ...@@ -1725,9 +1724,6 @@ namespace sw
void PixelProgram::SWITCH() void PixelProgram::SWITCH()
{ {
enableIndex++;
enableStack[enableIndex] = Int4(0xFFFFFFFF);
BasicBlock *endBlock = Nucleus::createBasicBlock(); BasicBlock *endBlock = Nucleus::createBasicBlock();
loopRepTestBlock[loopRepDepth] = nullptr; loopRepTestBlock[loopRepDepth] = nullptr;
......
...@@ -1038,12 +1038,12 @@ namespace sw ...@@ -1038,12 +1038,12 @@ namespace sw
switch(control) switch(control)
{ {
case Shader::CONTROL_GT: condition = CmpNLE(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_EQ: condition = CmpEQ(src0.x, src1.x); break;
case Shader::CONTROL_GE: condition = CmpNLT(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_LT: condition = CmpLT(src0.x, src1.x); break;
case Shader::CONTROL_NE: condition = CmpNEQ(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_LE: condition = CmpLE(src0.x, src1.x); break;
default: default:
ASSERT(false); ASSERT(false);
} }
...@@ -1277,10 +1277,9 @@ namespace sw ...@@ -1277,10 +1277,9 @@ namespace sw
BasicBlock *endBlock = loopRepEndBlock[loopRepDepth]; BasicBlock *endBlock = loopRepEndBlock[loopRepDepth];
Nucleus::createBr(loopRepEndBlock[loopRepDepth]); Nucleus::createBr(endBlock);
Nucleus::setInsertBlock(endBlock); Nucleus::setInsertBlock(endBlock);
enableIndex--;
enableBreak = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF); enableBreak = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
} }
...@@ -1341,12 +1340,12 @@ namespace sw ...@@ -1341,12 +1340,12 @@ namespace sw
switch(control) switch(control)
{ {
case Shader::CONTROL_GT: condition = CmpNLE(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_EQ: condition = CmpEQ(src0.x, src1.x); break;
case Shader::CONTROL_GE: condition = CmpNLT(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_LT: condition = CmpLT(src0.x, src1.x); break;
case Shader::CONTROL_NE: condition = CmpNEQ(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_LE: condition = CmpLE(src0.x, src1.x); break;
default: default:
ASSERT(false); ASSERT(false);
} }
...@@ -1486,9 +1485,6 @@ namespace sw ...@@ -1486,9 +1485,6 @@ namespace sw
void VertexProgram::SWITCH() void VertexProgram::SWITCH()
{ {
enableIndex++;
enableStack[enableIndex] = Int4(0xFFFFFFFF);
BasicBlock *endBlock = Nucleus::createBasicBlock(); BasicBlock *endBlock = Nucleus::createBasicBlock();
loopRepTestBlock[loopRepDepth] = nullptr; loopRepTestBlock[loopRepDepth] = nullptr;
......
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