citra_qt: Allow enabling frame advance before emulation start
Effectively allows starting emulation as paused.
This commit is contained in:
parent
d6b64f6b09
commit
e60e20666e
|
@ -21,6 +21,7 @@
|
||||||
#include "core/3ds.h"
|
#include "core/3ds.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/frontend/scope_acquire_context.h"
|
#include "core/frontend/scope_acquire_context.h"
|
||||||
|
#include "core/perf_stats.h"
|
||||||
#include "core/settings.h"
|
#include "core/settings.h"
|
||||||
#include "input_common/keyboard.h"
|
#include "input_common/keyboard.h"
|
||||||
#include "input_common/main.h"
|
#include "input_common/main.h"
|
||||||
|
@ -55,6 +56,13 @@ void EmuThread::run() {
|
||||||
|
|
||||||
emit LoadProgress(VideoCore::LoadCallbackStage::Complete, 0, 0);
|
emit LoadProgress(VideoCore::LoadCallbackStage::Complete, 0, 0);
|
||||||
|
|
||||||
|
if (Core::System::GetInstance().frame_limiter.IsFrameAdvancing()) {
|
||||||
|
// Usually the loading screen is hidden after the first frame is drawn. In this case
|
||||||
|
// we hide it immediately as we need to wait for user input to start the emulation.
|
||||||
|
emit HideLoadingScreen();
|
||||||
|
Core::System::GetInstance().frame_limiter.WaitOnce();
|
||||||
|
}
|
||||||
|
|
||||||
// Holds whether the cpu was running during the last iteration,
|
// Holds whether the cpu was running during the last iteration,
|
||||||
// so that the DebugModeLeft signal can be emitted before the
|
// so that the DebugModeLeft signal can be emitted before the
|
||||||
// next execution step.
|
// next execution step.
|
||||||
|
|
|
@ -122,6 +122,8 @@ signals:
|
||||||
void ErrorThrown(Core::System::ResultStatus, std::string);
|
void ErrorThrown(Core::System::ResultStatus, std::string);
|
||||||
|
|
||||||
void LoadProgress(VideoCore::LoadCallbackStage stage, std::size_t value, std::size_t total);
|
void LoadProgress(VideoCore::LoadCallbackStage stage, std::size_t value, std::size_t total);
|
||||||
|
|
||||||
|
void HideLoadingScreen();
|
||||||
};
|
};
|
||||||
|
|
||||||
class OpenGLWindow : public QWindow {
|
class OpenGLWindow : public QWindow {
|
||||||
|
|
|
@ -1048,6 +1048,8 @@ void GMainWindow::BootGame(const QString& filename) {
|
||||||
|
|
||||||
connect(emu_thread.get(), &EmuThread::LoadProgress, loading_screen,
|
connect(emu_thread.get(), &EmuThread::LoadProgress, loading_screen,
|
||||||
&LoadingScreen::OnLoadProgress, Qt::QueuedConnection);
|
&LoadingScreen::OnLoadProgress, Qt::QueuedConnection);
|
||||||
|
connect(emu_thread.get(), &EmuThread::HideLoadingScreen, loading_screen,
|
||||||
|
&LoadingScreen::OnLoadComplete);
|
||||||
|
|
||||||
// Update the GUI
|
// Update the GUI
|
||||||
registersWidget->OnDebugModeEntered();
|
registersWidget->OnDebugModeEntered();
|
||||||
|
@ -1082,6 +1084,13 @@ void GMainWindow::BootGame(const QString& filename) {
|
||||||
movie_record_author.clear();
|
movie_record_author.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ui->action_Enable_Frame_Advancing->isChecked()) {
|
||||||
|
ui->action_Advance_Frame->setEnabled(true);
|
||||||
|
Core::System::GetInstance().frame_limiter.SetFrameAdvancing(true);
|
||||||
|
} else {
|
||||||
|
ui->action_Advance_Frame->setEnabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
if (video_dumping_on_start) {
|
if (video_dumping_on_start) {
|
||||||
Layout::FramebufferLayout layout{
|
Layout::FramebufferLayout layout{
|
||||||
Layout::FrameLayoutFromResolutionScale(VideoCore::GetResolutionScaleFactor())};
|
Layout::FrameLayoutFromResolutionScale(VideoCore::GetResolutionScaleFactor())};
|
||||||
|
@ -1155,8 +1164,6 @@ void GMainWindow::ShutdownGame() {
|
||||||
ui->action_Load_Amiibo->setEnabled(false);
|
ui->action_Load_Amiibo->setEnabled(false);
|
||||||
ui->action_Remove_Amiibo->setEnabled(false);
|
ui->action_Remove_Amiibo->setEnabled(false);
|
||||||
ui->action_Report_Compatibility->setEnabled(false);
|
ui->action_Report_Compatibility->setEnabled(false);
|
||||||
ui->action_Enable_Frame_Advancing->setEnabled(false);
|
|
||||||
ui->action_Enable_Frame_Advancing->setChecked(false);
|
|
||||||
ui->action_Advance_Frame->setEnabled(false);
|
ui->action_Advance_Frame->setEnabled(false);
|
||||||
ui->action_Capture_Screenshot->setEnabled(false);
|
ui->action_Capture_Screenshot->setEnabled(false);
|
||||||
render_window->hide();
|
render_window->hide();
|
||||||
|
@ -1564,7 +1571,6 @@ void GMainWindow::OnStartGame() {
|
||||||
ui->action_Cheats->setEnabled(true);
|
ui->action_Cheats->setEnabled(true);
|
||||||
ui->action_Load_Amiibo->setEnabled(true);
|
ui->action_Load_Amiibo->setEnabled(true);
|
||||||
ui->action_Report_Compatibility->setEnabled(true);
|
ui->action_Report_Compatibility->setEnabled(true);
|
||||||
ui->action_Enable_Frame_Advancing->setEnabled(true);
|
|
||||||
ui->action_Capture_Screenshot->setEnabled(true);
|
ui->action_Capture_Screenshot->setEnabled(true);
|
||||||
|
|
||||||
discord_rpc->Update();
|
discord_rpc->Update();
|
||||||
|
|
|
@ -349,9 +349,6 @@
|
||||||
<property name="checkable">
|
<property name="checkable">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Enable Frame Advancing</string>
|
<string>Enable Frame Advancing</string>
|
||||||
</property>
|
</property>
|
||||||
|
|
|
@ -169,6 +169,10 @@ void FrameLimiter::DoFrameLimiting(microseconds current_system_time_us) {
|
||||||
previous_walltime = now;
|
previous_walltime = now;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool FrameLimiter::IsFrameAdvancing() const {
|
||||||
|
return frame_advancing_enabled;
|
||||||
|
}
|
||||||
|
|
||||||
void FrameLimiter::SetFrameAdvancing(bool value) {
|
void FrameLimiter::SetFrameAdvancing(bool value) {
|
||||||
const bool was_enabled = frame_advancing_enabled.exchange(value);
|
const bool was_enabled = frame_advancing_enabled.exchange(value);
|
||||||
if (was_enabled && !value) {
|
if (was_enabled && !value) {
|
||||||
|
|
|
@ -90,6 +90,7 @@ public:
|
||||||
|
|
||||||
void DoFrameLimiting(std::chrono::microseconds current_system_time_us);
|
void DoFrameLimiting(std::chrono::microseconds current_system_time_us);
|
||||||
|
|
||||||
|
bool IsFrameAdvancing() const;
|
||||||
/**
|
/**
|
||||||
* Sets whether frame advancing is enabled or not.
|
* Sets whether frame advancing is enabled or not.
|
||||||
* Note: The frontend must cancel frame advancing before shutting down in order
|
* Note: The frontend must cancel frame advancing before shutting down in order
|
||||||
|
|
Reference in New Issue