Module: wine Branch: master Commit: 808bbeb065073175a481659baae6eee4023be8d9 URL: http://source.winehq.org/git/wine.git/?a=commit;h=808bbeb065073175a481659baa...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Tue Nov 18 09:27:58 2008 +0100
dxgi: Store an array of adapters in dxgi_factory.
---
dlls/dxgi/dxgi_main.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ dlls/dxgi/dxgi_private.h | 2 ++ dlls/dxgi/factory.c | 7 +++++++ 3 files changed, 54 insertions(+), 0 deletions(-)
diff --git a/dlls/dxgi/dxgi_main.c b/dlls/dxgi/dxgi_main.c index 05476a5..a6dc5e6 100644 --- a/dlls/dxgi/dxgi_main.c +++ b/dlls/dxgi/dxgi_main.c @@ -80,6 +80,7 @@ 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);
@@ -87,6 +88,7 @@ HRESULT WINAPI CreateDXGIFactory(REFIID riid, void **factory) if (!object) { ERR("Failed to allocate DXGI factory object memory\n"); + *factory = NULL; return E_OUTOFMEMORY; }
@@ -95,7 +97,37 @@ HRESULT WINAPI CreateDXGIFactory(REFIID riid, void **factory)
EnterCriticalSection(&dxgi_cs); object->wined3d = WineDirect3DCreate(10, (IUnknown *)object); + + 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(**object->adapters)); + 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; + } + + adapter->vtbl = &dxgi_adapter_vtbl; + adapter->refcount = 1; + adapter->ordinal = i; + object->adapters[i] = (IDXGIAdapter *)adapter; + }
TRACE("Created IDXGIFactory %p\n", object);
@@ -103,6 +135,19 @@ 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 95dab26..25c54cb 100644 --- a/dlls/dxgi/dxgi_private.h +++ b/dlls/dxgi/dxgi_private.h @@ -46,6 +46,8 @@ struct dxgi_factory const struct IWineDXGIFactoryVtbl *vtbl; LONG refcount; IWineD3D *wined3d; + UINT adapter_count; + IDXGIAdapter **adapters; };
/* IDXGIDevice */ diff --git a/dlls/dxgi/factory.c b/dlls/dxgi/factory.c index a5f17e5..92b6cb5 100644 --- a/dlls/dxgi/factory.c +++ b/dlls/dxgi/factory.c @@ -65,6 +65,13 @@ static ULONG STDMETHODCALLTYPE dxgi_factory_Release(IWineDXGIFactory *iface)
if (!refcount) { + UINT i; + + for (i = 0; i < This->adapter_count; ++i) + { + IDXGIAdapter_Release(This->adapters[i]); + } + EnterCriticalSection(&dxgi_cs); IWineD3D_Release(This->wined3d); LeaveCriticalSection(&dxgi_cs);