[Mesa-dev] [PATCH 3/4] draw: simplify prim id insertion in prim assembler

sroland at vmware.com sroland at vmware.com
Mon Dec 1 17:31:09 PST 2014


From: Roland Scheidegger <sroland at vmware.com>

Because all topologies are reduced to basic primitives (i.e. no strips, fans)
and the vertices involved are all copied, there's no need for any elaborate
decisions where to insert the prim id. This looked especially broken for tri
strips with last provoking vertex, where it seems it would end up without
even assigning a prim id to the right (last) vertex in all cases.
So just get rid of all the logic and insert it everywhere even though it's
overkill (3x4 values assigned in total instead of just 1...).
---
 src/gallium/auxiliary/draw/draw_prim_assembler.c | 39 +++---------------------
 1 file changed, 5 insertions(+), 34 deletions(-)

diff --git a/src/gallium/auxiliary/draw/draw_prim_assembler.c b/src/gallium/auxiliary/draw/draw_prim_assembler.c
index 5cb19f5..776c172 100644
--- a/src/gallium/auxiliary/draw/draw_prim_assembler.c
+++ b/src/gallium/auxiliary/draw/draw_prim_assembler.c
@@ -50,8 +50,6 @@ struct draw_assembler
    int primid_slot;
    unsigned primid;
 
-   boolean is_strip;
-   boolean is_first_prim;
    unsigned num_prims;
 };
 
@@ -154,16 +152,8 @@ prim_line(struct draw_assembler *asmblr,
    unsigned indices[2];
 
    if (asmblr->needs_primid) {
-      if (asmblr->is_strip && asmblr->is_first_prim) {
-         inject_primid(asmblr, i0, asmblr->primid++);
-         inject_primid(asmblr, i1, asmblr->primid++);
-         asmblr->is_first_prim = FALSE;
-      } else if (asmblr->is_strip) {
-            inject_primid(asmblr, i1, asmblr->primid++);
-      } else {
-         inject_primid(asmblr, i0, asmblr->primid);
-         inject_primid(asmblr, i1, asmblr->primid++);
-      }
+      inject_primid(asmblr, i0, asmblr->primid);
+      inject_primid(asmblr, i1, asmblr->primid++);
    }
    indices[0] = i0;
    indices[1] = i1;
@@ -178,22 +168,9 @@ prim_tri(struct draw_assembler *asmblr,
    unsigned indices[3];
 
    if (asmblr->needs_primid) {
-      if (asmblr->is_strip && asmblr->is_first_prim) {
-         inject_primid(asmblr, i0, asmblr->primid++);
-         inject_primid(asmblr, i1, asmblr->primid++);
-         inject_primid(asmblr, i2, asmblr->primid++);
-         asmblr->is_first_prim = FALSE;
-      } else if (asmblr->is_strip) {
-         if (asmblr->num_prims & 1) {
-            inject_primid(asmblr, i1, asmblr->primid++);
-         } else {
-            inject_primid(asmblr, i2, asmblr->primid++);
-         }
-      } else {
-         inject_primid(asmblr, i0, asmblr->primid);
-         inject_primid(asmblr, i1, asmblr->primid);
-         inject_primid(asmblr, i2, asmblr->primid++);
-      }
+      inject_primid(asmblr, i0, asmblr->primid);
+      inject_primid(asmblr, i1, asmblr->primid);
+      inject_primid(asmblr, i2, asmblr->primid++);
    }
    indices[0] = i0;
    indices[1] = i1;
@@ -255,13 +232,7 @@ draw_prim_assembler_run(struct draw_context *draw,
    asmblr->output_verts = output_verts;
    asmblr->input_prims = input_prims;
    asmblr->input_verts = input_verts;
-   asmblr->is_strip =
-      (input_prims->prim == PIPE_PRIM_TRIANGLE_STRIP ||
-       input_prims->prim == PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY) ||
-      (input_prims->prim == PIPE_PRIM_LINE_STRIP ||
-       input_prims->prim == PIPE_PRIM_LINE_STRIP_ADJACENCY);
    asmblr->needs_primid = needs_primid(asmblr->draw);
-   asmblr->is_first_prim = asmblr->is_strip;
    asmblr->primid = 0;
    asmblr->num_prims = 0;
 
-- 
1.9.1



More information about the mesa-dev mailing list