Zhiyi Zhang : dxgi: Fix possible null output from d3d11_swapchain_GetFullscreenState.

Alexandre Julliard julliard at winehq.org
Wed Jul 31 13:55:51 CDT 2019


Module: wine
Branch: master
Commit: e66f8e8c2deda5dfdf22adfe1a98aadcc9d9ad01
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=e66f8e8c2deda5dfdf22adfe1a98aadcc9d9ad01

Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date:   Mon Jul  8 22:16:41 2019 +0800

dxgi: Fix possible null output from d3d11_swapchain_GetFullscreenState.

When swapchain is created in windowed mode, and then enter fullscreen
via Alt+Enter. Calling d3d11_swapchain_GetFullscreenState will return
a null output because swapchain->target wasn't initialized.

Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dxgi/swapchain.c  | 20 ++++++++++++++++----
 dlls/dxgi/tests/dxgi.c |  2 +-
 2 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index 8dbbfab..caf0863 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -407,22 +407,34 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFullscreenState(IDXGISwapCha
 {
     struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface);
     struct wined3d_swapchain_desc swapchain_desc;
+    HRESULT hr;
 
     TRACE("iface %p, fullscreen %p, target %p.\n", iface, fullscreen, target);
 
-    if (fullscreen)
+    if (fullscreen || target)
     {
         wined3d_mutex_lock();
         wined3d_swapchain_get_desc(swapchain->wined3d_swapchain, &swapchain_desc);
         wined3d_mutex_unlock();
-        *fullscreen = !swapchain_desc.windowed;
     }
 
+    if (fullscreen)
+        *fullscreen = !swapchain_desc.windowed;
+
     if (target)
     {
-        *target = swapchain->target;
-        if (*target)
+        if (!swapchain_desc.windowed)
+        {
+            if (!swapchain->target && FAILED(hr = IDXGISwapChain1_GetContainingOutput(iface, &swapchain->target)))
+                return hr;
+
+            *target = swapchain->target;
             IDXGIOutput_AddRef(*target);
+        }
+        else
+        {
+            *target = NULL;
+        }
     }
 
     return S_OK;
diff --git a/dlls/dxgi/tests/dxgi.c b/dlls/dxgi/tests/dxgi.c
index 38aeba1..ab33caf 100644
--- a/dlls/dxgi/tests/dxgi.c
+++ b/dlls/dxgi/tests/dxgi.c
@@ -5456,7 +5456,7 @@ static void test_window_association(void)
             ok(fullscreen == tests[i].expect_fullscreen
                     || broken(tests[i].broken_d3d10 && fullscreen),
                     "Test %u: Got unexpected fullscreen %#x.\n", i, fullscreen);
-            todo_wine_if(fullscreen) ok(fullscreen ? !!output : !output, "Test %u: Got wrong output.\n", i);
+            ok(fullscreen ? !!output : !output, "Test %u: Got wrong output.\n", i);
             if (output)
                 IDXGIOutput_Release(output);
 




More information about the wine-cvs mailing list