summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Riemann <friemann@gnome.org>2014-04-12 00:26:00 +0200
committerNeil Roberts <neil@linux.intel.com>2014-05-19 12:47:09 +0100
commit5556241b67a58b1d28997e752ecf45244f6003d1 (patch)
treea1f2836d43e21788b28375f2f22a39d7d16c82dc
parent22378d572b039e4fe6ceb56e56492470bb461d48 (diff)
atlas-texture: Keep reference on potential destination atlas
When a new CoglAtlasTexture tries to fit into an existing CoglAtlas it should make sure the atlas stays valid while it expands. https://bugzilla.gnome.org/show_bug.cgi?id=728064 Reviewed-by: Neil Roberts <neil@linux.intel.com> (cherry picked from commit 2eec9758f67e9073371c2edd63379324849373c4)
-rw-r--r--cogl/cogl-atlas-texture.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/cogl/cogl-atlas-texture.c b/cogl/cogl-atlas-texture.c
index beaaf247..1c8b5697 100644
--- a/cogl/cogl-atlas-texture.c
+++ b/cogl/cogl-atlas-texture.c
@@ -746,15 +746,25 @@ allocate_space (CoglAtlasTexture *atlas_tex,
/* Look for an existing atlas that can hold the texture */
for (l = ctx->atlases; l; l = l->next)
- /* Try to make some space in the atlas for the texture */
- if (_cogl_atlas_reserve_space (atlas = l->data,
- /* Add two pixels for the border */
- width + 2, height + 2,
- atlas_tex))
- {
- cogl_object_ref (atlas);
- break;
- }
+ {
+ /* We need to take a reference on the atlas before trying to
+ * reserve space because in some circumstances atlas migration
+ * can cause the atlas to be freed */
+ atlas = cogl_object_ref (l->data);
+ /* Try to make some space in the atlas for the texture */
+ if (_cogl_atlas_reserve_space (atlas,
+ /* Add two pixels for the border */
+ width + 2, height + 2,
+ atlas_tex))
+ {
+ /* keep the atlas reference */
+ break;
+ }
+ else
+ {
+ cogl_object_unref (atlas);
+ }
+ }
/* If we couldn't find a suitable atlas then start another */
if (l == NULL)