[PATCH 5/5] dxgi: Add a separate function for factory initialization.

Henri Verbeet hverbeet at codeweavers.com
Tue Dec 29 10:10:23 CST 2009


---
 dlls/dxgi/dxgi_main.c    |   72 ++++-----------------------------------------
 dlls/dxgi/dxgi_private.h |    3 +-
 dlls/dxgi/factory.c      |   73 +++++++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 80 insertions(+), 68 deletions(-)

diff --git a/dlls/dxgi/dxgi_main.c b/dlls/dxgi/dxgi_main.c
index 312b3b7..ec1b2f0 100644
--- a/dlls/dxgi/dxgi_main.c
+++ b/dlls/dxgi/dxgi_main.c
@@ -80,7 +80,6 @@ HRESULT WINAPI CreateDXGIFactory(REFIID riid, void **factory)
 {
     struct dxgi_factory *object;
     HRESULT hr;
-    UINT i;
 
     TRACE("riid %s, factory %p\n", debugstr_guid(riid), factory);
 
@@ -92,59 +91,13 @@ HRESULT WINAPI CreateDXGIFactory(REFIID riid, void **factory)
         return E_OUTOFMEMORY;
     }
 
-    object->vtbl = &dxgi_factory_vtbl;
-    object->refcount = 1;
-
-    EnterCriticalSection(&dxgi_cs);
-    object->wined3d = WineDirect3DCreate(10, (IUnknown *)object);
-    if(!object->wined3d)
-    {
-        hr = DXGI_ERROR_UNSUPPORTED;
-        LeaveCriticalSection(&dxgi_cs);
-        goto fail;
-    }
-
-    object->adapter_count = IWineD3D_GetAdapterCount(object->wined3d);
-    LeaveCriticalSection(&dxgi_cs);
-    object->adapters = HeapAlloc(GetProcessHeap(), 0, object->adapter_count * sizeof(*object->adapters));
-    if (!object->adapters)
-    {
-        ERR("Failed to allocate DXGI adapter array memory\n");
-        hr = E_OUTOFMEMORY;
-        goto fail;
-    }
-
-    for (i = 0; i < object->adapter_count; ++i)
+    hr = dxgi_factory_init(object);
+    if (FAILED(hr))
     {
-        struct dxgi_adapter *adapter = HeapAlloc(GetProcessHeap(), 0, sizeof(*adapter));
-        if (!adapter)
-        {
-            UINT j;
-            ERR("Failed to allocate DXGI adapter memory\n");
-            for (j = 0; j < i; ++j)
-            {
-                HeapFree(GetProcessHeap(), 0, object->adapters[j]);
-            }
-            hr = E_OUTOFMEMORY;
-            goto fail;
-        }
-
-        hr = dxgi_adapter_init(adapter, (IWineDXGIFactory *)object, i);
-        if (FAILED(hr))
-        {
-            UINT j;
-
-            ERR("Failed to initialize adapter, hr %#x.\n", hr);
-
-            HeapFree(GetProcessHeap(), 0, adapter);
-            for (j = 0; j < i; ++j)
-            {
-                IDXGIAdapter_Release(object->adapters[j]);
-            }
-            goto fail;
-        }
-
-        object->adapters[i] = (IDXGIAdapter *)adapter;
+        WARN("Failed to initialize swapchain, hr %#x.\n", hr);
+        HeapFree(GetProcessHeap(), 0, object);
+        *factory = NULL;
+        return hr;
     }
 
     TRACE("Created IDXGIFactory %p\n", object);
@@ -153,19 +106,6 @@ HRESULT WINAPI CreateDXGIFactory(REFIID riid, void **factory)
     IDXGIFactory_Release((IDXGIFactory *)object);
 
     return hr;
-
-fail:
-    HeapFree(GetProcessHeap(), 0, object->adapters);
-    if (object->wined3d)
-    {
-        EnterCriticalSection(&dxgi_cs);
-        IWineD3D_Release(object->wined3d);
-        LeaveCriticalSection(&dxgi_cs);
-    }
-    HeapFree(GetProcessHeap(), 0, object);
-    *factory = NULL;
-    return hr;
-
 }
 
 static BOOL get_layer(enum dxgi_device_layer_id id, struct dxgi_device_layer *layer)
diff --git a/dlls/dxgi/dxgi_private.h b/dlls/dxgi/dxgi_private.h
index 693bc39..2a46e40 100644
--- a/dlls/dxgi/dxgi_private.h
+++ b/dlls/dxgi/dxgi_private.h
@@ -75,7 +75,6 @@ const char *debug_dxgi_format(DXGI_FORMAT format) DECLSPEC_HIDDEN;
 WINED3DFORMAT wined3dformat_from_dxgi_format(DXGI_FORMAT format) DECLSPEC_HIDDEN;
 
 /* IDXGIFactory */
-extern const struct IWineDXGIFactoryVtbl dxgi_factory_vtbl DECLSPEC_HIDDEN;
 struct dxgi_factory
 {
     const struct IWineDXGIFactoryVtbl *vtbl;
@@ -85,6 +84,8 @@ struct dxgi_factory
     IDXGIAdapter **adapters;
 };
 
+HRESULT dxgi_factory_init(struct dxgi_factory *factory) DECLSPEC_HIDDEN;
+
 /* IDXGIDevice */
 struct dxgi_device
 {
diff --git a/dlls/dxgi/factory.c b/dlls/dxgi/factory.c
index 150e40c..9af9b40 100644
--- a/dlls/dxgi/factory.c
+++ b/dlls/dxgi/factory.c
@@ -274,7 +274,7 @@ static IWineD3D * STDMETHODCALLTYPE dxgi_factory_get_wined3d(IWineDXGIFactory *i
     return This->wined3d;
 }
 
-const struct IWineDXGIFactoryVtbl dxgi_factory_vtbl =
+static const struct IWineDXGIFactoryVtbl dxgi_factory_vtbl =
 {
     /* IUnknown methods */
     dxgi_factory_QueryInterface,
@@ -294,3 +294,74 @@ const struct IWineDXGIFactoryVtbl dxgi_factory_vtbl =
     /* IWineDXGIFactory methods */
     dxgi_factory_get_wined3d,
 };
+
+HRESULT dxgi_factory_init(struct dxgi_factory *factory)
+{
+    HRESULT hr;
+    UINT i;
+
+    factory->vtbl = &dxgi_factory_vtbl;
+    factory->refcount = 1;
+
+    EnterCriticalSection(&dxgi_cs);
+    factory->wined3d = WineDirect3DCreate(10, (IUnknown *)factory);
+    if (!factory->wined3d)
+    {
+        LeaveCriticalSection(&dxgi_cs);
+        return DXGI_ERROR_UNSUPPORTED;
+    }
+
+    factory->adapter_count = IWineD3D_GetAdapterCount(factory->wined3d);
+    LeaveCriticalSection(&dxgi_cs);
+    factory->adapters = HeapAlloc(GetProcessHeap(), 0, factory->adapter_count * sizeof(*factory->adapters));
+    if (!factory->adapters)
+    {
+        ERR("Failed to allocate DXGI adapter array memory.\n");
+        hr = E_OUTOFMEMORY;
+        goto fail;
+    }
+
+    for (i = 0; i < factory->adapter_count; ++i)
+    {
+        struct dxgi_adapter *adapter = HeapAlloc(GetProcessHeap(), 0, sizeof(*adapter));
+        if (!adapter)
+        {
+            UINT j;
+
+            ERR("Failed to allocate DXGI adapter memory.\n");
+
+            for (j = 0; j < i; ++j)
+            {
+                IDXGIAdapter_Release(factory->adapters[j]);
+            }
+            hr = E_OUTOFMEMORY;
+            goto fail;
+        }
+
+        hr = dxgi_adapter_init(adapter, (IWineDXGIFactory *)factory, i);
+        if (FAILED(hr))
+        {
+            UINT j;
+
+            ERR("Failed to initialize adapter, hr %#x.\n", hr);
+
+            HeapFree(GetProcessHeap(), 0, adapter);
+            for (j = 0; j < i; ++j)
+            {
+                IDXGIAdapter_Release(factory->adapters[j]);
+            }
+            goto fail;
+        }
+
+        factory->adapters[i] = (IDXGIAdapter *)adapter;
+    }
+
+    return S_OK;
+
+fail:
+    HeapFree(GetProcessHeap(), 0, factory->adapters);
+    EnterCriticalSection(&dxgi_cs);
+    IWineD3D_Release(factory->wined3d);
+    LeaveCriticalSection(&dxgi_cs);
+    return hr;
+}
-- 
1.6.4.4




More information about the wine-patches mailing list