summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/man/vo.rst7
-rw-r--r--video/out/vo_opengl.c20
2 files changed, 26 insertions, 1 deletions
diff --git a/DOCS/man/vo.rst b/DOCS/man/vo.rst
index 31540fc1fa..e36e59c18a 100644
--- a/DOCS/man/vo.rst
+++ b/DOCS/man/vo.rst
@@ -443,6 +443,13 @@ Available video output drivers are:
Slower, but might help getting better results when doing framedropping.
The details depend entirely on the OpenGL driver.
+ ``waitvsync``
+ Call ``glXWaitVideoSyncSGI`` after each buffer swap (default: disabled).
+ This may or may not help with video timing accuracy and frame drop. It's
+ possible that this makes video output slower, or has no effect at all.
+
+ X11 only.
+
``sw``
Continue even if a software renderer is detected.
diff --git a/video/out/vo_opengl.c b/video/out/vo_opengl.c
index c80506039c..fdf70ac2dd 100644
--- a/video/out/vo_opengl.c
+++ b/video/out/vo_opengl.c
@@ -66,6 +66,7 @@ struct gl_priv {
struct gl_video_opts *renderer_opts;
struct mp_icc_opts *icc_opts;
int use_glFinish;
+ int waitvsync;
int use_gl_debug;
int allow_sw;
int swap_interval;
@@ -74,6 +75,7 @@ struct gl_priv {
int vo_flipped;
int frames_rendered;
+ unsigned int prev_sgi_sync_count;
};
// Always called under mpgl_lock
@@ -96,6 +98,7 @@ static void resize(struct gl_priv *p)
static void flip_page(struct vo *vo)
{
struct gl_priv *p = vo->priv;
+ GL *gl = p->gl;
mpgl_lock(p->glctx);
@@ -106,7 +109,21 @@ static void flip_page(struct vo *vo)
gl_video_set_debug(p->renderer, false);
if (p->use_glFinish)
- p->gl->Finish();
+ gl->Finish();
+
+ if (p->waitvsync) {
+ if (gl->GetVideoSync) {
+ unsigned int n1 = 0, n2 = 0;
+ gl->GetVideoSync(&n1);
+ gl->WaitVideoSync(2, (n1 + 1) % 2, &n2);
+ int step = n1 - p->prev_sgi_sync_count;
+ p->prev_sgi_sync_count = n1;
+ MP_DBG(vo, "Flip counts: %u->%u, step=%d\n", n1, n2, step);
+ } else {
+ MP_WARN(vo, "GLX_SGI_video_sync not available, disabling.\n");
+ p->waitvsync = 0;
+ }
+ }
mpgl_unlock(p->glctx);
}
@@ -454,6 +471,7 @@ err_out:
#define OPT_BASE_STRUCT struct gl_priv
const struct m_option options[] = {
OPT_FLAG("glfinish", use_glFinish, 0),
+ OPT_FLAG("waitvsync", waitvsync, 0),
OPT_INT("swapinterval", swap_interval, 0, OPTDEF_INT(1)),
OPT_FLAG("debug", use_gl_debug, 0),
OPT_STRING_VALIDATE("backend", backend, 0, mpgl_validate_backend_opt),