diff --git a/legacy/evas/src/modules/engines/gl_common/evas_gl_common.h b/legacy/evas/src/modules/engines/gl_common/evas_gl_common.h index 5c9d8edb3a..864c33b56a 100644 --- a/legacy/evas/src/modules/engines/gl_common/evas_gl_common.h +++ b/legacy/evas/src/modules/engines/gl_common/evas_gl_common.h @@ -448,6 +448,7 @@ void evas_gl_common_shader_program_shutdown(Evas_GL_Program *p); void evas_gl_common_rect_draw(Evas_GL_Context *gc, int x, int y, int w, int h); +void evas_gl_texture_pool_empty(Evas_GL_Texture_Pool *pt); Evas_GL_Texture *evas_gl_common_texture_new(Evas_GL_Context *gc, RGBA_Image *im); Evas_GL_Texture *evas_gl_common_texture_native_new(Evas_GL_Context *gc, unsigned int w, unsigned int h, int alpha, Evas_GL_Image *im); Evas_GL_Texture *evas_gl_common_texture_render_new(Evas_GL_Context *gc, unsigned int w, unsigned int h, int alpha); diff --git a/legacy/evas/src/modules/engines/gl_common/evas_gl_context.c b/legacy/evas/src/modules/engines/gl_common/evas_gl_context.c index 1a45cf0b88..b0468415dc 100644 --- a/legacy/evas/src/modules/engines/gl_common/evas_gl_context.c +++ b/legacy/evas/src/modules/engines/gl_common/evas_gl_context.c @@ -758,6 +758,7 @@ void evas_gl_common_context_free(Evas_GL_Context *gc) { int i, j; + Eina_List *l; gc->references--; if (gc->references > 0) return; @@ -779,6 +780,8 @@ evas_gl_common_context_free(Evas_GL_Context *gc) if ((gc->shared) && (gc->shared->references == 0)) { + Evas_GL_Texture_Pool *pt; + evas_gl_common_shader_program_shutdown(&(gc->shared->shader.rect)); evas_gl_common_shader_program_shutdown(&(gc->shared->shader.font)); evas_gl_common_shader_program_shutdown(&(gc->shared->shader.img)); @@ -794,20 +797,15 @@ evas_gl_common_context_free(Evas_GL_Context *gc) { evas_gl_common_image_free(gc->shared->images->data); } - while (gc->shared->tex.whole) - { - evas_gl_common_texture_free(gc->shared->tex.whole->data); - } + + EINA_LIST_FOREACH(gc->shared->tex.whole, l, pt) + evas_gl_texture_pool_empty(pt); for (i = 0; i < 33; i++) { for (j = 0; j < 3; j++) { - while (gc->shared->tex.atlas[i][j]) - { - evas_gl_common_texture_free - ((Evas_GL_Texture *)gc->shared->tex.atlas[i][j]); - gc->shared->tex.atlas[i][j] = NULL; - } + EINA_LIST_FOREACH(gc->shared->tex.atlas[i][j], l, pt) + evas_gl_texture_pool_empty(pt); } } eina_hash_free(gc->shared->native_hash); diff --git a/legacy/evas/src/modules/engines/gl_common/evas_gl_texture.c b/legacy/evas/src/modules/engines/gl_common/evas_gl_texture.c index d10e1171be..e03b2d9bad 100644 --- a/legacy/evas/src/modules/engines/gl_common/evas_gl_texture.c +++ b/legacy/evas/src/modules/engines/gl_common/evas_gl_texture.c @@ -94,7 +94,7 @@ _tex_format_index(GLuint format) return 1; case GL_ALPHA: return 2; - case GL_LUMINANCE: + case GL_LUMINANCE: // never used in atlas return 3; default: return 0; @@ -312,10 +312,6 @@ evas_gl_common_texture_new(Evas_GL_Context *gc, RGBA_Image *im) } if (!tex->pt) { - // FIXME: mark as freed for now with 0x66, but this is me TRYING to - // find some mysterious bug i simply have been unable to catch or - // reproduce - so leave a trail and see how it goes. - memset(tex, 0x11, sizeof(Evas_GL_Texture)); free(tex); return NULL; } @@ -610,11 +606,10 @@ _pool_tex_dynamic_new(Evas_GL_Context *gc, int w, int h, int intformat, int form return pt; } -static void -pt_unref(Evas_GL_Texture_Pool *pt) +void +evas_gl_texture_pool_empty(Evas_GL_Texture_Pool *pt) { - pt->references--; - if (pt->references != 0) return; + if (!pt->gc) return; if (pt->format == alpha_fmt) { @@ -649,14 +644,6 @@ pt_unref(Evas_GL_Texture_Pool *pt) _print_tex_count(); - if (!((pt->render) || (pt->native))) - { - if (pt->whole) - pt->gc->shared->tex.whole = eina_list_remove(pt->gc->shared->tex.whole, pt); - else - pt->gc->shared->tex.atlas [pt->slot][pt->fslot] = - eina_list_remove(pt->gc->shared->tex.atlas[pt->slot][pt->fslot], pt); - } #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) if (pt->dyn.img) { @@ -677,11 +664,34 @@ pt_unref(Evas_GL_Texture_Pool *pt) { glsym_glDeleteFramebuffers(1, &(pt->fb)); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + pt->fb = 0; } - // FIXME: mark as freed for now with 0x66, but this is me TRYING to - // find some mysterious bug i simply have been unable to catch or - // reproduce - so leave a trail and see how it goes. - memset(pt, 0x22, sizeof(Evas_GL_Texture_Pool)); + while (pt->allocations) + pt->allocations = + eina_list_remove_list(pt->allocations, pt->allocations); + pt->texture = 0; + pt->gc = NULL; + pt->w = 0; + pt->h = 0; +} + +static void +pt_unref(Evas_GL_Texture_Pool *pt) +{ + if (!pt->gc) return; + pt->references--; + if (pt->references != 0) return; + + if (!((pt->render) || (pt->native))) + { + if (pt->whole) + pt->gc->shared->tex.whole = + eina_list_remove(pt->gc->shared->tex.whole, pt); + else + pt->gc->shared->tex.atlas [pt->slot][pt->fslot] = + eina_list_remove(pt->gc->shared->tex.atlas[pt->slot][pt->fslot], pt); + } + evas_gl_texture_pool_empty(pt); free(pt); } @@ -712,10 +722,6 @@ evas_gl_common_texture_native_new(Evas_GL_Context *gc, unsigned int w, unsigned } if (!tex->pt) { - // FIXME: mark as freed for now with 0x66, but this is me TRYING to - // find some mysterious bug i simply have been unable to catch or - // reproduce - so leave a trail and see how it goes. - memset(tex, 0x33, sizeof(Evas_GL_Texture)); free(tex); return NULL; } @@ -754,10 +760,6 @@ evas_gl_common_texture_render_new(Evas_GL_Context *gc, unsigned int w, unsigned } if (!tex->pt) { - // FIXME: mark as freed for now with 0x66, but this is me TRYING to - // find some mysterious bug i simply have been unable to catch or - // reproduce - so leave a trail and see how it goes. - memset(tex, 0x44, sizeof(Evas_GL_Texture)); free(tex); return NULL; } @@ -800,10 +802,6 @@ evas_gl_common_texture_dynamic_new(Evas_GL_Context *gc, Evas_GL_Image *im) } if (!tex->pt) { - // FIXME: mark as freed for now with 0x66, but this is me TRYING to - // find some mysterious bug i simply have been unable to catch or - // reproduce - so leave a trail and see how it goes. - memset(tex, 0x55, sizeof(Evas_GL_Texture)); free(tex); return NULL; } @@ -913,10 +911,6 @@ evas_gl_common_texture_free(Evas_GL_Texture *tex) } if (tex->ptu) pt_unref(tex->ptu); if (tex->ptv) pt_unref(tex->ptv); - // FIXME: mark as freed for now with 0x66, but this is me TRYING to - // find some mysterious bug i simply have been unable to catch or - // reproduce - so leave a trail and see how it goes. - memset(tex, 0x66, sizeof(Evas_GL_Texture)); free(tex); } @@ -938,10 +932,6 @@ evas_gl_common_texture_alpha_new(Evas_GL_Context *gc, DATA8 *pixels, gc->shared->info.tune.atlas.max_alloc_alpha_size); if (!tex->pt) { - // FIXME: mark as freed for now with 0x66, but this is me TRYING to - // find some mysterious bug i simply have been unable to catch or - // reproduce - so leave a trail and see how it goes. - memset(tex, 0x77, sizeof(Evas_GL_Texture)); free(tex); return NULL; } @@ -985,8 +975,6 @@ Evas_GL_Texture * evas_gl_common_texture_yuv_new(Evas_GL_Context *gc, DATA8 **rows, unsigned int w, unsigned int h) { Evas_GL_Texture *tex; -// Eina_List *l_after = NULL; -// int u = 0, v = 0; tex = calloc(1, sizeof(Evas_GL_Texture)); if (!tex) return NULL; @@ -996,10 +984,6 @@ evas_gl_common_texture_yuv_new(Evas_GL_Context *gc, DATA8 **rows, unsigned int w tex->pt = _pool_tex_new(gc, w + 1, h + 1, lum_ifmt, lum_fmt); if (!tex->pt) { - // FIXME: mark as freed for now with 0x66, but this is me TRYING to - // find some mysterious bug i simply have been unable to catch or - // reproduce - so leave a trail and see how it goes. - memset(tex, 0x88, sizeof(Evas_GL_Texture)); free(tex); return NULL; } @@ -1010,11 +994,6 @@ evas_gl_common_texture_yuv_new(Evas_GL_Context *gc, DATA8 **rows, unsigned int w tex->ptu = _pool_tex_new(gc, (w / 2) + 1, (h / 2) + 1, lum_ifmt, lum_fmt); if (!tex->ptu) { - pt_unref(tex->pt); - // FIXME: mark as freed for now with 0x66, but this is me TRYING to - // find some mysterious bug i simply have been unable to catch or - // reproduce - so leave a trail and see how it goes. - memset(tex, 0x99, sizeof(Evas_GL_Texture)); free(tex); return NULL; } @@ -1027,10 +1006,6 @@ evas_gl_common_texture_yuv_new(Evas_GL_Context *gc, DATA8 **rows, unsigned int w { pt_unref(tex->pt); pt_unref(tex->ptu); - // FIXME: mark as freed for now with 0x66, but this is me TRYING to - // find some mysterious bug i simply have been unable to catch or - // reproduce - so leave a trail and see how it goes. - memset(tex, 0xaa, sizeof(Evas_GL_Texture)); free(tex); return NULL; }