Henri Verbeet : dxgi: Add a separate function for device initialization.

Alexandre Julliard julliard at winehq.org
Thu Nov 19 10:15:22 CST 2009


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Thu Nov 19 11:41:25 2009 +0100

dxgi: Add a separate function for device initialization.

---

 dlls/dxgi/device.c       |   79 +++++++++++++++++++++++++++++++++++++++++++++-
 dlls/dxgi/dxgi_main.c    |   75 ++++---------------------------------------
 dlls/dxgi/dxgi_private.h |   68 ++++++++++++++++++++-------------------
 3 files changed, 120 insertions(+), 102 deletions(-)

diff --git a/dlls/dxgi/device.c b/dlls/dxgi/device.c
index bf079d5..9741d0e 100644
--- a/dlls/dxgi/device.c
+++ b/dlls/dxgi/device.c
@@ -312,7 +312,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_device_create_swapchain(IWineDXGIDevice *i
     return S_OK;
 }
 
-const struct IWineDXGIDeviceVtbl dxgi_device_vtbl =
+static const struct IWineDXGIDeviceVtbl dxgi_device_vtbl =
 {
     /* IUnknown methods */
     dxgi_device_QueryInterface,
@@ -334,3 +334,80 @@ const struct IWineDXGIDeviceVtbl dxgi_device_vtbl =
     dxgi_device_create_surface,
     dxgi_device_create_swapchain,
 };
+
+HRESULT dxgi_device_init(struct dxgi_device *device, struct dxgi_device_layer *layer,
+        IDXGIFactory *factory, IDXGIAdapter *adapter)
+{
+    IWineD3DDeviceParent *wined3d_device_parent;
+    IWineDXGIAdapter *wine_adapter;
+    UINT adapter_ordinal;
+    IWineD3D *wined3d;
+    void *layer_base;
+    HRESULT hr;
+
+    device->vtbl = &dxgi_device_vtbl;
+    device->refcount = 1;
+
+    layer_base = device + 1;
+
+    hr = layer->create(layer->id, &layer_base, 0,
+            device, &IID_IUnknown, (void **)&device->child_layer);
+    if (FAILED(hr))
+    {
+        WARN("Failed to create device, returning %#x.\n", hr);
+        goto fail;
+    }
+
+    hr = IDXGIFactory_QueryInterface(factory, &IID_IWineDXGIFactory, (void **)&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(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);
+
+    hr = IUnknown_QueryInterface((IUnknown *)device, &IID_IWineD3DDeviceParent, (void **)&wined3d_device_parent);
+    if (FAILED(hr))
+    {
+        ERR("DXGI device should implement IWineD3DDeviceParent.\n");
+        goto fail;
+    }
+
+    FIXME("Ignoring adapter type.\n");
+    EnterCriticalSection(&dxgi_cs);
+    hr = IWineD3D_CreateDevice(wined3d, adapter_ordinal, WINED3DDEVTYPE_HAL, NULL, 0,
+            (IUnknown *)device, wined3d_device_parent, &device->wined3d_device);
+    IWineD3DDeviceParent_Release(wined3d_device_parent);
+    IWineD3D_Release(wined3d);
+    LeaveCriticalSection(&dxgi_cs);
+    if (FAILED(hr))
+    {
+        WARN("Failed to create a wined3d device, returning %#x.\n", hr);
+        goto fail;
+    }
+
+    return S_OK;
+
+fail:
+    if (device->wined3d_device)
+    {
+        EnterCriticalSection(&dxgi_cs);
+        IWineD3DDevice_Release(device->wined3d_device);
+        LeaveCriticalSection(&dxgi_cs);
+    }
+    if (device->factory) IWineDXGIFactory_Release(device->factory);
+    if (device->child_layer) IUnknown_Release(device->child_layer);
+    return hr;
+}
diff --git a/dlls/dxgi/dxgi_main.c b/dlls/dxgi/dxgi_main.c
index fcc6c07..3b153ab 100644
--- a/dlls/dxgi/dxgi_main.c
+++ b/dlls/dxgi/dxgi_main.c
@@ -226,14 +226,9 @@ static HRESULT register_d3d10core_layers(HMODULE d3d10core)
 HRESULT WINAPI DXGID3D10CreateDevice(HMODULE d3d10core, IDXGIFactory *factory, IDXGIAdapter *adapter,
         UINT flags, DWORD unknown0, void **device)
 {
-    IWineD3DDeviceParent *wined3d_device_parent;
     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;
     HRESULT hr;
@@ -282,75 +277,19 @@ HRESULT WINAPI DXGID3D10CreateDevice(HMODULE d3d10core, IDXGIFactory *factory, I
         return E_OUTOFMEMORY;
     }
 
-    dxgi_device->vtbl = &dxgi_device_vtbl;
-    dxgi_device->refcount = 1;
-
-    layer_base = dxgi_device + 1;
-
-    hr = d3d10_layer.create(d3d10_layer.id, &layer_base, 0,
-            dxgi_device, &IID_IUnknown, (void **)&dxgi_device->child_layer);
-    if (FAILED(hr))
-    {
-        WARN("Failed to create device, returning %#x\n", hr);
-        goto fail;
-    }
-
-    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);
-
-    hr = IUnknown_QueryInterface((IUnknown *)dxgi_device, &IID_IWineD3DDeviceParent, (void **)&wined3d_device_parent);
+    hr = dxgi_device_init(dxgi_device, &d3d10_layer, factory, adapter);
     if (FAILED(hr))
     {
-        ERR("DXGI device should implement IWineD3DDeviceParent\n");
-        goto fail;
-    }
-
-    FIXME("Ignoring adapter type\n");
-    EnterCriticalSection(&dxgi_cs);
-    hr = IWineD3D_CreateDevice(wined3d, adapter_ordinal, WINED3DDEVTYPE_HAL, NULL, 0,
-            (IUnknown *)dxgi_device, wined3d_device_parent, &dxgi_device->wined3d_device);
-    IWineD3DDeviceParent_Release(wined3d_device_parent);
-    IWineD3D_Release(wined3d);
-    LeaveCriticalSection(&dxgi_cs);
-    if (FAILED(hr))
-    {
-        WARN("Failed to create a WineD3D device, returning %#x\n", hr);
-        goto fail;
+        WARN("Failed to initialize device, hr %#x.\n", hr);
+        HeapFree(GetProcessHeap(), 0, dxgi_device);
+        *device = NULL;
+        return hr;
     }
 
+    TRACE("Created device %p.\n", dxgi_device);
     *device = 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);
-    if (dxgi_device->child_layer) IUnknown_Release(dxgi_device->child_layer);
-    HeapFree(GetProcessHeap(), 0, dxgi_device);
-    *device = NULL;
-    return hr;
+    return S_OK;
 }
 
 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 0e4593d..46b6f43 100644
--- a/dlls/dxgi/dxgi_private.h
+++ b/dlls/dxgi/dxgi_private.h
@@ -36,6 +36,38 @@
 
 extern CRITICAL_SECTION dxgi_cs DECLSPEC_HIDDEN;
 
+/* Layered device */
+enum dxgi_device_layer_id
+{
+    DXGI_DEVICE_LAYER_DEBUG1        = 0x8,
+    DXGI_DEVICE_LAYER_THREAD_SAFE   = 0x10,
+    DXGI_DEVICE_LAYER_DEBUG2        = 0x20,
+    DXGI_DEVICE_LAYER_SWITCH_TO_REF = 0x30,
+    DXGI_DEVICE_LAYER_D3D10_DEVICE  = 0xffffffff,
+};
+
+struct layer_get_size_args
+{
+    DWORD unknown0;
+    DWORD unknown1;
+    DWORD *unknown2;
+    DWORD *unknown3;
+    IDXGIAdapter *adapter;
+    WORD interface_major;
+    WORD interface_minor;
+    WORD version_build;
+    WORD version_revision;
+};
+
+struct dxgi_device_layer
+{
+    enum dxgi_device_layer_id id;
+    HRESULT (WINAPI *init)(enum dxgi_device_layer_id id, DWORD *count, DWORD *values);
+    UINT (WINAPI *get_size)(enum dxgi_device_layer_id id, struct layer_get_size_args *args, DWORD unknown0);
+    HRESULT (WINAPI *create)(enum dxgi_device_layer_id id, void **layer_base, DWORD unknown0,
+            void *device_object, REFIID riid, void **device_layer);
+};
+
 /* TRACE helper functions */
 const char *debug_dxgi_format(DXGI_FORMAT format) DECLSPEC_HIDDEN;
 
@@ -53,7 +85,6 @@ struct dxgi_factory
 };
 
 /* IDXGIDevice */
-extern const struct IWineDXGIDeviceVtbl dxgi_device_vtbl DECLSPEC_HIDDEN;
 struct dxgi_device
 {
     const struct IWineDXGIDeviceVtbl *vtbl;
@@ -63,6 +94,9 @@ struct dxgi_device
     IWineDXGIFactory *factory;
 };
 
+HRESULT dxgi_device_init(struct dxgi_device *device, struct dxgi_device_layer *layer,
+        IDXGIFactory *factory, IDXGIAdapter *adapter) DECLSPEC_HIDDEN;
+
 /* IDXGIOutput */
 struct dxgi_output
 {
@@ -104,36 +138,4 @@ struct dxgi_surface
     LONG refcount;
 };
 
-/* Layered device */
-enum dxgi_device_layer_id
-{
-    DXGI_DEVICE_LAYER_DEBUG1        = 0x8,
-    DXGI_DEVICE_LAYER_THREAD_SAFE   = 0x10,
-    DXGI_DEVICE_LAYER_DEBUG2        = 0x20,
-    DXGI_DEVICE_LAYER_SWITCH_TO_REF = 0x30,
-    DXGI_DEVICE_LAYER_D3D10_DEVICE  = 0xffffffff,
-};
-
-struct layer_get_size_args
-{
-    DWORD unknown0;
-    DWORD unknown1;
-    DWORD *unknown2;
-    DWORD *unknown3;
-    IDXGIAdapter *adapter;
-    WORD interface_major;
-    WORD interface_minor;
-    WORD version_build;
-    WORD version_revision;
-};
-
-struct dxgi_device_layer
-{
-    enum dxgi_device_layer_id id;
-    HRESULT (WINAPI *init)(enum dxgi_device_layer_id id, DWORD *count, DWORD *values);
-    UINT (WINAPI *get_size)(enum dxgi_device_layer_id id, struct layer_get_size_args *args, DWORD unknown0);
-    HRESULT (WINAPI *create)(enum dxgi_device_layer_id id, void **layer_base, DWORD unknown0,
-            void *device_object, REFIID riid, void **device_layer);
-};
-
 #endif /* __WINE_DXGI_PRIVATE_H */




More information about the wine-cvs mailing list