From 394a162738f30f9cbf975f93bb9e15399715c423 Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Mon, 12 Nov 2012 11:52:31 -0500 Subject: Prefer OML_sync_control over SGI_video_sync when waiting for swap When we block waiting for the swap, prefer doing that using glXWaitForMsc() from OML_sync_control because that returns a system time value for the precise time of the swap. --- cogl/winsys/cogl-winsys-glx-feature-functions.h | 23 +++++++++++++++++ cogl/winsys/cogl-winsys-glx.c | 34 ++++++++++++++++++++----- 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/cogl/winsys/cogl-winsys-glx-feature-functions.h b/cogl/winsys/cogl-winsys-glx-feature-functions.h index 44d45321..f06ac69a 100644 --- a/cogl/winsys/cogl-winsys-glx-feature-functions.h +++ b/cogl/winsys/cogl-winsys-glx-feature-functions.h @@ -129,6 +129,29 @@ COGL_WINSYS_FEATURE_FUNCTION (int, glXSwapInterval, (int interval)) COGL_WINSYS_FEATURE_END () +COGL_WINSYS_FEATURE_BEGIN (255, 255, + sync_control, + "OML\0", + "sync_control\0", + 0, + 0) +COGL_WINSYS_FEATURE_FUNCTION (Bool, glXGetSyncValues, + (Display* dpy, + GLXDrawable drawable, + int64_t* ust, + int64_t* msc, + int64_t* sbc)) +COGL_WINSYS_FEATURE_FUNCTION (Bool, glXWaitForMsc, + (Display* dpy, + GLXDrawable drawable, + int64_t target_msc, + int64_t divisor, + int64_t remainder, + int64_t* ust, + int64_t* msc, + int64_t* sbc)) +COGL_WINSYS_FEATURE_END () + COGL_WINSYS_FEATURE_BEGIN (255, 255, copy_sub_buffer, "MESA\0", diff --git a/cogl/winsys/cogl-winsys-glx.c b/cogl/winsys/cogl-winsys-glx.c index e9bf7f0e..5b092e0e 100644 --- a/cogl/winsys/cogl-winsys-glx.c +++ b/cogl/winsys/cogl-winsys-glx.c @@ -428,10 +428,12 @@ update_base_winsys_features (CoglRenderer *renderer) COGL_WINSYS_FEATURE_MULTIPLE_ONSCREEN, TRUE); - if (glx_renderer->glXWaitVideoSync) + if (glx_renderer->pf_glXWaitVideoSync || + glx_renderer->pf_glXWaitForMsc) COGL_FLAGS_SET (glx_renderer->base_winsys_features, COGL_WINSYS_FEATURE_VBLANK_WAIT, TRUE); + } static CoglBool @@ -1254,14 +1256,32 @@ _cogl_winsys_wait_for_vblank (CoglContext *ctx) glx_renderer = ctx->display->renderer->winsys; - if (glx_renderer->glXGetVideoSync) + if (glx_renderer->glXWaitForMsc || + glx_renderer->glXGetVideoSync) { - uint32_t current_count; + if (glx_renderer->glXWaitForMsc) + { + CoglOnscreenGLX *glx_onscreen = onscreen->winsys; + Drawable drawable = glx_onscreen->glxwin; + int64_t ust; + int64_t msc; + int64_t sbc; + + glx_renderer->glXGetSyncValues (xlib_renderer->xdpy, drawable, + &ust, &msc, &sbc); + glx_renderer->glXWaitForMsc (xlib_renderer->xdpy, drawable, + 0, 2, (msc + 1) % 2, + &ust, &msc, &sbc); + } + else + { + uint32_t current_count; - glx_renderer->glXGetVideoSync (¤t_count); - glx_renderer->glXWaitVideoSync (2, - (current_count + 1) % 2, - ¤t_count); + glx_renderer->glXGetVideoSync (¤t_count); + glx_renderer->glXWaitVideoSync (2, + (current_count + 1) % 2, + ¤t_count); + } } } -- cgit v1.2.1