r5xx: Fix emit_mov() regression.
authorCorbin Simpson <MostAwesomeDude@gmail.com>
Tue, 27 May 2008 05:34:32 +0000 (22:34 -0700)
committerCorbin Simpson <MostAwesomeDude@gmail.com>
Tue, 27 May 2008 08:36:25 +0000 (01:36 -0700)
Specifically, fix improper swizzling.

src/mesa/drivers/dri/r300/r500_fragprog.c

index 911e6ae81e3abfedaf9ddc7f88a00ffb15ecd688..2315830a59c5acf4fbac3a80fc392bbf3070d43e 100644 (file)
@@ -138,6 +138,19 @@ static inline GLuint make_rgb_swizzle(struct prog_src_register src) {
        return swiz;
 }
 
+static inline GLuint make_rgba_swizzle(GLuint src) {
+       GLuint swiz = 0x0;
+       GLuint temp;
+       int i;
+       for (i = 0; i < 4; i++) {
+               temp = GET_SWZ(src, i);
+               /* Fix SWIZZLE_ONE */
+               if (temp == 5) temp++;
+               swiz |= temp << i*3;
+       }
+       return swiz;
+}
+
 static inline GLuint make_alpha_swizzle(struct prog_src_register src) {
        GLuint swiz = GET_SWZ(src.Swizzle, 3);
 
@@ -364,6 +377,8 @@ static void emit_mov(struct r500_fragment_program *fp, int counter, struct prog_
        emit_alu(fp, counter, fpi);
        fp->inst[counter].inst1 = R500_RGB_ADDR0(src_reg);
        fp->inst[counter].inst2 = R500_ALPHA_ADDR0(src_reg);
+       /* (De)mangle the swizzle from Mesa to R500. */
+       swizzle = make_rgba_swizzle(swizzle);
        /* 0x1FF is 9 bits, size of an RGB swizzle. */
        fp->inst[counter].inst3 = R500_ALU_RGB_SEL_A_SRC0
                | MAKE_SWIZ_RGB_A((swizzle & 0x1ff))