Mesa (main): u_primconvert: Refactor to remove recursion from util_primconvert_draw_vbo

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon May 2 17:43:19 UTC 2022


Module: Mesa
Branch: main
Commit: 12d88d500dae9d67db0c33f316ba327cf5aaed4e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=12d88d500dae9d67db0c33f316ba327cf5aaed4e

Author: Jesse Natalie <jenatali at microsoft.com>
Date:   Tue Apr 26 16:03:16 2022 -0700

u_primconvert: Refactor to remove recursion from util_primconvert_draw_vbo

This prevents having unused copies of pipe_draw_info and
pipe_draw_start_count_bias on the stack, and makes it easier to do
things once for a multi-draw, which will matter in the next patch.

Reviewed-by: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Reviewed-by: Sil Vilerino <sivileri at microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16182>

---

 src/util/indices/u_primconvert.c | 40 +++++++++++++++++++++-------------------
 1 file changed, 21 insertions(+), 19 deletions(-)

diff --git a/src/util/indices/u_primconvert.c b/src/util/indices/u_primconvert.c
index 5d0de366ace..1ee4f39e786 100644
--- a/src/util/indices/u_primconvert.c
+++ b/src/util/indices/u_primconvert.c
@@ -105,7 +105,6 @@ util_primconvert_save_flatshade_first(struct primconvert_context *pc, bool flats
 static bool
 primconvert_init_draw(struct primconvert_context *pc,
                       const struct pipe_draw_info *info,
-                      const struct pipe_draw_indirect_info *indirect,
                       const struct pipe_draw_start_count_bias *draws,
                       struct pipe_draw_info *new_info,
                       struct pipe_draw_start_count_bias *new_draw)
@@ -270,6 +269,23 @@ primconvert_init_draw(struct primconvert_context *pc,
    return true;
 }
 
+static void
+util_primconvert_draw_single_vbo(struct primconvert_context *pc,
+                                 const struct pipe_draw_info *info,
+                                 unsigned drawid_offset,
+                                 const struct pipe_draw_start_count_bias *draw)
+{
+   struct pipe_draw_info new_info;
+   struct pipe_draw_start_count_bias new_draw;
+
+   if (!primconvert_init_draw(pc, info, draw, &new_info, &new_draw))
+      return;
+   /* to the translated draw: */
+   pc->pipe->draw_vbo(pc->pipe, &new_info, drawid_offset, NULL, &new_draw, 1);
+
+   pipe_resource_reference(&new_info.index.resource, NULL);
+}
+
 void
 util_primconvert_draw_vbo(struct primconvert_context *pc,
                           const struct pipe_draw_info *info,
@@ -278,9 +294,6 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
                           const struct pipe_draw_start_count_bias *draws,
                           unsigned num_draws)
 {
-   struct pipe_draw_info new_info;
-   struct pipe_draw_start_count_bias new_draw;
-
    if (indirect && indirect->buffer) {
       /* this is stupid, but we're already doing a readback,
        * so this thing may as well get the rest of the job done
@@ -291,28 +304,17 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
          return;
 
       for (unsigned i = 0; i < draw_count; i++)
-         util_primconvert_draw_vbo(pc, &new_draws[i].info, drawid_offset + i, NULL, &new_draws[i].draw, 1);
+         util_primconvert_draw_single_vbo(pc, &new_draws[i].info, drawid_offset + i, &new_draws[i].draw);
       free(new_draws);
-      return;
-   }
-
-   if (num_draws > 1) {
+   } else {
       unsigned drawid = drawid_offset;
       for (unsigned i = 0; i < num_draws; i++) {
          if (draws[i].count && info->instance_count)
-            util_primconvert_draw_vbo(pc, info, drawid, NULL, &draws[i], 1);
+            util_primconvert_draw_single_vbo(pc, info, drawid, &draws[i]);
          if (info->increment_draw_id)
             drawid++;
       }
-      return;
    }
-
-   if (!primconvert_init_draw(pc, info, indirect, draws, &new_info, &new_draw))
-      return;
-   /* to the translated draw: */
-   pc->pipe->draw_vbo(pc->pipe, &new_info, drawid_offset, NULL, &new_draw, 1);
-
-   pipe_resource_reference(&new_info.index.resource, NULL);
 }
 
 void
@@ -344,7 +346,7 @@ util_primconvert_draw_vertex_state(struct primconvert_context *pc,
    dinfo.index_size = 4;
    dinfo.instance_count = 1;
    dinfo.index.resource = vstate->input.indexbuf;
-   if (!primconvert_init_draw(pc, &dinfo, NULL, draws, &new_info, &new_draw))
+   if (!primconvert_init_draw(pc, &dinfo, draws, &new_info, &new_draw))
       return;
 
    struct pipe_vertex_state *new_state = pc->pipe->screen->create_vertex_state(pc->pipe->screen,



More information about the mesa-commit mailing list