diff options
author | Owen W. Taylor <otaylor@fishsoup.net> | 2012-11-12 11:52:31 -0500 |
---|---|---|
committer | Robert Bragg <robert@linux.intel.com> | 2013-01-23 11:36:12 +0000 |
commit | 394a162738f30f9cbf975f93bb9e15399715c423 (patch) | |
tree | 5aea33fdb9a7ad42af1c725313f44b0b39a256f8 | |
parent | a0de9e74d97ef44c327bd1daef800aa8667e9938 (diff) | |
download | cogl-394a162738f30f9cbf975f93bb9e15399715c423.tar.gz |
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.
-rw-r--r-- | cogl/winsys/cogl-winsys-glx-feature-functions.h | 23 | ||||
-rw-r--r-- | 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 @@ -130,6 +130,29 @@ COGL_WINSYS_FEATURE_FUNCTION (int, glXSwapInterval, 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", "copy_sub_buffer\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); + } } } |