Mesa (glsl2): ir_to_mesa: Fix sparse swizzling of src regs when a writemask is present.
Eric Anholt
anholt at kemper.freedesktop.org
Fri Jul 2 21:09:26 UTC 2010
Module: Mesa
Branch: glsl2
Commit: cab95c228b12f0fc568164d57475c561c8d6053e
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=cab95c228b12f0fc568164d57475c561c8d6053e
Author: Eric Anholt <eric at anholt.net>
Date: Fri Jul 2 14:06:34 2010 -0700
ir_to_mesa: Fix sparse swizzling of src regs when a writemask is present.
Fixes glsl-fs-texture2d-masked.
---
src/mesa/shader/ir_to_mesa.cpp | 26 ++++++++++++++++++++++++++
1 files changed, 26 insertions(+), 0 deletions(-)
diff --git a/src/mesa/shader/ir_to_mesa.cpp b/src/mesa/shader/ir_to_mesa.cpp
index 11fb7b9..59268e6 100644
--- a/src/mesa/shader/ir_to_mesa.cpp
+++ b/src/mesa/shader/ir_to_mesa.cpp
@@ -1175,6 +1175,29 @@ get_assignment_lhs(ir_instruction *ir, ir_to_mesa_visitor *v)
return dst_reg;
}
+static GLuint
+reswizzle_for_writemask(GLuint writemask, GLuint swizzle)
+{
+ int new_swizzle[4], pos = 0;
+ int i;
+
+ /* reswizzle the rhs so the components are in place for the
+ * components we'll assign to the lhs.
+ */
+ for (i = 0; i < 4; i++) {
+ if (writemask & (1 << i)) {
+ new_swizzle[i] = GET_SWZ(swizzle, pos++);
+ } else {
+ new_swizzle[i] = GET_SWZ(swizzle, 0);
+ }
+ }
+
+ return MAKE_SWIZZLE4(new_swizzle[0],
+ new_swizzle[1],
+ new_swizzle[2],
+ new_swizzle[3]);
+}
+
void
ir_to_mesa_visitor::visit(ir_assignment *ir)
{
@@ -1189,6 +1212,9 @@ ir_to_mesa_visitor::visit(ir_assignment *ir)
ir->rhs->accept(this);
r = this->result;
+
+ r.swizzle = reswizzle_for_writemask(l.writemask, r.swizzle);
+
assert(l.file != PROGRAM_UNDEFINED);
assert(r.file != PROGRAM_UNDEFINED);
More information about the mesa-commit
mailing list