Module: Mesa
Branch: master
Commit: afc82113d1add6dfdf538ec48231d7154b4be968
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=afc82113d1add6dfdf538ec48231d7154b4be968

Author: Mike Blumenkrantz <[email protected]>
Date:   Thu Mar 25 13:54:01 2021 -0400

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 <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9843>

---

 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 {

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to