From: Roland Scheidegger Date: Thu, 17 May 2018 01:45:02 +0000 (+0200) Subject: draw: get rid of special logic to not emit null tris X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6f558fb0f79d88eb1749740e8bddb7e8b313fdf4;p=mesa.git draw: get rid of special logic to not emit null tris 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). Reviewed-by: Jose Fonseca --- diff --git a/src/gallium/auxiliary/draw/draw_pipe_clip.c b/src/gallium/auxiliary/draw/draw_pipe_clip.c index 46118b6e67d..2a9c944dc1e 100644 --- a/src/gallium/auxiliary/draw/draw_pipe_clip.c +++ b/src/gallium/auxiliary/draw/draw_pipe_clip.c @@ -209,30 +209,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; }