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