From: Kenneth Graunke Date: Thu, 17 Jan 2013 04:24:13 +0000 (-0800) Subject: i965/vs: Store texturing results into a vec4 temporary. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f0dbd9255b5813d1567e1f09266f80e35dcbeb70;p=mesa.git i965/vs: Store texturing results into a vec4 temporary. 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 Reviewed-by: Ian Romanick --- diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp index 313924571d8..ebf8990e64b 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp @@ -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;