diff --git a/cogl/cogl-framebuffer-private.h b/cogl/cogl-framebuffer-private.h index fce41e673..8ab782e8d 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 92caadea8..c71841fc2 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 e992b7a11..0d1f9a4d7 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 4eff256f2..686b9e973 100644 --- a/cogl/cogl-onscreen.c +++ b/cogl/cogl-onscreen.c @@ -100,9 +100,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); } @@ -290,7 +287,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 ce0628868..efeccfce6 100644 --- a/cogl/winsys/cogl-winsys-egl.c +++ b/cogl/winsys/cogl-winsys-egl.c @@ -534,7 +534,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; @@ -550,7 +551,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 4510f3364..59165de56 100644 --- a/cogl/winsys/cogl-winsys-glx.c +++ b/cogl/winsys/cogl-winsys-glx.c @@ -1061,7 +1061,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); @@ -1162,7 +1163,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); @@ -1297,7 +1298,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 fbe35908c..66f9ed13c 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);