freedreno: Handle multi-draw edge cases

Use the multi-draw emulation helper in the edge cases where we don't
handle multi-draw.

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-14 11:38:13 -07:00
parent 5765932375
commit 68e752652c

View file

@ -267,9 +267,6 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info,
return;
}
if (!indirect && (!draws[0].count || !info->instance_count))
return;
struct fd_context *ctx = fd_context(pctx);
/* for debugging problems with indirect draw, it is convenient
@ -277,6 +274,10 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info,
* bogus data:
*/
if (indirect && indirect->buffer && FD_DBG(NOINDR)) {
if (num_draws > 1) {
util_draw_multi(pctx, info, indirect, draws, num_draws);
return;
}
util_draw_indirect(pctx, info, indirect);
return;
}
@ -287,6 +288,11 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info,
/* emulate unsupported primitives: */
if (!fd_supported_prim(ctx, info->mode)) {
if (num_draws > 1) {
util_draw_multi(pctx, info, indirect, draws, num_draws);
return;
}
if (!indirect && !info->primitive_restart &&
!u_trim_pipe_prim(info->mode, (unsigned*)&draws[0].count))
return;
@ -304,6 +310,10 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info,
struct pipe_draw_info new_info;
if (info->index_size) {
if (info->has_user_indices) {
if (num_draws > 1) {
util_draw_multi(pctx, info, indirect, draws, num_draws);
return;
}
if (!util_upload_index_buffer(pctx, info, &draws[0],
&indexbuf, &index_offset, 4))
return;
@ -316,6 +326,11 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info,
}
}
if ((ctx->streamout.num_targets > 0) && (num_draws > 1)) {
util_draw_multi(pctx, info, indirect, draws, num_draws);
return;
}
struct fd_batch *batch = fd_context_batch(ctx);
if (ctx->in_discard_blit) {
@ -360,8 +375,10 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info,
batch->num_vertices += draws[0].count * info->instance_count;
for (unsigned i = 0; i < ctx->streamout.num_targets; i++)
for (unsigned i = 0; i < ctx->streamout.num_targets; i++) {
assert(num_draws == 1);
ctx->streamout.offsets[i] += draws[0].count;
}
if (FD_DBG(DDRAW))
fd_context_all_dirty(ctx);