ir_to_mesa: Fix sparse swizzling of src regs when a writemask is present.
authorEric Anholt <eric@anholt.net>
Fri, 2 Jul 2010 21:06:34 +0000 (14:06 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 2 Jul 2010 21:08:20 +0000 (14:08 -0700)
Fixes glsl-fs-texture2d-masked.

src/mesa/shader/ir_to_mesa.cpp

index 11fb7b9f16af1c747436c9fe58c490896643abc1..59268e6d17647c3737c93a88b672be624580a2ef 100644 (file)
@@ -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);