mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-01 01:38:06 +02:00
mesa: glsl: count number of temp regs used
This commit is contained in:
parent
d23b54a423
commit
8d1627c25a
2 changed files with 34 additions and 3 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue