From afc82113d1add6dfdf538ec48231d7154b4be968 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 25 Mar 2021 13:54:01 -0400 Subject: [PATCH] lavapipe: refactor indexed draw dispatch to handle multidraws each indexed direct draw cmd now contains n draws (though right now n=1) indexed draws now also have a flag used to avoid recalculating start index if a cmdbuf is submitted multiple times Reviewed-by: Dave Airlie Part-of: --- src/gallium/frontends/lavapipe/lvp_cmd_buffer.c | 9 ++++++--- src/gallium/frontends/lavapipe/lvp_execute.c | 12 +++++++----- src/gallium/frontends/lavapipe/lvp_private.h | 5 +++-- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/gallium/frontends/lavapipe/lvp_cmd_buffer.c b/src/gallium/frontends/lavapipe/lvp_cmd_buffer.c index 007248329ea..89481269527 100644 --- a/src/gallium/frontends/lavapipe/lvp_cmd_buffer.c +++ b/src/gallium/frontends/lavapipe/lvp_cmd_buffer.c @@ -745,15 +745,18 @@ VKAPI_ATTR void VKAPI_CALL lvp_CmdDrawIndexed( LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer); struct lvp_cmd_buffer_entry *cmd; - cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_DRAW_INDEXED); + uint32_t cmd_size = sizeof(struct pipe_draw_start_count); + cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_DRAW_INDEXED); if (!cmd) return; - cmd->u.draw_indexed.index_count = indexCount; cmd->u.draw_indexed.instance_count = instanceCount; - cmd->u.draw_indexed.first_index = firstIndex; cmd->u.draw_indexed.vertex_offset = vertexOffset; cmd->u.draw_indexed.first_instance = firstInstance; + cmd->u.draw_indexed.draw_count = 1; + cmd->u.draw_indexed.draws[0].start = firstIndex; + cmd->u.draw_indexed.draws[0].count = indexCount; + cmd->u.draw_indexed.calc_start = true; cmd_buf_queue(cmd_buffer, cmd); } diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c index d296abdedbb..50a150af1e9 100644 --- a/src/gallium/frontends/lavapipe/lvp_execute.c +++ b/src/gallium/frontends/lavapipe/lvp_execute.c @@ -2108,14 +2108,11 @@ static void handle_draw_indexed(struct lvp_cmd_buffer_entry *cmd, struct rendering_state *state) { const struct lvp_subpass *subpass = &state->pass->subpasses[state->subpass]; - struct pipe_draw_start_count draw = {0}; state->info.index_bounds_valid = false; state->info.min_index = 0; state->info.max_index = ~0; state->info.index_size = state->index_size; state->info.index.resource = state->index_buffer; - draw.start = (state->index_offset / state->index_size) + cmd->u.draw_indexed.first_index; - draw.count = cmd->u.draw_indexed.index_count; state->info.start_instance = cmd->u.draw_indexed.first_instance; state->info.instance_count = cmd->u.draw_indexed.instance_count; state->info.index_bias = cmd->u.draw_indexed.vertex_offset; @@ -2123,8 +2120,13 @@ static void handle_draw_indexed(struct lvp_cmd_buffer_entry *cmd, if (state->info.primitive_restart) state->info.restart_index = util_prim_restart_index_from_size(state->info.index_size); - - state->pctx->draw_vbo(state->pctx, &state->info, NULL, &draw, 1); + /* avoid calculating multiple times if cmdbuf is submitted again */ + if (cmd->u.draw_indexed.calc_start) { + for (unsigned i = 0; i < cmd->u.draw_indexed.draw_count; i++) + cmd->u.draw_indexed.draws[i].start = (state->index_offset / state->index_size) + cmd->u.draw_indexed.draws[i].start; + cmd->u.draw_indexed.calc_start = false; + } + state->pctx->draw_vbo(state->pctx, &state->info, NULL, cmd->u.draw_indexed.draws, cmd->u.draw_indexed.draw_count); } static void handle_draw_indirect(struct lvp_cmd_buffer_entry *cmd, diff --git a/src/gallium/frontends/lavapipe/lvp_private.h b/src/gallium/frontends/lavapipe/lvp_private.h index dc604365b7b..71d90d23555 100644 --- a/src/gallium/frontends/lavapipe/lvp_private.h +++ b/src/gallium/frontends/lavapipe/lvp_private.h @@ -754,11 +754,12 @@ struct lvp_cmd_draw { }; struct lvp_cmd_draw_indexed { - uint32_t index_count; uint32_t instance_count; - uint32_t first_index; uint32_t vertex_offset; uint32_t first_instance; + bool calc_start; + uint32_t draw_count; + struct pipe_draw_start_count draws[0]; }; struct lvp_cmd_draw_indirect {