aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Neph <ryanneph@google.com>2022-11-09 15:53:58 -0800
committerMarge Bot <emma+marge@anholt.net>2022-12-16 01:59:39 +0000
commite074f42081ed834c523e6b86c1166834a17c91b1 (patch)
tree5cfb5486ea0b1c86ac3f9da0fade3706e3fdfafa
parent60d930962928a1981bade0c3471a1ce18bd0212c (diff)
downloadvirglrenderer-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.h2
-rw-r--r--src/venus/vkr_queue.c24
-rw-r--r--src/venus/vkr_queue.h3
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.