Push mask stacks upon CAL, pop upon RET.
authorBrian <brian.paul@tungstengraphics.com>
Tue, 2 Oct 2007 22:24:40 +0000 (16:24 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Tue, 2 Oct 2007 22:24:40 +0000 (16:24 -0600)
Still need to handle conditional RET statements...

src/mesa/pipe/tgsi/exec/tgsi_exec.c

index 60abecaef187485e3a94b21d254208011f37b0bb..edd46100c5e40b38951455e6f1b3aa1112a8265b 100644 (file)
@@ -1980,6 +1980,16 @@ exec_instruction(
    case TGSI_OPCODE_CAL:
       /* skip the call if no execution channels are enabled */
       if (mach->ExecMask) {
+         /* do the call */
+
+         /* push Cond, Loop, Cont stacks */
+         assert(mach->CondStackTop < TGSI_EXEC_MAX_COND_NESTING);
+         mach->CondStack[mach->CondStackTop++] = mach->CondMask;
+         assert(mach->LoopStackTop < TGSI_EXEC_MAX_LOOP_NESTING);
+         mach->LoopStack[mach->LoopStackTop++] = mach->LoopMask;
+         assert(mach->ContStackTop < TGSI_EXEC_MAX_LOOP_NESTING);
+         mach->ContStack[mach->ContStackTop++] = mach->ContMask;
+
          /* note that PC was already incremented above */
          mach->CallStack[mach->CallStackTop++] = *pc;
          *pc = inst->InstructionExtLabel.Label;
@@ -1987,6 +1997,15 @@ exec_instruction(
       break;
 
    case TGSI_OPCODE_RET:
+      /* XXX examine ExecMask to determine if we should _really_ return */
+      /* pop Cond, Loop, Cont stacks */
+      assert(mach->CondStackTop > 0);
+      mach->CondMask = mach->CondStack[--mach->CondStackTop];
+      assert(mach->LoopStackTop > 0);
+      mach->LoopMask = mach->LoopStack[--mach->LoopStackTop];
+      assert(mach->ContStackTop > 0);
+      mach->ContMask = mach->ContStack[--mach->ContStackTop];
+
       assert(mach->CallStackTop >= 0);
       if (mach->CallStackTop == 0) {
          /* XXX error? */