Implement CAL/RET and a call stack for subroutines.
authorBrian <brian.paul@tungstengraphics.com>
Tue, 2 Oct 2007 20:05:21 +0000 (14:05 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Tue, 2 Oct 2007 20:05:21 +0000 (14:05 -0600)
The glsl/brick.c shader demo runs now.

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

index 27154d68839f10003f64bdcffa3cc01f4090834b..d757df48d8d031ea1b6222f9d7274c86774507da 100644 (file)
@@ -1903,12 +1903,18 @@ exec_instruction(
       break;
 
    case TGSI_OPCODE_CAL:
-      assert (0);
+      /* note that PC was already incremented above */
+      mach->CallStack[mach->CallStackTop++] = *pc;
+      *pc = inst->InstructionExtLabel.Label;
       break;
 
    case TGSI_OPCODE_RET:
-      /* XXX: end of shader! */
-      /*assert (0);*/
+      assert(mach->CallStackTop >= 0);
+      if (mach->CallStackTop == 0) {
+         /* XXX error? */
+         return;
+      }
+      *pc = mach->CallStack[--mach->CallStackTop];
       break;
 
    case TGSI_OPCODE_SSG:
@@ -2041,13 +2047,6 @@ exec_instruction(
       UPDATE_EXEC_MASK(mach);
       break;
 
-   case TGSI_OPCODE_ENDLOOP:
-      /* pop LoopMask */
-      assert(mach->LoopStackTop > 0);
-      mach->LoopMask = mach->LoopStack[--mach->LoopStackTop];
-      UPDATE_EXEC_MASK(mach);
-      break;
-
    case TGSI_OPCODE_ENDREP:
        assert (0);
        break;
@@ -2171,9 +2170,11 @@ exec_instruction(
       break;
 
    case TGSI_OPCODE_BGNSUB:
-      assert( 0 );
+      /* no-op */
       break;
 
+   case TGSI_OPCODE_ENDLOOP:
+      /* fall-through (for now at least) */
    case TGSI_OPCODE_ENDLOOP2:
       if (mach->LoopMask) {
          /* repeat loop: jump to instruction just past BGNLOOP */
@@ -2219,6 +2220,9 @@ exec_instruction(
 void
 tgsi_exec_machine_run( struct tgsi_exec_machine *mach )
 {
+   uint i;
+   int pc = 0;
+
 #if XXX_SSE
    mach->Temps[TEMP_KILMASK_I].xyzw[TEMP_KILMASK_C].u[0] = 0;
 #else
@@ -2226,6 +2230,9 @@ tgsi_exec_machine_run( struct tgsi_exec_machine *mach )
    mach->CondMask = 0xf;
    mach->LoopMask = 0xf;
    mach->ExecMask = 0xf;
+   assert(mach->CondStackTop == 0);
+   assert(mach->LoopStackTop == 0);
+   assert(mach->CallStackTop == 0);
 
    mach->Temps[TEMP_KILMASK_I].xyzw[TEMP_KILMASK_C].u[0] = 0;
    mach->Temps[TEMP_OUTPUT_I].xyzw[TEMP_OUTPUT_C].u[0] = 0;
@@ -2236,18 +2243,15 @@ tgsi_exec_machine_run( struct tgsi_exec_machine *mach )
    }
 
 
-   {
-      uint i;
-      int pc = 0;
-
-      for (i = 0; i < mach->NumDeclarations; i++) {
-         exec_declaration( mach, mach->Declarations+i );
-      }
+   /* execute declarations (interpolants) */
+   for (i = 0; i < mach->NumDeclarations; i++) {
+      exec_declaration( mach, mach->Declarations+i );
+   }
 
-      while (pc != -1) {
-         assert(pc < mach->NumInstructions);
-         exec_instruction( mach, mach->Instructions + pc, &pc );
-      }
+   /* execute instructions, until pc is set to -1 */
+   while (pc != -1) {
+      assert(pc < mach->NumInstructions);
+      exec_instruction( mach, mach->Instructions + pc, &pc );
    }
 
 #endif
index 0f2dd7d98742145781c468bdcc1acd98f30c0daa..ae5ce8a7c9337f7618c74c44cddc4d2264dd944d 100644 (file)
@@ -99,6 +99,7 @@ struct tgsi_exec_labels
 
 #define TGSI_EXEC_MAX_COND_NESTING  10
 #define TGSI_EXEC_MAX_LOOP_NESTING  10
+#define TGSI_EXEC_MAX_CALL_NESTING  10
 
 
 /**
@@ -149,6 +150,9 @@ struct tgsi_exec_machine
    uint LoopStack[TGSI_EXEC_MAX_LOOP_NESTING];
    int LoopStackTop;
 
+   uint CallStack[TGSI_EXEC_MAX_CALL_NESTING];
+   int CallStackTop;
+
    struct tgsi_full_instruction *Instructions;
    uint NumInstructions;
 
index 5c987436bed6705fb54061d2afeead63c0e05d7f..431b82a98f4d0f57615dcb78c581ba03f2e4ac06 100644 (file)
@@ -271,6 +271,10 @@ compile_instruction(
    case OPCODE_BRK:\r
       fullinst->Instruction.Opcode = TGSI_OPCODE_BRK;\r
       break;\r
+   case OPCODE_CAL:\r
+      fullinst->Instruction.Opcode = TGSI_OPCODE_CAL;\r
+      fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size;\r
+      break;\r
    case OPCODE_CMP:\r
       fullinst->Instruction.Opcode = TGSI_OPCODE_CMP;\r
       break;\r
@@ -382,6 +386,9 @@ compile_instruction(
    case OPCODE_RCP:\r
       fullinst->Instruction.Opcode = TGSI_OPCODE_RCP;\r
       break;\r
+   case OPCODE_RET:\r
+      fullinst->Instruction.Opcode = TGSI_OPCODE_RET;\r
+      break;\r
    case OPCODE_RSQ:\r
       fullinst->Instruction.Opcode = TGSI_OPCODE_RSQ;\r
       tgsi_util_set_full_src_register_sign_mode(\r