jpeg pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=82e8028b5d34ccf488eb3faed30f67b4b40bfaed
commit 82e8028b5d34ccf488eb3faed30f67b4b40bfaed Author: Jean-Philippe Andre <[email protected]> Date: Tue Oct 29 19:06:33 2013 +0900 evas/cserve2: Fix image preload with gl-x11 engine Cserves supports only the SW (xlib) and GL (gl-x11) engines. Also, improve cs2 support for some lesser used functions in the gl_x11 engine. --- src/lib/evas/cache2/evas_cache2.c | 1 + src/lib/evas/cache2/evas_cache2.h | 1 + src/modules/evas/engines/gl_common/evas_gl_image.c | 6 +++ .../evas/engines/gl_common/evas_gl_preload.c | 19 ++++++++++ .../evas/engines/gl_common/evas_gl_texture.c | 10 +++++ src/modules/evas/engines/gl_x11/evas_engine.c | 43 +++++++++++++++++++--- .../evas/engines/software_generic/evas_engine.c | 9 ++++- 7 files changed, 82 insertions(+), 7 deletions(-) diff --git a/src/lib/evas/cache2/evas_cache2.c b/src/lib/evas/cache2/evas_cache2.c index d4b2b53..5ec5b6d 100644 --- a/src/lib/evas/cache2/evas_cache2.c +++ b/src/lib/evas/cache2/evas_cache2.c @@ -307,6 +307,7 @@ _evas_cache2_image_preloaded_cb(void *data, Eina_Bool success) ie->cache2->preload = eina_list_remove(ie->cache2->preload, ie); ie->flags.preload_done = success; + ie->flags.updated_data = EINA_TRUE; while ((tmp = ie->targets)) { diff --git a/src/lib/evas/cache2/evas_cache2.h b/src/lib/evas/cache2/evas_cache2.h index 7cd9c79..6c7f5f8 100644 --- a/src/lib/evas/cache2/evas_cache2.h +++ b/src/lib/evas/cache2/evas_cache2.h @@ -66,6 +66,7 @@ EAPI void evas_cache2_image_close(Image_Entry *im); EAPI int evas_cache2_image_load_data(Image_Entry *ie); EAPI void evas_cache2_image_unload_data(Image_Entry *im); EAPI void evas_cache2_image_preload_data(Image_Entry *im, const void *target); +EAPI void evas_cache2_image_preload_cancel(Image_Entry *im, const void *target); EAPI void evas_cache2_image_cache_key_create(char *hkey, const char *path, size_t pathlen, const char *key, size_t keylen, const Evas_Image_Load_Opts *lo); EAPI DATA32 * evas_cache2_image_pixels(Image_Entry *im); 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 36b40aa..169b486 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_image.c +++ b/src/modules/evas/engines/gl_common/evas_gl_image.c @@ -8,6 +8,12 @@ void evas_gl_common_image_alloc_ensure(Evas_GL_Image *im) { if (!im->im) return; +#ifdef EVAS_CSERVE2 + if (evas_cache2_image_cached(&im->im->cache_entry)) + im->im = (RGBA_Image *)evas_cache2_image_size_set(&im->im->cache_entry, + im->w, im->h); + else +#endif im->im = (RGBA_Image *)evas_cache_image_size_set(&im->im->cache_entry, im->w, im->h); } diff --git a/src/modules/evas/engines/gl_common/evas_gl_preload.c b/src/modules/evas/engines/gl_common/evas_gl_preload.c index bdaa8de..5ee36b6 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_preload.c +++ b/src/modules/evas/engines/gl_common/evas_gl_preload.c @@ -1,5 +1,9 @@ #include "evas_gl_private.h" +#ifdef EVAS_CSERVE2 +#include "evas_cs2_private.h" +#endif + static Eina_Thread async_loader_thread; static Eina_Condition async_loader_cond; static Eina_Lock async_loader_lock; @@ -50,6 +54,11 @@ evas_gl_preload_pop(Evas_GL_Texture *tex) if (running) evas_gl_preload_render_lock(tmp_cb, tmp_data); evas_gl_common_texture_free(async_current->tex, EINA_FALSE); +#ifdef EVAS_CSERVE2 + if (evas_cache2_image_cached(&async_current->im->cache_entry)) + evas_cache2_image_close(&async_current->im->cache_entry); + else +#endif evas_cache_image_drop(&async_current->im->cache_entry); free(async_current); @@ -66,6 +75,11 @@ evas_gl_preload_pop(Evas_GL_Texture *tex) async_loader_tex = eina_list_remove_list(async_loader_tex, l); evas_gl_common_texture_free(async->tex, EINA_FALSE); +#ifdef EVAS_CSERVE2 + if (evas_cache2_image_cached(&async->im->cache_entry)) + evas_cache2_image_close(&async->im->cache_entry); + else +#endif evas_cache_image_drop(&async->im->cache_entry); free(async); @@ -100,6 +114,11 @@ _evas_gl_preload_main_loop_wakeup(void) async->tex->aptt = NULL; evas_gl_common_texture_free(async->tex, EINA_FALSE); +#ifdef EVAS_CSERVE2 + if (evas_cache2_image_cached(&async->im->cache_entry)) + evas_cache2_image_close(&async->im->cache_entry); + else +#endif evas_cache_image_drop(&async->im->cache_entry); free(async); } diff --git a/src/modules/evas/engines/gl_common/evas_gl_texture.c b/src/modules/evas/engines/gl_common/evas_gl_texture.c index e254db5..1cacce3 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_texture.c +++ b/src/modules/evas/engines/gl_common/evas_gl_texture.c @@ -941,6 +941,11 @@ evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im) async->tex = tex; async->tex->references++; async->im = im; +#ifdef EVAS_CSERVE2 + if (evas_cache2_image_cached(&async->im->cache_entry)) + evas_cache2_image_ref(&async->im->cache_entry); + else +#endif evas_cache_image_ref(&async->im->cache_entry); async->unpack_row_length = tex->gc->shared->info.unpack_row_length; @@ -949,6 +954,11 @@ evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im) // Failed to start asynchronous upload, likely due to preload not being supported by the backend async->tex->references--; +#ifdef EVAS_CSERVE2 + if (evas_cache2_image_cached(&async->im->cache_entry)) + evas_cache2_image_close(&async->im->cache_entry); + else +#endif evas_cache_image_drop(&async->im->cache_entry); free(async); diff --git a/src/modules/evas/engines/gl_x11/evas_engine.c b/src/modules/evas/engines/gl_x11/evas_engine.c index b708bf8..0a23ec1 100644 --- a/src/modules/evas/engines/gl_x11/evas_engine.c +++ b/src/modules/evas/engines/gl_x11/evas_engine.c @@ -14,6 +14,10 @@ # error gl_x11 should not get compiled if dlsym is not found on the system! #endif +#ifdef EVAS_CSERVE2 +#include "evas_cs2_private.h" +#endif + #define EVAS_GL_NO_GL_H_CHECK 1 #include "Evas_GL.h" @@ -1816,7 +1820,14 @@ eng_image_alpha_set(void *data, void *image, int has_alpha) Evas_GL_Image *im_new; if (!im->im->image.data) - evas_cache_image_load_data(&im->im->cache_entry); + { +#ifdef EVAS_CSERVE2 + if (evas_cserve2_use_get() && evas_cache2_image_cached(&im->im->cache_entry)) + evas_cache2_image_load_data(&im->im->cache_entry); + else +#endif + evas_cache_image_load_data(&im->im->cache_entry); + } evas_gl_common_image_alloc_ensure(im); im_new = evas_gl_common_image_new_from_copied_data (im->gc, im->im->cache_entry.w, im->im->cache_entry.h, @@ -2745,7 +2756,12 @@ eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data, i return NULL; } - error = evas_cache_image_load_data(&im->im->cache_entry); +#ifdef EVAS_CSERVE2 + if (evas_cserve2_use_get() && evas_cache2_image_cached(&im->im->cache_entry)) + error = evas_cache2_image_load_data(&im->im->cache_entry); + else +#endif + error = evas_cache_image_load_data(&im->im->cache_entry); evas_gl_common_image_alloc_ensure(im); switch (im->cs.space) { @@ -2874,7 +2890,13 @@ eng_image_data_preload_request(void *data, void *image, const Eo *target) if (gim->native.data) return; im = (RGBA_Image *)gim->im; if (!im) return; - evas_cache_image_preload_data(&im->cache_entry, target, NULL, NULL, NULL); + +#ifdef EVAS_CSERVE2 + if (evas_cserve2_use_get() && evas_cache2_image_cached(&im->cache_entry)) + evas_cache2_image_preload_data(&im->cache_entry, target); + else +#endif + evas_cache_image_preload_data(&im->cache_entry, target, NULL, NULL, NULL); if (!gim->tex) gim->tex = evas_gl_common_texture_new(re->win->gl_context, gim->im); evas_gl_preload_target_register(gim->tex, (Eo*) target); @@ -2890,7 +2912,13 @@ eng_image_data_preload_cancel(void *data EINA_UNUSED, void *image, const Eo *tar if (gim->native.data) return; im = (RGBA_Image *)gim->im; if (!im) return; - evas_cache_image_preload_cancel(&im->cache_entry, target); + +#ifdef EVAS_CSERVE2 + if (evas_cserve2_use_get() && evas_cache2_image_cached(&im->cache_entry)) + evas_cache2_image_preload_cancel(&im->cache_entry, target); + else +#endif + evas_cache_image_preload_cancel(&im->cache_entry, target); evas_gl_preload_target_unregister(gim->tex, (Eo*) target); } @@ -3396,7 +3424,12 @@ eng_pixel_alpha_get(void *image, int x, int y, DATA8 *alpha, int src_region_x, i { DATA32 *pixel; - evas_cache_image_load_data(&im->im->cache_entry); +#ifdef EVAS_CSERVE2 + if (evas_cserve2_use_get() && evas_cache2_image_cached(&im->im->cache_entry)) + evas_cache2_image_load_data(&im->im->cache_entry); + else +#endif + evas_cache_image_load_data(&im->im->cache_entry); if (!im->im->cache_entry.flags.loaded) { ERR("im %p has no pixels loaded yet", im); diff --git a/src/modules/evas/engines/software_generic/evas_engine.c b/src/modules/evas/engines/software_generic/evas_engine.c index b3ab2ce..a42cd9c 100644 --- a/src/modules/evas/engines/software_generic/evas_engine.c +++ b/src/modules/evas/engines/software_generic/evas_engine.c @@ -1195,12 +1195,17 @@ static void eng_image_data_preload_cancel(void *data EINA_UNUSED, void *image, const Eo *target) { RGBA_Image *im = image; + + if (!im) return; + #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get() && evas_cache2_image_cached(&im->cache_entry)) - return; + { + evas_cache2_image_preload_cancel(&im->cache_entry, target); + return; + } #endif - if (!im) return; evas_cache_image_preload_cancel(&im->cache_entry, target); } --
