From 671cdd0b817955cbd458af22042e36469af715aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B3zef=20Kucia?= Date: Wed, 8 Aug 2018 16:11:35 +0200 Subject: [PATCH] dxgi: Wait for Vulkan queue to become idle before destroying swapchain. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Direct3D 12 debug layers do not complain when a swapchain is destroyed immediately after Present(). Signed-off-by: Józef Kucia Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- dlls/dxgi/swapchain.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c index 7a305554dbe..f222568865f 100644 --- a/dlls/dxgi/swapchain.c +++ b/dlls/dxgi/swapchain.c @@ -826,8 +826,10 @@ static PFN_vkd3d_resource_incref vkd3d_resource_incref; struct dxgi_vk_funcs { PFN_vkAcquireNextImageKHR p_vkAcquireNextImageKHR; + PFN_vkCreateFence p_vkCreateFence; PFN_vkCreateSwapchainKHR p_vkCreateSwapchainKHR; PFN_vkCreateWin32SurfaceKHR p_vkCreateWin32SurfaceKHR; + PFN_vkDestroyFence p_vkDestroyFence; PFN_vkDestroySurfaceKHR p_vkDestroySurfaceKHR; PFN_vkDestroySwapchainKHR p_vkDestroySwapchainKHR; PFN_vkGetDeviceProcAddr p_vkGetDeviceProcAddr; @@ -839,10 +841,9 @@ struct dxgi_vk_funcs PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR p_vkGetPhysicalDeviceWin32PresentationSupportKHR; PFN_vkGetSwapchainImagesKHR p_vkGetSwapchainImagesKHR; PFN_vkQueuePresentKHR p_vkQueuePresentKHR; - PFN_vkCreateFence p_vkCreateFence; - PFN_vkWaitForFences p_vkWaitForFences; + PFN_vkQueueWaitIdle p_vkQueueWaitIdle; PFN_vkResetFences p_vkResetFences; - PFN_vkDestroyFence p_vkDestroyFence; + PFN_vkWaitForFences p_vkWaitForFences; }; static HRESULT hresult_from_vk_result(VkResult vr) @@ -929,10 +930,25 @@ static ULONG STDMETHODCALLTYPE d3d12_swapchain_AddRef(IDXGISwapChain3 *iface) static void d3d12_swapchain_destroy(struct d3d12_swapchain *swapchain) { const struct dxgi_vk_funcs *vk_funcs = &swapchain->vk_funcs; + VkQueue vk_queue; unsigned int i; if (swapchain->command_queue) + { + if ((vk_queue = vkd3d_acquire_vk_queue(swapchain->command_queue))) + { + vk_funcs->p_vkQueueWaitIdle(vk_queue); + + vkd3d_release_vk_queue(swapchain->command_queue); + } + else + { + WARN("Failed to acquire Vulkan queue.\n"); + } + ID3D12CommandQueue_Release(swapchain->command_queue); + } + if (swapchain->factory) IWineDXGIFactory_Release(swapchain->factory); @@ -1563,6 +1579,7 @@ static BOOL init_vk_funcs(struct dxgi_vk_funcs *dxgi, VkDevice vk_device) LOAD_DEVICE_PFN(vkAcquireNextImageKHR) LOAD_DEVICE_PFN(vkCreateFence) LOAD_DEVICE_PFN(vkDestroyFence) + LOAD_DEVICE_PFN(vkQueueWaitIdle) LOAD_DEVICE_PFN(vkResetFences) LOAD_DEVICE_PFN(vkWaitForFences) #undef LOAD_DEVICE_PFN