summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Roberts <neil@linux.intel.com>2011-11-14 15:09:13 +0000
committerNeil Roberts <neil@linux.intel.com>2011-11-14 18:46:56 +0000
commit4b4eb53658a3f0fca25212a16b5bbdc485d23be6 (patch)
treec1698e5d3ce4194a923d11d2f889aa06ed1c479c
parent4e59e567d431ba9599f1d6e9814e94a5b49e6265 (diff)
downloadcogl-4b4eb53658a3f0fca25212a16b5bbdc485d23be6.tar.gz
Don't take a reference to the last used onscreen framebuffer
Cogl keeps a pointer to the last used onscreen framebuffer from the context to implement the deprecated cogl_set_draw_buffer function which can take COGL_WINDOW_BUFFER as the target to use the last onscreen buffer. Previously this would also take a reference to that pointer. However that was causing a circular reference between the framebuffer and the context which makes it impossible to clean up resources properly when onscreen buffers are used. This patch instead changes it to just store the pointer and then clear the pointer during _cogl_onscreen_free as a kind of cheap weak reference. Reviewed-by: Robert Bragg <robert@linux.intel.com> (cherry-pick from commit 39ca3e51dfaa652ae4a0d936fff32a5edaca6c5f)
-rw-r--r--cogl/cogl-context.c6
-rw-r--r--cogl/cogl-framebuffer.c21
2 files changed, 11 insertions, 16 deletions
diff --git a/cogl/cogl-context.c b/cogl/cogl-context.c
index b44a748e..f6dea4cb 100644
--- a/cogl/cogl-context.c
+++ b/cogl/cogl-context.c
@@ -396,12 +396,6 @@ _cogl_context_free (CoglContext *context)
winsys->context_deinit (context);
- if (context->window_buffer)
- {
- cogl_object_unref (context->window_buffer);
- context->window_buffer = NULL;
- }
-
_cogl_free_framebuffer_stack (context->framebuffer_stack);
if (context->current_path)
diff --git a/cogl/cogl-framebuffer.c b/cogl/cogl-framebuffer.c
index e086e106..c6fab3c6 100644
--- a/cogl/cogl-framebuffer.c
+++ b/cogl/cogl-framebuffer.c
@@ -1042,6 +1042,9 @@ _cogl_onscreen_free (CoglOnscreen *onscreen)
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
const CoglWinsysVtable *winsys = _cogl_framebuffer_get_winsys (framebuffer);
+ if (framebuffer->context->window_buffer == onscreen)
+ framebuffer->context->window_buffer = NULL;
+
winsys->onscreen_deinit (onscreen);
g_return_if_fail (onscreen->winsys == NULL);
@@ -1172,18 +1175,16 @@ notify_buffers_changed (CoglFramebuffer *old_draw_buffer,
}
}
- /* XXX:
- * To support the deprecated cogl_set_draw_buffer API we keep track
- * of the last onscreen framebuffer that was set so that it can
- * be restored if the COGL_WINDOW_BUFFER enum is used. */
+ /* XXX: To support the deprecated cogl_set_draw_buffer API we keep
+ * track of the last onscreen framebuffer that was set so that it
+ * can be restored if the COGL_WINDOW_BUFFER enum is used. A
+ * reference isn't taken to the framebuffer because otherwise we
+ * would have a circular reference between the context and the
+ * framebuffer. Instead the pointer is set to NULL in
+ * _cogl_onscreen_free as a kind of a cheap weak reference */
if (new_draw_buffer &&
new_draw_buffer->type == COGL_FRAMEBUFFER_TYPE_ONSCREEN)
- {
- cogl_object_ref (new_draw_buffer);
- if (ctx->window_buffer)
- cogl_object_unref (ctx->window_buffer);
- ctx->window_buffer = new_draw_buffer;
- }
+ ctx->window_buffer = new_draw_buffer;
}
/* Set the current framebuffer without checking if it's already the