From 9e886423e7822577e8e5200c575fc17e4efebd32 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Tue, 29 Dec 2009 17:10:23 +0100 Subject: [PATCH] dxgi: Add a separate function for factory initialization. --- 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 312b3b79ebb..ec1b2f093f4 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_factory_init(object); + if (FAILED(hr)) { - 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) - { - 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 693bc3929a4..2a46e402305 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 150e40ce015..9af9b407275 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; +}