vc4: Fix handling of non-XYZW swizzles in color outputs.
authorEric Anholt <eric@anholt.net>
Mon, 18 Aug 2014 18:23:04 +0000 (11:23 -0700)
committerEric Anholt <eric@anholt.net>
Mon, 18 Aug 2014 22:27:43 +0000 (15:27 -0700)
The SWIZZLE_1 of the winsys destination was dereffing off the end of the
array, which surprisingly often worked out (since nobody reads the
rendered value anyway, so whatever junk was referenced in the QIR didn't
matter), but shader dumping would sometimes segfault.

src/gallium/drivers/vc4/vc4_program.c

index a072043b38d8c65f646e93ce3e3c176f7080cd9d..f64bc06f907cbfe02822058c1db8279322d1991c 100644 (file)
@@ -967,12 +967,12 @@ emit_frag_end(struct tgsi_to_qir *trans)
                 blend_color[3] = qir_uniform_f(trans, 0.5);
         }
 
-        struct qreg swizzled_outputs[4] = {
-                blend_color[format_desc->swizzle[0]],
-                blend_color[format_desc->swizzle[1]],
-                blend_color[format_desc->swizzle[2]],
-                blend_color[format_desc->swizzle[3]],
-        };
+        struct qreg swizzled_outputs[4];
+        for (int i = 0; i < 4; i++) {
+                swizzled_outputs[i] =
+                        get_swizzled_channel(trans, blend_color,
+                                             format_desc->swizzle[i]);
+        }
 
         if (trans->fs_key->depth_enabled) {
                 qir_emit(c, qir_inst(QOP_TLB_PASSTHROUGH_Z_WRITE, c->undef,