mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	citra_qt: Allow enabling frame advance before emulation start
Effectively allows starting emulation as paused.
This commit is contained in:
		
							parent
							
								
									d6b64f6b09
								
							
						
					
					
						commit
						e60e20666e
					
				
					 6 changed files with 24 additions and 6 deletions
				
			
		|  | @ -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 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue