diff options
author | Eric Anholt <eric@anholt.net> | 2010-09-22 14:40:40 -0700 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2010-09-22 14:55:58 -0700 |
commit | ac3d5beb0b20eb369b188aaf7b78f935969f3b62 (patch) | |
tree | 08a9eb35348aef0c8af136eb6783304b9cd4e6bc | |
parent | 86a1938aa56c02d7da137b09e579d24d7da50d9e (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.cpp | 7 |
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) { |