oooh thank you valgrind! found some bad mem access stuff in the gl

engine on shutdown. was freeing the wring kind of thing in the first
place.. and even then it should be more robust, so fix gl texture
robustness and this bug. can cause on-exit crashes if not fixed.



SVN revision: 56068
This commit is contained in:
Carsten Haitzler 2011-01-13 10:41:08 +00:00
parent 1e99ccd5f9
commit fdc17c8c84
3 changed files with 40 additions and 66 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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;
}