Mesa (master): vc4: Avoid reusing a pointer from c->outputs[] after add_output().
Eric Anholt
anholt at kemper.freedesktop.org
Thu Nov 13 03:49:39 UTC 2014
Module: Mesa
Branch: master
Commit: b3d269f5ae1844b542d8e875d7177c5eff3a29f2
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b3d269f5ae1844b542d8e875d7177c5eff3a29f2
Author: Eric Anholt <eric at anholt.net>
Date: Wed Nov 12 14:14:32 2014 -0800
vc4: Avoid reusing a pointer from c->outputs[] after add_output().
add_output() can resize the qreg array, so we might use a stale pointer.
---
src/gallium/drivers/vc4/vc4_program.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/src/gallium/drivers/vc4/vc4_program.c b/src/gallium/drivers/vc4/vc4_program.c
index 1cc6e96..ef0d5b8 100644
--- a/src/gallium/drivers/vc4/vc4_program.c
+++ b/src/gallium/drivers/vc4/vc4_program.c
@@ -1822,12 +1822,11 @@ emit_stub_vpm_read(struct vc4_compile *c)
static void
emit_ucp_clipdistance(struct vc4_compile *c)
{
- struct qreg *clipvertex;
-
+ unsigned cv;
if (c->output_clipvertex_index != -1)
- clipvertex = &c->outputs[c->output_clipvertex_index];
+ cv = c->output_clipvertex_index;
else if (c->output_position_index != -1)
- clipvertex = &c->outputs[c->output_position_index];
+ cv = c->output_position_index;
else
return;
@@ -1846,12 +1845,14 @@ emit_ucp_clipdistance(struct vc4_compile *c)
plane,
TGSI_SWIZZLE_X);
+
struct qreg dist = qir_uniform_f(c, 0.0);
for (int i = 0; i < 4; i++) {
+ struct qreg pos_chan = c->outputs[cv + i];
struct qreg ucp =
add_uniform(c, QUNIFORM_USER_CLIP_PLANE,
plane * 4 + i);
- dist = qir_FADD(c, dist, qir_FMUL(c, clipvertex[i], ucp));
+ dist = qir_FADD(c, dist, qir_FMUL(c, pos_chan, ucp));
}
c->outputs[output_index] = dist;
More information about the mesa-commit
mailing list