Skip to content

Commit

Permalink
Merge pull request hrydgard#19473 from hrydgard/frame-advance
Browse files Browse the repository at this point in the history
Try to make Frame Advance a bit more reliable
  • Loading branch information
hrydgard authored Sep 18, 2024
2 parents 105c0d0 + 42914c3 commit 68804ca
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 11 deletions.
26 changes: 16 additions & 10 deletions UI/EmuScreen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -1426,6 +1419,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) {
Expand Down
2 changes: 2 additions & 0 deletions UI/EmuScreen.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,5 +121,7 @@ class EmuScreen : public UIScreen {

std::string extraAssertInfoStr_;

std::atomic<bool> doFrameAdvance_{};

ControlMapper controlMapper_;
};
4 changes: 3 additions & 1 deletion UI/GameScreen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 68804ca

Please sign in to comment.