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@codeweavers.com --- 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);