Mesa (master): u_draw: Add helper to emultate multi-draw

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Mar 20 20:42:51 UTC 2021


Module: Mesa
Branch: master
Commit: 27ab249c9a2097c0c38e179ee47f8472a9c37a7c
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=27ab249c9a2097c0c38e179ee47f8472a9c37a7c

Author: Rob Clark <robdclark at chromium.org>
Date:   Thu Mar 18 10:48:41 2021 -0700

u_draw: Add helper to emultate multi-draw

No need to duplicate this in every driver.

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

---

 src/gallium/auxiliary/util/u_draw.c | 21 +++++++++++++++++++++
 src/gallium/auxiliary/util/u_draw.h |  8 ++++++++
 2 files changed, 29 insertions(+)

diff --git a/src/gallium/auxiliary/util/u_draw.c b/src/gallium/auxiliary/util/u_draw.c
index c4f8cec53e1..6133896bf70 100644
--- a/src/gallium/auxiliary/util/u_draw.c
+++ b/src/gallium/auxiliary/util/u_draw.c
@@ -191,3 +191,24 @@ util_draw_indirect(struct pipe_context *pipe,
    }
    pipe_buffer_unmap(pipe, transfer);
 }
+
+void
+util_draw_multi(struct pipe_context *pctx, const struct pipe_draw_info *info,
+                const struct pipe_draw_indirect_info *indirect,
+                const struct pipe_draw_start_count *draws,
+                unsigned num_draws)
+{
+   struct pipe_draw_info tmp_info = *info;
+
+   /* If you call this with num_draws==1, that is probably going to be
+    * an infinite loop
+    */
+   assert(num_draws > 1);
+
+   for (unsigned i = 0; i < num_draws; i++) {
+      if (indirect || (draws[i].count && info->instance_count))
+         pctx->draw_vbo(pctx, &tmp_info, indirect, &draws[i], 1);
+      if (tmp_info.increment_draw_id)
+         tmp_info.drawid++;
+   }
+}
diff --git a/src/gallium/auxiliary/util/u_draw.h b/src/gallium/auxiliary/util/u_draw.h
index f05d49592fc..6f8601f900d 100644
--- a/src/gallium/auxiliary/util/u_draw.h
+++ b/src/gallium/auxiliary/util/u_draw.h
@@ -155,6 +155,14 @@ util_draw_indirect(struct pipe_context *pipe,
                    const struct pipe_draw_info *info,
                    const struct pipe_draw_indirect_info *indirect);
 
+/* Helper to handle multi-draw by splitting into individual draws.  You
+ * don't want to call this if num_draws==1
+ */
+void
+util_draw_multi(struct pipe_context *pctx, const struct pipe_draw_info *info,
+                const struct pipe_draw_indirect_info *indirect,
+                const struct pipe_draw_start_count *draws,
+                unsigned num_draws);
 
 unsigned
 util_draw_max_index(



More information about the mesa-commit mailing list