[Mesa-dev] [PATCH] draw: get rid of special logic to not emit null tris

sroland at vmware.com sroland at vmware.com
Thu May 17 16:30:26 UTC 2018


From: Roland Scheidegger <sroland at vmware.com>

I've confirmed after 77554d220d6d74b4d913dc37ea3a874e9dc550e4 we no
longer need this to pass some tests from another api (as we no longer
generate the bogus extra null tris in the first place).
---
 src/gallium/auxiliary/draw/draw_pipe_clip.c | 38 -----------------------------
 1 file changed, 38 deletions(-)

diff --git a/src/gallium/auxiliary/draw/draw_pipe_clip.c b/src/gallium/auxiliary/draw/draw_pipe_clip.c
index 46118b6..2a9c944 100644
--- a/src/gallium/auxiliary/draw/draw_pipe_clip.c
+++ b/src/gallium/auxiliary/draw/draw_pipe_clip.c
@@ -210,30 +210,6 @@ static void interp(const struct clip_stage *clip,
 }
 
 /**
- * Checks whether the specified triangle is empty and if it is returns
- * true, otherwise returns false.
- * Triangle is considered null/empty if its area is equal to zero.
- */
-static inline boolean
-is_tri_null(const struct clip_stage *clip, const struct prim_header *header)
-{
-   const unsigned pos_attr = clip->pos_attr;
-   float x1 = header->v[1]->data[pos_attr][0] - header->v[0]->data[pos_attr][0];
-   float y1 = header->v[1]->data[pos_attr][1] - header->v[0]->data[pos_attr][1];
-   float z1 = header->v[1]->data[pos_attr][2] - header->v[0]->data[pos_attr][2];
-
-   float x2 = header->v[2]->data[pos_attr][0] - header->v[0]->data[pos_attr][0];
-   float y2 = header->v[2]->data[pos_attr][1] - header->v[0]->data[pos_attr][1];
-   float z2 = header->v[2]->data[pos_attr][2] - header->v[0]->data[pos_attr][2];
-
-   float vx = y1 * z2 - z1 * y2;
-   float vy = x1 * z2 - z1 * x2;
-   float vz = x1 * y2 - y1 * x2;
-
-   return (vx*vx  + vy*vy + vz*vz) == 0.f;
-}
-
-/**
  * Emit a post-clip polygon to the next pipeline stage.  The polygon
  * will be convex and the provoking vertex will always be vertex[0].
  */
@@ -247,7 +223,6 @@ static void emit_poly(struct draw_stage *stage,
    struct prim_header header;
    unsigned i;
    ushort edge_first, edge_middle, edge_last;
-   boolean tri_emitted = FALSE;
 
    if (stage->draw->rasterizer->flatshade_first) {
       edge_first  = DRAW_PIPE_EDGE_FLAG_0;
@@ -269,7 +244,6 @@ static void emit_poly(struct draw_stage *stage,
    header.pad = 0;
 
    for (i = 2; i < n; i++, header.flags = edge_middle) {
-      boolean tri_null;
       /* order the triangle verts to respect the provoking vertex mode */
       if (stage->draw->rasterizer->flatshade_first) {
          header.v[0] = inlist[0];  /* the provoking vertex */
@@ -282,18 +256,6 @@ static void emit_poly(struct draw_stage *stage,
          header.v[2] = inlist[0];  /* the provoking vertex */
       }
 
-      tri_null = is_tri_null(clipper, &header);
-      /*
-       * If we ever generated a tri (regardless if it had area or not),
-       * skip all subsequent null tris.
-       * FIXME: I think this logic was hiding bugs elsewhere. It should
-       * be possible now to always emit all tris.
-       */
-      if (tri_null && tri_emitted) {
-         continue;
-      }
-      tri_emitted = TRUE;
-
       if (!edgeflags[i-1]) {
          header.flags &= ~edge_middle;
       }
-- 
2.7.4



More information about the mesa-dev mailing list