Change Present to finish only after swap
This commit is contained in:
parent
6fff8e3921
commit
ac90cd0378
|
@ -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;
|
||||
|
||||
|
|
Reference in New Issue