[PATCH 06/11] dxgi: Switch display mode when creating fullscreen swapchains.

Józef Kucia jkucia at codeweavers.com
Mon Aug 1 15:28:40 CDT 2016


Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 dlls/dxgi/swapchain.c | 48 +++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 37 insertions(+), 11 deletions(-)

diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index 596da42..288df9b 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -443,8 +443,7 @@ HRESULT dxgi_swapchain_init(struct dxgi_swapchain *swapchain, struct dxgi_device
             WARN("Failed to get adapter parent, hr %#x.\n", hr);
             return hr;
         }
-        swapchain->device = &device->IWineDXGIDevice_iface;
-        IWineDXGIDevice_AddRef(swapchain->device);
+        IWineDXGIDevice_AddRef(swapchain->device = &device->IWineDXGIDevice_iface);
     }
     else
     {
@@ -454,8 +453,6 @@ HRESULT dxgi_swapchain_init(struct dxgi_swapchain *swapchain, struct dxgi_device
 
     swapchain->IDXGISwapChain_iface.lpVtbl = &dxgi_swapchain_vtbl;
     swapchain->refcount = 1;
-    swapchain->fullscreen = FALSE;
-    swapchain->target = NULL;
     wined3d_mutex_lock();
     wined3d_private_store_init(&swapchain->private_store);
 
@@ -463,15 +460,44 @@ HRESULT dxgi_swapchain_init(struct dxgi_swapchain *swapchain, struct dxgi_device
             &dxgi_swapchain_wined3d_parent_ops, &swapchain->wined3d_swapchain)))
     {
         WARN("Failed to create wined3d swapchain, hr %#x.\n", hr);
-        wined3d_private_store_cleanup(&swapchain->private_store);
-        wined3d_mutex_unlock();
-        if (swapchain->factory)
-            IDXGIFactory_Release(swapchain->factory);
-        if (swapchain->device)
-            IWineDXGIDevice_Release(swapchain->device);
-        return hr;
+        goto cleanup;
+    }
+
+    swapchain->fullscreen = !desc->windowed;
+    swapchain->target = NULL;
+    if (swapchain->fullscreen)
+    {
+        if (FAILED(hr = wined3d_swapchain_set_fullscreen(swapchain->wined3d_swapchain,
+                desc, NULL)))
+        {
+            WARN("Failed to set fullscreen state, hr %#x.\n", hr);
+            wined3d_swapchain_decref(swapchain->wined3d_swapchain);
+            goto cleanup;
+        }
+
+        if (FAILED(hr = IDXGISwapChain_GetContainingOutput(&swapchain->IDXGISwapChain_iface,
+                &swapchain->target)))
+        {
+            struct wined3d_swapchain_desc wined3d_desc = *desc;
+            WARN("Failed to get target output for fullscreen swapchain, hr %#x.\n", hr);
+            wined3d_desc.windowed = FALSE;
+            if (FAILED(hr = wined3d_swapchain_set_fullscreen(swapchain->wined3d_swapchain,
+                    &wined3d_desc, NULL)))
+                ERR("Failed to restore fullscreen state, hr %#x.\n", hr);
+            wined3d_swapchain_decref(swapchain->wined3d_swapchain);
+            goto cleanup;
+        }
     }
     wined3d_mutex_unlock();
 
     return S_OK;
+
+cleanup:
+    wined3d_private_store_cleanup(&swapchain->private_store);
+    wined3d_mutex_unlock();
+    if (swapchain->factory)
+        IDXGIFactory_Release(swapchain->factory);
+    if (swapchain->device)
+        IWineDXGIDevice_Release(swapchain->device);
+    return hr;
 }
-- 
2.7.3




More information about the wine-patches mailing list