From 3f9eb4fdf4b7bf3177eb26714566936a4a69f6fa Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Fri, 21 Jan 2022 23:36:33 +0000 Subject: [PATCH] venus: make vn_QueueSubmit async for native submissions Signed-off-by: Yiwei Zhang Reviewed-by: Chia-I Wu Part-of: --- src/virtio/vulkan/vn_android.c | 6 ++++++ src/virtio/vulkan/vn_queue.c | 14 ++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/virtio/vulkan/vn_android.c b/src/virtio/vulkan/vn_android.c index db1fc36e74a..9e4896c472c 100644 --- a/src/virtio/vulkan/vn_android.c +++ b/src/virtio/vulkan/vn_android.c @@ -683,6 +683,12 @@ vn_QueueSignalReleaseImageANDROID(VkQueue queue, return vn_error(dev->instance, result); if (dev->instance->experimental.globalFencing == VK_TRUE) { + /* XXX With globalFencing, the external queue fence was not passed in the + * above vn_QueueSubmit to hint it to be synchronous. So we need to wait + * for the ring here before vn_GetFenceFdKHR which is pure kernel ops. + */ + vn_instance_ring_wait(dev->instance); + const VkFenceGetFdInfoKHR fd_info = { .sType = VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR, .pNext = NULL, diff --git a/src/virtio/vulkan/vn_queue.c b/src/virtio/vulkan/vn_queue.c index d381d7231b5..a319b7b6f5e 100644 --- a/src/virtio/vulkan/vn_queue.c +++ b/src/virtio/vulkan/vn_queue.c @@ -335,15 +335,17 @@ VkResult vn_QueueSubmit(VkQueue _queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, - VkFence fence) + VkFence _fence) { VN_TRACE_FUNC(); struct vn_queue *queue = vn_queue_from_handle(_queue); struct vn_device *dev = queue->device; + struct vn_fence *fence = vn_fence_from_handle(_fence); + const bool is_fence_external = fence && fence->is_external; struct vn_queue_submission submit; VkResult result = vn_queue_submission_prepare_submit( - &submit, _queue, submitCount, pSubmits, fence); + &submit, _queue, submitCount, pSubmits, _fence); if (result != VK_SUCCESS) return vn_error(dev->instance, VK_ERROR_OUT_OF_HOST_MEMORY); @@ -357,6 +359,14 @@ vn_QueueSubmit(VkQueue _queue, } } + /* TODO defer roundtrip for external fence until the next sync operation */ + if (!wsi_mem && !is_fence_external) { + vn_async_vkQueueSubmit(dev->instance, submit.queue, submit.batch_count, + submit.submit_batches, submit.fence); + vn_queue_submission_cleanup(&submit); + return VK_SUCCESS; + } + result = vn_call_vkQueueSubmit(dev->instance, submit.queue, submit.batch_count, submit.submit_batches, submit.fence);