Stefan Dösinger : d3d8: Fix device creation error handling.

Alexandre Julliard julliard at winehq.org
Tue Nov 3 15:37:17 CST 2009


Module: wine
Branch: master
Commit: 83bca757070f6fb7d9045bddac2dd7d1cde1251e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=83bca757070f6fb7d9045bddac2dd7d1cde1251e

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Tue Oct 20 10:20:18 2009 +0200

d3d8: Fix device creation error handling.

---

 dlls/d3d8/directx.c |   27 +++++++++++++++++----------
 1 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/dlls/d3d8/directx.c b/dlls/d3d8/directx.c
index aedfdc8..57ddf56 100644
--- a/dlls/d3d8/directx.c
+++ b/dlls/d3d8/directx.c
@@ -413,6 +413,10 @@ static HRESULT WINAPI IDirect3D8Impl_CreateDevice(LPDIRECT3D8 iface, UINT Adapte
 
     hr = IWineD3DDevice_Init3D(object->WineD3DDevice, &localParameters);
     wined3d_mutex_unlock();
+    if (hr != D3D_OK) {
+        FIXME("(%p) D3D Initialization failed for WineD3DDevice %p\n", This, object->WineD3DDevice);
+        goto err;
+    }
 
     pPresentationParameters->BackBufferWidth                    = localParameters.BackBufferWidth;
     pPresentationParameters->BackBufferHeight                   = localParameters.BackBufferHeight;
@@ -428,25 +432,28 @@ static HRESULT WINAPI IDirect3D8Impl_CreateDevice(LPDIRECT3D8 iface, UINT Adapte
     pPresentationParameters->FullScreen_RefreshRateInHz         = localParameters.FullScreen_RefreshRateInHz;
     pPresentationParameters->FullScreen_PresentationInterval    = localParameters.PresentationInterval;
 
-    if (hr != D3D_OK) {
-        FIXME("(%p) D3D Initialization failed for WineD3DDevice %p\n", This, object->WineD3DDevice);
-        HeapFree(GetProcessHeap(), 0, object);
-        *ppReturnedDeviceInterface = NULL;
-    }
-
     object->declArraySize = 16;
     object->decls = HeapAlloc(GetProcessHeap(), 0, object->declArraySize * sizeof(*object->decls));
     if(!object->decls) {
         ERR("Out of memory\n");
+        hr = E_OUTOFMEMORY;
+        goto err;
+    }
+    return D3D_OK;
 
+err:
+    *ppReturnedDeviceInterface = NULL;
+
+    if(!object) return hr;
+    HeapFree(GetProcessHeap(), 0, object->decls);
+    if(object->WineD3DDevice) {
         wined3d_mutex_lock();
+        IWineD3DDevice_Uninit3D(object->WineD3DDevice, D3D8CB_DestroySwapChain);
         IWineD3DDevice_Release(object->WineD3DDevice);
         wined3d_mutex_unlock();
-
-        HeapFree(GetProcessHeap(), 0, object);
-        *ppReturnedDeviceInterface = NULL;
-        hr = E_OUTOFMEMORY;
     }
+    HeapFree(GetProcessHeap(), 0, object);
+
     return hr;
 }
 




More information about the wine-cvs mailing list