diff options
author | Ryan Neph <ryanneph@google.com> | 2022-11-09 15:53:58 -0800 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2022-12-16 01:59:39 +0000 |
commit | e074f42081ed834c523e6b86c1166834a17c91b1 (patch) | |
tree | 5cfb5486ea0b1c86ac3f9da0fade3706e3fdfafa | |
parent | 60d930962928a1981bade0c3471a1ce18bd0212c (diff) | |
download | virglrenderer-e074f42081ed834c523e6b86c1166834a17c91b1.tar.gz |
vkr: bind VkQueue to sync_queue on retrieval
Signed-off-by: Ryan Neph <ryanneph@google.com>
Part-of: <https://gitlab.freedesktop.org/virgl/virglrenderer/-/merge_requests/982>
-rw-r--r-- | src/venus/vkr_context.h | 2 | ||||
-rw-r--r-- | src/venus/vkr_queue.c | 24 | ||||
-rw-r--r-- | src/venus/vkr_queue.h | 3 |
3 files changed, 29 insertions, 0 deletions
diff --git a/src/venus/vkr_context.h b/src/venus/vkr_context.h index ccbf5d9c..70ab927c 100644 --- a/src/venus/vkr_context.h +++ b/src/venus/vkr_context.h @@ -63,6 +63,8 @@ struct vkr_context { struct list_head busy_queues; struct list_head signaled_syncs; + struct vkr_queue *sync_queues[64]; + struct vkr_instance *instance; char *instance_name; }; diff --git a/src/venus/vkr_queue.c b/src/venus/vkr_queue.c index 9d6255fe..3b38d8ce 100644 --- a/src/venus/vkr_queue.c +++ b/src/venus/vkr_queue.c @@ -7,6 +7,7 @@ #include "venus-protocol/vn_protocol_renderer_queue.h" +#include "vkr_context.h" #include "vkr_physical_device.h" #include "vkr_queue_gen.h" @@ -177,6 +178,9 @@ vkr_queue_destroy(struct vkr_context *ctx, struct vkr_queue *queue) list_del(&queue->busy_head); list_del(&queue->base.track_head); + if (queue->ring_idx > 0) + ctx->sync_queues[queue->ring_idx] = NULL; + if (queue->base.id) vkr_context_remove_object(ctx, &queue->base); else @@ -363,6 +367,26 @@ vkr_dispatch_vkGetDeviceQueue2(struct vn_dispatch_context *dispatch, return; } + const VkDeviceQueueTimelineInfoMESA *timeline_info = vkr_find_struct( + args->pQueueInfo->pNext, VK_STRUCTURE_TYPE_DEVICE_QUEUE_TIMELINE_INFO_MESA); + if (timeline_info) { + if (timeline_info->ringIdx == 0 || + timeline_info->ringIdx >= ARRAY_SIZE(ctx->sync_queues)) { + vkr_log("invalid ring_idx %d", timeline_info->ringIdx); + vkr_cs_decoder_set_fatal(&ctx->decoder); + return; + } + + if (ctx->sync_queues[timeline_info->ringIdx]) { + vkr_log("sync_queue %d already bound", timeline_info->ringIdx); + vkr_cs_decoder_set_fatal(&ctx->decoder); + return; + } + + queue->ring_idx = timeline_info->ringIdx; + ctx->sync_queues[timeline_info->ringIdx] = queue; + } + const vkr_object_id id = vkr_cs_handle_load_id((const void **)args->pQueue, VK_OBJECT_TYPE_QUEUE); vkr_queue_assign_object_id(ctx, queue, id); diff --git a/src/venus/vkr_queue.h b/src/venus/vkr_queue.h index ac90934b..4ca9d649 100644 --- a/src/venus/vkr_queue.h +++ b/src/venus/vkr_queue.h @@ -29,6 +29,9 @@ struct vkr_queue { uint32_t family; uint32_t index; + /* only used when client driver uses multiple timelines */ + uint32_t ring_idx; + /* Submitted fences are added to pending_syncs first. How submitted fences * are retired depends on VKR_RENDERER_THREAD_SYNC and * VKR_RENDERER_ASYNC_FENCE_CB. |