diff options
author | Robert Bragg <robert@linux.intel.com> | 2012-01-16 11:26:45 +0000 |
---|---|---|
committer | Robert Bragg <robert@linux.intel.com> | 2012-01-16 11:26:45 +0000 |
commit | 83b7ff8bdcc66bd467df671898b1eed5f9d72543 (patch) | |
tree | 1f7fbdd7b990532227316206a2a8596b9939e678 | |
parent | d0214d30b2ef8d9b319fe0853eb30046d9f38010 (diff) | |
download | cogl-83b7ff8bdcc66bd467df671898b1eed5f9d72543.tar.gz |
template: Allow configuration of swap throttle
This adds cogl_onscreen_template_set_swap_throttled() api that allows
developers to specify their preference for swap buffer throttling
up-front as part of the onscreen template that is used to create a
CoglDisplay when initializing Cogl. This is desirable because some
platforms may not support configuring swap throttling on a per
framebuffer basis and also since applications often want to apply the
same policy to all onscreen framebuffers anyway.
-rw-r--r-- | cogl/cogl-framebuffer-private.h | 1 | ||||
-rw-r--r-- | cogl/cogl-onscreen-template.c | 8 | ||||
-rw-r--r-- | cogl/cogl-onscreen-template.h | 17 | ||||
-rw-r--r-- | cogl/cogl-onscreen.c | 5 | ||||
-rw-r--r-- | cogl/winsys/cogl-winsys-egl.c | 5 | ||||
-rw-r--r-- | cogl/winsys/cogl-winsys-glx.c | 7 | ||||
-rw-r--r-- | cogl/winsys/cogl-winsys-wgl.c | 7 |
7 files changed, 38 insertions, 12 deletions
diff --git a/cogl/cogl-framebuffer-private.h b/cogl/cogl-framebuffer-private.h index fce41e67..8ab782e8 100644 --- a/cogl/cogl-framebuffer-private.h +++ b/cogl/cogl-framebuffer-private.h @@ -49,6 +49,7 @@ typedef struct CoglSwapChain *swap_chain; gboolean need_stencil; int samples_per_pixel; + gboolean swap_throttled; } CoglFramebufferConfig; /* Flags to pass to _cogl_offscreen_new_to_texture_full */ diff --git a/cogl/cogl-onscreen-template.c b/cogl/cogl-onscreen-template.c index 92caadea..c71841fc 100644 --- a/cogl/cogl-onscreen-template.c +++ b/cogl/cogl-onscreen-template.c @@ -86,3 +86,11 @@ cogl_onscreen_template_set_samples_per_pixel ( { onscreen_template->config.samples_per_pixel = samples_per_pixel; } + +void +cogl_onscreen_template_set_swap_throttled ( + CoglOnscreenTemplate *onscreen_template, + gboolean throttled) +{ + onscreen_template->config.swap_throttled = throttled; +} diff --git a/cogl/cogl-onscreen-template.h b/cogl/cogl-onscreen-template.h index e992b7a1..0d1f9a4d 100644 --- a/cogl/cogl-onscreen-template.h +++ b/cogl/cogl-onscreen-template.h @@ -71,6 +71,23 @@ cogl_onscreen_template_set_samples_per_pixel ( CoglOnscreenTemplate *onscreen_template, int n); +/** + * cogl_onscreen_template_set_swap_throttled: + * @onscreen_template: A #CoglOnscreenTemplate template framebuffer + * @throttled: Whether throttling should be enabled + * + * Requests that any future #CoglOnscreen framebuffers derived from this + * template should enable or disable swap throttling according to the given + * @throttled argument. + * + * Since: 1.10 + * Stability: unstable + */ +void +cogl_onscreen_template_set_swap_throttled ( + CoglOnscreenTemplate *onscreen_template, + gboolean throttled); + G_END_DECLS #endif /* __COGL_ONSCREEN_TEMPLATE_H__ */ diff --git a/cogl/cogl-onscreen.c b/cogl/cogl-onscreen.c index 708a4412..023777a8 100644 --- a/cogl/cogl-onscreen.c +++ b/cogl/cogl-onscreen.c @@ -102,9 +102,6 @@ cogl_onscreen_new (CoglContext *ctx, int width, int height) _cogl_onscreen_init_from_template (onscreen, ctx->display->onscreen_template); - /* FIXME: This should be configurable via the template too */ - onscreen->swap_throttled = TRUE; - return _cogl_onscreen_object_new (onscreen); } @@ -294,7 +291,7 @@ cogl_onscreen_set_swap_throttled (CoglOnscreen *onscreen, gboolean throttled) { CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); - onscreen->swap_throttled = throttled; + framebuffer->config.swap_throttled = throttled; if (framebuffer->allocated) { const CoglWinsysVtable *winsys = diff --git a/cogl/winsys/cogl-winsys-egl.c b/cogl/winsys/cogl-winsys-egl.c index 3f81c2bb..865c748f 100644 --- a/cogl/winsys/cogl-winsys-egl.c +++ b/cogl/winsys/cogl-winsys-egl.c @@ -529,7 +529,8 @@ _cogl_winsys_onscreen_deinit (CoglOnscreen *onscreen) static void _cogl_winsys_onscreen_bind (CoglOnscreen *onscreen) { - CoglContext *context = COGL_FRAMEBUFFER (onscreen)->context; + CoglFramebuffer *fb = COGL_FRAMEBUFFER (onscreen); + CoglContext *context = fb->context; CoglDisplayEGL *egl_display = context->display->winsys; CoglRenderer *renderer = context->display->renderer; CoglRendererEGL *egl_renderer = renderer->winsys; @@ -545,7 +546,7 @@ _cogl_winsys_onscreen_bind (CoglOnscreen *onscreen) egl_display->egl_context); egl_context->current_surface = egl_onscreen->egl_surface; - if (onscreen->swap_throttled) + if (fb->config.swap_throttled) eglSwapInterval (egl_renderer->edpy, 1); else eglSwapInterval (egl_renderer->edpy, 0); diff --git a/cogl/winsys/cogl-winsys-glx.c b/cogl/winsys/cogl-winsys-glx.c index 362f5eff..d313ed33 100644 --- a/cogl/winsys/cogl-winsys-glx.c +++ b/cogl/winsys/cogl-winsys-glx.c @@ -1046,7 +1046,8 @@ _cogl_winsys_onscreen_bind (CoglOnscreen *onscreen) */ if (glx_renderer->pf_glXSwapInterval) { - if (onscreen->swap_throttled) + CoglFramebuffer *fb = COGL_FRAMEBUFFER (onscreen); + if (fb->config.swap_throttled) glx_renderer->pf_glXSwapInterval (1); else glx_renderer->pf_glXSwapInterval (0); @@ -1147,7 +1148,7 @@ _cogl_winsys_onscreen_swap_region (CoglOnscreen *onscreen, framebuffer, COGL_FRAMEBUFFER_STATE_BIND); - if (onscreen->swap_throttled) + if (framebuffer->config.swap_throttled) { have_counter = _cogl_winsys_has_feature (COGL_WINSYS_FEATURE_VBLANK_COUNTER); @@ -1282,7 +1283,7 @@ _cogl_winsys_onscreen_swap_buffers (CoglOnscreen *onscreen) drawable = glx_onscreen->glxwin ? glx_onscreen->glxwin : xlib_onscreen->xwin; - if (onscreen->swap_throttled) + if (framebuffer->config.swap_throttled) { guint32 end_frame_vsync_counter = 0; diff --git a/cogl/winsys/cogl-winsys-wgl.c b/cogl/winsys/cogl-winsys-wgl.c index fbe35908..66f9ed13 100644 --- a/cogl/winsys/cogl-winsys-wgl.c +++ b/cogl/winsys/cogl-winsys-wgl.c @@ -89,7 +89,6 @@ typedef struct _CoglOnscreenWgl HDC client_dc; - gboolean swap_throttled; } CoglOnscreenWgl; /* Define a set of arrays containing the functions required from GL @@ -651,6 +650,7 @@ _cogl_winsys_context_deinit (CoglContext *context) static void _cogl_winsys_onscreen_bind (CoglOnscreen *onscreen) { + CoglFramebuffer *fb; CoglContext *context; CoglContextWgl *wgl_context; CoglDisplayWgl *wgl_display; @@ -663,7 +663,8 @@ _cogl_winsys_onscreen_bind (CoglOnscreen *onscreen) context */ _COGL_RETURN_IF_FAIL (onscreen != NULL); - context = COGL_FRAMEBUFFER (onscreen)->context; + fb = COGL_FRAMEBUFFER (onscreen); + context = fb->context; wgl_context = context->winsys; wgl_display = context->display->winsys; wgl_onscreen = onscreen->winsys; @@ -680,7 +681,7 @@ _cogl_winsys_onscreen_bind (CoglOnscreen *onscreen) */ if (wgl_renderer->pf_wglSwapInterval) { - if (onscreen->swap_throttled) + if (fb->config.swap_throttled) wgl_renderer->pf_wglSwapInterval (1); else wgl_renderer->pf_wglSwapInterval (0); |