u_draw: Add helper to emultate multi-draw

No need to duplicate this in every driver.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9581>
This commit is contained in:
Rob Clark
2021-03-18 10:48:41 -07:00
parent 7b1505d165
commit 27ab249c9a
2 changed files with 29 additions and 0 deletions

View File

@@ -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++;
}
}

View File

@@ -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(