[gtk+] gsk: Turn texture cache into a hash table



commit 9836d2259feb556439162013a439b1cc217140af
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Tue Jul 12 14:59:37 2016 +0100

    gsk: Turn texture cache into a hash table
    
    We want to add the list of FBOs tied to a texture; this means we cannot
    trivally copy the Texture structure when adding it to a GArray. We're
    also going to have more textures than VAOs, so it makes more sense to
    use a O(1) access data structure for them.

 gsk/gskgldriver.c |   44 +++++++++++++++++++++-----------------------
 1 files changed, 21 insertions(+), 23 deletions(-)
---
diff --git a/gsk/gskgldriver.c b/gsk/gskgldriver.c
index 57e8bfe..1a2a289 100644
--- a/gsk/gskgldriver.c
+++ b/gsk/gskgldriver.c
@@ -28,7 +28,7 @@ struct _GskGLDriver
 
   GdkGLContext *gl_context;
 
-  GArray *textures;
+  GHashTable *textures;
   GArray *vaos;
 
   Texture *bound_source_texture;
@@ -49,12 +49,19 @@ static GParamSpec *gsk_gl_driver_properties[N_PROPS];
 
 G_DEFINE_TYPE (GskGLDriver, gsk_gl_driver, G_TYPE_OBJECT)
 
+static Texture *
+texture_new (void)
+{
+  return g_slice_new0 (Texture);
+}
+
 static void
-texture_clear (gpointer data)
+texture_free (gpointer data)
 {
   Texture *t = data;
 
   glDeleteTextures (1, &t->texture_id);
+  g_slice_free (Texture, t);
 }
 
 static void
@@ -71,7 +78,7 @@ gsk_gl_driver_finalize (GObject *gobject)
 {
   GskGLDriver *self = GSK_GL_DRIVER (gobject);
 
-  g_clear_pointer (&self->textures, g_array_unref);
+  g_clear_pointer (&self->textures, g_hash_table_unref);
   g_clear_pointer (&self->vaos, g_array_unref);
 
   g_clear_object (&self->gl_context);
@@ -137,8 +144,7 @@ gsk_gl_driver_class_init (GskGLDriverClass *klass)
 static void
 gsk_gl_driver_init (GskGLDriver *self)
 {
-  self->textures = g_array_new (FALSE, FALSE, sizeof (Texture));
-  g_array_set_clear_func (self->textures, texture_clear);
+  self->textures = g_hash_table_new_full (NULL, NULL, NULL, texture_free);
 
   self->vaos = g_array_new (FALSE, FALSE, sizeof (Vao));
   g_array_set_clear_func (self->vaos, vao_clear);
@@ -188,7 +194,7 @@ gsk_gl_driver_end_frame (GskGLDriver *driver)
   driver->bound_mask_texture = NULL;
   driver->bound_vao = NULL;
 
-  g_array_set_size (driver->textures, 0);
+  g_hash_table_remove_all (driver->textures);
   g_array_set_size (driver->vaos, 0);
 
   driver->in_frame = FALSE;
@@ -202,7 +208,7 @@ gsk_gl_driver_create_texture (GskGLDriver     *driver,
                               int              mag_filter)
 {
   guint texture_id;
-  Texture t;
+  Texture *t;
 
   g_return_val_if_fail (GSK_IS_GL_DRIVER (driver), -1);
 
@@ -214,12 +220,13 @@ gsk_gl_driver_create_texture (GskGLDriver     *driver,
   glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter);
   glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter);
 
-  t.texture_id = texture_id;
-  t.width = width;
-  t.height = height;
-  t.min_filter = min_filter;
-  t.mag_filter = mag_filter;
-  g_array_append_val (driver->textures, t);
+  t = texture_new ();
+  t->texture_id = texture_id;
+  t->width = width;
+  t->height = height;
+  t->min_filter = min_filter;
+  t->mag_filter = mag_filter;
+  g_hash_table_insert (driver->textures, GUINT_TO_POINTER (texture_id), t);
 
   return texture_id;
 }
@@ -270,16 +277,7 @@ static Texture *
 gsk_gl_driver_get_texture (GskGLDriver *driver,
                            int          texture_id)
 {
-  int i;
-
-  for (i = 0; i < driver->textures->len; i++)
-    {
-      Texture *t = &g_array_index (driver->textures, Texture, i);
-      if (t->texture_id == texture_id)
-        return t;
-    }
-
-  return NULL;
+  return g_hash_table_lookup (driver->textures, GINT_TO_POINTER (texture_id));
 }
 
 static Vao *


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