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
int shaderID;
bool depthOverride : 1; // FIXME: Eliminate by querying shader.
bool shaderContainsKill : 1; // FIXME: Eliminate by querying shader.
bool depthOverride : 1; // TODO: Eliminate by querying shader.
bool shaderContainsKill : 1; // TODO: Eliminate by querying shader.
DepthCompareMode depthCompareMode : BITS(DEPTH_LAST);
AlphaCompareMode alphaCompareMode : BITS(ALPHA_LAST);
......
......@@ -50,10 +50,10 @@ namespace sw
uint64_t shaderID;
bool fixedFunction : 1;
bool textureSampling : 1;
unsigned int positionRegister : BITS(MAX_VERTEX_OUTPUTS);
unsigned int pointSizeRegister : BITS(MAX_VERTEX_OUTPUTS);
bool fixedFunction : 1; // TODO: Eliminate by querying shader.
bool textureSampling : 1; // TODO: Eliminate by querying shader.
unsigned int positionRegister : BITS(MAX_VERTEX_OUTPUTS); // TODO: Eliminate by querying shader.
unsigned int pointSizeRegister : BITS(MAX_VERTEX_OUTPUTS); // TODO: Eliminate by querying shader.
unsigned int vertexBlendMatrixCount : 3;
bool indexedVertexBlendEnable : 1;
......
......@@ -1517,10 +1517,9 @@ namespace sw
BasicBlock *endBlock = loopRepEndBlock[loopRepDepth];
Nucleus::createBr(loopRepEndBlock[loopRepDepth]);
Nucleus::createBr(endBlock);
Nucleus::setInsertBlock(endBlock);
enableIndex--;
enableBreak = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
}
......@@ -1725,9 +1724,6 @@ namespace sw
void PixelProgram::SWITCH()
{
enableIndex++;
enableStack[enableIndex] = Int4(0xFFFFFFFF);
BasicBlock *endBlock = Nucleus::createBasicBlock();
loopRepTestBlock[loopRepDepth] = nullptr;
......
......@@ -1038,12 +1038,12 @@ namespace sw
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 @@ namespace sw
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 @@ namespace sw
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 @@ namespace sw
void VertexProgram::SWITCH()
{
enableIndex++;
enableStack[enableIndex] = Int4(0xFFFFFFFF);
BasicBlock *endBlock = Nucleus::createBasicBlock();
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