Module: wine Branch: master Commit: a42b7568b9608349bc31fb466da218a48181cf61 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a42b7568b9608349bc31fb466d...
Author: Henri Verbeet hverbeet@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 */