draw: fix points with negative w coords for d3d style point clipping
authorRoland Scheidegger <sroland@vmware.com>
Tue, 21 Jan 2014 16:47:08 +0000 (17:47 +0100)
committerRoland Scheidegger <sroland@vmware.com>
Tue, 21 Jan 2014 16:49:02 +0000 (17:49 +0100)
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>
src/gallium/auxiliary/draw/draw_pipe_clip.c

index 8bdb882218b0f935e19a6340924bb7e07e200d64..de354e9e9da597b8da4c4441f17fec98c8c349a8 100644 (file)
@@ -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 )