mesa: glsl: count number of temp regs used

This commit is contained in:
Haihao Xiang 2008-08-06 09:05:09 -06:00 committed by Brian Paul
parent d23b54a423
commit 8d1627c25a
2 changed files with 34 additions and 3 deletions

View 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;
}

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.