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 <olvaffe@gmail.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32360>
This commit is contained in:
Chia-I Wu 2024-11-24 19:25:33 -08:00 committed by Marge Bot
parent 39824d70b8
commit b9631adb0e
2 changed files with 37 additions and 0 deletions

View file

@ -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];
};

View file

@ -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)