From: Zhiyi Zhang Subject: [PATCH v2 2/2] dxgi: Fix possible null output from d3d11_swapchain_GetFullscreenState. Message-Id: Date: Mon, 8 Jul 2019 22:16:41 +0800 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 --- 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 8dbbfab805..caf0863609 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 3d81cec9ca..3722a7249d 100644 --- a/dlls/dxgi/tests/dxgi.c +++ b/dlls/dxgi/tests/dxgi.c @@ -5455,7 +5455,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); -- 2.20.1