From 0e58bcea7fdf5b6f77bb6f8680bda6ba49b76c6d Mon Sep 17 00:00:00 2001 From: Zhiyi Zhang Date: Mon, 5 Oct 2020 17:24:16 +0800 Subject: [PATCH] dxgi: Retrieve d3d12 swapchain fullscreen state from wined3d. Once Alt+Enter handling is implemented, the fullscreen state may change without dxgi necessarily being aware of it. Signed-off-by: Zhiyi Zhang Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- dlls/dxgi/swapchain.c | 19 +++++++++++++++++-- dlls/wined3d/swapchain.c | 7 +++++++ dlls/wined3d/wined3d.spec | 1 + include/wine/wined3d.h | 1 + 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c index d778ab9e03d..f3b74389d29 100644 --- a/dlls/dxgi/swapchain.c +++ b/dlls/dxgi/swapchain.c @@ -2276,7 +2276,11 @@ static HRESULT STDMETHODCALLTYPE d3d12_swapchain_GetFullscreenState(IDXGISwapCha TRACE("iface %p, fullscreen %p, target %p.\n", iface, fullscreen, target); if (fullscreen) - *fullscreen = !swapchain->fullscreen_desc.Windowed; + { + wined3d_mutex_lock(); + *fullscreen = !wined3d_swapchain_state_is_windowed(swapchain->state); + wined3d_mutex_unlock(); + } if (target && (*target = swapchain->target)) IDXGIOutput_AddRef(*target); @@ -2289,6 +2293,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_swapchain_GetDesc(IDXGISwapChain4 *iface, struct d3d12_swapchain *swapchain = d3d12_swapchain_from_IDXGISwapChain4(iface); const DXGI_SWAP_CHAIN_FULLSCREEN_DESC *fullscreen_desc = &swapchain->fullscreen_desc; const DXGI_SWAP_CHAIN_DESC1 *swapchain_desc = &swapchain->desc; + BOOL windowed; TRACE("iface %p, desc %p.\n", iface, desc); @@ -2298,6 +2303,10 @@ static HRESULT STDMETHODCALLTYPE d3d12_swapchain_GetDesc(IDXGISwapChain4 *iface, return E_INVALIDARG; } + wined3d_mutex_lock(); + windowed = wined3d_swapchain_state_is_windowed(swapchain->state); + wined3d_mutex_unlock(); + desc->BufferDesc.Width = swapchain_desc->Width; desc->BufferDesc.Height = swapchain_desc->Height; desc->BufferDesc.RefreshRate = fullscreen_desc->RefreshRate; @@ -2308,7 +2317,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_swapchain_GetDesc(IDXGISwapChain4 *iface, desc->BufferUsage = swapchain_desc->BufferUsage; desc->BufferCount = swapchain_desc->BufferCount; desc->OutputWindow = swapchain->window; - desc->Windowed = fullscreen_desc->Windowed; + desc->Windowed = windowed; desc->SwapEffect = swapchain_desc->SwapEffect; desc->Flags = swapchain_desc->Flags; @@ -2470,6 +2479,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_swapchain_GetFullscreenDesc(IDXGISwapChai DXGI_SWAP_CHAIN_FULLSCREEN_DESC *desc) { struct d3d12_swapchain *swapchain = d3d12_swapchain_from_IDXGISwapChain4(iface); + BOOL windowed; TRACE("iface %p, desc %p.\n", iface, desc); @@ -2479,7 +2489,12 @@ static HRESULT STDMETHODCALLTYPE d3d12_swapchain_GetFullscreenDesc(IDXGISwapChai return E_INVALIDARG; } + wined3d_mutex_lock(); + windowed = wined3d_swapchain_state_is_windowed(swapchain->state); + wined3d_mutex_unlock(); + *desc = swapchain->fullscreen_desc; + desc->Windowed = windowed; return S_OK; } diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index 6270c363bb9..d0d93417a18 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -2266,6 +2266,13 @@ HRESULT CDECL wined3d_swapchain_state_set_fullscreen(struct wined3d_swapchain_st return WINED3D_OK; } +BOOL CDECL wined3d_swapchain_state_is_windowed(const struct wined3d_swapchain_state *state) +{ + TRACE("state %p.\n", state); + + return state->desc.windowed; +} + void CDECL wined3d_swapchain_state_destroy(struct wined3d_swapchain_state *state) { heap_free(state); diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index cf792746cc7..d11e06d0c34 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -291,6 +291,7 @@ @ cdecl wined3d_swapchain_state_create(ptr ptr ptr) @ cdecl wined3d_swapchain_state_destroy(ptr) +@ cdecl wined3d_swapchain_state_is_windowed(ptr) @ cdecl wined3d_swapchain_state_resize_target(ptr ptr) @ cdecl wined3d_swapchain_state_set_fullscreen(ptr ptr ptr) diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 3535a69bacb..238961006a0 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2806,6 +2806,7 @@ void __cdecl wined3d_swapchain_set_window(struct wined3d_swapchain *swapchain, H HRESULT __cdecl wined3d_swapchain_state_create(const struct wined3d_swapchain_desc *desc, HWND window, struct wined3d_swapchain_state **state); void __cdecl wined3d_swapchain_state_destroy(struct wined3d_swapchain_state *state); +BOOL __cdecl wined3d_swapchain_state_is_windowed(const struct wined3d_swapchain_state *state); HRESULT __cdecl wined3d_swapchain_state_resize_target(struct wined3d_swapchain_state *state, const struct wined3d_display_mode *mode); HRESULT __cdecl wined3d_swapchain_state_set_fullscreen(struct wined3d_swapchain_state *state,