diff options
author | Paul Berry <[email protected]> | 2013-11-22 12:37:22 -0800 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2013-11-26 21:04:52 -0800 |
commit | 444a621e55044f4d44efb98b76cb4ce1bde47da4 (patch) | |
tree | b14ae224a6888276a32b9d359a8bfea691bc46b9 /src/glsl/linker.cpp | |
parent | 756b4f9a8c657c4ba93a0a082bd77a9c3390c11e (diff) |
glsl: Fix lowering of direct assignment in lower_clip_distance.
In commit 065da16 (glsl: Convert lower_clip_distance_visitor to be an
ir_rvalue_visitor), we failed to notice that since
lower_clip_distance_visitor overrides visit_leave(ir_assignment *),
ir_rvalue_visitor::visit_leave(ir_assignment *) wasn't getting called.
As a result, clip distance dereferences appearing directly on the
right hand side of an assignment (not in a subexpression) weren't
getting properly lowered. This caused an ir_dereference_variable node
to be left in the IR that referred to the old gl_ClipDistance
variable. However, since the lowering pass replaces gl_ClipDistance
with gl_ClipDistanceMESA, this turned into a dangling pointer when the
IR got reparented.
Prior to the introduction of geometry shaders, this bug was unlikely
to arise, because (a) reading from gl_ClipDistance[i] in the fragment
shader was rare, and (b) when it happened, it was likely that it would
either appear in a subexpression, or be hoisted into a subexpression
by tree grafting.
However, in a geometry shader, we're likely to see a statement like
this, which would trigger the bug:
gl_ClipDistance[i] = gl_in[j].gl_ClipDistance[i];
This patch causes
lower_clip_distance_visitor::visit_leave(ir_assignment *) to call the
base class visitor, so that the right hand side of the assignment is
properly lowered.
Fixes piglit test:
- spec/glsl-1.50/execution/geometry/clip-distance-itemized-copy
Cc: Ian Romanick <[email protected]>
Cc: "9.2" <[email protected]>
Cc: "10.0" <[email protected]>
Reviewed-by: Eric Anholt <[email protected]>
Reviewed-by: Ian Romanick <[email protected]>
(cherry picked from commit 9dfcb05fa649ee7a573eab3d16851ebd4cb96010)
Diffstat (limited to 'src/glsl/linker.cpp')
0 files changed, 0 insertions, 0 deletions