diff options
author | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2016-04-12 12:47:30 +0900 |
---|---|---|
committer | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2016-04-12 12:47:30 +0900 |
commit | af4c3c0fe134b4684ddf81b2a7f3e409688b99fd (patch) | |
tree | a31da58d1721b60ae4552ee38d5dd0af674b1073 | |
parent | 21ee8b83370f0878591106e5625fa2c0a18b4226 (diff) | |
download | efl-af4c3c0fe134b4684ddf81b2a7f3e409688b99fd.tar.gz |
evas gl - fix leak with font glyph textures
some font glyphs are still allocated after tyhe last gl window is
freed which means we can't make current anymore to free textures after
that. this fixes that by flushing gl texture info from the font cache
when the last gl windows are gone.
@fix
-rw-r--r-- | src/examples/elementary/codegen_example.edj | bin | 12063 -> 0 bytes | |||
-rw-r--r-- | src/lib/evas/common/evas_font.h | 1 | ||||
-rw-r--r-- | src/lib/evas/common/evas_font_load.c | 57 | ||||
-rw-r--r-- | src/modules/evas/engines/gl_cocoa/evas_gl_cocoa_main.m | 1 | ||||
-rw-r--r-- | src/modules/evas/engines/gl_drm/evas_outbuf.c | 2 | ||||
-rw-r--r-- | src/modules/evas/engines/gl_sdl/evas_engine.c | 1 | ||||
-rw-r--r-- | src/modules/evas/engines/gl_x11/evas_x_main.c | 2 |
7 files changed, 64 insertions, 0 deletions
diff --git a/src/examples/elementary/codegen_example.edj b/src/examples/elementary/codegen_example.edj Binary files differdeleted file mode 100644 index 4f87ec8c82..0000000000 --- a/src/examples/elementary/codegen_example.edj +++ /dev/null diff --git a/src/lib/evas/common/evas_font.h b/src/lib/evas/common/evas_font.h index 5017262078..3d59201776 100644 --- a/src/lib/evas/common/evas_font.h +++ b/src/lib/evas/common/evas_font.h @@ -68,6 +68,7 @@ EAPI void evas_common_font_flush (void); EAPI void evas_common_font_flush_last (void); EAPI RGBA_Font_Int *evas_common_font_int_find (const char *name, int size, Font_Rend_Flags wanted_rend); EAPI void evas_common_font_all_clear (void); +EAPI void evas_common_font_ext_clear (void); /* query */ diff --git a/src/lib/evas/common/evas_font_load.c b/src/lib/evas/common/evas_font_load.c index 041fe00029..2afd124941 100644 --- a/src/lib/evas/common/evas_font_load.c +++ b/src/lib/evas/common/evas_font_load.c @@ -962,3 +962,60 @@ evas_common_font_int_find(const char *name, int size, eina_stringshare_del(tmp_fn.name); return fi; } + +static void +_font_int_ext_clear(RGBA_Font_Int *fi) +{ + RGBA_Font_Glyph *fg; + Fash_Glyph_Map *fmap; + Fash_Glyph_Map2 *fash2; + Fash_Glyph *fash; + int i, j, k; + + fash = fi->fash; + if (!fash) return; + for (k = 0; k <= 0xff; k++) + { + fash2 = fash->bucket[k]; + if (fash2) + { + for (j = 0; j <= 0xff; j++) + { + fmap = fash2->bucket[j]; + if (fmap) + { + for (i = 0; i <= 0xff; i++) + { + fg = fmap->item[i]; + if ((fg) && (fg != (void *)(-1))) + { + if (fg->ext_dat) + { + if (fg->ext_dat_free) + fg->ext_dat_free(fg->ext_dat); + fg->ext_dat = NULL; + fg->ext_dat_free = NULL; + } + } + } + } + } + } + } +} + +static Eina_Bool +_cb_hash_font_ext(const Eina_Hash *hash EINA_UNUSED, + const void *key EINA_UNUSED, + void *data EINA_UNUSED, + void *fdata EINA_UNUSED) +{ + _font_int_ext_clear(data); + return EINA_TRUE; +} + +EAPI void +evas_common_font_ext_clear(void) +{ + eina_hash_foreach(fonts, _cb_hash_font_ext, NULL); +} diff --git a/src/modules/evas/engines/gl_cocoa/evas_gl_cocoa_main.m b/src/modules/evas/engines/gl_cocoa/evas_gl_cocoa_main.m index ea29753a43..15dc218d82 100644 --- a/src/modules/evas/engines/gl_cocoa/evas_gl_cocoa_main.m +++ b/src/modules/evas/engines/gl_cocoa/evas_gl_cocoa_main.m @@ -111,6 +111,7 @@ eng_window_free(Evas_GL_Cocoa_Window *gw) if (gw == _evas_gl_cocoa_window) _evas_gl_cocoa_window = NULL; + evas_common_font_ext_clear(); evas_gl_common_context_free(gw->gl_context); [(EvasGLView*)gw->view release]; free(gw); diff --git a/src/modules/evas/engines/gl_drm/evas_outbuf.c b/src/modules/evas/engines/gl_drm/evas_outbuf.c index 55d0e2077f..b120216608 100644 --- a/src/modules/evas/engines/gl_drm/evas_outbuf.c +++ b/src/modules/evas/engines/gl_drm/evas_outbuf.c @@ -394,6 +394,8 @@ evas_outbuf_free(Outbuf *ob) win_count--; evas_outbuf_use(ob); + if (win_count == 0) evas_common_font_ext_clear(); + if (ob == _evas_gl_drm_window) _evas_gl_drm_window = NULL; if (ob->gl_context) diff --git a/src/modules/evas/engines/gl_sdl/evas_engine.c b/src/modules/evas/engines/gl_sdl/evas_engine.c index 8c70fba4ec..99956ad0ce 100644 --- a/src/modules/evas/engines/gl_sdl/evas_engine.c +++ b/src/modules/evas/engines/gl_sdl/evas_engine.c @@ -57,6 +57,7 @@ _outbuf_free_region_for_update(Outbuf *ob EINA_UNUSED, RGBA_Image *update EINA_U static void _outbuf_free(Outbuf *ob) { + evas_common_font_ext_clear(); glsym_evas_gl_common_context_free(ob->gl_context); } diff --git a/src/modules/evas/engines/gl_x11/evas_x_main.c b/src/modules/evas/engines/gl_x11/evas_x_main.c index 031f790625..654e384461 100644 --- a/src/modules/evas/engines/gl_x11/evas_x_main.c +++ b/src/modules/evas/engines/gl_x11/evas_x_main.c @@ -587,6 +587,8 @@ eng_window_free(Outbuf *gw) win_count--; eng_window_use(gw); + if (win_count == 0) evas_common_font_ext_clear(); + context = _tls_context_get(); xwin = _tls_outbuf_get(); |