summaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary/draw
diff options
context:
space:
mode:
authorRoland Scheidegger <sroland@vmware.com>2014-01-21 17:47:08 +0100
committerRoland Scheidegger <sroland@vmware.com>2014-01-21 17:49:02 +0100
commite23e4f67bed51a8dfd182eae6c7e8e23a7d2cb0e (patch)
tree0d29ffd683c4e81212bca8d643bf17c873a4da1d /src/gallium/auxiliary/draw
parentad04e396faaddce926ee1146f0da12b30aee7b87 (diff)
downloadexternal_mesa3d-e23e4f67bed51a8dfd182eae6c7e8e23a7d2cb0e.zip
external_mesa3d-e23e4f67bed51a8dfd182eae6c7e8e23a7d2cb0e.tar.gz
external_mesa3d-e23e4f67bed51a8dfd182eae6c7e8e23a7d2cb0e.tar.bz2
draw: fix points with negative w coords for d3d style point clipping
Even with depth clipping disabled, vertices which have negative w coords must be discarded. And since we don't have a proper guardband implementation yet (relying on driver to handle all values except infs/nans in rasterization for such points) we need to kill them off manually (as they can end up with coordinates inside viewport otherwise). v2: use 0.0f instead of 0 (spotted by Brian). Reviewed-by: Jose Fonseca <jfonseca@vmware.com> Reviewed-by: Brian Paul <brianp@vmware.com>
Diffstat (limited to 'src/gallium/auxiliary/draw')
-rw-r--r--src/gallium/auxiliary/draw/draw_pipe_clip.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/gallium/auxiliary/draw/draw_pipe_clip.c b/src/gallium/auxiliary/draw/draw_pipe_clip.c
index 8bdb882..de354e9 100644
--- a/src/gallium/auxiliary/draw/draw_pipe_clip.c
+++ b/src/gallium/auxiliary/draw/draw_pipe_clip.c
@@ -635,8 +635,13 @@ clip_point_guard_xy( struct draw_stage *stage,
clipmask &= ~(1 << plane_idx); /* turn off this plane's bit */
/* TODO: this should really do proper guardband clipping,
* currently just throw out infs/nans.
+ * Also note that vertices with negative w values MUST be tossed
+ * out (not sure if proper guardband clipping would do this
+ * automatically). These would usually be captured by depth clip
+ * too but this can be disabled.
*/
- if (util_is_inf_or_nan(header->v[0]->clip[0]) ||
+ if (header->v[0]->clip[3] <= 0.0f ||
+ util_is_inf_or_nan(header->v[0]->clip[0]) ||
util_is_inf_or_nan(header->v[0]->clip[1]))
return;
}
@@ -645,7 +650,6 @@ clip_point_guard_xy( struct draw_stage *stage,
}
-
static void
clip_first_point( struct draw_stage *stage,
struct prim_header *header )