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