diff --git a/Source/Core/DolphinWX/Frame.cpp b/Source/Core/DolphinWX/Frame.cpp index 5d7fd6b316..2c18202716 100644 --- a/Source/Core/DolphinWX/Frame.cpp +++ b/Source/Core/DolphinWX/Frame.cpp @@ -525,6 +525,16 @@ void CFrame::OnActive(wxActivateEvent& event) { if (SConfig::GetInstance().bRenderToMain) m_RenderParent->SetFocus(); + else if (RendererIsFullscreen() && g_ActiveConfig.ExclusiveFullscreenEnabled()) + { + // Regain exclusive mode if it was lost due to a focus change. + if (g_renderer && !g_renderer->IsFullscreen()) + { + bool was_unpaused = Core::PauseAndLock(true); + g_renderer->SetFullscreen(true); + Core::PauseAndLock(false, was_unpaused); + } + } if (SConfig::GetInstance().m_PauseOnFocusLost && Core::GetState() == Core::CORE_PAUSE) DoPause(); @@ -1118,13 +1128,10 @@ void CFrame::DoFullscreen(bool enable_fullscreen) { ToggleDisplayMode(enable_fullscreen); - if (!enable_fullscreen && g_renderer) - g_renderer->SetFullscreen(false); - - m_RenderFrame->ShowFullScreen(enable_fullscreen, wxFULLSCREEN_ALL); - if (SConfig::GetInstance().bRenderToMain) { + m_RenderFrame->ShowFullScreen(enable_fullscreen, wxFULLSCREEN_ALL); + if (enable_fullscreen) { // Save the current mode before going to fullscreen @@ -1166,12 +1173,29 @@ void CFrame::DoFullscreen(bool enable_fullscreen) } } } - else + else if (g_ActiveConfig.ExclusiveFullscreenEnabled()) { + if (g_renderer && !enable_fullscreen) + { + bool was_unpaused = Core::PauseAndLock(true); + g_renderer->SetFullscreen(false); + Core::PauseAndLock(false, was_unpaused); + } + + m_RenderFrame->ShowFullScreen(enable_fullscreen, wxFULLSCREEN_ALL); m_RenderFrame->Raise(); - if (enable_fullscreen && g_renderer) + if (g_renderer && enable_fullscreen) + { + bool was_unpaused = Core::PauseAndLock(true); g_renderer->SetFullscreen(true); + Core::PauseAndLock(false, was_unpaused); + } + } + else + { + m_RenderFrame->ShowFullScreen(enable_fullscreen, wxFULLSCREEN_ALL); + m_RenderFrame->Raise(); } } diff --git a/Source/Core/VideoBackends/D3D/Render.cpp b/Source/Core/VideoBackends/D3D/Render.cpp index 26bd8956bc..0653f48afa 100644 --- a/Source/Core/VideoBackends/D3D/Render.cpp +++ b/Source/Core/VideoBackends/D3D/Render.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include @@ -44,9 +43,6 @@ namespace DX11 static u32 s_last_multisamples = 1; static bool s_last_stereo_mode = false; static bool s_last_xfb_mode = false; -static bool s_last_exclusive_mode = false; - -static std::mutex s_critical_fullscreen; static Television s_television; @@ -254,7 +250,6 @@ Renderer::Renderer(void*& window_handle) s_last_efb_scale = g_ActiveConfig.iEFBScale; s_last_stereo_mode = g_ActiveConfig.iStereoMode > 0; s_last_xfb_mode = g_ActiveConfig.bUseRealXFB; - s_last_exclusive_mode = D3D::GetFullscreenState(); CalculateTargetSize(s_backbuffer_width, s_backbuffer_height); PixelShaderManager::SetEfbScaleChanged(); @@ -872,15 +867,6 @@ void Renderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, // Flip/present backbuffer to frontbuffer here D3D::Present(); - // Check if we need to regain exclusive mode - { - std::lock_guard lk(s_critical_fullscreen); - - const bool exclusive_mode = D3D::GetFullscreenState(); - if (s_last_exclusive_mode && !exclusive_mode && Host_RendererHasFocus()) - D3D::SetFullscreenState(true); - } - // Resize the back buffers NOW to avoid flickering if (CalculateTargetSize(s_backbuffer_width, s_backbuffer_height) || xfbchanged || windowResized || s_last_efb_scale != g_ActiveConfig.iEFBScale || @@ -1266,9 +1252,12 @@ void Renderer::BlitScreen(TargetRectangle src, TargetRectangle dst, D3DTexture2D void Renderer::SetFullscreen(bool enable_fullscreen) { - std::lock_guard lk(s_critical_fullscreen); - s_last_exclusive_mode = enable_fullscreen; D3D::SetFullscreenState(enable_fullscreen); } +bool Renderer::IsFullscreen() +{ + return D3D::GetFullscreenState(); +} + } // namespace DX11 diff --git a/Source/Core/VideoBackends/D3D/Render.h b/Source/Core/VideoBackends/D3D/Render.h index 43e9519be9..bb16316aef 100644 --- a/Source/Core/VideoBackends/D3D/Render.h +++ b/Source/Core/VideoBackends/D3D/Render.h @@ -26,6 +26,7 @@ public: void SetInterlacingMode() override; void SetViewport() override; void SetFullscreen(bool enable_fullscreen) override; + bool IsFullscreen() override; // TODO: Fix confusing names (see ResetAPIState and RestoreAPIState) void ApplyState(bool bUseDstAlpha) override; diff --git a/Source/Core/VideoCommon/RenderBase.h b/Source/Core/VideoCommon/RenderBase.h index 4e1f6fe23b..15324f0ab5 100644 --- a/Source/Core/VideoCommon/RenderBase.h +++ b/Source/Core/VideoCommon/RenderBase.h @@ -73,6 +73,7 @@ public: virtual void SetInterlacingMode() {} virtual void SetViewport() {} virtual void SetFullscreen(bool enable_fullscreen) {} + virtual bool IsFullscreen() { return false; } virtual void ApplyState(bool bUseDstAlpha) {} virtual void RestoreState() {} virtual void ResetAPIState() {}