From 23012a8e4658a8e3993cbd1e030081ff130b4638 Mon Sep 17 00:00:00 2001 From: crosire Date: Sun, 28 Apr 2024 15:32:35 +0200 Subject: [PATCH] Change "IDXGISwapChain::GetFullscreenState" to return forced fullscreen state when set by an add-on or config Needed in Fallout 4, since otherwise it continues trying to change the fullscreen state --- source/dxgi/dxgi_swapchain.cpp | 32 ++++++++++++++++++++++++++++++++ source/dxgi/dxgi_swapchain.hpp | 4 ++++ 2 files changed, 36 insertions(+) diff --git a/source/dxgi/dxgi_swapchain.cpp b/source/dxgi/dxgi_swapchain.cpp index 4b31be277..8949ce543 100644 --- a/source/dxgi/dxgi_swapchain.cpp +++ b/source/dxgi/dxgi_swapchain.cpp @@ -261,6 +261,9 @@ HRESULT STDMETHODCALLTYPE DXGISwapChain::SetFullscreenState(BOOL Fullscreen, IDX LOG(INFO) << "Redirecting " << "IDXGISwapChain::SetFullscreenState" << '(' << "this = " << this << ", Fullscreen = " << (Fullscreen ? "TRUE" : "FALSE") << ", pTarget = " << pTarget << ')' << " ..."; #if RESHADE_ADDON + _force_windowed_addon = false; + _force_fullscreen_addon = false; + HMONITOR hmonitor = nullptr; if (pTarget != nullptr) { @@ -270,7 +273,11 @@ HRESULT STDMETHODCALLTYPE DXGISwapChain::SetFullscreenState(BOOL Fullscreen, IDX } if (reshade::invoke_addon_event(_impl, Fullscreen != FALSE, hmonitor)) + { + _force_windowed_addon = Fullscreen == FALSE; + _force_fullscreen_addon = Fullscreen != FALSE; return S_OK; + } #endif if (_force_windowed) @@ -286,6 +293,31 @@ HRESULT STDMETHODCALLTYPE DXGISwapChain::SetFullscreenState(BOOL Fullscreen, IDX } HRESULT STDMETHODCALLTYPE DXGISwapChain::GetFullscreenState(BOOL *pFullscreen, IDXGIOutput **ppTarget) { + if (_force_windowed +#if RESHADE_ADDON + || _force_windowed_addon +#endif + ) + { + if (pFullscreen != nullptr) + *pFullscreen = FALSE; + if (ppTarget != nullptr) + *ppTarget = nullptr; + return S_OK; + } + if (_force_fullscreen +#if RESHADE_ADDON + || _force_fullscreen_addon +#endif + ) + { + if (pFullscreen != nullptr) + *pFullscreen = TRUE; + if (ppTarget != nullptr) + _orig->GetContainingOutput(ppTarget); + return S_OK; + } + const bool was_in_dxgi_runtime = g_in_dxgi_runtime; g_in_dxgi_runtime = true; const HRESULT hr = _orig->GetFullscreenState(pFullscreen, ppTarget); diff --git a/source/dxgi/dxgi_swapchain.hpp b/source/dxgi/dxgi_swapchain.hpp index de0665330..cae12127c 100644 --- a/source/dxgi/dxgi_swapchain.hpp +++ b/source/dxgi/dxgi_swapchain.hpp @@ -105,4 +105,8 @@ struct DECLSPEC_UUID("1F445F9F-9887-4C4C-9055-4E3BADAFCCA8") DXGISwapChain final bool _force_vsync = false; bool _force_windowed = false; bool _force_fullscreen = false; +#if RESHADE_ADDON + bool _force_windowed_addon = false; + bool _force_fullscreen_addon = false; +#endif };