[gtk/wip/matthiasc/opbuffer: 5/5] gl: Speed up icon cache lookups



commit 90c7ba770c0beed373f4df32dc3433828b22914e
Author: Matthias Clasen <mclasen redhat com>
Date:   Tue Oct 15 08:27:16 2019 -0400

    gl: Speed up icon cache lookups
    
    Use gdk_texture_set_render_data to avoid
    hash table lookups when we can.

 gsk/gl/gskgliconcache.c | 31 ++++++++++++++++++++-----------
 1 file changed, 20 insertions(+), 11 deletions(-)
---
diff --git a/gsk/gl/gskgliconcache.c b/gsk/gl/gskgliconcache.c
index 7f2e30257e..8e7722caca 100644
--- a/gsk/gl/gskgliconcache.c
+++ b/gsk/gl/gskgliconcache.c
@@ -10,7 +10,10 @@
 static void
 icon_data_free (gpointer p)
 {
-  g_object_unref (((IconData *)p)->source_texture);
+  IconData *icon_data = p;
+
+  gdk_texture_clear_render_data (icon_data->source_texture);
+  g_object_unref (icon_data->source_texture);
   g_free (p);
 }
 
@@ -69,7 +72,9 @@ gsk_gl_icon_cache_begin_frame (GskGLIconCache *self,
       while (g_hash_table_iter_next (&iter, (gpointer *)&texture, (gpointer *)&icon_data))
         {
           if (g_ptr_array_find (removed_atlases, icon_data->atlas, NULL))
-            g_hash_table_iter_remove (&iter);
+            {
+              g_hash_table_iter_remove (&iter);
+            }
         }
     }
   
@@ -83,8 +88,8 @@ gsk_gl_icon_cache_begin_frame (GskGLIconCache *self,
         {
           if (icon_data->used)
             {
-              const int width = gdk_texture_get_width (icon_data->source_texture);
-              const int height = gdk_texture_get_height (icon_data->source_texture);
+              const int width = icon_data->source_texture->width;
+              const int height = icon_data->source_texture->height;
               gsk_gl_texture_atlas_mark_unused (icon_data->atlas, width + 2, height + 2);
               icon_data->used = FALSE;
             }
@@ -101,17 +106,19 @@ gsk_gl_icon_cache_lookup_or_add (GskGLIconCache  *self,
                                  GdkTexture      *texture,
                                  const IconData **out_icon_data)
 {
-  IconData *icon_data = g_hash_table_lookup (self->icons, texture);
+  IconData *icon_data;
+
+  icon_data = gdk_texture_get_render_data (texture, self);
+
+  if (!icon_data)
+    icon_data = g_hash_table_lookup (self->icons, texture);
 
   if (icon_data)
     {
       icon_data->frame_age = 0;
       if (!icon_data->used)
         {
-          const int width = gdk_texture_get_width (texture);
-          const int height = gdk_texture_get_height (texture);
-
-          gsk_gl_texture_atlas_mark_used (icon_data->atlas, width + 2, height + 2);
+          gsk_gl_texture_atlas_mark_used (icon_data->atlas, texture->width + 2, texture->height + 2);
           icon_data->used = TRUE;
         }
 
@@ -121,8 +128,8 @@ gsk_gl_icon_cache_lookup_or_add (GskGLIconCache  *self,
 
   /* texture not on any atlas yet. Find a suitable one. */
   {
-    const int width = gdk_texture_get_width (texture);
-    const int height = gdk_texture_get_height (texture);
+    const int width = texture->width;
+    const int height = texture->height;
     GskGLTextureAtlas *atlas = NULL;
     int packed_x = 0;
     int packed_y = 0;
@@ -220,6 +227,8 @@ gsk_gl_icon_cache_lookup_or_add (GskGLIconCache  *self,
 
     gdk_gl_context_pop_debug_group (gdk_gl_context_get_current ());
 
+    gdk_texture_set_render_data (texture, self, icon_data, NULL);
+
     *out_icon_data = icon_data;
 
     cairo_surface_destroy (surface);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]