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