i965: When emitting a src/dst read of an output, keep the swizzle and neg
authorIan Romanick <ian.d.romanick@intel.com>
Thu, 21 Jul 2011 01:07:50 +0000 (18:07 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Sat, 23 Jul 2011 08:24:18 +0000 (01:24 -0700)
Fixes i965 piglit vs-varying-array-mat[234]-row-rd.

Reviewed-by: Eric Anholt <eric@anholt.net>
src/mesa/drivers/dri/i965/brw_vs_emit.c

index 5ef8b0720ba0d296ff3825996c65f2e50653f037..d8cb0f7cb6971345ef7390ceeb6e19f92155e990 100644 (file)
@@ -1980,9 +1980,22 @@ void brw_vs_emit(struct brw_vs_compile *c )
              const struct prog_src_register *src = &inst->SrcReg[i];
              index = src->Index;
              file = src->File; 
-             if (file == PROGRAM_OUTPUT && c->output_regs[index].used_in_src)
-                 args[i] = c->output_regs[index].reg;
-             else
+             if (file == PROGRAM_OUTPUT && c->output_regs[index].used_in_src) {
+                /* Can't just make get_arg "do the right thing" here because
+                 * other callers of get_arg and get_src_reg don't expect any
+                 * special behavior for the c->output_regs[index].used_in_src
+                 * case.
+                 */
+                args[i] = c->output_regs[index].reg;
+                args[i].dw1.bits.swizzle =
+                   BRW_SWIZZLE4(GET_SWZ(src->Swizzle, 0),
+                                GET_SWZ(src->Swizzle, 1),
+                                GET_SWZ(src->Swizzle, 2),
+                                GET_SWZ(src->Swizzle, 3));
+
+                /* Note this is ok for non-swizzle ARB_vp instructions */
+                args[i].negate = src->Negate ? 1 : 0;
+             } else
                   args[i] = get_arg(c, inst, i);
          }