Mesa (main): aux/primconvert: break out primconvert internals into util function

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Nov 12 03:08:16 UTC 2021


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Fri Nov  5 11:56:22 2021 -0400

aux/primconvert: break out primconvert internals into util function

this should (ideally) be no functional changes

Reviewed-by: Rob Clark <robdclark at chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13742>

---

 src/gallium/auxiliary/indices/u_primconvert.c | 162 ++++++++++++++------------
 1 file changed, 88 insertions(+), 74 deletions(-)

diff --git a/src/gallium/auxiliary/indices/u_primconvert.c b/src/gallium/auxiliary/indices/u_primconvert.c
index 5ce8dddfa1f..30da20ddb63 100644
--- a/src/gallium/auxiliary/indices/u_primconvert.c
+++ b/src/gallium/auxiliary/indices/u_primconvert.c
@@ -102,16 +102,14 @@ util_primconvert_save_flatshade_first(struct primconvert_context *pc, bool flats
    pc->api_pv = flatshade_first ? PV_FIRST : PV_LAST;
 }
 
-void
-util_primconvert_draw_vbo(struct primconvert_context *pc,
-                          const struct pipe_draw_info *info,
-                          unsigned drawid_offset,
-                          const struct pipe_draw_indirect_info *indirect,
-                          const struct pipe_draw_start_count_bias *draws,
-                          unsigned num_draws)
+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)
 {
-   struct pipe_draw_info new_info;
-   struct pipe_draw_start_count_bias new_draw;
    struct pipe_draw_start_count_bias *direct_draws = NULL;
    unsigned num_direct_draws = 0;
    struct pipe_transfer *src_transfer = NULL;
@@ -123,32 +121,6 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
    unsigned total_index_count = draws->count;
    void *rewrite_buffer = NULL;
 
-   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
-       */
-      unsigned draw_count = 0;
-      struct u_indirect_params *new_draws = util_draw_indirect_read(pc->pipe, info, indirect, &draw_count);
-      if (!new_draws)
-         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);
-      free(new_draws);
-      return;
-   }
-
-   if (num_draws > 1) {
-      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);
-         if (info->increment_draw_id)
-            drawid++;
-      }
-      return;
-   }
-
    const struct pipe_draw_start_count_bias *draw = &draws[0];
 
    /* Filter out degenerate primitives, u_upload_alloc() will assert
@@ -156,20 +128,20 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
     */
    if (!info->primitive_restart &&
        !u_trim_pipe_prim(info->mode, (unsigned*)&draw->count))
-      return;
+      return false;
 
-   util_draw_init_info(&new_info);
-   new_info.index_bounds_valid = info->index_bounds_valid;
-   new_info.min_index = info->min_index;
-   new_info.max_index = info->max_index;
-   new_info.start_instance = info->start_instance;
-   new_info.instance_count = info->instance_count;
-   new_info.primitive_restart = info->primitive_restart;
-   new_info.restart_index = info->restart_index;
+   util_draw_init_info(new_info);
+   new_info->index_bounds_valid = info->index_bounds_valid;
+   new_info->min_index = info->min_index;
+   new_info->max_index = info->max_index;
+   new_info->start_instance = info->start_instance;
+   new_info->instance_count = info->instance_count;
+   new_info->primitive_restart = info->primitive_restart;
+   new_info->restart_index = info->restart_index;
    if (info->index_size) {
-      enum pipe_prim_type mode = new_info.mode = u_index_prim_type_convert(pc->cfg.primtypes_mask, info->mode, true);
+      enum pipe_prim_type mode = new_info->mode = u_index_prim_type_convert(pc->cfg.primtypes_mask, info->mode, true);
       unsigned index_size = info->index_size;
-      new_info.index_size = u_index_size_convert(info->index_size);
+      new_info->index_size = u_index_size_convert(info->index_size);
 
       src = info->has_user_indices ? info->index.user : NULL;
       if (!src) {
@@ -189,8 +161,8 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
           *         this pre-filters degenerate primitives
           */
          direct_draws = util_prim_restart_convert_to_direct(src, info, draw, &num_direct_draws,
-                                                            &new_info.min_index, &new_info.max_index, &total_index_count);
-         new_info.primitive_restart = false;
+                                                            &new_info->min_index, &new_info->max_index, &total_index_count);
+         new_info->primitive_restart = false;
          /* step 2: get a translator function which does nothing but handle any index size conversions
           * which may or may not occur (8bit -> 16bit)
           */
@@ -198,10 +170,10 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
                             info->mode, index_size, total_index_count,
                             pc->api_pv, pc->api_pv,
                             PR_DISABLE,
-                            &mode, &index_size, &new_draw.count,
+                            &mode, &index_size, &new_draw->count,
                             &direct_draw_func);
          /* this should always be a direct translation */
-         assert(new_draw.count == total_index_count);
+         assert(new_draw->count == total_index_count);
          /* step 3: allocate a temp buffer for an intermediate rewrite step
           *         if no indices were found, this was a single incomplete restart and can be discarded
           */
@@ -210,18 +182,18 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
          if (!rewrite_buffer) {
             if (src_transfer)
                pipe_buffer_unmap(pc->pipe, src_transfer);
-            return;
+            return false;
          }
       }
       /* (step 4: get the actual primitive conversion translator function) */
       u_index_translator(pc->cfg.primtypes_mask,
                          info->mode, index_size, total_index_count,
                          pc->api_pv, pc->api_pv,
-                         new_info.primitive_restart ? PR_ENABLE : PR_DISABLE,
-                         &mode, &index_size, &new_draw.count,
+                         new_info->primitive_restart ? PR_ENABLE : PR_DISABLE,
+                         &mode, &index_size, &new_draw->count,
                          &trans_func);
-      assert(new_info.mode == mode);
-      assert(new_info.index_size == index_size);
+      assert(new_info->mode == mode);
+      assert(new_info->index_size == index_size);
    }
    else {
       enum pipe_prim_type mode = 0;
@@ -230,17 +202,17 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
       u_index_generator(pc->cfg.primtypes_mask,
                         info->mode, draw->start, draw->count,
                         pc->api_pv, pc->api_pv,
-                        &mode, &index_size, &new_draw.count,
+                        &mode, &index_size, &new_draw->count,
                         &gen_func);
-      new_info.mode = mode;
-      new_info.index_size = index_size;
+      new_info->mode = mode;
+      new_info->index_size = index_size;
    }
 
    /* (step 5: allocate gpu memory sized for the FINAL index count) */
-   u_upload_alloc(pc->pipe->stream_uploader, 0, new_info.index_size * new_draw.count, 4,
-                  &ib_offset, &new_info.index.resource, &dst);
-   new_draw.start = ib_offset / new_info.index_size;
-   new_draw.index_bias = info->index_size ? draw->index_bias : 0;
+   u_upload_alloc(pc->pipe->stream_uploader, 0, new_info->index_size * new_draw->count, 4,
+                  &ib_offset, &new_info->index.resource, &dst);
+   new_draw->start = ib_offset / new_info->index_size;
+   new_draw->index_bias = info->index_size ? draw->index_bias : 0;
 
    if (info->index_size) {
       if (num_direct_draws) {
@@ -260,24 +232,24 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
             /* step 6c: handle the primitive type conversion rewriting to the converted index count */
             trans_func(ptr, 0, direct_draws[i].count, tmp_count, info->restart_index, dst_ptr);
             /* step 6d: increment the temp buffer and mapped final index buffer pointers */
-            ptr += new_info.index_size * direct_draws[i].count;
-            dst_ptr += new_info.index_size * tmp_count;
+            ptr += new_info->index_size * direct_draws[i].count;
+            dst_ptr += new_info->index_size * tmp_count;
          }
          /* step 7: set the final index count, which is the converted total index count from the original draw rewrite */
-         new_draw.count = u_index_count_converted_indices(pc->cfg.primtypes_mask, true, info->mode, total_index_count);
+         new_draw->count = u_index_count_converted_indices(pc->cfg.primtypes_mask, true, info->mode, total_index_count);
       } else
-         trans_func(src, draw->start, draw->count, new_draw.count, info->restart_index, dst);
+         trans_func(src, draw->start, draw->count, new_draw->count, info->restart_index, dst);
 
-      if (pc->cfg.fixed_prim_restart && new_info.primitive_restart) {
-         new_info.restart_index = (1ull << (new_info.index_size * 8)) - 1;
-         if (info->restart_index != new_info.restart_index)
-            util_translate_prim_restart_data(new_info.index_size, dst, dst,
-                                             new_draw.count,
+      if (pc->cfg.fixed_prim_restart && new_info->primitive_restart) {
+         new_info->restart_index = (1ull << (new_info->index_size * 8)) - 1;
+         if (info->restart_index != new_info->restart_index)
+            util_translate_prim_restart_data(new_info->index_size, dst, dst,
+                                             new_draw->count,
                                              info->restart_index);
       }
    }
    else {
-      gen_func(draw->start, new_draw.count, dst);
+      gen_func(draw->start, new_draw->count, dst);
    }
 
    if (src_transfer)
@@ -285,10 +257,52 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
 
    u_upload_unmap(pc->pipe->stream_uploader);
 
-   /* to the translated draw: */
-   pc->pipe->draw_vbo(pc->pipe, &new_info, drawid_offset, NULL, &new_draw, 1);
    free(direct_draws);
    free(rewrite_buffer);
+   return true;
+}
+
+void
+util_primconvert_draw_vbo(struct primconvert_context *pc,
+                          const struct pipe_draw_info *info,
+                          unsigned drawid_offset,
+                          const struct pipe_draw_indirect_info *indirect,
+                          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
+       */
+      unsigned draw_count = 0;
+      struct u_indirect_params *new_draws = util_draw_indirect_read(pc->pipe, info, indirect, &draw_count);
+      if (!new_draws)
+         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);
+      free(new_draws);
+      return;
+   }
+
+   if (num_draws > 1) {
+      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);
+         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);
 }



More information about the mesa-commit mailing list