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