Skip to content

Commit

Permalink
Change "IDXGISwapChain::GetFullscreenState" to return forced fullscre…
Browse files Browse the repository at this point in the history
…en state when set by an add-on or config

Needed in Fallout 4, since otherwise it continues trying to change the fullscreen state
  • Loading branch information
crosire committed Apr 28, 2024
1 parent 1b703f3 commit 23012a8
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 0 deletions.
32 changes: 32 additions & 0 deletions source/dxgi/dxgi_swapchain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -270,7 +273,11 @@ HRESULT STDMETHODCALLTYPE DXGISwapChain::SetFullscreenState(BOOL Fullscreen, IDX
}

if (reshade::invoke_addon_event<reshade::addon_event::set_fullscreen_state>(_impl, Fullscreen != FALSE, hmonitor))
{
_force_windowed_addon = Fullscreen == FALSE;
_force_fullscreen_addon = Fullscreen != FALSE;
return S_OK;
}
#endif

if (_force_windowed)
Expand All @@ -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);
Expand Down
4 changes: 4 additions & 0 deletions source/dxgi/dxgi_swapchain.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
};

0 comments on commit 23012a8

Please sign in to comment.