summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2013-01-16 20:24:13 -0800
committerKenneth Graunke <[email protected]>2013-01-18 11:31:27 -0800
commitf0dbd9255b5813d1567e1f09266f80e35dcbeb70 (patch)
tree177361584870d487198680a873cbce48dfd5b2e8
parentaeff9a0d9889c4583e4f7fc89539380c1e6d043c (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.cpp13
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;