mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-02 01:28:07 +02:00
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:
parent
5765932375
commit
68e752652c
1 changed files with 21 additions and 4 deletions
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue