From: Brian Paul Date: Fri, 26 Sep 2008 17:18:06 +0000 (-0600) Subject: mesa: fix temp register allocation problems. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8fd329d04885eba7587bbe7604d3a1088e35de40;p=mesa.git mesa: fix temp register allocation problems. Complex texcombine modes were running out of registers (>32 registers for 8 tex units). --- diff --git a/src/mesa/main/texenvprogram.c b/src/mesa/main/texenvprogram.c index c64d88faf9c..97aa87e58cf 100644 --- a/src/mesa/main/texenvprogram.c +++ b/src/mesa/main/texenvprogram.c @@ -398,6 +398,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; @@ -491,10 +499,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; } @@ -549,6 +559,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 && @@ -1062,6 +1076,7 @@ create_new_program(GLcontext *ctx, struct state_key *key, for (unit = 0 ; unit < ctx->Const.MaxTextureUnits; unit++) if (key->enabled_units & (1<