From 27ab249c9a2097c0c38e179ee47f8472a9c37a7c Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Thu, 18 Mar 2021 10:48:41 -0700 Subject: [PATCH] u_draw: Add helper to emultate multi-draw No need to duplicate this in every driver. Signed-off-by: Rob Clark Part-of: --- 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(