r300: Redirect constant TEX coordinates
authorNicolai Haehnle <nhaehnle@gmail.com>
Sat, 14 Feb 2009 16:06:06 +0000 (17:06 +0100)
committerNicolai Haehnle <nhaehnle@gmail.com>
Sat, 14 Feb 2009 16:36:04 +0000 (17:36 +0100)
R3xx/R5xx fragment program texture constants must come from a hardware
register instead of the constant file, so we redirect if necessary during
the native rewrite phase.

The symptoms of this bug started appearing when the Mesa fixed function
texenvprogram code started using STATE_CURRENT_ATTRIB constants for
texture coordinates when the corresponding attributes were constant across
all vertices.

Signed-off-by: Nicolai Haehnle <nhaehnle@gmail.com>
src/mesa/drivers/dri/r300/r300_fragprog.c
src/mesa/drivers/dri/r300/r500_fragprog.c

index 4ef7f2bd7882b842ed33b172fa6ed391d8ebed51..8d030c63fb3f41e39fb3121984830a8d98451349 100644 (file)
@@ -163,6 +163,19 @@ static GLboolean transform_TEX(
                }
        }
 
+       if (inst.SrcReg[0].File != PROGRAM_TEMPORARY && inst.SrcReg[0].File != PROGRAM_INPUT) {
+               int tmpreg = radeonFindFreeTemporary(t);
+               tgt = radeonAppendInstructions(t->Program, 1);
+               tgt->Opcode = OPCODE_MOV;
+               tgt->DstReg.File = PROGRAM_TEMPORARY;
+               tgt->DstReg.Index = tmpreg;
+               tgt->SrcReg[0] = inst.SrcReg[0];
+
+               reset_srcreg(&inst.SrcReg[0]);
+               inst.SrcReg[0].File = PROGRAM_TEMPORARY;
+               inst.SrcReg[0].Index = tmpreg;
+       }
+       
        tgt = radeonAppendInstructions(t->Program, 1);
        _mesa_copy_instructions(tgt, &inst, 1);
 
index 75dae86fa814e8fcb0f81195a9f5e9da7a4b08e2..926ddd5964435f7b940a92b9c0c20b540097eb02 100644 (file)
 #include "radeon_program_alu.h"
 
 
+static void reset_srcreg(struct prog_src_register* reg)
+{
+       _mesa_bzero(reg, sizeof(*reg));
+       reg->Swizzle = SWIZZLE_NOOP;
+}
+
 static struct prog_src_register shadow_ambient(struct gl_program *program, int tmu)
 {
        gl_state_index fail_value_tokens[STATE_LENGTH] = {
@@ -99,6 +105,19 @@ static GLboolean transform_TEX(
                destredirect = GL_TRUE;
        }
 
+       if (inst.SrcReg[0].File != PROGRAM_TEMPORARY && inst.SrcReg[0].File != PROGRAM_INPUT) {
+               int tmpreg = radeonFindFreeTemporary(t);
+               tgt = radeonAppendInstructions(t->Program, 1);
+               tgt->Opcode = OPCODE_MOV;
+               tgt->DstReg.File = PROGRAM_TEMPORARY;
+               tgt->DstReg.Index = tmpreg;
+               tgt->SrcReg[0] = inst.SrcReg[0];
+
+               reset_srcreg(&inst.SrcReg[0]);
+               inst.SrcReg[0].File = PROGRAM_TEMPORARY;
+               inst.SrcReg[0].Index = tmpreg;
+       }
+
        tgt = radeonAppendInstructions(t->Program, 1);
        _mesa_copy_instructions(tgt, &inst, 1);