From b0b043f4437bcf403bd94c07649e142daee2a396 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Thu, 9 Apr 2009 13:20:00 +0000 Subject: [PATCH] scalecache tracks normal cache size etc. etc. etc. SVN revision: 39907 --- .../evas/src/lib/engines/common/evas_image.h | 4 ++ .../engines/common/evas_image_scalecache.c | 55 ++++++++++++++++++- .../engines/software_generic/evas_engine.c | 2 + 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/legacy/evas/src/lib/engines/common/evas_image.h b/legacy/evas/src/lib/engines/common/evas_image.h index 4addd77b34..95ea10cae6 100644 --- a/legacy/evas/src/lib/engines/common/evas_image.h +++ b/legacy/evas/src/lib/engines/common/evas_image.h @@ -30,6 +30,10 @@ EAPI void evas_common_image_alpha_line_buffer_free (RGBA_Image * EAPI RGBA_Image *evas_common_load_image_from_file (const char *file, const char *key, RGBA_Image_Loadopts *lo); EAPI int evas_common_save_image_to_file (RGBA_Image *im, const char *file, const char *key, int quality, int compress); +EAPI void evas_common_rgba_image_scalecache_size_set(int size); +EAPI int evas_common_rgba_image_scalecache_size_get(void); +EAPI void evas_common_rgba_image_scalecache_flush(void); + EAPI void evas_common_rgba_image_scalecache_prepare(Image_Entry *ie, RGBA_Image *dst, RGBA_Draw_Context *dc, int smooth, diff --git a/legacy/evas/src/lib/engines/common/evas_image_scalecache.c b/legacy/evas/src/lib/engines/common/evas_image_scalecache.c index 76bdcd667b..0a033de038 100644 --- a/legacy/evas/src/lib/engines/common/evas_image_scalecache.c +++ b/legacy/evas/src/lib/engines/common/evas_image_scalecache.c @@ -17,7 +17,8 @@ #define FLOP_ADD 4 #define MAX_FLOP_COUNT 16 #define FLOP_DEL 1 -#define SCALE_CACHE_SIZE 10 * 1024 * 1024 +//#define SCALE_CACHE_SIZE 10 * 1024 * 1024 +#define SCALE_CACHE_SIZE 0 typedef struct _Scaleitem Scaleitem; @@ -93,9 +94,11 @@ evas_common_rgba_image_scalecache_dirty(Image_Entry *ie) if (sci->im) { // printf(" 0- %i\n", sci->dst_w * sci->dst_h * 4); + LKL(cache_lock); evas_common_rgba_image_free(&sci->im->cache_entry); cache_size -= sci->dst_w * sci->dst_h * 4; cache_list = eina_inlist_remove(cache_list, (Eina_Inlist *)sci); + LKU(cache_lock); } free(sci); } @@ -226,7 +229,7 @@ _sci_find(RGBA_Image *im, } static void -_cache_prune(Scaleitem *notsci) +_cache_prune(Scaleitem *notsci, Evas_Bool copies_only) { RGBA_Image *im; Scaleitem *sci; @@ -234,6 +237,12 @@ _cache_prune(Scaleitem *notsci) { if (!cache_list) break; sci = (Scaleitem *)(cache_list); + if (copies_only) + { + while ((sci) && (!sci->parent_im->image.data)) + sci = ((Eina_Inlist *)sci)->next; + if (!sci) return; + } if (sci == notsci) return; im = sci->parent_im; if (sci->im) @@ -253,6 +262,40 @@ _cache_prune(Scaleitem *notsci) } #endif +EAPI void +evas_common_rgba_image_scalecache_size_set(int size) +{ + LKL(cache_lock); + if (size != max_cache_size) + { + max_cache_size = size; + _cache_prune(NULL, 1); + } + LKU(cache_lock); +} + +EAPI int +evas_common_rgba_image_scalecache_size_get(void) +{ + int t; + LKL(cache_lock); + t = max_cache_size; + LKU(cache_lock); + return t; +} + +EAPI void +evas_common_rgba_image_scalecache_flush(void) +{ + int t; + LKL(cache_lock); + t = max_cache_size; + max_cache_size = 0; + _cache_prune(NULL, 1); + max_cache_size = t; + LKU(cache_lock); +} + EAPI void evas_common_rgba_image_scalecache_prepare(Image_Entry *ie, RGBA_Image *dst, RGBA_Draw_Context *dc, int smooth, @@ -286,6 +329,7 @@ evas_common_rgba_image_scalecache_prepare(Image_Entry *ie, RGBA_Image *dst, LKU(im->cache.lock); return; } + LKL(cache_lock); sci = _sci_find(im, dc, smooth, src_region_x, src_region_y, src_region_w, src_region_h, dst_region_w, dst_region_h); @@ -313,6 +357,7 @@ evas_common_rgba_image_scalecache_prepare(Image_Entry *ie, RGBA_Image *dst, } sci->usage++; sci->usage_count = use_counter; + LKU(cache_lock); if (sci->usage > im->cache.newest_usage) im->cache.newest_usage = sci->usage; // printf("newset? %p %i > %i\n", im, @@ -382,9 +427,11 @@ evas_common_rgba_image_scalecache_do(Image_Entry *ie, RGBA_Image *dst, LKU(im->cache.lock); return; } + LKL(cache_lock); sci = _sci_find(im, dc, smooth, src_region_x, src_region_y, src_region_w, src_region_h, dst_region_w, dst_region_h); + LKU(cache_lock); if (!sci) { if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888) @@ -418,6 +465,7 @@ evas_common_rgba_image_scalecache_do(Image_Entry *ie, RGBA_Image *dst, { static RGBA_Draw_Context *ct = NULL; + LKL(cache_lock); im->cache.orig_usage++; im->cache.usage_count = use_counter; im->cache.populate_count--; @@ -453,7 +501,8 @@ evas_common_rgba_image_scalecache_do(Image_Entry *ie, RGBA_Image *dst, // sci->dst_w * sci->dst_h * 4, sci->flop, // sci->dst_w, sci->dst_h); cache_list = eina_inlist_append(cache_list, (Eina_Inlist *)sci); - _cache_prune(sci); + _cache_prune(sci, 0); + LKU(cache_lock); didpop = 1; } } diff --git a/legacy/evas/src/modules/engines/software_generic/evas_engine.c b/legacy/evas/src/modules/engines/software_generic/evas_engine.c index 75d97b1372..2517f5004b 100644 --- a/legacy/evas/src/modules/engines/software_generic/evas_engine.c +++ b/legacy/evas/src/modules/engines/software_generic/evas_engine.c @@ -784,6 +784,7 @@ eng_image_cache_flush(void *data __UNUSED__) tmp_size = evas_common_image_get_cache(); evas_common_image_set_cache(0); + evas_common_rgba_image_scalecache_flush(); evas_common_image_set_cache(tmp_size); } @@ -791,6 +792,7 @@ static void eng_image_cache_set(void *data __UNUSED__, int bytes) { evas_common_image_set_cache(bytes); + evas_common_rgba_image_scalecache_size_set(bytes); } static int