aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary/draw
diff options
context:
space:
mode:
authorRoland Scheidegger <[email protected]>2014-08-06 03:40:31 +0200
committerRoland Scheidegger <[email protected]>2014-08-06 18:01:33 +0200
commit6e9005e8b0e72e7a29cd9700d3bcb2459922c01e (patch)
treea563d46fd4680c2bee8d8dcdb3c7e7bfb873b885 /src/gallium/auxiliary/draw
parent11bd6f0e9b348b67f73f39dfd2b8b6b9a8452bc4 (diff)
draw: fix clipvertex trouble if position comes from gs
If the vertex shader has no position but the gs has, the clipvertex output was -1 (because it's the same as vs position in this case if there's no explicit clipvertex output). This caused crashes (or assertion failures) in clipping since in the end position (which came from gs) was different from cv (-1) and we then tried to use the bogus cv input. Rather than just test for -1 cv value in clipping, make it explicitly return the position output of the gs instead which seems cleaner (since we really don't want to use the clipvertex value from the vs (it could be a valid value in the (unsupported) case of vs writing clipvertex but still using a gs). This fixes piglit shader_runner clip-distance-out-values.shader_test. Reviewed-by: Zack Rusin <[email protected]>
Diffstat (limited to 'src/gallium/auxiliary/draw')
-rw-r--r--src/gallium/auxiliary/draw/draw_context.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/gallium/auxiliary/draw/draw_context.c b/src/gallium/auxiliary/draw/draw_context.c
index d7197fd9933..001446f8e5a 100644
--- a/src/gallium/auxiliary/draw/draw_context.c
+++ b/src/gallium/auxiliary/draw/draw_context.c
@@ -818,11 +818,15 @@ draw_current_shader_uses_viewport_index(const struct draw_context *draw)
/**
* Return the index of the shader output which will contain the
- * vertex position.
+ * clip vertex position.
+ * Note we don't support clipvertex output in the gs. For clipping
+ * to work correctly hence we return ordinary position output instead.
*/
uint
draw_current_shader_clipvertex_output(const struct draw_context *draw)
{
+ if (draw->gs.geometry_shader)
+ return draw->gs.position_output;
return draw->vs.clipvertex_output;
}