Try not to use the same temp reg as a TXP destination more than once,

as this also constitutes a texture indirection.  Reported by Ben
Skeggs.
This commit is contained in:
Keith Whitwell
2005-05-10 08:58:44 +00:00
parent fee163a61a
commit ecb6bfc0ce

View File

@@ -82,6 +82,10 @@ struct texenv_fragment_program {
struct fragment_program *program;
GLcontext *ctx;
GLuint tex_temp_flag; /* Temps which have been the result of a texture
* operation.
*/
GLuint temp_flag; /* Tracks temporary regs which are in
* use.
*/
@@ -135,9 +139,20 @@ static GLboolean is_undef( struct ureg reg )
return reg.file == 0xf;
}
static struct ureg get_temp( struct texenv_fragment_program *p )
{
int bit = ffs( ~p->temp_flag );
int bit;
/* First try and reuse texture results:
*/
bit = ffs( ~(p->temp_flag & p->tex_temp_flag) );
/* Then any unused temporary:
*/
if (!bit)
bit = ffs( ~p->temp_flag );
if (!bit) {
fprintf(stderr, "%s: out of temporaries\n", __FILE__);
exit(1);
@@ -147,6 +162,29 @@ static struct ureg get_temp( struct texenv_fragment_program *p )
return make_ureg(PROGRAM_TEMPORARY, (bit-1));
}
static struct ureg get_tex_temp( struct texenv_fragment_program *p )
{
int bit;
/* First try to find temp not previously used as a texture result:
*/
bit = ffs( ~(p->temp_flag & ~p->tex_temp_flag) );
/* Then any unused temporary:
*/
if (!bit)
bit = ffs( ~p->temp_flag );
if (!bit) {
fprintf(stderr, "%s: out of temporaries\n", __FILE__);
exit(1);
}
p->temp_flag |= 1<<(bit-1);
p->tex_temp_flag |= 1<<(bit-1);
return make_ureg(PROGRAM_TEMPORARY, (bit-1));
}
static void release_temps( struct texenv_fragment_program *p )
{
@@ -339,7 +377,7 @@ static struct ureg get_source( struct texenv_fragment_program *p,
GLuint dim = translate_tex_src_bit( p, p->ctx->Texture.Unit[unit]._ReallyEnabled);
struct ureg texcoord = register_input(p, FRAG_ATTRIB_TEX0+unit);
struct ureg tmp = get_temp( p );
struct ureg tmp = get_tex_temp( p );
/* TODO: Use D0_MASK_XY where possible.
*/