diff options
Diffstat (limited to 'src/mesa/shader/prog_execute.c')
-rw-r--r-- | src/mesa/shader/prog_execute.c | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/src/mesa/shader/prog_execute.c b/src/mesa/shader/prog_execute.c index 038ce0b4f0..7f034520cd 100644 --- a/src/mesa/shader/prog_execute.c +++ b/src/mesa/shader/prog_execute.c @@ -684,9 +684,13 @@ _mesa_execute_program(GLcontext * ctx, break; case OPCODE_BGNLOOP: /* no-op */ + ASSERT(program->Instructions[inst->BranchTarget].Opcode + == OPCODE_ENDLOOP); break; case OPCODE_ENDLOOP: /* subtract 1 here since pc is incremented by for(pc) loop */ + ASSERT(program->Instructions[inst->BranchTarget].Opcode + == OPCODE_BGNLOOP); pc = inst->BranchTarget - 1; /* go to matching BNGLOOP */ break; case OPCODE_BGNSUB: /* begin subroutine */ @@ -694,12 +698,26 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_ENDSUB: /* end subroutine */ break; case OPCODE_BRA: /* branch (conditional) */ - /* fall-through */ + if (eval_condition(machine, inst)) { + /* take branch */ + /* Subtract 1 here since we'll do pc++ below */ + pc = inst->BranchTarget - 1; + } + break; case OPCODE_BRK: /* break out of loop (conditional) */ - /* fall-through */ + ASSERT(program->Instructions[inst->BranchTarget].Opcode + == OPCODE_ENDLOOP); + if (eval_condition(machine, inst)) { + /* break out of loop */ + /* pc++ at end of for-loop will put us after the ENDLOOP inst */ + pc = inst->BranchTarget; + } + break; case OPCODE_CONT: /* continue loop (conditional) */ + ASSERT(program->Instructions[inst->BranchTarget].Opcode + == OPCODE_ENDLOOP); if (eval_condition(machine, inst)) { - /* take branch */ + /* continue at ENDLOOP */ /* Subtract 1 here since we'll do pc++ at end of for-loop */ pc = inst->BranchTarget - 1; } @@ -892,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]; @@ -911,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 */ |