Mesa (main): venus: create per queue family command pool for feedback cmd

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jun 16 19:06:12 UTC 2022


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

Author: Yiwei Zhang <zzyiwei at chromium.org>
Date:   Wed May 25 22:51:59 2022 +0000

venus: create per queue family command pool for feedback cmd

Signed-off-by: Yiwei Zhang <zzyiwei at chromium.org>
Reviewed-by: Ryan Neph <ryanneph at google.com>
Reviewed-by: Chad Versace <chadversary at chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16731>

---

 src/virtio/vulkan/vn_device.c   | 11 ++++++-
 src/virtio/vulkan/vn_device.h   |  6 ++++
 src/virtio/vulkan/vn_feedback.c | 63 +++++++++++++++++++++++++++++++++++++++++
 src/virtio/vulkan/vn_feedback.h | 12 ++++++++
 4 files changed, 91 insertions(+), 1 deletion(-)

diff --git a/src/virtio/vulkan/vn_device.c b/src/virtio/vulkan/vn_device.c
index 2c8c90cc6f5..5fc070a9ee4 100644
--- a/src/virtio/vulkan/vn_device.c
+++ b/src/virtio/vulkan/vn_device.c
@@ -375,12 +375,19 @@ vn_device_init(struct vn_device *dev,
    if (result != VK_SUCCESS)
       goto out_buffer_cache_fini;
 
-   result = vn_device_init_queues(dev, create_info);
+   result = vn_feedback_cmd_pools_init(dev);
    if (result != VK_SUCCESS)
       goto out_feedback_pool_fini;
 
+   result = vn_device_init_queues(dev, create_info);
+   if (result != VK_SUCCESS)
+      goto out_cmd_pools_fini;
+
    return VK_SUCCESS;
 
+out_cmd_pools_fini:
+   vn_feedback_cmd_pools_fini(dev);
+
 out_feedback_pool_fini:
    vn_device_feedback_pool_fini(dev);
 
@@ -455,6 +462,8 @@ vn_DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator)
    for (uint32_t i = 0; i < dev->queue_count; i++)
       vn_queue_fini(&dev->queues[i]);
 
+   vn_feedback_cmd_pools_fini(dev);
+
    vn_device_feedback_pool_fini(dev);
 
    vn_buffer_cache_fini(dev);
diff --git a/src/virtio/vulkan/vn_device.h b/src/virtio/vulkan/vn_device.h
index 123a39e0352..df93db74d50 100644
--- a/src/virtio/vulkan/vn_device.h
+++ b/src/virtio/vulkan/vn_device.h
@@ -34,6 +34,12 @@ struct vn_device {
 
    struct vn_feedback_pool feedback_pool;
 
+   /* feedback cmd pool per queue family used by the device
+    * - length matches queue_family_count
+    * - order matches queue_families
+    */
+   struct vn_feedback_cmd_pool *cmd_pools;
+
    struct vn_queue *queues;
    uint32_t queue_count;
 };
diff --git a/src/virtio/vulkan/vn_feedback.c b/src/virtio/vulkan/vn_feedback.c
index 24041229f0c..31d653357de 100644
--- a/src/virtio/vulkan/vn_feedback.c
+++ b/src/virtio/vulkan/vn_feedback.c
@@ -322,3 +322,66 @@ vn_feedback_event_cmd_record(VkCommandBuffer cmd_handle,
                          VK_PIPELINE_STAGE_HOST_BIT, 0, 0, NULL, 1,
                          &buf_barrier_after, 0, NULL);
 }
+
+VkResult
+vn_feedback_cmd_pools_init(struct vn_device *dev)
+{
+   const VkAllocationCallbacks *alloc = &dev->base.base.alloc;
+   VkDevice dev_handle = vn_device_to_handle(dev);
+   struct vn_feedback_cmd_pool *pools;
+   VkCommandPoolCreateInfo info = {
+      .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
+      .pNext = NULL,
+      .flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,
+   };
+
+   /* TODO will also condition on timeline semaphore feedback */
+   if (VN_PERF(NO_FENCE_FEEDBACK))
+      return VK_SUCCESS;
+
+   assert(dev->queue_family_count);
+
+   pools = vk_zalloc(alloc, sizeof(*pools) * dev->queue_family_count,
+                     VN_DEFAULT_ALIGN, VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
+   if (!pools)
+      return VK_ERROR_OUT_OF_HOST_MEMORY;
+
+   for (uint32_t i = 0; i < dev->queue_family_count; i++) {
+      VkResult result;
+
+      info.queueFamilyIndex = dev->queue_families[i];
+      result = vn_CreateCommandPool(dev_handle, &info, alloc, &pools[i].pool);
+      if (result != VK_SUCCESS) {
+         for (uint32_t j = 0; j < i; j++) {
+            vn_DestroyCommandPool(dev_handle, pools[j].pool, alloc);
+            simple_mtx_destroy(&pools[j].mutex);
+         }
+
+         vk_free(alloc, pools);
+         return result;
+      }
+
+      simple_mtx_init(&pools[i].mutex, mtx_plain);
+   }
+
+   dev->cmd_pools = pools;
+
+   return VK_SUCCESS;
+}
+
+void
+vn_feedback_cmd_pools_fini(struct vn_device *dev)
+{
+   const VkAllocationCallbacks *alloc = &dev->base.base.alloc;
+   VkDevice dev_handle = vn_device_to_handle(dev);
+
+   if (!dev->cmd_pools)
+      return;
+
+   for (uint32_t i = 0; i < dev->queue_family_count; i++) {
+      vn_DestroyCommandPool(dev_handle, dev->cmd_pools[i].pool, alloc);
+      simple_mtx_destroy(&dev->cmd_pools[i].mutex);
+   }
+
+   vk_free(alloc, dev->cmd_pools);
+}
diff --git a/src/virtio/vulkan/vn_feedback.h b/src/virtio/vulkan/vn_feedback.h
index f5b008d264e..c391ed8d78e 100644
--- a/src/virtio/vulkan/vn_feedback.h
+++ b/src/virtio/vulkan/vn_feedback.h
@@ -47,6 +47,12 @@ struct vn_feedback_slot {
    struct list_head head;
 };
 
+struct vn_feedback_cmd_pool {
+   simple_mtx_t mutex;
+
+   VkCommandPool pool;
+};
+
 VkResult
 vn_feedback_pool_init(struct vn_device *dev,
                       struct vn_feedback_pool *pool,
@@ -107,4 +113,10 @@ vn_feedback_event_cmd_record(VkCommandBuffer cmd_handle,
                              VkPipelineStageFlags stage_mask,
                              VkResult status);
 
+VkResult
+vn_feedback_cmd_pools_init(struct vn_device *dev);
+
+void
+vn_feedback_cmd_pools_fini(struct vn_device *dev);
+
 #endif /* VN_FEEDBACK_H */



More information about the mesa-commit mailing list