From b9631adb0e733cfaaafa48564382fcfd910ba609 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Sun, 24 Nov 2024 19:25:33 -0800 Subject: [PATCH] panvk/csf: add vk_sync to panvk_queue It will be used to synchronize gpu timestamp writes and trace event processing. Signed-off-by: Chia-I Wu Reviewed-by: Boris Brezillon Part-of: --- src/panfrost/vulkan/csf/panvk_queue.h | 5 ++++ src/panfrost/vulkan/csf/panvk_vX_queue.c | 32 ++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/panfrost/vulkan/csf/panvk_queue.h b/src/panfrost/vulkan/csf/panvk_queue.h index 484b0c7ccb3..07936b2b451 100644 --- a/src/panfrost/vulkan/csf/panvk_queue.h +++ b/src/panfrost/vulkan/csf/panvk_queue.h @@ -70,6 +70,11 @@ struct panvk_queue { struct panvk_priv_mem debug_syncobjs; struct panvk_priv_mem tiler_oom_regs_save; + struct { + struct vk_sync *sync; + uint64_t next_value; + } utrace; + struct panvk_subqueue subqueues[PANVK_SUBQUEUE_COUNT]; }; diff --git a/src/panfrost/vulkan/csf/panvk_vX_queue.c b/src/panfrost/vulkan/csf/panvk_vX_queue.c index 07c9f4ff696..1f97061b1e5 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_queue.c +++ b/src/panfrost/vulkan/csf/panvk_vX_queue.c @@ -12,6 +12,7 @@ #include "panvk_cmd_buffer.h" #include "panvk_macros.h" #include "panvk_queue.h" +#include "panvk_utrace.h" #include "util/bitscan.h" #include "vk_drm_syncobj.h" @@ -339,6 +340,28 @@ finish_subqueue(struct panvk_queue *queue, enum panvk_subqueue_id subqueue) finish_subqueue_tracing(queue, subqueue); } +static VkResult +init_utrace(struct panvk_queue *queue) +{ + struct panvk_device *dev = to_panvk_device(queue->vk.base.device); + const struct panvk_physical_device *phys_dev = + to_panvk_physical_device(dev->vk.physical); + VkResult result; + + const struct vk_sync_type *sync_type = phys_dev->sync_types[0]; + assert(sync_type && vk_sync_type_is_drm_syncobj(sync_type) && + (sync_type->features & VK_SYNC_FEATURE_TIMELINE)); + + result = vk_sync_create(&dev->vk, sync_type, VK_SYNC_IS_TIMELINE, 0, + &queue->utrace.sync); + if (result != VK_SUCCESS) + return result; + + queue->utrace.next_value = 1; + + return VK_SUCCESS; +} + static VkResult init_subqueue(struct panvk_queue *queue, enum panvk_subqueue_id subqueue) { @@ -479,9 +502,14 @@ init_subqueue(struct panvk_queue *queue, enum panvk_subqueue_id subqueue) static void cleanup_queue(struct panvk_queue *queue) { + struct panvk_device *dev = to_panvk_device(queue->vk.base.device); + for (uint32_t i = 0; i < PANVK_SUBQUEUE_COUNT; i++) finish_subqueue(queue, i); + if (queue->utrace.sync) + vk_sync_destroy(&dev->vk, queue->utrace.sync); + finish_render_desc_ringbuf(queue); panvk_pool_free_mem(&queue->tiler_oom_regs_save); @@ -535,6 +563,10 @@ init_queue(struct panvk_queue *queue) if (result != VK_SUCCESS) goto err_cleanup_queue; + result = init_utrace(queue); + if (result != VK_SUCCESS) + goto err_cleanup_queue; + for (uint32_t i = 0; i < PANVK_SUBQUEUE_COUNT; i++) { result = init_subqueue(queue, i); if (result != VK_SUCCESS)