[gtk/big-glyphs: 12/17] gl: Improve cache dropping code
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/big-glyphs: 12/17] gl: Improve cache dropping code
- Date: Mon, 3 Jun 2019 02:10:42 +0000 (UTC)
commit 0a09b8dca70b0187a4ea2c22a08804162ca5b1a0
Author: Matthias Clasen <mclasen redhat com>
Date: Sun Jun 2 22:21:05 2019 +0000
gl: Improve cache dropping code
There was a TODO here to avoid iterating the
glyphs multiple times, so avoid that. And
actually log the number of glyphs that was dropped.
gsk/gl/gskglglyphcache.c | 31 +++++++++++++++++++++----------
1 file changed, 21 insertions(+), 10 deletions(-)
---
diff --git a/gsk/gl/gskglglyphcache.c b/gsk/gl/gskglglyphcache.c
index ed0aeb479c..6e81b1b793 100644
--- a/gsk/gl/gskglglyphcache.c
+++ b/gsk/gl/gskglglyphcache.c
@@ -381,7 +381,7 @@ gsk_gl_glyph_cache_begin_frame (GskGLGlyphCache *self)
GHashTableIter iter;
GlyphCacheKey *key;
GskGLCachedGlyph *value;
- guint dropped = 0;
+ GHashTable *removed = g_hash_table_new (g_direct_hash, g_direct_equal);
self->timestamp++;
@@ -421,18 +421,29 @@ gsk_gl_glyph_cache_begin_frame (GskGLGlyphCache *self)
atlas->image->texture_id = 0;
}
- /* Remove all glyphs that point to this atlas */
- g_hash_table_iter_init (&iter, self->hash_table);
- while (g_hash_table_iter_next (&iter, (gpointer *)&key, (gpointer *)&value))
- {
- if (value->atlas == atlas)
- g_hash_table_iter_remove (&iter);
- }
- /* TODO: The above loop inside this other loop could be slow... */
+ g_hash_table_add (removed, atlas);
g_ptr_array_remove_index (self->atlases, i);
+ }
+ }
+
+ if (g_hash_table_size (removed) > 0)
+ {
+ guint dropped = 0;
+
+ /* Remove all glyphs whose atlas was removed */
+ g_hash_table_iter_init (&iter, self->hash_table);
+ while (g_hash_table_iter_next (&iter, (gpointer *)&key, (gpointer *)&value))
+ {
+ if (g_hash_table_contains (removed, value->atlas))
+ {
+ g_hash_table_iter_remove (&iter);
+ dropped++;
+ }
}
+
+ GSK_RENDERER_NOTE(self->renderer, GLYPH_CACHE, if (dropped > 0) g_message ("Dropped %d glyphs",
dropped));
}
- GSK_RENDERER_NOTE(self->renderer, GLYPH_CACHE, g_message ("Dropped %d glyphs", dropped));
+ g_hash_table_unref (removed);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]