r600g: fix LIT to handle src==dst properly
authorVadim Girlin <vadimgirlin@gmail.com>
Fri, 17 Jun 2011 19:02:01 +0000 (23:02 +0400)
committerDave Airlie <airlied@redhat.com>
Sat, 18 Jun 2011 06:03:04 +0000 (16:03 +1000)
Current LIT implementation uses dst components for storing temp
results, possibly overwriting still needed values (depends on the
swizzles).
This patch uses temp reg for one of such cases (found in etqw) and
fixes "LIT R.z, R.xyzz".

Tested on evergreen. Fixes some etqw-demo rendering glitches when
"Lighting" is set to "High" in the settings.

Signed-off-by: Vadim Girlin <vadimgirlin@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/drivers/r600/r600_shader.c

index 0995dd5a99bda690065d51813c486b5f2c6ebedd..02681081c93413e3c18516132805abc3fcae465b 100644 (file)
@@ -1366,7 +1366,9 @@ static int tgsi_lit(struct r600_shader_ctx *ctx)
                        memset(&alu, 0, sizeof(struct r600_bc_alu));
                        alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
                        r600_bc_src(&alu.src[0], &ctx->src[0], 1);
-                       tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
+                       alu.dst.sel = ctx->temp_reg;
+                       alu.dst.chan = 2;
+                       alu.dst.write = 1;
                        alu.last = 1;
                        r = r600_bc_add_alu(ctx->bc, &alu);
                        if (r)