mesa: glsl: count number of temp regs used

This commit is contained in:
Haihao Xiang
2008-08-06 09:01:34 -06:00
committed by Brian Paul
parent fb71a48413
commit 5f46093938
2 changed files with 36 additions and 5 deletions
-2
View 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;
}
+36 -3
View 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);