Mesa (master): vc4: Fix handling of non-XYZW swizzles in color outputs.

Eric Anholt anholt at kemper.freedesktop.org
Mon Aug 18 22:28:04 UTC 2014


Module: Mesa
Branch: master
Commit: 489350e5701a4a0855e622fa12fbf3700101c5d7
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=489350e5701a4a0855e622fa12fbf3700101c5d7

Author: Eric Anholt <eric at anholt.net>
Date:   Mon Aug 18 11:23:04 2014 -0700

vc4: Fix handling of non-XYZW swizzles in color outputs.

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 |   12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/vc4/vc4_program.c b/src/gallium/drivers/vc4/vc4_program.c
index a072043..f64bc06 100644
--- a/src/gallium/drivers/vc4/vc4_program.c
+++ b/src/gallium/drivers/vc4/vc4_program.c
@@ -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,




More information about the mesa-commit mailing list