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

index f891068322cf25b196770f7fe23f9483cd8798f3..142e240802ea04f5ba115c48de41d9c0aae4b172 100644 (file)
@@ -2473,8 +2473,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 1de561930a49f63260abe472270ed2c8f4384ab6..53de4232bea7b43d5c03ec3f70a8c7ead8687253 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.