venus: lazily create queue wait fence and make it non-external
authorYiwei Zhang <zzyiwei@chromium.org>
Thu, 11 Aug 2022 22:33:26 +0000 (22:33 +0000)
committerMarge Bot <emma+marge@anholt.net>
Thu, 25 Aug 2022 20:18:28 +0000 (20:18 +0000)
Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17975>

src/virtio/vulkan/vn_device.c
src/virtio/vulkan/vn_queue.c

index 57a72da..faa0651 100644 (file)
@@ -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;
 }
 
index dc31670..080819e 100644 (file)
@@ -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);
 }