[PATCH 4/5] dxgi: Call wined3d_device_init_3d() on device creation.

Henri Verbeet hverbeet at codeweavers.com
Mon Sep 15 04:03:36 CDT 2014


---
 dlls/dxgi/Makefile.in     |    2 +-
 dlls/dxgi/device.c        |   27 ++++++++++++-----------
 dlls/dxgi/dxgi_private.h  |    2 ++
 dlls/dxgi/factory.c       |   54 +++++++++++++++++++++------------------------
 dlls/dxgi/swapchain.c     |   14 +-----------
 include/wine/winedxgi.idl |    1 -
 6 files changed, 43 insertions(+), 57 deletions(-)

diff --git a/dlls/dxgi/Makefile.in b/dlls/dxgi/Makefile.in
index 0082a6c..ce76b8e 100644
--- a/dlls/dxgi/Makefile.in
+++ b/dlls/dxgi/Makefile.in
@@ -1,6 +1,6 @@
 MODULE    = dxgi.dll
 IMPORTLIB = dxgi
-IMPORTS   = dxguid uuid wined3d
+IMPORTS   = dxguid uuid wined3d user32
 
 C_SRCS = \
 	adapter.c \
diff --git a/dlls/dxgi/device.c b/dlls/dxgi/device.c
index ac3bbfc..7976a91 100644
--- a/dlls/dxgi/device.c
+++ b/dlls/dxgi/device.c
@@ -80,6 +80,7 @@ static ULONG STDMETHODCALLTYPE dxgi_device_Release(IWineDXGIDevice *iface)
     {
         if (This->child_layer) IUnknown_Release(This->child_layer);
         EnterCriticalSection(&dxgi_cs);
+        wined3d_device_uninit_3d(This->wined3d_device);
         wined3d_device_decref(This->wined3d_device);
         LeaveCriticalSection(&dxgi_cs);
         IDXGIFactory1_Release(This->factory);
@@ -248,18 +249,6 @@ static HRESULT STDMETHODCALLTYPE dxgi_device_GetGPUThreadPriority(IWineDXGIDevic
 
 /* IWineDXGIDevice methods */
 
-static struct wined3d_device * STDMETHODCALLTYPE dxgi_device_get_wined3d_device(IWineDXGIDevice *iface)
-{
-    struct dxgi_device *This = impl_from_IWineDXGIDevice(iface);
-
-    TRACE("iface %p\n", iface);
-
-    EnterCriticalSection(&dxgi_cs);
-    wined3d_device_incref(This->wined3d_device);
-    LeaveCriticalSection(&dxgi_cs);
-    return This->wined3d_device;
-}
-
 static HRESULT STDMETHODCALLTYPE dxgi_device_create_surface(IWineDXGIDevice *iface, const DXGI_SURFACE_DESC *desc,
         DXGI_USAGE usage, const DXGI_SHARED_RESOURCE *shared_resource, IUnknown *outer, void **surface)
 {
@@ -338,7 +327,6 @@ static const struct IWineDXGIDeviceVtbl dxgi_device_vtbl =
     dxgi_device_SetGPUThreadPriority,
     dxgi_device_GetGPUThreadPriority,
     /* IWineDXGIAdapter methods */
-    dxgi_device_get_wined3d_device,
     dxgi_device_create_surface,
     dxgi_device_create_swapchain,
 };
@@ -347,6 +335,7 @@ HRESULT dxgi_device_init(struct dxgi_device *device, struct dxgi_device_layer *l
         IDXGIFactory *factory, IDXGIAdapter *adapter)
 {
     struct wined3d_device_parent *wined3d_device_parent;
+    struct wined3d_swapchain_desc swapchain_desc;
     IWineDXGIDeviceParent *dxgi_device_parent;
     struct dxgi_adapter *dxgi_adapter;
     struct dxgi_factory *dxgi_factory;
@@ -411,6 +400,18 @@ HRESULT dxgi_device_init(struct dxgi_device *device, struct dxgi_device_layer *l
         return hr;
     }
 
+    memset(&swapchain_desc, 0, sizeof(swapchain_desc));
+    swapchain_desc.swap_effect = WINED3D_SWAP_EFFECT_DISCARD;
+    swapchain_desc.device_window = dxgi_factory_get_device_window(dxgi_factory);
+    swapchain_desc.windowed = TRUE;
+    if (FAILED(hr = wined3d_device_init_3d(device->wined3d_device, &swapchain_desc)))
+    {
+        ERR("Failed to initialize 3D, hr %#x.\n", hr);
+        wined3d_device_decref(device->wined3d_device);
+        IUnknown_Release(device->child_layer);
+        return hr;
+    }
+
     device->factory = &dxgi_factory->IDXGIFactory1_iface;
     IDXGIFactory1_AddRef(device->factory);
 
diff --git a/dlls/dxgi/dxgi_private.h b/dlls/dxgi/dxgi_private.h
index b4815ab..278137d 100644
--- a/dlls/dxgi/dxgi_private.h
+++ b/dlls/dxgi/dxgi_private.h
@@ -86,9 +86,11 @@ struct dxgi_factory
     UINT adapter_count;
     IDXGIAdapter1 **adapters;
     BOOL extended;
+    HWND device_window;
 };
 
 HRESULT dxgi_factory_create(REFIID riid, void **factory, BOOL extended) DECLSPEC_HIDDEN;
+HWND dxgi_factory_get_device_window(struct dxgi_factory *factory) DECLSPEC_HIDDEN;
 struct dxgi_factory *unsafe_impl_from_IDXGIFactory1(IDXGIFactory1 *iface) DECLSPEC_HIDDEN;
 
 /* IDXGIDevice */
diff --git a/dlls/dxgi/factory.c b/dlls/dxgi/factory.c
index c0e9197..9dbcb3e 100644
--- a/dlls/dxgi/factory.c
+++ b/dlls/dxgi/factory.c
@@ -72,6 +72,8 @@ static ULONG STDMETHODCALLTYPE dxgi_factory_Release(IDXGIFactory1 *iface)
     {
         UINT i;
 
+        if (factory->device_window)
+            DestroyWindow(factory->device_window);
         for (i = 0; i < factory->adapter_count; ++i)
         {
             IDXGIAdapter1_Release(factory->adapters[i]);
@@ -179,9 +181,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_factory_CreateSwapChain(IDXGIFactory1 *ifa
 {
     struct wined3d_swapchain *wined3d_swapchain;
     struct wined3d_swapchain_desc wined3d_desc;
-    struct wined3d_device *wined3d_device;
     IWineDXGIDevice *dxgi_device;
-    UINT count;
     HRESULT hr;
 
     FIXME("iface %p, device %p, desc %p, swapchain %p partial stub!\n", iface, device, desc, swapchain);
@@ -193,17 +193,6 @@ static HRESULT STDMETHODCALLTYPE dxgi_factory_CreateSwapChain(IDXGIFactory1 *ifa
         return hr;
     }
 
-    wined3d_device = IWineDXGIDevice_get_wined3d_device(dxgi_device);
-    IWineDXGIDevice_Release(dxgi_device);
-
-    count = wined3d_device_get_swapchain_count(wined3d_device);
-    if (count)
-    {
-        FIXME("Only a single swapchain supported.\n");
-        wined3d_device_decref(wined3d_device);
-        return E_FAIL;
-    }
-
     if (!desc->OutputWindow)
     {
         FIXME("No output window, should use factory output window\n");
@@ -234,29 +223,16 @@ static HRESULT STDMETHODCALLTYPE dxgi_factory_CreateSwapChain(IDXGIFactory1 *ifa
     wined3d_desc.refresh_rate = dxgi_rational_to_uint(&desc->BufferDesc.RefreshRate);
     wined3d_desc.swap_interval = WINED3DPRESENT_INTERVAL_DEFAULT;
 
-    hr = wined3d_device_init_3d(wined3d_device, &wined3d_desc);
+    hr = IWineDXGIDevice_create_swapchain(dxgi_device, &wined3d_desc, &wined3d_swapchain);
+    IWineDXGIDevice_Release(dxgi_device);
     if (FAILED(hr))
     {
-        WARN("Failed to initialize 3D, returning %#x\n", hr);
-        wined3d_device_decref(wined3d_device);
+        WARN("Failed to create swapchain, hr %#x.\n", hr);
         return hr;
     }
 
-    wined3d_swapchain = wined3d_device_get_swapchain(wined3d_device, 0);
-    wined3d_device_decref(wined3d_device);
-    if (!wined3d_swapchain)
-    {
-        WARN("Failed to get swapchain.\n");
-        return E_FAIL;
-    }
-
     *swapchain = wined3d_swapchain_get_parent(wined3d_swapchain);
 
-    /* FIXME? The swapchain is created with refcount 1 by the wined3d device,
-     * but the wined3d device can't hold a real reference. */
-
-    TRACE("Created IDXGISwapChain %p\n", *swapchain);
-
     return S_OK;
 }
 
@@ -395,3 +371,23 @@ HRESULT dxgi_factory_create(REFIID riid, void **factory, BOOL extended)
 
     return hr;
 }
+
+HWND dxgi_factory_get_device_window(struct dxgi_factory *factory)
+{
+    EnterCriticalSection(&dxgi_cs);
+
+    if (!factory->device_window)
+    {
+        if (!(factory->device_window = CreateWindowA("static", "DXGI device window",
+                WS_DISABLED, 0, 0, 0, 0, NULL, NULL, NULL, NULL)))
+        {
+            ERR("Failed to create a window.\n");
+            return NULL;
+        }
+        TRACE("Created device window %p for factory %p.\n", factory->device_window, factory);
+    }
+
+    LeaveCriticalSection(&dxgi_cs);
+
+    return factory->device_window;
+}
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index 0c27007..437537a 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -72,19 +72,7 @@ static ULONG STDMETHODCALLTYPE dxgi_swapchain_Release(IDXGISwapChain *iface)
     TRACE("%p decreasing refcount to %u\n", This, refcount);
 
     if (!refcount)
-    {
-        struct wined3d_device *wined3d_device;
-        HRESULT hr;
-
-        FIXME("Only a single swapchain is supported\n");
-
-        wined3d_device = wined3d_swapchain_get_device(This->wined3d_swapchain);
-        hr = wined3d_device_uninit_3d(wined3d_device);
-        if (FAILED(hr))
-        {
-            ERR("Uninit3D failed, hr %#x\n", hr);
-        }
-    }
+        wined3d_swapchain_decref(This->wined3d_swapchain);
 
     return refcount;
 }
diff --git a/include/wine/winedxgi.idl b/include/wine/winedxgi.idl
index 88be8db..4980588 100644
--- a/include/wine/winedxgi.idl
+++ b/include/wine/winedxgi.idl
@@ -25,7 +25,6 @@ import "dxgi.idl";
 ]
 interface IWineDXGIDevice : IDXGIDevice
 {
-    struct wined3d_device *get_wined3d_device();
     HRESULT create_surface(
         [in] const DXGI_SURFACE_DESC *desc,
         [in] DXGI_USAGE usage,
-- 
1.7.10.4




More information about the wine-patches mailing list