[Mesa-dev] [PATCH] draw: don't cull tris with zero aera

sroland at vmware.com sroland at vmware.com
Thu Oct 26 19:24:35 UTC 2017


From: Roland Scheidegger <sroland at vmware.com>

Culling tris with zero aera seems like a great idea, but apparently with
fill mode line (and point) we're supposed to draw them, at least some tests
for some other state tracker complained otherwise.
Such tris also always seem to be back facing (not sure if this can be
inferred from anything, since in a mathematical sense it cannot really be
determined), so make sure to account for this when filling in the face
information.
(For solid tris, this is of course unnecessary, drivers will throw the tris
away later in any case.)
---
 src/gallium/auxiliary/draw/draw_pipe_cull.c     | 10 ++++++++++
 src/gallium/auxiliary/draw/draw_pipe_unfilled.c |  5 ++---
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/src/gallium/auxiliary/draw/draw_pipe_cull.c b/src/gallium/auxiliary/draw/draw_pipe_cull.c
index 3e8e458..3863485 100644
--- a/src/gallium/auxiliary/draw/draw_pipe_cull.c
+++ b/src/gallium/auxiliary/draw/draw_pipe_cull.c
@@ -181,6 +181,16 @@ static void cull_tri( struct draw_stage *stage,
             /* triangle is not culled, pass to next stage */
             stage->next->tri( stage->next, header );
          }
+      } else {
+         /*
+          * With zero aera, this is back facing (because the spec says
+          * it's front facing if sign is positive?).
+          * Some apis apparently do not allow us to cull zero aera tris
+          * here, in case of fill mode line (which is rather lame).
+          */
+         if ((PIPE_FACE_BACK & cull_stage(stage)->cull_face) == 0) {
+            stage->next->tri( stage->next, header );
+         }
       }
    }
 }
diff --git a/src/gallium/auxiliary/draw/draw_pipe_unfilled.c b/src/gallium/auxiliary/draw/draw_pipe_unfilled.c
index c465c75..f39db0e 100644
--- a/src/gallium/auxiliary/draw/draw_pipe_unfilled.c
+++ b/src/gallium/auxiliary/draw/draw_pipe_unfilled.c
@@ -63,10 +63,9 @@ inject_front_face_info(struct draw_stage *stage,
                        struct prim_header *header)
 {
    struct unfilled_stage *unfilled = unfilled_stage(stage);
-   unsigned ccw = header->det < 0.0;
    boolean is_front_face = (
-      (stage->draw->rasterizer->front_ccw && ccw) ||
-      (!stage->draw->rasterizer->front_ccw && !ccw));
+      (stage->draw->rasterizer->front_ccw && header->det < 0.0f) ||
+      (!stage->draw->rasterizer->front_ccw && header->det > 0.0f));
    int slot = unfilled->face_slot;
    unsigned i;
 
-- 
2.7.4



More information about the mesa-dev mailing list