i965/vec4: Only zero out unused message components when there are any.
authorKenneth Graunke <kenneth@whitecape.org>
Mon, 9 Sep 2013 18:11:03 +0000 (11:11 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 9 Sep 2013 18:26:53 +0000 (11:26 -0700)
Otherwise, coordinates with four components would result in a MOV
with a destination writemask that has no channels enabled:

mov(8) g115<1>.F 0D { align16 WE_normal NoDDChk 1Q };

At best, this is stupid: we emit code that shouldn't do anything.
Worse, it apparently causes GPU hangs (observable with Chris's
textureGather test on CubeArrays.)

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Cc: Chris Forbes <chrisf@ijw.co.nz>
Cc: mesa-stable@lists.freedesktop.org
src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp

index ca52fd39c8772cdf3c4fae71a2679389ec86b964..8cfe4e3d93088528e513818a68b8408913116063 100644 (file)
@@ -2245,8 +2245,10 @@ vec4_visitor::visit(ir_texture *ir)
         emit(MOV(dst_reg(MRF, param_base, ir->coordinate->type, coord_mask),
                  coordinate));
       }
-      emit(MOV(dst_reg(MRF, param_base, ir->coordinate->type, zero_mask),
-              src_reg(0)));
+      if (zero_mask != 0) {
+         emit(MOV(dst_reg(MRF, param_base, ir->coordinate->type, zero_mask),
+                  src_reg(0)));
+      }
       /* Load the shadow comparitor */
       if (ir->shadow_comparitor && ir->op != ir_txd) {
         emit(MOV(dst_reg(MRF, param_base + 1, ir->shadow_comparitor->type,