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

Author: Bas Nieuwenhuizen <[email protected]>
Date:   Wed Jun  8 00:37:09 2022 +0200

radv: Add implementation of cmd buffers for a sparse binding queue.

None of the commands are allowed on these ...

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16935>

---

 src/amd/vulkan/radv_cmd_buffer.c | 96 +++++++++++++++++++++++-----------------
 src/amd/vulkan/radv_private.h    |  1 +
 2 files changed, 56 insertions(+), 41 deletions(-)

diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index defa33f2fbb..610c9db083f 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -323,36 +323,38 @@ radv_destroy_cmd_buffer(struct vk_command_buffer 
*vk_cmd_buffer)
 {
    struct radv_cmd_buffer *cmd_buffer = container_of(vk_cmd_buffer, struct 
radv_cmd_buffer, vk);
 
-   list_for_each_entry_safe (struct radv_cmd_buffer_upload, up, 
&cmd_buffer->upload.list, list) {
-      radv_rmv_log_command_buffer_bo_destroy(cmd_buffer->device, 
up->upload_bo);
-      cmd_buffer->device->ws->buffer_destroy(cmd_buffer->device->ws, 
up->upload_bo);
-      list_del(&up->list);
-      free(up);
-   }
+   if (cmd_buffer->qf != RADV_QUEUE_SPARSE) {
+      list_for_each_entry_safe (struct radv_cmd_buffer_upload, up, 
&cmd_buffer->upload.list, list) {
+         radv_rmv_log_command_buffer_bo_destroy(cmd_buffer->device, 
up->upload_bo);
+         cmd_buffer->device->ws->buffer_destroy(cmd_buffer->device->ws, 
up->upload_bo);
+         list_del(&up->list);
+         free(up);
+      }
 
-   if (cmd_buffer->upload.upload_bo) {
-      radv_rmv_log_command_buffer_bo_destroy(cmd_buffer->device, 
cmd_buffer->upload.upload_bo);
-      cmd_buffer->device->ws->buffer_destroy(cmd_buffer->device->ws, 
cmd_buffer->upload.upload_bo);
-   }
+      if (cmd_buffer->upload.upload_bo) {
+         radv_rmv_log_command_buffer_bo_destroy(cmd_buffer->device, 
cmd_buffer->upload.upload_bo);
+         cmd_buffer->device->ws->buffer_destroy(cmd_buffer->device->ws, 
cmd_buffer->upload.upload_bo);
+      }
 
-   if (cmd_buffer->cs)
-      cmd_buffer->device->ws->cs_destroy(cmd_buffer->cs);
-   if (cmd_buffer->gang.cs)
-      cmd_buffer->device->ws->cs_destroy(cmd_buffer->gang.cs);
-   if (cmd_buffer->transfer.copy_temp)
-      cmd_buffer->device->ws->buffer_destroy(cmd_buffer->device->ws, 
cmd_buffer->transfer.copy_temp);
+      if (cmd_buffer->cs)
+         cmd_buffer->device->ws->cs_destroy(cmd_buffer->cs);
+      if (cmd_buffer->gang.cs)
+         cmd_buffer->device->ws->cs_destroy(cmd_buffer->gang.cs);
+      if (cmd_buffer->transfer.copy_temp)
+         cmd_buffer->device->ws->buffer_destroy(cmd_buffer->device->ws, 
cmd_buffer->transfer.copy_temp);
 
-   radv_cmd_buffer_finish_shader_part_cache(cmd_buffer);
+      radv_cmd_buffer_finish_shader_part_cache(cmd_buffer);
 
-   for (unsigned i = 0; i < MAX_BIND_POINTS; i++) {
-      struct radv_descriptor_set_header *set = 
&cmd_buffer->descriptors[i].push_set.set;
-      free(set->mapped_ptr);
-      if (set->layout)
-         vk_descriptor_set_layout_unref(&cmd_buffer->device->vk, 
&set->layout->vk);
-      vk_object_base_finish(&set->base);
-   }
+      for (unsigned i = 0; i < MAX_BIND_POINTS; i++) {
+         struct radv_descriptor_set_header *set = 
&cmd_buffer->descriptors[i].push_set.set;
+         free(set->mapped_ptr);
+         if (set->layout)
+            vk_descriptor_set_layout_unref(&cmd_buffer->device->vk, 
&set->layout->vk);
+         vk_object_base_finish(&set->base);
+      }
 
-   vk_object_base_finish(&cmd_buffer->meta_push_descriptors.base);
+      vk_object_base_finish(&cmd_buffer->meta_push_descriptors.base);
+   }
 
    vk_command_buffer_finish(&cmd_buffer->vk);
    vk_free(&cmd_buffer->vk.pool->alloc, cmd_buffer);
@@ -375,29 +377,32 @@ radv_create_cmd_buffer(struct vk_command_pool *pool, 
struct vk_command_buffer **
       return result;
    }
 
-   if (!radv_cmd_buffer_init_shader_part_cache(device, cmd_buffer)) {
-      radv_destroy_cmd_buffer(&cmd_buffer->vk);
-      return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
-   }
-
-   list_inithead(&cmd_buffer->upload.list);
-
    cmd_buffer->device = device;
 
    cmd_buffer->qf = vk_queue_to_radv(device->physical_device, 
pool->queue_family_index);
 
-   ring = radv_queue_family_to_ring(device->physical_device, cmd_buffer->qf);
+   if (cmd_buffer->qf != RADV_QUEUE_SPARSE) {
+      list_inithead(&cmd_buffer->upload.list);
 
-   cmd_buffer->cs = device->ws->cs_create(device->ws, ring, 
cmd_buffer->vk.level == VK_COMMAND_BUFFER_LEVEL_SECONDARY);
-   if (!cmd_buffer->cs) {
-      radv_destroy_cmd_buffer(&cmd_buffer->vk);
-      return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
-   }
+      if (!radv_cmd_buffer_init_shader_part_cache(device, cmd_buffer)) {
+         radv_destroy_cmd_buffer(&cmd_buffer->vk);
+         return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
+      }
 
-   vk_object_base_init(&device->vk, &cmd_buffer->meta_push_descriptors.base, 
VK_OBJECT_TYPE_DESCRIPTOR_SET);
+      ring = radv_queue_family_to_ring(device->physical_device, 
cmd_buffer->qf);
+
+      cmd_buffer->cs =
+         device->ws->cs_create(device->ws, ring, cmd_buffer->vk.level == 
VK_COMMAND_BUFFER_LEVEL_SECONDARY);
+      if (!cmd_buffer->cs) {
+         radv_destroy_cmd_buffer(&cmd_buffer->vk);
+         return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
+      }
 
-   for (unsigned i = 0; i < MAX_BIND_POINTS; i++)
-      vk_object_base_init(&device->vk, 
&cmd_buffer->descriptors[i].push_set.set.base, VK_OBJECT_TYPE_DESCRIPTOR_SET);
+      vk_object_base_init(&device->vk, 
&cmd_buffer->meta_push_descriptors.base, VK_OBJECT_TYPE_DESCRIPTOR_SET);
+
+      for (unsigned i = 0; i < MAX_BIND_POINTS; i++)
+         vk_object_base_init(&device->vk, 
&cmd_buffer->descriptors[i].push_set.set.base, VK_OBJECT_TYPE_DESCRIPTOR_SET);
+   }
 
    *cmd_buffer_out = &cmd_buffer->vk;
 
@@ -417,6 +422,9 @@ radv_reset_cmd_buffer(struct vk_command_buffer 
*vk_cmd_buffer, UNUSED VkCommandB
 
    vk_command_buffer_reset(&cmd_buffer->vk);
 
+   if (cmd_buffer->qf == RADV_QUEUE_SPARSE)
+      return;
+
    cmd_buffer->device->ws->cs_reset(cmd_buffer->cs);
    if (cmd_buffer->gang.cs)
       cmd_buffer->device->ws->cs_reset(cmd_buffer->gang.cs);
@@ -5659,6 +5667,9 @@ radv_BeginCommandBuffer(VkCommandBuffer commandBuffer, 
const VkCommandBufferBegi
 
    vk_command_buffer_begin(&cmd_buffer->vk, pBeginInfo);
 
+   if (cmd_buffer->qf == RADV_QUEUE_SPARSE)
+      return result;
+
    memset(&cmd_buffer->state, 0, sizeof(cmd_buffer->state));
    cmd_buffer->state.last_index_type = -1;
    cmd_buffer->state.last_num_instances = -1;
@@ -6087,6 +6098,9 @@ radv_EndCommandBuffer(VkCommandBuffer commandBuffer)
 {
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
 
+   if (cmd_buffer->qf == RADV_QUEUE_SPARSE)
+      return vk_command_buffer_end(&cmd_buffer->vk);
+
    radv_emit_mip_change_flush_default(cmd_buffer);
 
    const bool is_gfx_or_ace = cmd_buffer->qf == RADV_QUEUE_GENERAL || 
cmd_buffer->qf == RADV_QUEUE_COMPUTE;
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index caee8d17474..7ff9b195967 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -261,6 +261,7 @@ enum radv_queue_family {
    RADV_QUEUE_GENERAL,
    RADV_QUEUE_COMPUTE,
    RADV_QUEUE_TRANSFER,
+   RADV_QUEUE_SPARSE,
    RADV_QUEUE_VIDEO_DEC,
    RADV_QUEUE_VIDEO_ENC,
    RADV_MAX_QUEUE_FAMILIES,

Reply via email to