diff options
author | Felix Riemann <friemann@gnome.org> | 2014-04-12 00:26:00 +0200 |
---|---|---|
committer | Neil Roberts <neil@linux.intel.com> | 2014-05-19 12:47:09 +0100 |
commit | 5556241b67a58b1d28997e752ecf45244f6003d1 (patch) | |
tree | a1f2836d43e21788b28375f2f22a39d7d16c82dc | |
parent | 22378d572b039e4fe6ceb56e56492470bb461d48 (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.c | 28 |
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) |