Mesa (main): venus: make vn_QueueSubmit async for native submissions
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Jan 28 19:25:48 UTC 2022
Module: Mesa
Branch: main
Commit: 3f9eb4fdf4b7bf3177eb26714566936a4a69f6fa
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=3f9eb4fdf4b7bf3177eb26714566936a4a69f6fa
Author: Yiwei Zhang <zzyiwei at chromium.org>
Date: Fri Jan 21 23:36:33 2022 +0000
venus: make vn_QueueSubmit async for native submissions
Signed-off-by: Yiwei Zhang <zzyiwei at chromium.org>
Reviewed-by: Chia-I Wu <olvaffe at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14657>
---
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);
More information about the mesa-commit
mailing list