summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChun-wei Fan <fanchunwei@src.gnome.org>2011-11-15 14:09:37 +0800
committerChun-wei Fan <fanchunwei@src.gnome.org>2011-11-15 14:09:37 +0800
commite9d81dc5432bb27646bedc30b32103ac3bad0b24 (patch)
treec555a0f7273776264872d42600d64b7506d2e25d
parentca96da3ffd56aab654eca37835ff7e370767b6cf (diff)
parent4b4eb53658a3f0fca25212a16b5bbdc485d23be6 (diff)
downloadcogl-msvc-support-1.8.tar.gz
Merge branch 'cogl-1.8' into msvc-support-1.8msvc-support-1.8
-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