i965/vs: Fix textureGrad() with shadow samplers on Haswell.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 13 Feb 2013 05:51:17 +0000 (21:51 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 1 May 2013 17:42:51 +0000 (10:42 -0700)
The shadow comparitor needs to be loaded into the Z component of the
last DWord.

Fixes es3conform's shadow_execution_vert and oglconform's
shadow-grad advanced.textureGrad.1D tests on Haswell.

NOTE: This is a candidate for stable branches.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp

index 31da01f143bc13c4b89b96db715cf1363daad847..3b0687f615a1298070ff0e3b0f7fdd9d2a51842f 100644 (file)
@@ -2271,7 +2271,7 @@ vec4_visitor::visit(ir_texture *ir)
       emit(MOV(dst_reg(MRF, param_base, ir->coordinate->type, zero_mask),
               src_reg(0)));
       /* Load the shadow comparitor */
-      if (ir->shadow_comparitor) {
+      if (ir->shadow_comparitor && ir->op != ir_txd) {
         emit(MOV(dst_reg(MRF, param_base + 1, ir->shadow_comparitor->type,
                          WRITEMASK_X),
                  shadow_comparitor));
@@ -2317,12 +2317,18 @@ vec4_visitor::visit(ir_texture *ir)
            emit(MOV(dst_reg(MRF, param_base + 1, type, WRITEMASK_YW), dPdy));
            inst->mlen++;
 
-           if (ir->type->vector_elements == 3) {
+           if (ir->type->vector_elements == 3 || ir->shadow_comparitor) {
               dPdx.swizzle = BRW_SWIZZLE_ZZZZ;
               dPdy.swizzle = BRW_SWIZZLE_ZZZZ;
               emit(MOV(dst_reg(MRF, param_base + 2, type, WRITEMASK_X), dPdx));
               emit(MOV(dst_reg(MRF, param_base + 2, type, WRITEMASK_Y), dPdy));
               inst->mlen++;
+
+               if (ir->shadow_comparitor) {
+                  emit(MOV(dst_reg(MRF, param_base + 2,
+                                   ir->shadow_comparitor->type, WRITEMASK_Z),
+                           shadow_comparitor));
+               }
            }
         } else /* intel->gen == 4 */ {
            emit(MOV(dst_reg(MRF, param_base + 1, type, WRITEMASK_XYZ), dPdx));