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);
|
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_info *info,
|
||||||
const struct pipe_draw_indirect_info *indirect);
|
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
|
unsigned
|
||||||
util_draw_max_index(
|
util_draw_max_index(
|
||||||
|
Reference in New Issue
Block a user