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:
@@ -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++;
|
||||
}
|
||||
}
|
||||
|
@@ -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(
|
||||
|
Reference in New Issue
Block a user