From e66f8e8c2deda5dfdf22adfe1a98aadcc9d9ad01 Mon Sep 17 00:00:00 2001 From: Zhiyi Zhang Date: Mon, 8 Jul 2019 22:16:41 +0800 Subject: [PATCH] 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 Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- 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 8dbbfab805d..caf08636097 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 38aeba17bda..ab33caf2e2d 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);