citra_qt: Allow enabling frame advance before emulation start

Effectively allows starting emulation as paused.
This commit is contained in:
zhupengfei 2020-07-23 18:49:17 +08:00
parent d6b64f6b09
commit e60e20666e
No known key found for this signature in database
GPG key ID: DD129E108BD09378
6 changed files with 24 additions and 6 deletions

View file

@ -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.

View file

@ -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 {

View file

@ -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();

View file

@ -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>

View file

@ -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) {

View file

@ -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