=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: dxgi: Factor out d3d12_swapchain_destroy_buffers().

Alexandre Julliard julliard at winehq.org
Wed Aug 29 16:10:45 CDT 2018


Module: wine
Branch: master
Commit: 7343aec0cd4ea6447b523b0b09e8487ced1316b0
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=7343aec0cd4ea6447b523b0b09e8487ced1316b0

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Wed Aug 29 12:53:35 2018 +0200

dxgi: Factor out d3d12_swapchain_destroy_buffers().

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dxgi/swapchain.c | 84 +++++++++++++++++++++++++++++++--------------------
 1 file changed, 51 insertions(+), 33 deletions(-)

diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index a2fc37d..0b651c4 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -1345,6 +1345,52 @@ static HRESULT d3d12_swapchain_create_buffers(struct d3d12_swapchain *swapchain,
     return S_OK;
 }
 
+static void d3d12_swapchain_destroy_buffers(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");
+        }
+    }
+
+    for (i = 0; i < swapchain->buffer_count; ++i)
+    {
+        if (swapchain->buffers[i])
+        {
+            vkd3d_resource_decref(swapchain->buffers[i]);
+            swapchain->buffers[i] = NULL;
+        }
+
+        if (swapchain->vk_device)
+        {
+            vk_funcs->p_vkDestroyImage(swapchain->vk_device, swapchain->vk_images[i], NULL);
+            swapchain->vk_images[i] = VK_NULL_HANDLE;
+            vk_funcs->p_vkDestroySemaphore(swapchain->vk_device, swapchain->vk_semaphores[i], NULL);
+            swapchain->vk_semaphores[i] = VK_NULL_HANDLE;
+        }
+    }
+
+    if (swapchain->vk_device)
+    {
+        vk_funcs->p_vkFreeMemory(swapchain->vk_device, swapchain->vk_memory, NULL);
+        swapchain->vk_memory = VK_NULL_HANDLE;
+        vk_funcs->p_vkDestroyCommandPool(swapchain->vk_device, swapchain->vk_cmd_pool, NULL);
+        swapchain->vk_cmd_pool = VK_NULL_HANDLE;
+    }
+}
+
 static inline struct d3d12_swapchain *d3d12_swapchain_from_IDXGISwapChain3(IDXGISwapChain3 *iface)
 {
     return CONTAINING_RECORD(iface, struct d3d12_swapchain, IDXGISwapChain3_iface);
@@ -1388,49 +1434,18 @@ 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");
-        }
+    d3d12_swapchain_destroy_buffers(swapchain);
 
+    if (swapchain->command_queue)
         ID3D12CommandQueue_Release(swapchain->command_queue);
-    }
-
-    if (swapchain->factory)
-        IWineDXGIFactory_Release(swapchain->factory);
 
     wined3d_private_store_cleanup(&swapchain->private_store);
 
-    for (i = 0; i < swapchain->buffer_count; ++i)
-    {
-        if (swapchain->buffers[i])
-            vkd3d_resource_decref(swapchain->buffers[i]);
-
-        if (swapchain->vk_device)
-        {
-            vk_funcs->p_vkDestroyImage(swapchain->vk_device, swapchain->vk_images[i], NULL);
-            vk_funcs->p_vkDestroySemaphore(swapchain->vk_device, swapchain->vk_semaphores[i], NULL);
-        }
-    }
-
     if (swapchain->vk_device)
     {
         vk_funcs->p_vkDestroyFence(swapchain->vk_device, swapchain->vk_fence, NULL);
         vk_funcs->p_vkDestroySwapchainKHR(swapchain->vk_device, swapchain->vk_swapchain, NULL);
-
-        vk_funcs->p_vkFreeMemory(swapchain->vk_device, swapchain->vk_memory, NULL);
-        vk_funcs->p_vkDestroyCommandPool(swapchain->vk_device, swapchain->vk_cmd_pool, NULL);
     }
 
     if (swapchain->vk_instance)
@@ -1438,6 +1453,9 @@ static void d3d12_swapchain_destroy(struct d3d12_swapchain *swapchain)
 
     if (swapchain->device)
         ID3D12Device_Release(swapchain->device);
+
+    if (swapchain->factory)
+        IWineDXGIFactory_Release(swapchain->factory);
 }
 
 static ULONG STDMETHODCALLTYPE d3d12_swapchain_Release(IDXGISwapChain3 *iface)




More information about the wine-cvs mailing list