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