Henri Verbeet : dxgi: Store an array of adapters in dxgi_factory.

Alexandre Julliard julliard at winehq.org
Tue Nov 18 09:27:12 CST 2008


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

Author: Henri Verbeet <hverbeet at 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);




More information about the wine-cvs mailing list