summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Bragg <robert@linux.intel.com>2012-01-16 11:26:45 +0000
committerRobert Bragg <robert@linux.intel.com>2012-01-16 18:27:20 +0000
commit3161f1b0e66ac91b5d82749dfa65133d90b11c42 (patch)
tree8085bc838a491af50215574d265f24864e5cddd9
parent1e0378051015e1e9f9a4ce6ebcfc653602a847ab (diff)
downloadcogl-3161f1b0e66ac91b5d82749dfa65133d90b11c42.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.h1
-rw-r--r--cogl/cogl-onscreen-template.c8
-rw-r--r--cogl/cogl-onscreen-template.h17
-rw-r--r--cogl/cogl-onscreen.c5
-rw-r--r--cogl/winsys/cogl-winsys-egl.c5
-rw-r--r--cogl/winsys/cogl-winsys-glx.c7
-rw-r--r--cogl/winsys/cogl-winsys-wgl.c7
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 4eff256f..686b9e97 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 ce062886..efeccfce 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 4510f336..59165de5 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 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);