diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index bb352c8b81..bb4a669ebc 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -715,16 +715,9 @@ void EmuScreen::onVKey(int virtualKeyCode, bool down) { break; case VIRTKEY_FRAME_ADVANCE: - if (!Achievements::WarnUserIfHardcoreModeActive(false)) { - if (down) { - // If game is running, pause emulation immediately. Otherwise, advance a single frame. - if (Core_IsStepping()) { - frameStep_ = true; - Core_EnableStepping(false); - } else if (!frameStep_) { - Core_EnableStepping(true, "ui.frameAdvance", 0); - } - } + // Can't do this reliably in an async fashion, so we just set a variable. + if (down) { + doFrameAdvance_.store(true); } break; @@ -1422,6 +1415,19 @@ ScreenRenderFlags EmuScreen::render(ScreenRenderMode mode) { Core_UpdateDebugStats((DebugOverlay)g_Config.iDebugOverlay == DebugOverlay::DEBUG_STATS || g_Config.bLogFrameDrops); + if (doFrameAdvance_.exchange(false)) { + if (!Achievements::WarnUserIfHardcoreModeActive(false)) { + // If game is running, pause emulation immediately. Otherwise, advance a single frame. + if (Core_IsStepping()) { + frameStep_ = true; + Core_EnableStepping(false); + } else if (!frameStep_) { + lastNumFlips = gpuStats.numFlips; + Core_EnableStepping(true, "ui.frameAdvance", 0); + } + } + } + bool blockedExecution = Achievements::IsBlockingExecution(); uint32_t clearColor = 0; if (!blockedExecution) { diff --git a/UI/EmuScreen.h b/UI/EmuScreen.h index 77df9e3816..a80e684019 100644 --- a/UI/EmuScreen.h +++ b/UI/EmuScreen.h @@ -121,5 +121,7 @@ private: std::string extraAssertInfoStr_; + std::atomic doFrameAdvance_{}; + ControlMapper controlMapper_; }; diff --git a/UI/GameScreen.cpp b/UI/GameScreen.cpp index baca52fc58..14a71400f0 100644 --- a/UI/GameScreen.cpp +++ b/UI/GameScreen.cpp @@ -205,7 +205,9 @@ void GameScreen::CreateViews() { rightColumnItems->SetSpacing(0.0f); rightColumn->Add(rightColumnItems); - rightColumnItems->Add(new Choice(ga->T("Play")))->OnClick.Handle(this, &GameScreen::OnPlay); + if (!inGame_) { + rightColumnItems->Add(new Choice(ga->T("Play")))->OnClick.Handle(this, &GameScreen::OnPlay); + } btnGameSettings_ = rightColumnItems->Add(new Choice(ga->T("Game Settings"))); btnGameSettings_->OnClick.Handle(this, &GameScreen::OnGameSettings);