mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	Change Present to finish only after swap
This commit is contained in:
		
							parent
							
								
									6fff8e3921
								
							
						
					
					
						commit
						ac90cd0378
					
				
					 6 changed files with 20 additions and 1 deletions
				
			
		|  | @ -227,6 +227,7 @@ void EmuWindow_SDL2::Present() { | |||
|     while (IsOpen()) { | ||||
|         VideoCore::g_renderer->Present(); | ||||
|         SDL_GL_SwapWindow(render_window); | ||||
|         VideoCore::g_renderer->PresentComplete(); | ||||
|     } | ||||
|     SDL_GL_MakeCurrent(render_window, nullptr); | ||||
| } | ||||
|  |  | |||
|  | @ -86,7 +86,7 @@ GRenderWindow::GRenderWindow(QWidget* parent, EmuThread* emu_thread) | |||
|     setWindowTitle(QStringLiteral("Citra %1 | %2-%3") | ||||
|                        .arg(Common::g_build_name, Common::g_scm_branch, Common::g_scm_desc)); | ||||
|     setAttribute(Qt::WA_AcceptTouchEvents); | ||||
| 
 | ||||
|     connect(this, &QOpenGLWidget::frameSwapped, this, &GRenderWindow::OnFrameSwapped); | ||||
|     InputCommon::Init(); | ||||
| } | ||||
| 
 | ||||
|  | @ -104,6 +104,10 @@ void GRenderWindow::DoneCurrent() { | |||
| 
 | ||||
| void GRenderWindow::PollEvents() {} | ||||
| 
 | ||||
| void OnFrameSwapped() { | ||||
|     VideoCore::g_renderer->PresentComplete(); | ||||
| } | ||||
| 
 | ||||
| // On Qt 5.0+, this correctly gets the size of the framebuffer (pixels).
 | ||||
| //
 | ||||
| // Older versions get the window size (density independent pixels),
 | ||||
|  | @ -294,6 +298,10 @@ void GRenderWindow::paintGL() { | |||
|     update(); | ||||
| } | ||||
| 
 | ||||
| void GRenderWindow::OnFrameSwapped() { | ||||
|     VideoCore::g_renderer->PresentComplete(); | ||||
| } | ||||
| 
 | ||||
| void GRenderWindow::showEvent(QShowEvent* event) { | ||||
|     QWidget::showEvent(event); | ||||
| } | ||||
|  |  | |||
|  | @ -163,6 +163,7 @@ public slots: | |||
|     void OnEmulationStarting(EmuThread* emu_thread); | ||||
|     void OnEmulationStopping(); | ||||
|     void OnFramebufferSizeChanged(); | ||||
|     void OnFrameSwapped(); | ||||
| 
 | ||||
| signals: | ||||
|     /// Emitted when the window is closed
 | ||||
|  |  | |||
|  | @ -34,6 +34,9 @@ public: | |||
|     /// Draws the latest frame to the window (Renderer specific implementation)
 | ||||
|     virtual void Present() = 0; | ||||
| 
 | ||||
|     /// Marks the presentation buffer as complete and swaps it back into the pool
 | ||||
|     virtual void PresentComplete() = 0; | ||||
| 
 | ||||
|     /// Prepares for video dumping (e.g. create necessary buffers, etc)
 | ||||
|     virtual void PrepareVideoDumping() = 0; | ||||
| 
 | ||||
|  |  | |||
|  | @ -794,6 +794,9 @@ void RendererOpenGL::Present() { | |||
|     /* insert fence for the main thread to block on */ | ||||
|     frame.present_sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); | ||||
|     glFlush(); | ||||
| } | ||||
| 
 | ||||
| void RendererOpenGL::PresentComplete() { | ||||
|     render_window.mailbox->PresentationComplete(); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -60,6 +60,9 @@ public: | |||
|     /// context
 | ||||
|     void Present() override; | ||||
| 
 | ||||
|     /// Finializes the presentation and sets up the presentation frame to go back into the mailbox
 | ||||
|     void PresentComplete() override; | ||||
| 
 | ||||
|     /// Prepares for video dumping (e.g. create necessary buffers, etc)
 | ||||
|     void PrepareVideoDumping() override; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue