mesa: glsl: count number of temp regs used
authorHaihao Xiang <haihao.xiang@intel.com>
Wed, 6 Aug 2008 15:01:34 +0000 (09:01 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Wed, 6 Aug 2008 15:01:34 +0000 (09:01 -0600)
src/mesa/shader/slang/slang_codegen.c
src/mesa/shader/slang/slang_link.c

index ad9cf06e2751a1242ca9ffcca4b74823b5b1ab13..bde09fdf4ad41d461680d37ece2fcce20eee5448 100644 (file)
@@ -2433,8 +2433,6 @@ _slang_gen_var_decl(slang_assemble_ctx *A, slang_variable *var)
           */
          n->Store->Swizzle = SWIZZLE_NOOP;
       }
-
-      A->program->NumTemporaries++; /* an approximation */
    }
    return n;
 }
index 26959d9d1514b975b5d5b92f763a69ec4294c928..694623f4b00aa70e03b47d80d3bdc8d67740c895 100644 (file)
@@ -276,6 +276,36 @@ _slang_resolve_attributes(struct gl_shader_program *shProg,
 }
 
 
+/**
+ * Scan program instructions to update the program's NumTemporaries field.
+ * Note: this implemenation relies on the code generator allocating
+ * temps in increasing order (0, 1, 2, ... ).
+ */
+static void
+_slang_count_temporaries(struct gl_program *prog)
+{
+   GLuint i, j;
+   GLint maxIndex = -1;
+
+   for (i = 0; i < prog->NumInstructions; i++) {
+      const struct prog_instruction *inst = prog->Instructions + i;
+      const GLuint numSrc = _mesa_num_inst_src_regs(inst->Opcode);
+      for (j = 0; j < numSrc; j++) {
+         if (inst->SrcReg[j].File == PROGRAM_TEMPORARY) {
+            if (maxIndex < inst->SrcReg[j].Index)
+               maxIndex = inst->SrcReg[j].Index;
+         }
+         if (inst->DstReg.File == PROGRAM_TEMPORARY) {
+            if (maxIndex < inst->DstReg.Index)
+               maxIndex = inst->DstReg.Index;
+         }
+      }
+   }
+
+   prog->NumTemporaries = (GLuint) (maxIndex + 1);
+}
+
+
 /**
  * Scan program instructions to update the program's InputsRead and
  * OutputsWritten fields.
@@ -459,6 +489,7 @@ _slang_link(GLcontext *ctx,
 
    if (shProg->VertexProgram) {
       _slang_update_inputs_outputs(&shProg->VertexProgram->Base);
+      _slang_count_temporaries(&shProg->VertexProgram->Base);
       if (!(shProg->VertexProgram->Base.OutputsWritten & (1 << VERT_RESULT_HPOS))) {
          /* the vertex program did not compute a vertex position */
          link_error(shProg,
@@ -466,8 +497,10 @@ _slang_link(GLcontext *ctx,
          return;
       }
    }
-   if (shProg->FragmentProgram)
+   if (shProg->FragmentProgram) {
+      _slang_count_temporaries(&shProg->FragmentProgram->Base);
       _slang_update_inputs_outputs(&shProg->FragmentProgram->Base);
+   }
 
    /* Check that all the varying vars needed by the fragment shader are
     * actually produced by the vertex shader.
@@ -500,7 +533,7 @@ _slang_link(GLcontext *ctx,
       _mesa_print_program(&fragProg->Base);
       _mesa_print_program_parameters(ctx, &fragProg->Base);
 #endif
-#if 0
+#if 01
       printf("************** linked fragment prog\n");
       _mesa_print_program(&shProg->FragmentProgram->Base);
       _mesa_print_program_parameters(ctx, &shProg->FragmentProgram->Base);
@@ -516,7 +549,7 @@ _slang_link(GLcontext *ctx,
       _mesa_print_program(&vertProg->Base);
       _mesa_print_program_parameters(ctx, &vertProg->Base);
 #endif
-#if 0
+#if 01
       printf("************** linked vertex prog\n");
       _mesa_print_program(&shProg->VertexProgram->Base);
       _mesa_print_program_parameters(ctx, &shProg->VertexProgram->Base);