From dc4de5b7c7b3f9aba4b3b4d1acda8d45736148ca Mon Sep 17 00:00:00 2001 From: Brandon Wright Date: Mon, 3 Dec 2018 17:28:22 -0600 Subject: [PATCH] GTK+: OpenGL: Add fences as glFinish alternative. --- gtk/src/gtk_display_driver_opengl.cpp | 17 +++++++++++++++-- gtk/src/gtk_display_driver_opengl.h | 1 + gtk/src/gtk_glx_context.cpp | 2 ++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/gtk/src/gtk_display_driver_opengl.cpp b/gtk/src/gtk_display_driver_opengl.cpp index 8d1f4d53..eeb20a22 100644 --- a/gtk/src/gtk_display_driver_opengl.cpp +++ b/gtk/src/gtk_display_driver_opengl.cpp @@ -584,6 +584,9 @@ int S9xOpenGLDisplayDriver::create_context () else core = false; + if (version >= 31 || epoxy_has_gl_extension ("GL_ARB_sync")) + fences = true; + return 1; } @@ -640,8 +643,18 @@ void S9xOpenGLDisplayDriver::swap_buffers () if (config->sync_every_frame) { - usleep (0); - glFinish (); + if (fences) + { + GLsync fence = glFenceSync (GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + usleep (0); + glClientWaitSync (fence, GL_SYNC_FLUSH_COMMANDS_BIT, 100000000); + glDeleteSync (fence); + } + else + { + usleep (0); + glFinish (); + } } } diff --git a/gtk/src/gtk_display_driver_opengl.h b/gtk/src/gtk_display_driver_opengl.h index 8c91deaf..d6696efb 100644 --- a/gtk/src/gtk_display_driver_opengl.h +++ b/gtk/src/gtk_display_driver_opengl.h @@ -63,6 +63,7 @@ class S9xOpenGLDisplayDriver : public S9xDisplayDriver bool npot; bool using_pbos; bool initialized; + bool fences; bool using_glsl_shaders; GLSLShader *glsl_shader; diff --git a/gtk/src/gtk_glx_context.cpp b/gtk/src/gtk_glx_context.cpp index 4b684629..804a29a9 100644 --- a/gtk/src/gtk_glx_context.cpp +++ b/gtk/src/gtk_glx_context.cpp @@ -156,6 +156,8 @@ void GTKGLXContext::swap_interval (int frames) glXSwapIntervalEXT (display, xid, frames); else if (epoxy_has_glx_extension (display, screen, "GLX_SGI_swap_control")) glXSwapIntervalSGI (frames); + else if (epoxy_has_glx_extension (display, screen, "GLX_MESA_swap_control")) + glXSwapIntervalMESA (frames); }