diff options
author | Adel Gadllah <adel.gadllah@gmail.com> | 2012-12-14 23:26:30 +0100 |
---|---|---|
committer | Robert Bragg <robert@linux.intel.com> | 2013-01-23 17:58:10 +0000 |
commit | 860fb00fdce6eba5ae7eb629b72799633f34e0e9 (patch) | |
tree | ef65db14d96dfa5b0d9ddcc6635ab71a6c51cdd7 /cogl/winsys/cogl-winsys-glx.c | |
parent | 9fb0cbd45db40b34669fc7397b69c731019b70ac (diff) | |
download | cogl-860fb00fdce6eba5ae7eb629b72799633f34e0e9.tar.gz |
cogl-onscreen: Add buffer_age support
Add a new BUFFER_AGE winsys feature and a get_buffer_age method to
cogl-onscreen that allows to query the value.
https://bugzilla.gnome.org/show_bug.cgi?id=669122
Reviewed-by: Neil Roberts <neil@linux.intel.com>
Reviewed-by: Robert Bragg <robert@linux.intel.com>
Note: When landing the patch I made some gtk-doc updates and changed
_get_buffer_age to return an age of 0 always if the age feature isn't
support instead of using _COGL_RETURN_VAL_IF_FAIL. -- Robert Bragg
(cherry picked from commit 427b1038051e9b53a071d8c229b363b075bb1dc0)
Diffstat (limited to 'cogl/winsys/cogl-winsys-glx.c')
-rw-r--r-- | cogl/winsys/cogl-winsys-glx.c | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/cogl/winsys/cogl-winsys-glx.c b/cogl/winsys/cogl-winsys-glx.c index 97e4c60b..22078cc4 100644 --- a/cogl/winsys/cogl-winsys-glx.c +++ b/cogl/winsys/cogl-winsys-glx.c @@ -280,7 +280,9 @@ resolve_core_glx_functions (CoglRenderer *renderer, (!g_module_symbol (glx_renderer->libgl_module, "glXGetProcAddress", (void **) &glx_renderer->glXGetProcAddress) && !g_module_symbol (glx_renderer->libgl_module, "glXGetProcAddressARB", - (void **) &glx_renderer->glXGetProcAddress))) + (void **) &glx_renderer->glXGetProcAddress)) || + !g_module_symbol (glx_renderer->libgl_module, "glXQueryDrawable", + (void **) &glx_renderer->glXQueryDrawable)) { _cogl_set_error (error, COGL_WINSYS_ERROR, COGL_WINSYS_ERROR_INIT, @@ -1189,6 +1191,30 @@ _cogl_winsys_get_vsync_counter (CoglContext *ctx) return video_sync_count; } +#ifndef GLX_BACK_BUFFER_AGE_EXT +#define GLX_BACK_BUFFER_AGE_EXT 0x20F4 +#endif + +static int +_cogl_winsys_onscreen_get_buffer_age (CoglOnscreen *onscreen) +{ + CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); + CoglContext *context = framebuffer->context; + CoglXlibRenderer *xlib_renderer = _cogl_xlib_renderer_get_data (context->display->renderer); + CoglGLXRenderer *glx_renderer = context->display->renderer->winsys; + CoglOnscreenGLX *glx_onscreen = onscreen->winsys; + CoglOnscreenXlib *xlib_onscreen = onscreen->winsys; + GLXDrawable drawable = glx_onscreen->glxwin ? glx_onscreen->glxwin : xlib_onscreen->xwin; + unsigned int age; + + if (!_cogl_winsys_has_feature (COGL_WINSYS_FEATURE_BUFFER_AGE)) + return 0; + + glx_renderer->glXQueryDrawable (xlib_renderer->xdpy, drawable, GLX_BACK_BUFFER_AGE_EXT, &age); + + return age; +} + static void _cogl_winsys_onscreen_swap_region (CoglOnscreen *onscreen, const int *user_rectangles, @@ -2165,6 +2191,7 @@ static CoglWinsysVtable _cogl_winsys_vtable = .onscreen_bind = _cogl_winsys_onscreen_bind, .onscreen_swap_buffers = _cogl_winsys_onscreen_swap_buffers, .onscreen_swap_region = _cogl_winsys_onscreen_swap_region, + .onscreen_get_buffer_age = _cogl_winsys_onscreen_get_buffer_age, .onscreen_update_swap_throttled = _cogl_winsys_onscreen_update_swap_throttled, .onscreen_x11_get_window_xid = |