diff options
author | Kenneth Graunke <[email protected]> | 2013-01-16 20:24:13 -0800 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2013-01-18 11:31:27 -0800 |
commit | f0dbd9255b5813d1567e1f09266f80e35dcbeb70 (patch) | |
tree | 177361584870d487198680a873cbce48dfd5b2e8 | |
parent | aeff9a0d9889c4583e4f7fc89539380c1e6d043c (diff) |
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 <[email protected]>
Reviewed-by: Ian Romanick <[email protected]>
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 13 |
1 files changed, 7 insertions, 6 deletions
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; |