raster pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=8b796edce75b037df1c2fafe7e94f4e4dde417be
commit 8b796edce75b037df1c2fafe7e94f4e4dde417be Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com> Date: Thu Aug 7 18:13:07 2014 +0900 evas gl - fixz minor leak on exit of rectangles these were static rect cutouts, so they stayed around on exit and thus we "lost" them. this nukes them on context free and each new frame. fixes the "leak" --- src/modules/evas/engines/gl_common/evas_gl_context.c | 12 +++++++++++- src/modules/evas/engines/gl_common/evas_gl_font.c | 8 ++++---- src/modules/evas/engines/gl_common/evas_gl_image.c | 8 ++++---- src/modules/evas/engines/gl_common/evas_gl_polygon.c | 8 ++++---- src/modules/evas/engines/gl_common/evas_gl_private.h | 2 ++ src/modules/evas/engines/gl_common/evas_gl_rectangle.c | 8 ++++---- 6 files changed, 29 insertions(+), 17 deletions(-) diff --git a/src/modules/evas/engines/gl_common/evas_gl_context.c b/src/modules/evas/engines/gl_common/evas_gl_context.c index a48a6d0..11e5c6d 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_context.c +++ b/src/modules/evas/engines/gl_common/evas_gl_context.c @@ -11,6 +11,7 @@ static int sym_done = 0; int _evas_engine_GL_common_log_dom = -1; +Cutout_Rects *_evas_gl_common_cutout_rects = NULL; typedef void (*glsym_func_void) (); typedef void *(*glsym_func_void_ptr) (); @@ -934,6 +935,11 @@ evas_gl_common_context_free(Evas_Engine_GL_Context *gc) } if (gc == _evas_gl_common_context) _evas_gl_common_context = NULL; free(gc); + if (_evas_gl_common_cutout_rects) + { + evas_common_draw_context_apply_clear_cutouts(_evas_gl_common_cutout_rects); + _evas_gl_common_cutout_rects = NULL; + } } EAPI void @@ -949,6 +955,11 @@ evas_gl_common_context_newframe(Evas_Engine_GL_Context *gc) { int i; + if (_evas_gl_common_cutout_rects) + { + evas_common_draw_context_apply_clear_cutouts(_evas_gl_common_cutout_rects); + _evas_gl_common_cutout_rects = NULL; + } if (dbgflushnum < 0) { dbgflushnum = 0; @@ -3332,7 +3343,6 @@ finish: else return 0; } - Eina_Bool evas_gl_common_module_open(void) { diff --git a/src/modules/evas/engines/gl_common/evas_gl_font.c b/src/modules/evas/engines/gl_common/evas_gl_font.c index 70ee3b2..33c1f58 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_font.c +++ b/src/modules/evas/engines/gl_common/evas_gl_font.c @@ -62,7 +62,6 @@ evas_gl_font_texture_draw(void *context, void *surface EINA_UNUSED, void *draw_c Evas_Engine_GL_Context *gc = context; RGBA_Draw_Context *dc = draw_context; Evas_GL_Texture *tex; - static Cutout_Rects *rects = NULL; Cutout_Rect *rct; int r, g, b, a; double ssx, ssy, ssw, ssh; @@ -130,12 +129,12 @@ evas_gl_font_texture_draw(void *context, void *surface EINA_UNUSED, void *draw_c gc->dc->clip.use = c; gc->dc->clip.x = cx; gc->dc->clip.y = cy; gc->dc->clip.w = cw; gc->dc->clip.h = ch; return; } - rects = evas_common_draw_context_apply_cutouts(dc, rects); - for (i = 0; i < rects->active; ++i) + _evas_gl_common_cutout_rects = evas_common_draw_context_apply_cutouts(dc, _evas_gl_common_cutout_rects); + for (i = 0; i < _evas_gl_common_cutout_rects->active; ++i) { int nx, ny, nw, nh; - rct = rects->rects + i; + rct = _evas_gl_common_cutout_rects->rects + i; nx = x; ny = y; nw = tex->w; nh = tex->h; RECTS_CLIP_TO_RECT(nx, ny, nw, nh, rct->x, rct->y, rct->w, rct->h); if ((nw < 1) || (nh < 1)) continue; @@ -157,6 +156,7 @@ evas_gl_font_texture_draw(void *context, void *surface EINA_UNUSED, void *draw_c nx, ny, nw, nh, r, g, b, a); } + evas_common_draw_context_cutouts_free(_evas_gl_common_cutout_rects); /* restore clip info */ gc->dc->clip.use = c; gc->dc->clip.x = cx; gc->dc->clip.y = cy; gc->dc->clip.w = cw; gc->dc->clip.h = ch; } diff --git a/src/modules/evas/engines/gl_common/evas_gl_image.c b/src/modules/evas/engines/gl_common/evas_gl_image.c index dfe4f1e..21b9498 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_image.c +++ b/src/modules/evas/engines/gl_common/evas_gl_image.c @@ -1074,7 +1074,6 @@ _evas_gl_common_image_push(Evas_Engine_GL_Context *gc, Evas_GL_Image *im, void evas_gl_common_image_draw(Evas_Engine_GL_Context *gc, Evas_GL_Image *im, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh, int smooth) { - static Cutout_Rects *rects = NULL; RGBA_Draw_Context *dc; int r, g, b, a; Cutout_Rect *rct; @@ -1165,10 +1164,10 @@ evas_gl_common_image_draw(Evas_Engine_GL_Context *gc, Evas_GL_Image *im, int sx, gc->dc->clip.use = c; gc->dc->clip.x = cx; gc->dc->clip.y = cy; gc->dc->clip.w = cw; gc->dc->clip.h = ch; return; } - rects = evas_common_draw_context_apply_cutouts(dc, rects); - for (i = 0; i < rects->active; ++i) + _evas_gl_common_cutout_rects = evas_common_draw_context_apply_cutouts(dc, _evas_gl_common_cutout_rects); + for (i = 0; i < _evas_gl_common_cutout_rects->active; ++i) { - rct = rects->rects + i; + rct = _evas_gl_common_cutout_rects->rects + i; _evas_gl_common_image_push(gc, im, dx, dy, dw, dh, @@ -1177,6 +1176,7 @@ evas_gl_common_image_draw(Evas_Engine_GL_Context *gc, Evas_GL_Image *im, int sx, r, g, b, a, smooth, yuv, yuy2, nv12, rgb_a_pair); } + evas_common_draw_context_cutouts_free(_evas_gl_common_cutout_rects); /* restore clip info */ gc->dc->clip.use = c; gc->dc->clip.x = cx; gc->dc->clip.y = cy; gc->dc->clip.w = cw; gc->dc->clip.h = ch; } diff --git a/src/modules/evas/engines/gl_common/evas_gl_polygon.c b/src/modules/evas/engines/gl_common/evas_gl_polygon.c index f143d4c..afaaad5 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_polygon.c +++ b/src/modules/evas/engines/gl_common/evas_gl_polygon.c @@ -128,7 +128,6 @@ polygon_edge_sorter(const void *a, const void *b) void evas_gl_common_poly_draw(Evas_Engine_GL_Context *gc, Evas_GL_Polygon *poly, int dx, int dy) { - static Cutout_Rects *rects = NULL; Cutout_Rect *r; int c, cx, cy, cw, ch, cr, cg, cb, ca, i; int x = 0, y = 0, w = 0, h = 0; @@ -277,10 +276,10 @@ evas_gl_common_poly_draw(Evas_Engine_GL_Context *gc, Evas_GL_Polygon *poly, int /* our clip is 0 size.. abort */ if ((gc->dc->clip.w > 0) && (gc->dc->clip.h > 0)) { - rects = evas_common_draw_context_apply_cutouts(gc->dc, rects); - for (i = 0; i < rects->active; ++i) + _evas_gl_common_cutout_rects = evas_common_draw_context_apply_cutouts(gc->dc, _evas_gl_common_cutout_rects); + for (i = 0; i < _evas_gl_common_cutout_rects->active; ++i) { - r = rects->rects + i; + r = _evas_gl_common_cutout_rects->rects + i; if ((r->w > 0) && (r->h > 0)) { EINA_INLIST_FOREACH(spans, span) @@ -295,6 +294,7 @@ evas_gl_common_poly_draw(Evas_Engine_GL_Context *gc, Evas_GL_Polygon *poly, int } } } + evas_common_draw_context_cutouts_free(_evas_gl_common_cutout_rects); } } while (spans) diff --git a/src/modules/evas/engines/gl_common/evas_gl_private.h b/src/modules/evas/engines/gl_common/evas_gl_private.h index 8f7eb21..de44997 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_private.h +++ b/src/modules/evas/engines/gl_common/evas_gl_private.h @@ -29,4 +29,6 @@ extern int _evas_engine_GL_common_log_dom; #endif #define CRI(...) EINA_LOG_DOM_CRIT(_evas_engine_GL_common_log_dom, __VA_ARGS__) +extern Cutout_Rects *_evas_gl_common_cutout_rects; + #endif diff --git a/src/modules/evas/engines/gl_common/evas_gl_rectangle.c b/src/modules/evas/engines/gl_common/evas_gl_rectangle.c index 8dd0931..b9ae03a 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_rectangle.c +++ b/src/modules/evas/engines/gl_common/evas_gl_rectangle.c @@ -3,7 +3,6 @@ void evas_gl_common_rect_draw(Evas_Engine_GL_Context *gc, int x, int y, int w, int h) { - static Cutout_Rects *rects = NULL; Cutout_Rect *r; int c, cx, cy, cw, ch, cr, cg, cb, ca, i; @@ -37,15 +36,16 @@ evas_gl_common_rect_draw(Evas_Engine_GL_Context *gc, int x, int y, int w, int h) /* our clip is 0 size.. abort */ if ((gc->dc->clip.w > 0) && (gc->dc->clip.h > 0)) { - rects = evas_common_draw_context_apply_cutouts(gc->dc, rects); - for (i = 0; i < rects->active; ++i) + _evas_gl_common_cutout_rects = evas_common_draw_context_apply_cutouts(gc->dc, _evas_gl_common_cutout_rects); + for (i = 0; i < _evas_gl_common_cutout_rects->active; ++i) { - r = rects->rects + i; + r = _evas_gl_common_cutout_rects->rects + i; if ((r->w > 0) && (r->h > 0)) { evas_gl_common_context_rectangle_push(gc, r->x, r->y, r->w, r->h, cr, cg, cb, ca); } } + evas_common_draw_context_cutouts_free(_evas_gl_common_cutout_rects); } } /* restore clip info */ --