i965/vs: Store texturing results into a vec4 temporary.
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 17 Jan 2013 04:24:13 +0000 (20:24 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Fri, 18 Jan 2013 19:31:27 +0000 (11:31 -0800)
The sampler appears to ignore writemasks (even when correcting the
WRITEMASK_XYZW in brw_vec4_emit.cpp to the proper writemask) and just
always writes all four values.

To cope with this, just texture into a temporary, then MOV out into a
register that has the proper number of components.

NOTE: This is a candidate for stable branches.

Fixes es3conform's shadow_execution_vert.test.

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

index 313924571d8e19bc4607e9bbdd57c9d914a96a32..ebf8990e64b1deccb4fa6abe1b55ed3162c31c13 100644 (file)
@@ -2005,6 +2005,7 @@ vec4_visitor::visit(ir_texture *ir)
    inst->mlen = inst->header_present + 1; /* always at least one */
    inst->sampler = sampler;
    inst->dst = dst_reg(this, ir->type);
+   inst->dst.writemask = WRITEMASK_XYZW;
    inst->shadow_compare = ir->shadow_comparitor != NULL;
 
    if (ir->offset != NULL && ir->op != ir_txf)
@@ -2123,13 +2124,16 @@ vec4_visitor::visit(ir_texture *ir)
 void
 vec4_visitor::swizzle_result(ir_texture *ir, src_reg orig_val, int sampler)
 {
-   this->result = orig_val;
-
    int s = c->key.tex.swizzles[sampler];
 
+   this->result = src_reg(this, ir->type);
+   dst_reg swizzled_result(this->result);
+
    if (ir->op == ir_txs || ir->type == glsl_type::float_type
-                       || s == SWIZZLE_NOOP)
+                       || s == SWIZZLE_NOOP) {
+      emit(MOV(swizzled_result, orig_val));
       return;
+   }
 
    int zero_mask = 0, one_mask = 0, copy_mask = 0;
    int swizzle[4];
@@ -2149,9 +2153,6 @@ vec4_visitor::swizzle_result(ir_texture *ir, src_reg orig_val, int sampler)
       }
    }
 
-   this->result = src_reg(this, ir->type);
-   dst_reg swizzled_result(this->result);
-
    if (copy_mask) {
       orig_val.swizzle = BRW_SWIZZLE4(swizzle[0], swizzle[1], swizzle[2], swizzle[3]);
       swizzled_result.writemask = copy_mask;