summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2010-09-22 14:40:40 -0700
committerEric Anholt <eric@anholt.net>2010-09-22 14:55:58 -0700
commitac3d5beb0b20eb369b188aaf7b78f935969f3b62 (patch)
tree08a9eb35348aef0c8af136eb6783304b9cd4e6bc
parent86a1938aa56c02d7da137b09e579d24d7da50d9e (diff)
i965: When splitting vector variable assignment, ignore unset channels.
The new checks for sanity in ir_assignment creation got angry about this write_mask == 0. Fixes: glsl-fs-dot-vec2. glsl-fs-atan-2 glsl-fs-dot-vec2
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs_vector_splitting.cpp7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs_vector_splitting.cpp b/src/mesa/drivers/dri/i965/brw_fs_vector_splitting.cpp
index d4da86b3b0..9b58916cf2 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_vector_splitting.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_vector_splitting.cpp
@@ -271,12 +271,15 @@ ir_vector_splitting_visitor::visit_leave(ir_assignment *ir)
void *mem_ctx = lhs ? lhs->mem_ctx : rhs->mem_ctx;
unsigned int writemask;
+ if (!(ir->write_mask & (1 << i)))
+ continue;
+
if (lhs) {
new_lhs = new(mem_ctx) ir_dereference_variable(lhs->components[i]);
- writemask = (ir->write_mask >> i) & 1;
+ writemask = 1;
} else {
new_lhs = ir->lhs->clone(mem_ctx, NULL);
- writemask = ir->write_mask & (1 << i);
+ writemask = 1 << i;
}
if (rhs) {