mesa: fix temp register allocation problems.
Complex texcombine modes were running out of registers (>32 registers for 8 tex units).
This commit is contained in:
@@ -411,6 +411,14 @@ static struct ureg get_tex_temp( struct texenv_fragment_program *p )
|
||||
}
|
||||
|
||||
|
||||
/** Mark a temp reg as being no longer allocatable. */
|
||||
static void reserve_temp( struct texenv_fragment_program *p, struct ureg r )
|
||||
{
|
||||
if (r.file == PROGRAM_TEMPORARY)
|
||||
p->temps_output |= (1 << r.idx);
|
||||
}
|
||||
|
||||
|
||||
static void release_temps(GLcontext *ctx, struct texenv_fragment_program *p )
|
||||
{
|
||||
GLuint max_temp = ctx->Const.FragmentProgram.MaxTemps;
|
||||
@@ -504,10 +512,12 @@ emit_op(struct texenv_fragment_program *p,
|
||||
|
||||
emit_dst( &inst->DstReg, dest, mask );
|
||||
|
||||
#if 0
|
||||
/* Accounting for indirection tracking:
|
||||
*/
|
||||
if (dest.file == PROGRAM_TEMPORARY)
|
||||
p->temps_output |= 1 << dest.idx;
|
||||
#endif
|
||||
|
||||
return inst;
|
||||
}
|
||||
@@ -562,6 +572,10 @@ static struct ureg emit_texld( struct texenv_fragment_program *p,
|
||||
|
||||
p->program->Base.NumTexInstructions++;
|
||||
|
||||
/* Accounting for indirection tracking:
|
||||
*/
|
||||
reserve_temp(p, dest);
|
||||
|
||||
/* Is this a texture indirection?
|
||||
*/
|
||||
if ((coord.file == PROGRAM_TEMPORARY &&
|
||||
@@ -1079,6 +1093,7 @@ create_new_program(GLcontext *ctx, struct state_key *key,
|
||||
for (unit = 0 ; unit < ctx->Const.MaxTextureUnits; unit++)
|
||||
if (key->enabled_units & (1<<unit)) {
|
||||
p.src_previous = emit_texenv( &p, unit );
|
||||
reserve_temp(&p, p.src_previous); /* don't re-use this temp reg */
|
||||
release_temps(ctx, &p); /* release all temps */
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user