mesa: adjust OPCODE_IF/ELSE BranchTarget fields to point to ELSE/ENDIF instr.
This is a little more logical. Suggested in bug report 25654.
This commit is contained in:
@@ -5717,11 +5717,11 @@ GLboolean AssembleInstr(GLuint uiFirstInst,
|
||||
return GL_FALSE;
|
||||
break;
|
||||
|
||||
case OPCODE_IF :
|
||||
case OPCODE_IF:
|
||||
{
|
||||
GLboolean bHasElse = GL_FALSE;
|
||||
|
||||
if(pILInst[pILInst[i].BranchTarget - 1].Opcode == OPCODE_ELSE)
|
||||
if(pILInst[pILInst[i].BranchTarget].Opcode == OPCODE_ELSE)
|
||||
{
|
||||
bHasElse = GL_TRUE;
|
||||
}
|
||||
|
||||
@@ -910,6 +910,10 @@ _mesa_execute_program(GLcontext * ctx,
|
||||
case OPCODE_IF:
|
||||
{
|
||||
GLboolean cond;
|
||||
ASSERT(program->Instructions[inst->BranchTarget].Opcode
|
||||
== OPCODE_ELSE ||
|
||||
program->Instructions[inst->BranchTarget].Opcode
|
||||
== OPCODE_ENDIF);
|
||||
/* eval condition */
|
||||
if (inst->SrcReg[0].File != PROGRAM_UNDEFINED) {
|
||||
GLfloat a[4];
|
||||
@@ -929,14 +933,16 @@ _mesa_execute_program(GLcontext * ctx,
|
||||
else {
|
||||
/* go to the instruction after ELSE or ENDIF */
|
||||
assert(inst->BranchTarget >= 0);
|
||||
pc = inst->BranchTarget - 1;
|
||||
pc = inst->BranchTarget;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case OPCODE_ELSE:
|
||||
/* goto ENDIF */
|
||||
ASSERT(program->Instructions[inst->BranchTarget].Opcode
|
||||
== OPCODE_ENDIF);
|
||||
assert(inst->BranchTarget >= 0);
|
||||
pc = inst->BranchTarget - 1;
|
||||
pc = inst->BranchTarget;
|
||||
break;
|
||||
case OPCODE_ENDIF:
|
||||
/* nothing */
|
||||
|
||||
@@ -1728,6 +1728,7 @@ emit_if(slang_emit_info *emitInfo, slang_ir_node *n)
|
||||
if (!inst) {
|
||||
return NULL;
|
||||
}
|
||||
prog->Instructions[ifInstLoc].BranchTarget = prog->NumInstructions - 1;
|
||||
}
|
||||
else {
|
||||
/* jump to endif instruction */
|
||||
@@ -1737,8 +1738,8 @@ emit_if(slang_emit_info *emitInfo, slang_ir_node *n)
|
||||
}
|
||||
inst_comment(inst, "else");
|
||||
inst->DstReg.CondMask = COND_TR; /* always branch */
|
||||
prog->Instructions[ifInstLoc].BranchTarget = prog->NumInstructions;
|
||||
}
|
||||
prog->Instructions[ifInstLoc].BranchTarget = prog->NumInstructions;
|
||||
emit(emitInfo, n->Children[2]);
|
||||
}
|
||||
else {
|
||||
@@ -1753,8 +1754,14 @@ emit_if(slang_emit_info *emitInfo, slang_ir_node *n)
|
||||
}
|
||||
}
|
||||
|
||||
if (n->Children[2]) {
|
||||
prog->Instructions[elseInstLoc].BranchTarget = prog->NumInstructions;
|
||||
if (elseInstLoc) {
|
||||
/* point ELSE instruction BranchTarget at ENDIF */
|
||||
if (emitInfo->EmitHighLevelInstructions) {
|
||||
prog->Instructions[elseInstLoc].BranchTarget = prog->NumInstructions - 1;
|
||||
}
|
||||
else {
|
||||
prog->Instructions[elseInstLoc].BranchTarget = prog->NumInstructions;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@@ -1824,7 +1831,12 @@ emit_loop(slang_emit_info *emitInfo, slang_ir_node *n)
|
||||
assert(inst->Opcode == OPCODE_BRK ||
|
||||
inst->Opcode == OPCODE_BRA);
|
||||
/* go to instruction at end of loop */
|
||||
inst->BranchTarget = endInstLoc;
|
||||
if (emitInfo->EmitHighLevelInstructions) {
|
||||
inst->BranchTarget = endInstLoc;
|
||||
}
|
||||
else {
|
||||
inst->BranchTarget = endInstLoc + 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
assert(ir->Opcode == IR_CONT ||
|
||||
@@ -1942,7 +1954,7 @@ emit_cont_break_if_true(slang_emit_info *emitInfo, slang_ir_node *n)
|
||||
}
|
||||
|
||||
emitInfo->prog->Instructions[ifInstLoc].BranchTarget
|
||||
= emitInfo->prog->NumInstructions;
|
||||
= emitInfo->prog->NumInstructions - 1;
|
||||
return inst;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user