From 1e82480c9a074163ec6788a8a60ead403f7b0658 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Andre Date: Mon, 23 Sep 2013 17:51:06 +0900 Subject: [PATCH] evas/cserve2: Use scalecache with cserve2 Let's reuse the logic from scalecache and call cserve2 functions when the scalecache should be used. So, now, cserve2 server will not scale any image... This is too computationally intensive for the server's main thread. This is not optimal but makes a hell of a lot more sense for the moment. (since cserve2 manages the SHM segments) --- src/bin/evas/evas_cserve2.h | 2 +- src/bin/evas/evas_cserve2_cache.c | 24 +++++++- src/bin/evas/evas_cserve2_scale.c | 6 +- src/lib/evas/cache2/evas_cache2.c | 3 +- src/lib/evas/canvas/evas_object_image.c | 56 +++---------------- src/lib/evas/common/evas_image_scalecache.c | 20 +++++++ src/lib/evas/cserve2/evas_cs2.h | 4 ++ .../engines/software_generic/evas_engine.c | 54 +++--------------- 8 files changed, 68 insertions(+), 101 deletions(-) diff --git a/src/bin/evas/evas_cserve2.h b/src/bin/evas/evas_cserve2.h index b1b6d6882e..2a3a40eb67 100644 --- a/src/bin/evas/evas_cserve2.h +++ b/src/bin/evas/evas_cserve2.h @@ -320,7 +320,7 @@ void cserve2_cache_client_del(Client *client); int cserve2_cache_file_open(Client *client, unsigned int client_file_id, const char *path, const char *key, unsigned int rid, Evas_Image_Load_Opts *lo); void cserve2_cache_file_close(Client *client, unsigned int client_file_id); int cserve2_cache_image_entry_create(Client *client, int rid, unsigned int client_file_id, unsigned int image_id, Evas_Image_Load_Opts *opts); -void cserve2_rgba_image_scale_do(void *src_data, void *dst_data, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int alpha, int smooth); +void cserve2_rgba_image_scale_do(void *src_data, int src_full_w, int src_full_h, void *dst_data, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int alpha, int smooth); void cserve2_cache_image_load(Client *client, unsigned int client_image_id, unsigned int rid); void cserve2_cache_image_preload(Client *client, unsigned int client_image_id, unsigned int rid); void cserve2_cache_image_unload(Client *client, unsigned int client_image_id); diff --git a/src/bin/evas/evas_cserve2_cache.c b/src/bin/evas/evas_cserve2_cache.c index 5361c137a1..e86643df54 100644 --- a/src/bin/evas/evas_cserve2_cache.c +++ b/src/bin/evas/evas_cserve2_cache.c @@ -506,6 +506,8 @@ _image_loaded_msg_create(Image_Entry *ientry, Image_Data *idata, int *size) msg->shm.mmap_size = cserve2_shm_map_size_get(ientry->shm); msg->shm.image_size = cserve2_shm_size_get(ientry->shm); msg->alpha_sparse = idata->alpha_sparse; + msg->image.w = idata->w; + msg->image.h = idata->h; if (idata->shm_id) { @@ -805,7 +807,9 @@ _scaling_do(Shm_Handle *scale_shm, Image_Data *idata, Image_Entry *original) char *scale_map, *orig_map; void *src_data, *dst_data; File_Data *fd; + Image_Data *orig_idata; +#warning FIXME Remove this call, add alpha flag to Image_Data fd = _file_data_find(idata->file_id); if (!fd) { @@ -814,6 +818,13 @@ _scaling_do(Shm_Handle *scale_shm, Image_Data *idata, Image_Entry *original) return -1; } + orig_idata = _image_data_find(original->base.id); + if (!orig_idata) + { + ERR("Could not find image %u", original->base.id); + return -1; + } + scale_map = cserve2_shm_map(scale_shm); if (scale_map == MAP_FAILED) { @@ -833,14 +844,16 @@ _scaling_do(Shm_Handle *scale_shm, Image_Data *idata, Image_Entry *original) src_data = orig_map + cserve2_shm_map_offset_get(original->shm); dst_data = scale_map + cserve2_shm_map_offset_get(scale_shm); - DBG("Scaling image ([%d,%d:%dx%d] --> [%d,%d:%dx%d])", + DBG("Scaling image ([%dx%d]:[%d,%d:%dx%d] --> [%d,%d:%dx%d])", + orig_idata->w, orig_idata->h, idata->opts.scale_load.src_x, idata->opts.scale_load.src_y, idata->opts.scale_load.src_w, idata->opts.scale_load.src_h, 0, 0, idata->opts.scale_load.dst_w, idata->opts.scale_load.dst_h); cserve2_rgba_image_scale_do( - src_data, dst_data, + src_data, orig_idata->w, orig_idata->h, + dst_data, idata->opts.scale_load.src_x, idata->opts.scale_load.src_y, idata->opts.scale_load.src_w, idata->opts.scale_load.src_h, 0, 0, @@ -875,6 +888,8 @@ _scaling_prepare_and_do(Image_Entry *ientry, Image_Data *idata) cserve2_shared_string_del(idata->shm_id); ientry->shm = scale_shm; idata->shm_id = 0; + idata->w = idata->opts.scale_load.dst_w; + idata->h = idata->opts.scale_load.dst_h; return 0; } @@ -895,6 +910,9 @@ _load_request_response(Image_Entry *ientry, if (!idata->doload) DBG("Entry %d loaded by speculative preload.", idata->id); + idata->w = resp->w; + idata->h = resp->h; + if (_scaling_needed(idata, resp)) { DBG("About to scale image %u", idata->id); @@ -2781,7 +2799,7 @@ do_scaling: CSERVE2_REQ_IMAGE_LOAD, 0, NULL, 0, &_load_funcs, orig_entry); } - if (orig_entry->base.request || !orig_entry->shm) + if (orig_entry->base.request || !orig_entry->shm || !orig_data->valid) return -1; // Not loaded yet if (ientry->shm) diff --git a/src/bin/evas/evas_cserve2_scale.c b/src/bin/evas/evas_cserve2_scale.c index 9324432f13..dd909db235 100644 --- a/src/bin/evas/evas_cserve2_scale.c +++ b/src/bin/evas/evas_cserve2_scale.c @@ -32,7 +32,8 @@ _cserve2_rgba_image_set(RGBA_Image *im, void *data, int w, int h, int alpha) } void -cserve2_rgba_image_scale_do(void *src_data, void *dst_data, +cserve2_rgba_image_scale_do(void *src_data, int src_full_w, int src_full_h, + void *dst_data, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int alpha, int smooth) @@ -40,8 +41,7 @@ cserve2_rgba_image_scale_do(void *src_data, void *dst_data, RGBA_Image src, dst; RGBA_Draw_Context ct; - _cserve2_rgba_image_set(&src, src_data, src_w, src_h, alpha); - + _cserve2_rgba_image_set(&src, src_data, src_full_w, src_full_h, alpha); _cserve2_rgba_image_set(&dst, dst_data, dst_w, dst_h, alpha); dst.flags = RGBA_IMAGE_NOTHING; diff --git a/src/lib/evas/cache2/evas_cache2.c b/src/lib/evas/cache2/evas_cache2.c index fc7982d5ba..b6b1eadd1f 100644 --- a/src/lib/evas/cache2/evas_cache2.c +++ b/src/lib/evas/cache2/evas_cache2.c @@ -799,7 +799,8 @@ evas_cache2_image_open_wait(Image_Entry *im) } static Image_Entry * -_scaled_image_find(Image_Entry *im, int src_x, int src_y, int src_w, int src_h, int dst_w, int dst_h, int smooth) +_scaled_image_find(Image_Entry *im, int src_x, int src_y, int src_w, + int src_h, int dst_w, int dst_h, int smooth) { size_t pathlen, keylen, size; char *hkey; diff --git a/src/lib/evas/canvas/evas_object_image.c b/src/lib/evas/canvas/evas_object_image.c index 5178e1b1a7..4e5cd3d391 100644 --- a/src/lib/evas/canvas/evas_object_image.c +++ b/src/lib/evas/canvas/evas_object_image.c @@ -3998,53 +3998,15 @@ evas_object_image_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, v (o->cur->border.b == 0) && (o->cur->border.fill != 0)) { -#ifdef EVAS_CSERVE2 - if (evas_cserve2_use_get()) - { - Image_Entry *ie; - void *data = pixels; - int w = imagew, h = imageh; - Eina_Bool mustclose = EINA_FALSE; - - ie = evas_cache2_image_scale_load - ((Image_Entry *)pixels, - 0, 0, - imagew, imageh, - iw, ih, o->cur->smooth_scale); - if (ie != &((RGBA_Image *)pixels)->cache_entry) - { - data = ie; - w = iw; - h = ih; - mustclose = EINA_TRUE; - } - - _draw_image - (obj, output, context, surface, data, - 0, 0, - w, h, - obj->cur->geometry.x + ix + x, - obj->cur->geometry.y + iy + y, - iw, ih, - o->cur->smooth_scale, - do_async); - - if (mustclose) - evas_cache2_image_close(ie); - } - else -#endif - { - _draw_image - (obj, output, context, surface, pixels, - 0, 0, - imagew, imageh, - obj->cur->geometry.x + ix + x, - obj->cur->geometry.y + iy + y, - iw, ih, - o->cur->smooth_scale, - do_async); - } + _draw_image + (obj, output, context, surface, pixels, + 0, 0, + imagew, imageh, + obj->cur->geometry.x + ix + x, + obj->cur->geometry.y + iy + y, + iw, ih, + o->cur->smooth_scale, + do_async); } else { diff --git a/src/lib/evas/common/evas_image_scalecache.c b/src/lib/evas/common/evas_image_scalecache.c index fc907614c8..3802f0cce5 100644 --- a/src/lib/evas/common/evas_image_scalecache.c +++ b/src/lib/evas/common/evas_image_scalecache.c @@ -759,6 +759,26 @@ evas_common_rgba_image_scalecache_do_cbs(Image_Entry *ie, RGBA_Image *dst, } } } + +#ifdef EVAS_CSERVE2 + if (sci->populate_me && (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888) + && evas_cserve2_use_get() && evas_cache2_image_cached(&im->cache_entry)) + { + RGBA_Image *im2 = (RGBA_Image *) evas_cache2_image_scale_load + (&im->cache_entry, src_region_x, src_region_y, + src_region_w, src_region_h, dst_region_w, dst_region_h, smooth); + SLKL(cache_lock); + if (im2 != im) + { + sci->im = im2; + sci->populate_me = 0; + cache_list = eina_inlist_append(cache_list, (Eina_Inlist *)sci); + didpop = 1; + } + SLKU(cache_lock); + } +#endif + if (sci->populate_me) { // INF("##! populate!"); diff --git a/src/lib/evas/cserve2/evas_cs2.h b/src/lib/evas/cserve2/evas_cs2.h index 6cc8804e29..5378790999 100644 --- a/src/lib/evas/cserve2/evas_cs2.h +++ b/src/lib/evas/cserve2/evas_cs2.h @@ -90,6 +90,9 @@ struct _Msg_Loaded { int mmap_size; int image_size; } shm; + struct { + unsigned int w, h; // Real dimensions of this image. May differ from Msg_Opened::image::{w,h} after scaling. + } image; Eina_Bool alpha_sparse : 1; }; @@ -354,6 +357,7 @@ struct _Image_Data { uint32_t file_id; string_t shm_id; Evas_Image_Load_Opts opts; + uint32_t w, h; Eina_Bool alpha_sparse : 1; Eina_Bool unused : 1; Eina_Bool doload : 1; diff --git a/src/modules/evas/engines/software_generic/evas_engine.c b/src/modules/evas/engines/software_generic/evas_engine.c index 577d3af4b0..57766ef34c 100644 --- a/src/modules/evas/engines/software_generic/evas_engine.c +++ b/src/modules/evas/engines/software_generic/evas_engine.c @@ -1352,52 +1352,14 @@ eng_image_draw(void *data EINA_UNUSED, void *context, void *surface, void *image #endif else { -#if 0 -#ifdef EVAS_CSERVE2 - if (evas_cserve2_use_get()) - { - evas_cache2_image_load_data(&im->cache_entry); - goto image_loaded; - } -#endif - if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888) - evas_cache_image_load_data(&im->cache_entry); - evas_common_image_colorspace_normalize(im); - -image_loaded: -#endif -#ifdef EVAS_CSERVE2 - if (evas_cserve2_use_get()) - { - if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888) - evas_cache2_image_load_data(&im->cache_entry); - - if (!im->cache_entry.flags.loaded) return EINA_FALSE; - evas_common_image_colorspace_normalize(im); - - if (smooth) - evas_common_scale_rgba_in_to_out_clip_smooth - (im, surface, context, - src_x, src_y, src_w, src_h, - dst_x, dst_y, dst_w, dst_h); - else - evas_common_scale_rgba_in_to_out_clip_sample - (im, surface, context, - src_x, src_y, src_w, src_h, - dst_x, dst_y, dst_w, dst_h); - } - else -#endif - { - evas_common_rgba_image_scalecache_prepare - (&im->cache_entry, surface, context, smooth, - src_x, src_y, src_w, src_h, - dst_x, dst_y, dst_w, dst_h); - evas_common_rgba_image_scalecache_do - (&im->cache_entry, surface, context, smooth, - src_x, src_y, src_w, src_h, - dst_x, dst_y, dst_w, dst_h); - } + evas_common_rgba_image_scalecache_prepare + (&im->cache_entry, surface, context, smooth, + src_x, src_y, src_w, src_h, + dst_x, dst_y, dst_w, dst_h); + evas_common_rgba_image_scalecache_do + (&im->cache_entry, surface, context, smooth, + src_x, src_y, src_w, src_h, + dst_x, dst_y, dst_w, dst_h); evas_common_cpu_end_opt(); }