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); }
