Module: Mesa
Branch: main
Commit: 81b44b49316eed934fb502b7846191b1c313b83c
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=81b44b49316eed934fb502b7846191b1c313b83c

Author: Yiwei Zhang <[email protected]>
Date:   Thu Aug 11 22:33:26 2022 +0000

venus: lazily create queue wait fence and make it non-external

Signed-off-by: Yiwei Zhang <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17975>

---

 src/virtio/vulkan/vn_device.c | 17 -----------------
 src/virtio/vulkan/vn_queue.c  | 22 ++++++++++++++++++----
 2 files changed, 18 insertions(+), 21 deletions(-)

diff --git a/src/virtio/vulkan/vn_device.c b/src/virtio/vulkan/vn_device.c
index 57a72da643e..faa06512279 100644
--- a/src/virtio/vulkan/vn_device.c
+++ b/src/virtio/vulkan/vn_device.c
@@ -57,23 +57,6 @@ vn_queue_init(struct vn_device *dev,
    queue->index = queue_index;
    queue->flags = queue_info->flags;
 
-   const VkExportFenceCreateInfo export_fence_info = {
-      .sType = VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO,
-      .pNext = NULL,
-      .handleTypes = VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT,
-   };
-   const VkFenceCreateInfo fence_info = {
-      .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
-      .pNext = dev->instance->experimental.globalFencing == VK_TRUE
-                  ? &export_fence_info
-                  : NULL,
-      .flags = 0,
-   };
-   VkResult result = vn_CreateFence(vn_device_to_handle(dev), &fence_info,
-                                    NULL, &queue->wait_fence);
-   if (result != VK_SUCCESS)
-      return result;
-
    return VK_SUCCESS;
 }
 
diff --git a/src/virtio/vulkan/vn_queue.c b/src/virtio/vulkan/vn_queue.c
index dc31670eec0..080819e947d 100644
--- a/src/virtio/vulkan/vn_queue.c
+++ b/src/virtio/vulkan/vn_queue.c
@@ -483,14 +483,28 @@ vn_QueueWaitIdle(VkQueue _queue)
 {
    VN_TRACE_FUNC();
    struct vn_queue *queue = vn_queue_from_handle(_queue);
-   VkDevice device = vn_device_to_handle(queue->device);
+   VkDevice dev_handle = vn_device_to_handle(queue->device);
+   VkResult result;
+
+   /* lazily create queue wait fence for queue idle waiting */
+   if (queue->wait_fence == VK_NULL_HANDLE) {
+      const VkFenceCreateInfo create_info = {
+         .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
+         .flags = 0,
+      };
+      result =
+         vn_CreateFence(dev_handle, &create_info, NULL, &queue->wait_fence);
+      if (result != VK_SUCCESS)
+         return result;
+   }
 
-   VkResult result = vn_QueueSubmit(_queue, 0, NULL, queue->wait_fence);
+   result = vn_QueueSubmit(_queue, 0, NULL, queue->wait_fence);
    if (result != VK_SUCCESS)
       return result;
 
-   result = vn_WaitForFences(device, 1, &queue->wait_fence, true, UINT64_MAX);
-   vn_ResetFences(device, 1, &queue->wait_fence);
+   result =
+      vn_WaitForFences(dev_handle, 1, &queue->wait_fence, true, UINT64_MAX);
+   vn_ResetFences(dev_handle, 1, &queue->wait_fence);
 
    return vn_result(queue->device->instance, result);
 }

Reply via email to