Mesa (master): lavapipe: add support for VK_KHR_indirect_draw_count

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Dec 3 03:31:46 UTC 2020


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

Author: Dave Airlie <airlied at redhat.com>
Date:   Fri Nov 27 18:21:17 2020 +1000

lavapipe: add support for VK_KHR_indirect_draw_count

Just hooks up the new cmds to the gallium draw API

Reviewed-by: Adam Jackson <ajax at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7888>

---

 src/gallium/frontends/lavapipe/lvp_cmd_buffer.c  | 56 ++++++++++++++++++++++++
 src/gallium/frontends/lavapipe/lvp_execute.c     | 27 ++++++++++++
 src/gallium/frontends/lavapipe/lvp_extensions.py |  2 +-
 src/gallium/frontends/lavapipe/lvp_private.h     | 12 +++++
 4 files changed, 96 insertions(+), 1 deletion(-)

diff --git a/src/gallium/frontends/lavapipe/lvp_cmd_buffer.c b/src/gallium/frontends/lavapipe/lvp_cmd_buffer.c
index 64bd862fa98..eff125472ed 100644
--- a/src/gallium/frontends/lavapipe/lvp_cmd_buffer.c
+++ b/src/gallium/frontends/lavapipe/lvp_cmd_buffer.c
@@ -1417,3 +1417,59 @@ void lvp_CmdPipelineBarrier(
    /* TODO finish off this */
    cmd_buf_queue(cmd_buffer, cmd);
 }
+
+void lvp_CmdDrawIndirectCount(
+    VkCommandBuffer                             commandBuffer,
+    VkBuffer                                    buffer,
+    VkDeviceSize                                offset,
+    VkBuffer                                    countBuffer,
+    VkDeviceSize                                countBufferOffset,
+    uint32_t                                    maxDrawCount,
+    uint32_t                                    stride)
+{
+   LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);
+   LVP_FROM_HANDLE(lvp_buffer, buf, buffer);
+   LVP_FROM_HANDLE(lvp_buffer, count_buf, countBuffer);
+   struct lvp_cmd_buffer_entry *cmd;
+
+   cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_DRAW_INDIRECT_COUNT);
+   if (!cmd)
+      return;
+
+   cmd->u.draw_indirect_count.offset = offset;
+   cmd->u.draw_indirect_count.buffer = buf;
+   cmd->u.draw_indirect_count.count_buffer_offset = countBufferOffset;
+   cmd->u.draw_indirect_count.count_buffer = count_buf;
+   cmd->u.draw_indirect_count.max_draw_count = maxDrawCount;
+   cmd->u.draw_indirect_count.stride = stride;
+
+   cmd_buf_queue(cmd_buffer, cmd);
+}
+
+void lvp_CmdDrawIndexedIndirectCount(
+    VkCommandBuffer                             commandBuffer,
+    VkBuffer                                    buffer,
+    VkDeviceSize                                offset,
+    VkBuffer                                    countBuffer,
+    VkDeviceSize                                countBufferOffset,
+    uint32_t                                    maxDrawCount,
+    uint32_t                                    stride)
+{
+   LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);
+   LVP_FROM_HANDLE(lvp_buffer, buf, buffer);
+   LVP_FROM_HANDLE(lvp_buffer, count_buf, countBuffer);
+   struct lvp_cmd_buffer_entry *cmd;
+
+   cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_DRAW_INDEXED_INDIRECT_COUNT);
+   if (!cmd)
+      return;
+
+   cmd->u.draw_indirect_count.offset = offset;
+   cmd->u.draw_indirect_count.buffer = buf;
+   cmd->u.draw_indirect_count.count_buffer_offset = countBufferOffset;
+   cmd->u.draw_indirect_count.count_buffer = count_buf;
+   cmd->u.draw_indirect_count.max_draw_count = maxDrawCount;
+   cmd->u.draw_indirect_count.stride = stride;
+
+   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 d2bec928089..91bd18fe90c 100644
--- a/src/gallium/frontends/lavapipe/lvp_execute.c
+++ b/src/gallium/frontends/lavapipe/lvp_execute.c
@@ -2283,6 +2283,25 @@ static void handle_resolve_image(struct lvp_cmd_buffer_entry *cmd,
    }
 }
 
+static void handle_draw_indirect_count(struct lvp_cmd_buffer_entry *cmd,
+                                       struct rendering_state *state, bool indexed)
+{
+   if (indexed) {
+      state->info.index_bounds_valid = false;
+      state->info.index_size = state->index_size;
+      state->info.index.resource = state->index_buffer;
+      state->info.max_index = ~0;
+   } else
+      state->info.index_size = 0;
+   state->indirect_info.offset = cmd->u.draw_indirect_count.offset;
+   state->indirect_info.stride = cmd->u.draw_indirect_count.stride;
+   state->indirect_info.draw_count = cmd->u.draw_indirect_count.max_draw_count;
+   state->indirect_info.buffer = cmd->u.draw_indirect_count.buffer->bo;
+   state->indirect_info.indirect_draw_count_offset = cmd->u.draw_indirect_count.count_buffer_offset;
+   state->indirect_info.indirect_draw_count = cmd->u.draw_indirect_count.count_buffer->bo;
+   state->pctx->draw_vbo(state->pctx, &state->info, &state->indirect_info, &state->draw, 1);
+}
+
 static void lvp_execute_cmd_buffer(struct lvp_cmd_buffer *cmd_buffer,
                                    struct rendering_state *state)
 {
@@ -2426,6 +2445,14 @@ static void lvp_execute_cmd_buffer(struct lvp_cmd_buffer *cmd_buffer,
       case LVP_CMD_EXECUTE_COMMANDS:
          handle_execute_commands(cmd, state);
          break;
+      case LVP_CMD_DRAW_INDIRECT_COUNT:
+         emit_state(state);
+         handle_draw_indirect_count(cmd, state, false);
+         break;
+      case LVP_CMD_DRAW_INDEXED_INDIRECT_COUNT:
+         emit_state(state);
+         handle_draw_indirect_count(cmd, state, true);
+         break;
       }
    }
 }
diff --git a/src/gallium/frontends/lavapipe/lvp_extensions.py b/src/gallium/frontends/lavapipe/lvp_extensions.py
index df989e92452..05c5c11b40e 100644
--- a/src/gallium/frontends/lavapipe/lvp_extensions.py
+++ b/src/gallium/frontends/lavapipe/lvp_extensions.py
@@ -65,7 +65,7 @@ EXTENSIONS = [
     Extension('VK_KHR_descriptor_update_template',        1, False),
     Extension('VK_KHR_device_group',                      1, False),
     Extension('VK_KHR_device_group_creation',             1, False),
-    Extension('VK_KHR_draw_indirect_count',               1, False),
+    Extension('VK_KHR_draw_indirect_count',               1, True),
     Extension('VK_KHR_driver_properties',                 1, True),
     Extension('VK_KHR_external_fence',                    1, False),
     Extension('VK_KHR_external_fence_capabilities',       1, True),
diff --git a/src/gallium/frontends/lavapipe/lvp_private.h b/src/gallium/frontends/lavapipe/lvp_private.h
index 1d00af7d6a3..eb31c3cfb36 100644
--- a/src/gallium/frontends/lavapipe/lvp_private.h
+++ b/src/gallium/frontends/lavapipe/lvp_private.h
@@ -640,6 +640,8 @@ enum lvp_cmds {
    LVP_CMD_NEXT_SUBPASS,
    LVP_CMD_END_RENDER_PASS,
    LVP_CMD_EXECUTE_COMMANDS,
+   LVP_CMD_DRAW_INDIRECT_COUNT,
+   LVP_CMD_DRAW_INDEXED_INDIRECT_COUNT,
 };
 
 struct lvp_cmd_bind_pipeline {
@@ -904,6 +906,15 @@ struct lvp_cmd_execute_commands {
    struct lvp_cmd_buffer *cmd_buffers[0];
 };
 
+struct lvp_cmd_draw_indirect_count {
+   VkDeviceSize offset;
+   struct lvp_buffer *buffer;
+   VkDeviceSize count_buffer_offset;
+   struct lvp_buffer *count_buffer;
+   uint32_t max_draw_count;
+   uint32_t stride;
+};
+
 struct lvp_cmd_buffer_entry {
    struct list_head cmd_link;
    uint32_t cmd_type;
@@ -944,6 +955,7 @@ struct lvp_cmd_buffer_entry {
       struct lvp_cmd_begin_render_pass begin_render_pass;
       struct lvp_cmd_next_subpass next_subpass;
       struct lvp_cmd_execute_commands execute_commands;
+      struct lvp_cmd_draw_indirect_count draw_indirect_count;
    } u;
 };
 



More information about the mesa-commit mailing list