Zhiyi Zhang : wined3d: Clean up swapchain state on wined3d_swapchain_init() failure paths.

Alexandre Julliard julliard at winehq.org
Mon Oct 12 15:20:50 CDT 2020


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

Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date:   Mon Oct 12 16:41:01 2020 +0800

wined3d: Clean up swapchain state on wined3d_swapchain_init() failure paths.

Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wined3d/swapchain.c       | 8 +++++---
 dlls/wined3d/wined3d_main.c    | 7 ++++++-
 dlls/wined3d/wined3d_private.h | 2 +-
 3 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index f821437997..aa56634f3f 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -34,7 +34,7 @@ void wined3d_swapchain_cleanup(struct wined3d_swapchain *swapchain)
 
     TRACE("Destroying swapchain %p.\n", swapchain);
 
-    wined3d_swapchain_state_unregister(&swapchain->state);
+    wined3d_swapchain_state_cleanup(&swapchain->state);
     wined3d_swapchain_set_gamma_ramp(swapchain, 0, &swapchain->orig_gamma);
 
     /* Release the swapchain's draw buffers. Make sure swapchain->back_buffers[0]
@@ -1359,7 +1359,8 @@ static HRESULT wined3d_swapchain_init(struct wined3d_swapchain *swapchain, struc
     if (FAILED(hr = wined3d_swapchain_state_init(&swapchain->state, desc, window, device->wined3d, state_parent)))
     {
         ERR("Failed to initialise swapchain state, hr %#x.\n", hr);
-        goto err;
+        wined3d_mutex_unlock();
+        return hr;
     }
 
     swapchain->swapchain_ops = swapchain_ops;
@@ -1565,6 +1566,7 @@ err:
         wined3d_texture_decref(swapchain->front_buffer);
     }
 
+    wined3d_swapchain_state_cleanup(&swapchain->state);
     wined3d_mutex_unlock();
 
     return hr;
@@ -2290,7 +2292,7 @@ BOOL CDECL wined3d_swapchain_state_is_windowed(const struct wined3d_swapchain_st
 
 void CDECL wined3d_swapchain_state_destroy(struct wined3d_swapchain_state *state)
 {
-    wined3d_swapchain_state_unregister(state);
+    wined3d_swapchain_state_cleanup(state);
     heap_free(state);
 }
 
diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c
index 001b7dd125..7e96f87468 100644
--- a/dlls/wined3d/wined3d_main.c
+++ b/dlls/wined3d/wined3d_main.c
@@ -817,7 +817,7 @@ void wined3d_swapchain_state_register(struct wined3d_swapchain_state *state,
     wined3d_wndproc_mutex_unlock();
 }
 
-void wined3d_swapchain_state_unregister(struct wined3d_swapchain_state *state)
+static void wined3d_swapchain_state_unregister(struct wined3d_swapchain_state *state)
 {
     struct wined3d_registered_swapchain_state *state_entry, *last_state_entry;
     struct wined3d_window_hook *hook, *last_hook;
@@ -850,6 +850,11 @@ void wined3d_swapchain_state_unregister(struct wined3d_swapchain_state *state)
     wined3d_wndproc_mutex_unlock();
 }
 
+void wined3d_swapchain_state_cleanup(struct wined3d_swapchain_state *state)
+{
+    wined3d_swapchain_state_unregister(state);
+}
+
 /* At process attach */
 BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, void *reserved)
 {
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 4c2204cd86..901c809d87 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -5083,13 +5083,13 @@ struct wined3d_swapchain_state
     HWND device_window;
 };
 
+void wined3d_swapchain_state_cleanup(struct wined3d_swapchain_state *state) DECLSPEC_HIDDEN;
 void wined3d_swapchain_state_register(struct wined3d_swapchain_state *state,
         struct wined3d *wined3d) DECLSPEC_HIDDEN;
 void wined3d_swapchain_state_restore_from_fullscreen(struct wined3d_swapchain_state *state,
         HWND window, const RECT *window_rect) DECLSPEC_HIDDEN;
 HRESULT wined3d_swapchain_state_setup_fullscreen(struct wined3d_swapchain_state *state,
         HWND window, int x, int y, int width, int height) DECLSPEC_HIDDEN;
-void wined3d_swapchain_state_unregister(struct wined3d_swapchain_state *state) DECLSPEC_HIDDEN;
 
 struct wined3d_swapchain_ops
 {




More information about the wine-cvs mailing list