diff options
author | Emmanuele Bassi <ebassi@gnome.org> | 2018-03-30 13:59:06 +0100 |
---|---|---|
committer | Emmanuele Bassi <ebassi@gnome.org> | 2018-03-30 13:59:06 +0100 |
commit | e8d497b83a67ac86eaf2cc8b25a7304499f6d9e8 (patch) | |
tree | 0c91ea1c05aec06e04a3f92b1b1b511c4fa52836 | |
parent | 37767e056fcb8aeccde407948b77713d1098e7b5 (diff) | |
download | gtk+-e8d497b83a67ac86eaf2cc8b25a7304499f6d9e8.tar.gz |
Do not leak the shaders cacheshader-cache
When finalizing the shader cache object we need to delete the shaders
and programs we are caching as well.
-rw-r--r-- | gsk/gl/gskglshadercache.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/gsk/gl/gskglshadercache.c b/gsk/gl/gskglshadercache.c index 4ad6f2fb2c..79d8bed578 100644 --- a/gsk/gl/gskglshadercache.c +++ b/gsk/gl/gskglshadercache.c @@ -44,6 +44,24 @@ gsk_gl_shader_cache_new (void) return g_object_new (GSK_TYPE_GL_SHADER_CACHE, NULL); } +static void +delete_shader (gpointer data) +{ + int shader_id = GPOINTER_TO_INT (data); + + if (shader_id > 0) + glDeleteShader (shader_id); +} + +static void +delete_program (gpointer data) +{ + int program_id = GPOINTER_TO_INT (data); + + if (program_id > 0) + glDeleteProgram (program_id); +} + int gsk_gl_shader_cache_compile_shader (GskGLShaderCache *cache, int shader_type, @@ -53,7 +71,7 @@ gsk_gl_shader_cache_compile_shader (GskGLShaderCache *cache, if (cache->shader_cache == NULL) cache->shader_cache = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, - NULL); + delete_shader); char *shasum = g_compute_checksum_for_string (G_CHECKSUM_SHA256, source, -1); @@ -124,7 +142,7 @@ gsk_gl_shader_cache_link_program (GskGLShaderCache *cache, if (cache->program_cache == NULL) cache->program_cache = g_hash_table_new_full (g_int64_hash, g_int64_equal, g_free, - NULL); + delete_program); gint64 *key = g_new (gint64, 1); |