[Cogl] [PATCH] atlas-texture: remove some use of _COGL_GET_CONTEXT

Robert Bragg robert at sixbynine.org
Mon Nov 26 15:26:57 PST 2012


From: Robert Bragg <robert at linux.intel.com>

This removes several uses of _COGL_GET_CONTEXT in cogl-atlas-texture.c.
Notably this involved making CoglPangoGlyphCache track an associated
CoglContext pointer which cogl-pango can pass to
_cogl_atlas_texture_new_with_size().
---
 cogl-pango/cogl-pango-glyph-cache.c |   22 ++++-
 cogl-pango/cogl-pango-glyph-cache.h |    3 +-
 cogl-pango/cogl-pango-render.c      |    6 +-
 cogl/cogl-atlas-texture-private.h   |   13 ++-
 cogl/cogl-atlas-texture.c           |  154 +++++++++++++++++------------------
 5 files changed, 105 insertions(+), 93 deletions(-)

diff --git a/cogl-pango/cogl-pango-glyph-cache.c b/cogl-pango/cogl-pango-glyph-cache.c
index 18c899d..47234ee 100644
--- a/cogl-pango/cogl-pango-glyph-cache.c
+++ b/cogl-pango/cogl-pango-glyph-cache.c
@@ -36,6 +36,8 @@ typedef struct _CoglPangoGlyphCacheKey     CoglPangoGlyphCacheKey;
 
 struct _CoglPangoGlyphCache
 {
+  CoglContext *ctx;
+
   /* Hash table to quickly check whether a particular glyph in a
      particular font is already cached */
   GHashTable       *hash_table;
@@ -111,12 +113,17 @@ cogl_pango_glyph_cache_equal_func (const void *a, const void *b)
 }
 
 CoglPangoGlyphCache *
-cogl_pango_glyph_cache_new (CoglBool use_mipmapping)
+cogl_pango_glyph_cache_new (CoglContext *ctx,
+                            CoglBool use_mipmapping)
 {
   CoglPangoGlyphCache *cache;
 
   cache = g_malloc (sizeof (CoglPangoGlyphCache));
 
+  /* Note: as a rule we don't take references to a CoglContext
+   * internally since */
+  cache->ctx = ctx;
+
   cache->hash_table = g_hash_table_new_full
     (cogl_pango_glyph_cache_hash_func,
      cogl_pango_glyph_cache_equal_func,
@@ -158,8 +165,11 @@ void
 cogl_pango_glyph_cache_free (CoglPangoGlyphCache *cache)
 {
   if (cache->using_global_atlas)
-    _cogl_atlas_texture_remove_reorganize_callback
-      (cogl_pango_glyph_cache_reorganize_cb, cache);
+    {
+      _cogl_atlas_texture_remove_reorganize_callback (
+                                  cache->ctx,
+                                  cogl_pango_glyph_cache_reorganize_cb, cache);
+    }
 
   cogl_pango_glyph_cache_clear (cache);
 
@@ -213,7 +223,8 @@ cogl_pango_glyph_cache_add_to_global_atlas (CoglPangoGlyphCache *cache,
   if (cache->use_mipmapping)
     return FALSE;
 
-  texture = _cogl_atlas_texture_new_with_size (value->draw_width,
+  texture = _cogl_atlas_texture_new_with_size (cache->ctx,
+                                               value->draw_width,
                                                value->draw_height,
                                                COGL_TEXTURE_NONE,
                                                COGL_PIXEL_FORMAT_RGBA_8888_PRE);
@@ -236,7 +247,8 @@ cogl_pango_glyph_cache_add_to_global_atlas (CoglPangoGlyphCache *cache,
   if (!cache->using_global_atlas)
     {
       _cogl_atlas_texture_add_reorganize_callback
-        (cogl_pango_glyph_cache_reorganize_cb, cache);
+        (cache->ctx,
+         cogl_pango_glyph_cache_reorganize_cb, cache);
       cache->using_global_atlas = TRUE;
     }
 
diff --git a/cogl-pango/cogl-pango-glyph-cache.h b/cogl-pango/cogl-pango-glyph-cache.h
index ba0f0de..113747d 100644
--- a/cogl-pango/cogl-pango-glyph-cache.h
+++ b/cogl-pango/cogl-pango-glyph-cache.h
@@ -60,7 +60,8 @@ typedef void (* CoglPangoGlyphCacheDirtyFunc) (PangoFont *font,
                                                CoglPangoGlyphCacheValue *value);
 
 CoglPangoGlyphCache *
-cogl_pango_glyph_cache_new (CoglBool use_mipmapping);
+cogl_pango_glyph_cache_new (CoglContext *ctx,
+                            CoglBool use_mipmapping);
 
 void
 cogl_pango_glyph_cache_free (CoglPangoGlyphCache *cache);
diff --git a/cogl-pango/cogl-pango-render.c b/cogl-pango/cogl-pango-render.c
index 6524786..16f70b7 100644
--- a/cogl-pango/cogl-pango-render.c
+++ b/cogl-pango/cogl-pango-render.c
@@ -214,8 +214,10 @@ _cogl_pango_renderer_constructed (GObject *gobject)
   renderer->mipmap_caches.pipeline_cache =
     _cogl_pango_pipeline_cache_new (ctx, TRUE);
 
-  renderer->no_mipmap_caches.glyph_cache = cogl_pango_glyph_cache_new (FALSE);
-  renderer->mipmap_caches.glyph_cache = cogl_pango_glyph_cache_new (TRUE);
+  renderer->no_mipmap_caches.glyph_cache =
+    cogl_pango_glyph_cache_new (ctx, FALSE);
+  renderer->mipmap_caches.glyph_cache =
+    cogl_pango_glyph_cache_new (ctx, TRUE);
 
   _cogl_pango_renderer_set_use_mipmapping (renderer, FALSE);
 
diff --git a/cogl/cogl-atlas-texture-private.h b/cogl/cogl-atlas-texture-private.h
index 7a70f54..52fdf06 100644
--- a/cogl/cogl-atlas-texture-private.h
+++ b/cogl/cogl-atlas-texture-private.h
@@ -64,17 +64,20 @@ _cogl_atlas_texture_new_from_bitmap (CoglBitmap *bmp,
                                      CoglError **error);
 
 CoglAtlasTexture *
-_cogl_atlas_texture_new_with_size (unsigned int     width,
-                                   unsigned int     height,
+_cogl_atlas_texture_new_with_size (CoglContext *ctx,
+                                   int width,
+                                   int height,
                                    CoglTextureFlags flags,
-                                   CoglPixelFormat  internal_format);
+                                   CoglPixelFormat internal_format);
 
 void
-_cogl_atlas_texture_add_reorganize_callback (GHookFunc callback,
+_cogl_atlas_texture_add_reorganize_callback (CoglContext *ctx,
+                                             GHookFunc callback,
                                              void *user_data);
 
 void
-_cogl_atlas_texture_remove_reorganize_callback (GHookFunc callback,
+_cogl_atlas_texture_remove_reorganize_callback (CoglContext *ctx,
+                                                GHookFunc callback,
                                                 void *user_data);
 
 CoglBool
diff --git a/cogl/cogl-atlas-texture.c b/cogl/cogl-atlas-texture.c
index 77e52f9..f3f0910 100644
--- a/cogl/cogl-atlas-texture.c
+++ b/cogl/cogl-atlas-texture.c
@@ -59,9 +59,9 @@ static CoglSubTexture *
 _cogl_atlas_texture_create_sub_texture (CoglTexture *full_texture,
                                         const CoglRectangleMapEntry *rectangle)
 {
+  CoglContext *ctx = full_texture->context;
   /* Create a subtexture for the given rectangle not including the
      1-pixel border */
-  _COGL_GET_CONTEXT (ctx, NULL);
   return cogl_sub_texture_new (ctx,
                                full_texture,
                                rectangle->x + 1,
@@ -193,17 +193,13 @@ _cogl_atlas_texture_atlas_destroyed_cb (void *user_data)
 }
 
 static CoglAtlas *
-_cogl_atlas_texture_create_atlas (void)
+_cogl_atlas_texture_create_atlas (CoglContext *ctx)
 {
   static CoglUserDataKey atlas_private_key;
 
-  CoglAtlas *atlas;
-
-  _COGL_GET_CONTEXT (ctx, NULL);
-
-  atlas = _cogl_atlas_new (COGL_PIXEL_FORMAT_RGBA_8888,
-                           0,
-                           _cogl_atlas_texture_update_position_cb);
+  CoglAtlas *atlas = _cogl_atlas_new (COGL_PIXEL_FORMAT_RGBA_8888,
+                                      0,
+                                      _cogl_atlas_texture_update_position_cb);
 
   _cogl_atlas_add_reorganize_callback (atlas,
                                        _cogl_atlas_texture_pre_reorganize_cb,
@@ -364,55 +360,58 @@ _cogl_atlas_texture_gl_flush_legacy_texobj_filters (CoglTexture *tex,
 static void
 _cogl_atlas_texture_migrate_out_of_atlas (CoglAtlasTexture *atlas_tex)
 {
+  CoglTexture *standalone_tex;
+  CoglContext *ctx;
+
   /* Make sure this texture is not in the atlas */
-  if (atlas_tex->atlas)
-    {
-      CoglTexture *standalone_tex;
-
-      COGL_NOTE (ATLAS, "Migrating texture out of the atlas");
-
-      /* We don't know if any journal entries currently depend on
-       * OpenGL texture coordinates that would be invalidated by
-       * migrating textures in this atlas so we flush all journals
-       * before migrating.
-       *
-       * We are assuming that texture atlas migration never happens
-       * during a flush so we don't have to consider recursion here.
-       */
-      cogl_flush ();
-
-      standalone_tex =
-        _cogl_atlas_copy_rectangle (atlas_tex->atlas,
-                                    atlas_tex->rectangle.x + 1,
-                                    atlas_tex->rectangle.y + 1,
-                                    atlas_tex->rectangle.width - 2,
-                                    atlas_tex->rectangle.height - 2,
-                                    COGL_TEXTURE_NO_ATLAS,
-                                    atlas_tex->format);
-      /* Note: we simply silently ignore failures to migrate a texture
-       * out (most likely due to lack of memory) and hope for the
-       * best.
-       *
-       * Maybe we should find a way to report the problem back to the
-       * app.
-       */
-      if (!standalone_tex)
-        return;
-
-      /* Notify cogl-pipeline.c that the texture's underlying GL texture
-       * storage is changing so it knows it may need to bind a new texture
-       * if the CoglTexture is reused with the same texture unit. */
-      _cogl_pipeline_texture_storage_change_notify (COGL_TEXTURE (atlas_tex));
-
-      /* We need to unref the sub texture after doing the copy because
-         the copy can involve rendering which might cause the texture
-         to be used if it is used from a layer that is left in a
-         texture unit */
-      cogl_object_unref (atlas_tex->sub_texture);
-      atlas_tex->sub_texture = standalone_tex;
-
-      _cogl_atlas_texture_remove_from_atlas (atlas_tex);
-    }
+  if (!atlas_tex->atlas)
+    return;
+
+  ctx = COGL_TEXTURE (atlas_tex)->context;
+
+  COGL_NOTE (ATLAS, "Migrating texture out of the atlas");
+
+  /* We don't know if any journal entries currently depend on
+   * OpenGL texture coordinates that would be invalidated by
+   * migrating textures in this atlas so we flush all journals
+   * before migrating.
+   *
+   * We are assuming that texture atlas migration never happens
+   * during a flush so we don't have to consider recursion here.
+   */
+  cogl_flush ();
+
+  standalone_tex =
+    _cogl_atlas_copy_rectangle (atlas_tex->atlas,
+                                atlas_tex->rectangle.x + 1,
+                                atlas_tex->rectangle.y + 1,
+                                atlas_tex->rectangle.width - 2,
+                                atlas_tex->rectangle.height - 2,
+                                COGL_TEXTURE_NO_ATLAS,
+                                atlas_tex->format);
+  /* Note: we simply silently ignore failures to migrate a texture
+   * out (most likely due to lack of memory) and hope for the
+   * best.
+   *
+   * Maybe we should find a way to report the problem back to the
+   * app.
+   */
+  if (!standalone_tex)
+    return;
+
+  /* Notify cogl-pipeline.c that the texture's underlying GL texture
+   * storage is changing so it knows it may need to bind a new texture
+   * if the CoglTexture is reused with the same texture unit. */
+  _cogl_pipeline_texture_storage_change_notify (COGL_TEXTURE (atlas_tex));
+
+  /* We need to unref the sub texture after doing the copy because
+     the copy can involve rendering which might cause the texture
+     to be used if it is used from a layer that is left in a
+     texture unit */
+  cogl_object_unref (atlas_tex->sub_texture);
+  atlas_tex->sub_texture = standalone_tex;
+
+  _cogl_atlas_texture_remove_from_atlas (atlas_tex);
 }
 
 static void
@@ -660,16 +659,15 @@ _cogl_atlas_texture_can_use_format (CoglPixelFormat format)
 }
 
 CoglAtlasTexture *
-_cogl_atlas_texture_new_with_size (unsigned int width,
-                                   unsigned int height,
+_cogl_atlas_texture_new_with_size (CoglContext *ctx,
+                                   int width,
+                                   int height,
                                    CoglTextureFlags flags,
                                    CoglPixelFormat internal_format)
 {
   CoglAtlasTexture *atlas_tex;
-  CoglAtlas        *atlas;
-  GSList           *l;
-
-  _COGL_GET_CONTEXT (ctx, NULL);
+  CoglAtlas *atlas;
+  GSList *l;
 
   /* Don't put textures in the atlas if the user has explicitly
      requested to disable it */
@@ -731,7 +729,7 @@ _cogl_atlas_texture_new_with_size (unsigned int width,
   /* If we couldn't find a suitable atlas then start another */
   if (l == NULL)
     {
-      atlas = _cogl_atlas_texture_create_atlas ();
+      atlas = _cogl_atlas_texture_create_atlas (ctx);
       COGL_NOTE (ATLAS, "Created new atlas for textures: %p", atlas);
       if (!_cogl_atlas_reserve_space (atlas,
                                       /* Add two pixels for the border */
@@ -757,6 +755,7 @@ _cogl_atlas_texture_new_from_bitmap (CoglBitmap *bmp,
                                      CoglPixelFormat internal_format,
                                      CoglError **error)
 {
+  CoglContext *ctx = _cogl_bitmap_get_context (bmp);
   CoglAtlasTexture *atlas_tex;
   CoglBitmap *dst_bmp;
   int bmp_width;
@@ -772,7 +771,8 @@ _cogl_atlas_texture_new_from_bitmap (CoglBitmap *bmp,
   internal_format = _cogl_texture_determine_internal_format (bmp_format,
                                                              internal_format);
 
-  atlas_tex = _cogl_atlas_texture_new_with_size (bmp_width, bmp_height,
+  atlas_tex = _cogl_atlas_texture_new_with_size (ctx,
+                                                 bmp_width, bmp_height,
                                                  flags, internal_format);
 
   if (atlas_tex == NULL)
@@ -816,31 +816,25 @@ _cogl_atlas_texture_new_from_bitmap (CoglBitmap *bmp,
 }
 
 void
-_cogl_atlas_texture_add_reorganize_callback (GHookFunc callback,
+_cogl_atlas_texture_add_reorganize_callback (CoglContext *ctx,
+                                             GHookFunc callback,
                                              void *user_data)
 {
-  GHook *hook;
-
-  _COGL_GET_CONTEXT (ctx, NO_RETVAL);
-
-  hook = g_hook_alloc (&ctx->atlas_reorganize_callbacks);
+  GHook *hook = g_hook_alloc (&ctx->atlas_reorganize_callbacks);
   hook->func = callback;
   hook->data = user_data;
   g_hook_prepend (&ctx->atlas_reorganize_callbacks, hook);
 }
 
 void
-_cogl_atlas_texture_remove_reorganize_callback (GHookFunc callback,
+_cogl_atlas_texture_remove_reorganize_callback (CoglContext *ctx,
+                                                GHookFunc callback,
                                                 void *user_data)
 {
-  GHook *hook;
-
-  _COGL_GET_CONTEXT (ctx, NO_RETVAL);
-
-  hook = g_hook_find_func_data (&ctx->atlas_reorganize_callbacks,
-                                FALSE,
-                                callback,
-                                user_data);
+  GHook *hook = g_hook_find_func_data (&ctx->atlas_reorganize_callbacks,
+                                       FALSE,
+                                       callback,
+                                       user_data);
 
   if (hook)
     g_hook_destroy_link (&ctx->atlas_reorganize_callbacks, hook);
-- 
1.7.7.6



More information about the Cogl mailing list