dxgi: Wait for Vulkan queue to become idle before destroying swapchain.
Direct3D 12 debug layers do not complain when a swapchain is destroyed immediately after Present(). Signed-off-by: Józef Kucia <jkucia@codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
eef51f2e2b
commit
671cdd0b81
|
@ -826,8 +826,10 @@ static PFN_vkd3d_resource_incref vkd3d_resource_incref;
|
||||||
struct dxgi_vk_funcs
|
struct dxgi_vk_funcs
|
||||||
{
|
{
|
||||||
PFN_vkAcquireNextImageKHR p_vkAcquireNextImageKHR;
|
PFN_vkAcquireNextImageKHR p_vkAcquireNextImageKHR;
|
||||||
|
PFN_vkCreateFence p_vkCreateFence;
|
||||||
PFN_vkCreateSwapchainKHR p_vkCreateSwapchainKHR;
|
PFN_vkCreateSwapchainKHR p_vkCreateSwapchainKHR;
|
||||||
PFN_vkCreateWin32SurfaceKHR p_vkCreateWin32SurfaceKHR;
|
PFN_vkCreateWin32SurfaceKHR p_vkCreateWin32SurfaceKHR;
|
||||||
|
PFN_vkDestroyFence p_vkDestroyFence;
|
||||||
PFN_vkDestroySurfaceKHR p_vkDestroySurfaceKHR;
|
PFN_vkDestroySurfaceKHR p_vkDestroySurfaceKHR;
|
||||||
PFN_vkDestroySwapchainKHR p_vkDestroySwapchainKHR;
|
PFN_vkDestroySwapchainKHR p_vkDestroySwapchainKHR;
|
||||||
PFN_vkGetDeviceProcAddr p_vkGetDeviceProcAddr;
|
PFN_vkGetDeviceProcAddr p_vkGetDeviceProcAddr;
|
||||||
|
@ -839,10 +841,9 @@ struct dxgi_vk_funcs
|
||||||
PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR p_vkGetPhysicalDeviceWin32PresentationSupportKHR;
|
PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR p_vkGetPhysicalDeviceWin32PresentationSupportKHR;
|
||||||
PFN_vkGetSwapchainImagesKHR p_vkGetSwapchainImagesKHR;
|
PFN_vkGetSwapchainImagesKHR p_vkGetSwapchainImagesKHR;
|
||||||
PFN_vkQueuePresentKHR p_vkQueuePresentKHR;
|
PFN_vkQueuePresentKHR p_vkQueuePresentKHR;
|
||||||
PFN_vkCreateFence p_vkCreateFence;
|
PFN_vkQueueWaitIdle p_vkQueueWaitIdle;
|
||||||
PFN_vkWaitForFences p_vkWaitForFences;
|
|
||||||
PFN_vkResetFences p_vkResetFences;
|
PFN_vkResetFences p_vkResetFences;
|
||||||
PFN_vkDestroyFence p_vkDestroyFence;
|
PFN_vkWaitForFences p_vkWaitForFences;
|
||||||
};
|
};
|
||||||
|
|
||||||
static HRESULT hresult_from_vk_result(VkResult vr)
|
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)
|
static void d3d12_swapchain_destroy(struct d3d12_swapchain *swapchain)
|
||||||
{
|
{
|
||||||
const struct dxgi_vk_funcs *vk_funcs = &swapchain->vk_funcs;
|
const struct dxgi_vk_funcs *vk_funcs = &swapchain->vk_funcs;
|
||||||
|
VkQueue vk_queue;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
if (swapchain->command_queue)
|
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);
|
ID3D12CommandQueue_Release(swapchain->command_queue);
|
||||||
|
}
|
||||||
|
|
||||||
if (swapchain->factory)
|
if (swapchain->factory)
|
||||||
IWineDXGIFactory_Release(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(vkAcquireNextImageKHR)
|
||||||
LOAD_DEVICE_PFN(vkCreateFence)
|
LOAD_DEVICE_PFN(vkCreateFence)
|
||||||
LOAD_DEVICE_PFN(vkDestroyFence)
|
LOAD_DEVICE_PFN(vkDestroyFence)
|
||||||
|
LOAD_DEVICE_PFN(vkQueueWaitIdle)
|
||||||
LOAD_DEVICE_PFN(vkResetFences)
|
LOAD_DEVICE_PFN(vkResetFences)
|
||||||
LOAD_DEVICE_PFN(vkWaitForFences)
|
LOAD_DEVICE_PFN(vkWaitForFences)
|
||||||
#undef LOAD_DEVICE_PFN
|
#undef LOAD_DEVICE_PFN
|
||||||
|
|
Loading…
Reference in New Issue