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