From 9a4d2799d4d1b9c722d55856eb952253702610fc Mon Sep 17 00:00:00 2001 From: R2DLiu Date: Sat, 22 Aug 2020 10:43:34 -0400 Subject: [PATCH] even with 0646c9a --- Source/Core/Core/HW/EXI/EXI_DeviceSlippi.cpp | 11 +++---- Source/Core/Core/Slippi/SlippiPlayback.cpp | 30 +++++++++++++++----- Source/Core/Core/Slippi/SlippiPlayback.h | 8 ++++-- Source/Core/DolphinQt/RenderWidget.cpp | 2 +- 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/Source/Core/Core/HW/EXI/EXI_DeviceSlippi.cpp b/Source/Core/Core/HW/EXI/EXI_DeviceSlippi.cpp index be70cd0a96..4ff8391b90 100644 --- a/Source/Core/Core/HW/EXI/EXI_DeviceSlippi.cpp +++ b/Source/Core/Core/HW/EXI/EXI_DeviceSlippi.cpp @@ -1180,12 +1180,12 @@ void CEXISlippi::prepareFrameData(u8* payload) { if (frameIndex < watchSettings.startFrame) { - g_playbackStatus->isHardFFW = true; + g_playbackStatus->setHardFFW(true); } else if (frameIndex == watchSettings.startFrame) { // TODO: This might disable fast forward on first frame when we dont want to? - g_playbackStatus->isHardFFW = false; + g_playbackStatus->setHardFFW(false); } } @@ -1193,7 +1193,8 @@ void CEXISlippi::prepareFrameData(u8* payload) if (commSettings.rollbackDisplayMethod == "normal") { auto nextFrame = m_current_game->GetFrameAt(frameSeqIdx); - g_playbackStatus->isHardFFW = nextFrame && nextFrame->frame <= g_playbackStatus->currentPlaybackFrame; + bool shouldHardFFW = nextFrame && nextFrame->frame <= g_playbackStatus->currentPlaybackFrame; + g_playbackStatus->setHardFFW(shouldHardFFW); if (nextFrame) { @@ -1224,7 +1225,7 @@ void CEXISlippi::prepareFrameData(u8* payload) // last frame instead of the frame previous to fast forwarding. // Not sure if this fully works with partial frames g_playbackStatus->isSoftFFW = false; - g_playbackStatus->isHardFFW = false; + g_playbackStatus->setHardFFW(false); } bool shouldFFW = g_playbackStatus->shouldFFWFrame(frameIndex); @@ -1240,7 +1241,7 @@ void CEXISlippi::prepareFrameData(u8* payload) // Disable fast forward here too... this shouldn't be necessary but better // safe than sorry I guess g_playbackStatus->isSoftFFW = false; - g_playbackStatus->isHardFFW = false; + g_playbackStatus->setHardFFW(false); if (requestResultCode == FRAME_RESP_TERMINATE) { diff --git a/Source/Core/Core/Slippi/SlippiPlayback.cpp b/Source/Core/Core/Slippi/SlippiPlayback.cpp index 9bb755dbf6..68e4c2ea45 100644 --- a/Source/Core/Core/Slippi/SlippiPlayback.cpp +++ b/Source/Core/Core/Slippi/SlippiPlayback.cpp @@ -175,7 +175,7 @@ void SlippiPlaybackStatus::SavestateThread() INFO_LOG(SLIPPI, "Exiting savestate thread"); } -void SlippiPlaybackStatus::SeekToFrame() +void SlippiPlaybackStatus::seekToFrame() { if (seekMtx.try_lock()) { if (targetFrameNum < Slippi::PLAYBACK_FIRST_SAVE) @@ -235,15 +235,11 @@ void SlippiPlaybackStatus::SeekToFrame() // Fastforward until we get to the frame we want if (targetFrameNum != closestStateFrame && targetFrameNum != lastFrame) { - isHardFFW = true; - SConfig::GetInstance().m_OCEnable = true; - SConfig::GetInstance().m_OCFactor = 4.0f; + setHardFFW(true); Core::SetState(Core::State::Running); cv_waitingForTargetFrame.wait(ffwLock); Core::SetState(Core::State::Paused); - SConfig::GetInstance().m_OCFactor = 1.0f; - SConfig::GetInstance().m_OCEnable = false; - isHardFFW = false; + setHardFFW(false); } targetFrameNum = INT_MAX; @@ -254,6 +250,23 @@ void SlippiPlaybackStatus::SeekToFrame() } } +// Set isHardFFW and update OC settings to speed up the FFW +void SlippiPlaybackStatus::setHardFFW(bool enable) { + if (enable) + { + SConfig::GetInstance().m_OCEnable = true; + SConfig::GetInstance().m_OCFactor = 4.0f; + } + else + { + SConfig::GetInstance().m_OCFactor = origOCFactor; + SConfig::GetInstance().m_OCEnable = origOCEnable; + } + + isHardFFW = enable; +} + + void SlippiPlaybackStatus::loadState(s32 closestStateFrame) { if (closestStateFrame == Slippi::PLAYBACK_FIRST_SAVE) @@ -301,6 +314,9 @@ void SlippiPlaybackStatus::updateWatchSettingsStartEnd() SlippiPlaybackStatus::~SlippiPlaybackStatus() { + SConfig::GetInstance().m_OCFactor = origOCFactor; + SConfig::GetInstance().m_OCEnable = origOCEnable; + // Kill threads to prevent cleanup crash resetPlayback(); } diff --git a/Source/Core/Core/Slippi/SlippiPlayback.h b/Source/Core/Core/Slippi/SlippiPlayback.h index 692aabf07b..7a35b74d83 100644 --- a/Source/Core/Core/Slippi/SlippiPlayback.h +++ b/Source/Core/Core/Slippi/SlippiPlayback.h @@ -14,7 +14,7 @@ class SlippiPlaybackStatus { public: SlippiPlaybackStatus(); - virtual ~SlippiPlaybackStatus(); + ~SlippiPlaybackStatus(); bool shouldJumpBack = false; bool shouldJumpForward = false; @@ -22,6 +22,9 @@ public: volatile bool shouldRunThreads = false; bool isHardFFW = false; bool isSoftFFW = false; + bool origOCEnable; + float origOCFactor; + s32 lastFFWFrame = INT_MIN; s32 currentPlaybackFrame = INT_MIN; s32 targetFrameNum = INT_MAX; @@ -33,7 +36,8 @@ public: void resetPlayback(void); bool shouldFFWFrame(s32 frameIndex) const; void prepareSlippiPlayback(s32& frameIndex); - void SeekToFrame(); + void setHardFFW(bool enable); + void seekToFrame(); private: void SavestateThread(void); diff --git a/Source/Core/DolphinQt/RenderWidget.cpp b/Source/Core/DolphinQt/RenderWidget.cpp index c9793b9c58..8f0bd61ab2 100644 --- a/Source/Core/DolphinQt/RenderWidget.cpp +++ b/Source/Core/DolphinQt/RenderWidget.cpp @@ -359,5 +359,5 @@ void RenderWidget::Exit() void RenderWidget::PlaybackSeek() { - g_playbackStatus->SeekToFrame(); + g_playbackStatus->seekToFrame(); }