Henri Verbeet : dxgi: Add a wined3d device to dxgi_device.

Alexandre Julliard julliard at winehq.org
Mon Nov 17 09:14:28 CST 2008


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Mon Nov 17 12:16:04 2008 +0100

dxgi: Add a wined3d device to dxgi_device.

---

 dlls/dxgi/device.c       |    4 +++
 dlls/dxgi/dxgi_main.c    |   52 +++++++++++++++++++++++++++++++++++++++++++--
 dlls/dxgi/dxgi_private.h |    2 +
 3 files changed, 55 insertions(+), 3 deletions(-)

diff --git a/dlls/dxgi/device.c b/dlls/dxgi/device.c
index fddc535..7ccece6 100644
--- a/dlls/dxgi/device.c
+++ b/dlls/dxgi/device.c
@@ -73,6 +73,10 @@ static ULONG STDMETHODCALLTYPE dxgi_device_Release(IDXGIDevice *iface)
     if (!refcount)
     {
         if (This->child_layer) IUnknown_Release(This->child_layer);
+        EnterCriticalSection(&dxgi_cs);
+        IWineD3DDevice_Release(This->wined3d_device);
+        LeaveCriticalSection(&dxgi_cs);
+        IWineDXGIFactory_Release(This->factory);
         HeapFree(GetProcessHeap(), 0, This);
     }
 
diff --git a/dlls/dxgi/dxgi_main.c b/dlls/dxgi/dxgi_main.c
index e12d11c..05476a5 100644
--- a/dlls/dxgi/dxgi_main.c
+++ b/dlls/dxgi/dxgi_main.c
@@ -166,6 +166,9 @@ HRESULT WINAPI DXGID3D10CreateDevice(HMODULE d3d10core, IDXGIFactory *factory, I
     struct layer_get_size_args get_size_args;
     struct dxgi_device *dxgi_device;
     struct dxgi_device_layer d3d10_layer;
+    IWineDXGIAdapter *wine_adapter;
+    UINT adapter_ordinal;
+    IWineD3D *wined3d;
     void *layer_base;
     UINT device_size;
     DWORD count;
@@ -217,6 +220,39 @@ HRESULT WINAPI DXGID3D10CreateDevice(HMODULE d3d10core, IDXGIFactory *factory, I
 
     dxgi_device->vtbl = &dxgi_device_vtbl;
     dxgi_device->refcount = 1;
+
+    hr = IDXGIFactory_QueryInterface(factory, &IID_IWineDXGIFactory, (void **)&dxgi_device->factory);
+    if (FAILED(hr))
+    {
+        WARN("This is not the factory we're looking for, returning %#x\n", hr);
+        goto fail;
+    }
+    wined3d = IWineDXGIFactory_get_wined3d(dxgi_device->factory);
+
+    hr = IDXGIAdapter_QueryInterface(adapter, &IID_IWineDXGIAdapter, (void **)&wine_adapter);
+    if (FAILED(hr))
+    {
+        WARN("This is not the adapter we're looking for, returning %#x\n", hr);
+        EnterCriticalSection(&dxgi_cs);
+        IWineD3D_Release(wined3d);
+        LeaveCriticalSection(&dxgi_cs);
+        goto fail;
+    }
+    adapter_ordinal = IWineDXGIAdapter_get_ordinal(wine_adapter);
+    IWineDXGIAdapter_Release(wine_adapter);
+
+    FIXME("Ignoring adapter type\n");
+    EnterCriticalSection(&dxgi_cs);
+    hr = IWineD3D_CreateDevice(wined3d, adapter_ordinal, WINED3DDEVTYPE_HAL, NULL,
+            0, &dxgi_device->wined3d_device, (IUnknown *)dxgi_device);
+    IWineD3D_Release(wined3d);
+    LeaveCriticalSection(&dxgi_cs);
+    if (FAILED(hr))
+    {
+        WARN("Failed to create a WineD3D device, returning %#x\n", hr);
+        goto fail;
+    }
+
     layer_base = dxgi_device + 1;
 
     hr = d3d10_layer.create(d3d10_layer.id, &layer_base, 0,
@@ -224,14 +260,24 @@ HRESULT WINAPI DXGID3D10CreateDevice(HMODULE d3d10core, IDXGIFactory *factory, I
     if (FAILED(hr))
     {
         WARN("Failed to create device, returning %#x\n", hr);
-        HeapFree(GetProcessHeap(), 0, dxgi_device);
-        *device = NULL;
-        return hr;
+        goto fail;
     }
 
     *device = (IUnknown *)dxgi_device;
 
     return hr;
+
+fail:
+    if (dxgi_device->wined3d_device)
+    {
+        EnterCriticalSection(&dxgi_cs);
+        IWineD3DDevice_Release(dxgi_device->wined3d_device);
+        LeaveCriticalSection(&dxgi_cs);
+    }
+    if (dxgi_device->factory) IWineDXGIFactory_Release(dxgi_device->factory);
+    HeapFree(GetProcessHeap(), 0, dxgi_device);
+    *device = NULL;
+    return hr;
 }
 
 HRESULT WINAPI DXGID3D10RegisterLayers(const struct dxgi_device_layer *layers, UINT layer_count)
diff --git a/dlls/dxgi/dxgi_private.h b/dlls/dxgi/dxgi_private.h
index 7ebf2e2..95dab26 100644
--- a/dlls/dxgi/dxgi_private.h
+++ b/dlls/dxgi/dxgi_private.h
@@ -55,6 +55,8 @@ struct dxgi_device
     const struct IDXGIDeviceVtbl *vtbl;
     IUnknown *child_layer;
     LONG refcount;
+    IWineD3DDevice *wined3d_device;
+    IWineDXGIFactory *factory;
 };
 
 /* IDXGIAdapter */




More information about the wine-cvs mailing list