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

Dieter Nützel Dieter at nuetzel-hh.de
Fri May 18 03:48:09 UTC 2018


Tested-by: Dieter Nützel <Dieter at nuetzel-hh.de>

on RX580

with UH, UV, glmark2, Blender 2.79, FreeCAD 0.17, Gimp 2.10, digikam 
5.9.0, Krita 4.0.3 and some Mesa-demos

Dieter

Am 17.05.2018 18:30, schrieb sroland at vmware.com:
> 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;
>        }


More information about the mesa-dev mailing list