mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-25 07:09:48 -06:00
Frame: Use PauseAndLock when switching fullscreen modes.
This allows us to regain exclusive mode directly from OnActive().
This commit is contained in:
@ -525,6 +525,16 @@ void CFrame::OnActive(wxActivateEvent& event)
|
|||||||
{
|
{
|
||||||
if (SConfig::GetInstance().bRenderToMain)
|
if (SConfig::GetInstance().bRenderToMain)
|
||||||
m_RenderParent->SetFocus();
|
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)
|
if (SConfig::GetInstance().m_PauseOnFocusLost && Core::GetState() == Core::CORE_PAUSE)
|
||||||
DoPause();
|
DoPause();
|
||||||
@ -1118,13 +1128,10 @@ void CFrame::DoFullscreen(bool enable_fullscreen)
|
|||||||
{
|
{
|
||||||
ToggleDisplayMode(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)
|
if (SConfig::GetInstance().bRenderToMain)
|
||||||
{
|
{
|
||||||
|
m_RenderFrame->ShowFullScreen(enable_fullscreen, wxFULLSCREEN_ALL);
|
||||||
|
|
||||||
if (enable_fullscreen)
|
if (enable_fullscreen)
|
||||||
{
|
{
|
||||||
// Save the current mode before going to 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();
|
m_RenderFrame->Raise();
|
||||||
|
|
||||||
if (enable_fullscreen && g_renderer)
|
if (g_renderer && enable_fullscreen)
|
||||||
|
{
|
||||||
|
bool was_unpaused = Core::PauseAndLock(true);
|
||||||
g_renderer->SetFullscreen(true);
|
g_renderer->SetFullscreen(true);
|
||||||
|
Core::PauseAndLock(false, was_unpaused);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_RenderFrame->ShowFullScreen(enable_fullscreen, wxFULLSCREEN_ALL);
|
||||||
|
m_RenderFrame->Raise();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
#include <cinttypes>
|
#include <cinttypes>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <mutex>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <strsafe.h>
|
#include <strsafe.h>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
@ -44,9 +43,6 @@ namespace DX11
|
|||||||
static u32 s_last_multisamples = 1;
|
static u32 s_last_multisamples = 1;
|
||||||
static bool s_last_stereo_mode = false;
|
static bool s_last_stereo_mode = false;
|
||||||
static bool s_last_xfb_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;
|
static Television s_television;
|
||||||
|
|
||||||
@ -254,7 +250,6 @@ Renderer::Renderer(void*& window_handle)
|
|||||||
s_last_efb_scale = g_ActiveConfig.iEFBScale;
|
s_last_efb_scale = g_ActiveConfig.iEFBScale;
|
||||||
s_last_stereo_mode = g_ActiveConfig.iStereoMode > 0;
|
s_last_stereo_mode = g_ActiveConfig.iStereoMode > 0;
|
||||||
s_last_xfb_mode = g_ActiveConfig.bUseRealXFB;
|
s_last_xfb_mode = g_ActiveConfig.bUseRealXFB;
|
||||||
s_last_exclusive_mode = D3D::GetFullscreenState();
|
|
||||||
CalculateTargetSize(s_backbuffer_width, s_backbuffer_height);
|
CalculateTargetSize(s_backbuffer_width, s_backbuffer_height);
|
||||||
PixelShaderManager::SetEfbScaleChanged();
|
PixelShaderManager::SetEfbScaleChanged();
|
||||||
|
|
||||||
@ -872,15 +867,6 @@ void Renderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight,
|
|||||||
// Flip/present backbuffer to frontbuffer here
|
// Flip/present backbuffer to frontbuffer here
|
||||||
D3D::Present();
|
D3D::Present();
|
||||||
|
|
||||||
// Check if we need to regain exclusive mode
|
|
||||||
{
|
|
||||||
std::lock_guard<std::mutex> 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
|
// Resize the back buffers NOW to avoid flickering
|
||||||
if (CalculateTargetSize(s_backbuffer_width, s_backbuffer_height) || xfbchanged || windowResized ||
|
if (CalculateTargetSize(s_backbuffer_width, s_backbuffer_height) || xfbchanged || windowResized ||
|
||||||
s_last_efb_scale != g_ActiveConfig.iEFBScale ||
|
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)
|
void Renderer::SetFullscreen(bool enable_fullscreen)
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lk(s_critical_fullscreen);
|
|
||||||
s_last_exclusive_mode = enable_fullscreen;
|
|
||||||
D3D::SetFullscreenState(enable_fullscreen);
|
D3D::SetFullscreenState(enable_fullscreen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Renderer::IsFullscreen()
|
||||||
|
{
|
||||||
|
return D3D::GetFullscreenState();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace DX11
|
} // namespace DX11
|
||||||
|
@ -26,6 +26,7 @@ public:
|
|||||||
void SetInterlacingMode() override;
|
void SetInterlacingMode() override;
|
||||||
void SetViewport() override;
|
void SetViewport() override;
|
||||||
void SetFullscreen(bool enable_fullscreen) override;
|
void SetFullscreen(bool enable_fullscreen) override;
|
||||||
|
bool IsFullscreen() override;
|
||||||
|
|
||||||
// TODO: Fix confusing names (see ResetAPIState and RestoreAPIState)
|
// TODO: Fix confusing names (see ResetAPIState and RestoreAPIState)
|
||||||
void ApplyState(bool bUseDstAlpha) override;
|
void ApplyState(bool bUseDstAlpha) override;
|
||||||
|
@ -73,6 +73,7 @@ public:
|
|||||||
virtual void SetInterlacingMode() {}
|
virtual void SetInterlacingMode() {}
|
||||||
virtual void SetViewport() {}
|
virtual void SetViewport() {}
|
||||||
virtual void SetFullscreen(bool enable_fullscreen) {}
|
virtual void SetFullscreen(bool enable_fullscreen) {}
|
||||||
|
virtual bool IsFullscreen() { return false; }
|
||||||
virtual void ApplyState(bool bUseDstAlpha) {}
|
virtual void ApplyState(bool bUseDstAlpha) {}
|
||||||
virtual void RestoreState() {}
|
virtual void RestoreState() {}
|
||||||
virtual void ResetAPIState() {}
|
virtual void ResetAPIState() {}
|
||||||
|
Reference in New Issue
Block a user