summaryrefslogtreecommitdiffstats
path: root/src/glsl/opt_vectorize.cpp
diff options
context:
space:
mode:
authorKenneth Graunke <kenneth@whitecape.org>2014-04-08 16:55:23 -0700
committerKenneth Graunke <kenneth@whitecape.org>2014-04-11 12:39:37 -0700
commitae2a03b5736037128fb071595717f300d5b3afd5 (patch)
tree9a3aec47ed45d1bcb20f5b85077f9e5c19e4e556 /src/glsl/opt_vectorize.cpp
parent625cf8c874950a38e7afb404345611f0fad4d490 (diff)
downloadexternal_mesa3d-ae2a03b5736037128fb071595717f300d5b3afd5.zip
external_mesa3d-ae2a03b5736037128fb071595717f300d5b3afd5.tar.gz
external_mesa3d-ae2a03b5736037128fb071595717f300d5b3afd5.tar.bz2
glsl: Try vectorizing when seeing a repeated assignment to a channel.
When considering assignment expressions like: v.x += u.x; v.x += u.x; the vectorizer would incorrectly keep going, attempting to find more instructions to vectorize. It would overwrite the saved assignment to point at the second one, and increment channels a second time, resulting in try_vectorize thinking the expression was a vec2 instead of a float. Instead, if we see a repeated assignment to a channel, just try to vectorize everything we've found so far. This clears the saved state so it will start over. Fixes Piglit's repeated-channel-assignments.vert. Cc: "10.1" <mesa-stable@lists.freedesktop.org> Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Matt Turner <mattst88@gmail.com>
Diffstat (limited to 'src/glsl/opt_vectorize.cpp')
-rw-r--r--src/glsl/opt_vectorize.cpp1
1 files changed, 1 insertions, 0 deletions
diff --git a/src/glsl/opt_vectorize.cpp b/src/glsl/opt_vectorize.cpp
index 3306397..f9a3b61 100644
--- a/src/glsl/opt_vectorize.cpp
+++ b/src/glsl/opt_vectorize.cpp
@@ -260,6 +260,7 @@ ir_vectorize_visitor::visit_enter(ir_assignment *ir)
if (ir->condition ||
this->channels >= 4 ||
!single_channel_write_mask(ir->write_mask) ||
+ this->assignment[write_mask_to_swizzle(ir->write_mask)] != NULL ||
(lhs && !ir->lhs->equals(lhs)) ||
(rhs && !ir->rhs->equals(rhs, ir_type_swizzle))) {
try_vectorize();