forked from enlightenment/efl
evas/vg: added support for engine surface cache.
This commit is contained in:
parent
d4a2b2025b
commit
aacf277c3a
|
@ -1174,6 +1174,34 @@ typedef enum _Evas_Render_Mode
|
||||||
void evas_common_rgba_image_scalecache_items_ref(Image_Entry *ie, Eina_Array *ret);
|
void evas_common_rgba_image_scalecache_items_ref(Image_Entry *ie, Eina_Array *ret);
|
||||||
void evas_common_rgba_image_scalecache_item_unref(Image_Entry *ie);
|
void evas_common_rgba_image_scalecache_item_unref(Image_Entry *ie);
|
||||||
|
|
||||||
|
// Generic Cache
|
||||||
|
typedef struct _Generic_Cache Generic_Cache;
|
||||||
|
typedef struct _Generic_Cache_Entry Generic_Cache_Entry;
|
||||||
|
|
||||||
|
struct _Generic_Cache_Entry
|
||||||
|
{
|
||||||
|
void *key; // pointer
|
||||||
|
void *data; // engine image
|
||||||
|
int ref;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef void (*Generic_Cache_Free)(void *user_data, void *data);
|
||||||
|
|
||||||
|
struct _Generic_Cache
|
||||||
|
{
|
||||||
|
Eina_Hash *hash;
|
||||||
|
Eina_List *lru_list;
|
||||||
|
void *user_data;
|
||||||
|
Generic_Cache_Free free_func;
|
||||||
|
};
|
||||||
|
|
||||||
|
EAPI Generic_Cache* generic_cache_new(void *user_data, Generic_Cache_Free func);
|
||||||
|
EAPI void generic_cache_destroy(Generic_Cache *cache);
|
||||||
|
EAPI void generic_cache_dump(Generic_Cache *cache);
|
||||||
|
EAPI void generic_cache_data_set(Generic_Cache *cache, void *key, void *data);
|
||||||
|
EAPI void *generic_cache_data_get(Generic_Cache *cache, void *key);
|
||||||
|
EAPI void generic_cache_data_drop(Generic_Cache *cache, void *key);
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -1070,13 +1070,14 @@ eng_canvas_alpha_get(void *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
eng_output_dump(void *engine EINA_UNUSED, void *data)
|
eng_output_dump(void *engine, void *data)
|
||||||
{
|
{
|
||||||
Render_Engine *re;
|
Render_Engine *re;
|
||||||
|
Render_Engine_GL_Generic *e = engine;
|
||||||
|
|
||||||
re = (Render_Engine *)data;
|
re = (Render_Engine *)data;
|
||||||
if (!re) return;
|
if (!re) return;
|
||||||
|
generic_cache_dump(e->software.surface_cache);
|
||||||
evas_common_image_image_all_unload();
|
evas_common_image_image_all_unload();
|
||||||
evas_common_font_font_all_unload();
|
evas_common_font_font_all_unload();
|
||||||
glsym_evas_gl_common_image_all_unload(eng_get_ob(re)->gl_context);
|
glsym_evas_gl_common_image_all_unload(eng_get_ob(re)->gl_context);
|
||||||
|
|
|
@ -152,6 +152,8 @@ egl_display_get(Render_Engine_GL_Generic *engine)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void eng_image_free(void *engine, void *image);
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
eng_engine_new(void)
|
eng_engine_new(void)
|
||||||
{
|
{
|
||||||
|
@ -159,6 +161,7 @@ eng_engine_new(void)
|
||||||
|
|
||||||
engine = calloc(1, sizeof (Render_Engine_GL_Generic));
|
engine = calloc(1, sizeof (Render_Engine_GL_Generic));
|
||||||
if (!engine) return NULL;
|
if (!engine) return NULL;
|
||||||
|
engine->software.surface_cache = generic_cache_new(engine, eng_image_free);
|
||||||
|
|
||||||
return engine;
|
return engine;
|
||||||
}
|
}
|
||||||
|
@ -169,6 +172,8 @@ eng_engine_free(void *engine)
|
||||||
Render_Engine_GL_Generic *e = engine;
|
Render_Engine_GL_Generic *e = engine;
|
||||||
Render_Output_GL_Generic *output;
|
Render_Output_GL_Generic *output;
|
||||||
|
|
||||||
|
generic_cache_destroy(e->software.surface_cache);
|
||||||
|
|
||||||
EINA_LIST_FREE(e->software.outputs, output)
|
EINA_LIST_FREE(e->software.outputs, output)
|
||||||
ERR("Output %p not properly cleaned before engine destruction.", output);
|
ERR("Output %p not properly cleaned before engine destruction.", output);
|
||||||
free(e);
|
free(e);
|
||||||
|
|
|
@ -316,11 +316,13 @@ eng_output_free(void *engine, void *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
eng_output_dump(void *engine EINA_UNUSED, void *data)
|
eng_output_dump(void *engine, void *data)
|
||||||
{
|
{
|
||||||
Render_Engine *re;
|
Render_Engine *re;
|
||||||
|
Render_Engine_GL_Generic *e = engine;
|
||||||
|
|
||||||
re = (Render_Engine *)data;
|
re = (Render_Engine *)data;
|
||||||
|
generic_cache_dump(e->software.surface_cache);
|
||||||
evas_common_image_image_all_unload();
|
evas_common_image_image_all_unload();
|
||||||
evas_common_font_font_all_unload();
|
evas_common_font_font_all_unload();
|
||||||
glsym_evas_gl_common_image_all_unload(re->generic.software.ob->gl_context);
|
glsym_evas_gl_common_image_all_unload(re->generic.software.ob->gl_context);
|
||||||
|
@ -339,7 +341,6 @@ gl_symbols(void)
|
||||||
|
|
||||||
#define LINK2GENERIC(sym) \
|
#define LINK2GENERIC(sym) \
|
||||||
glsym_##sym = dlsym(RTLD_DEFAULT, #sym);
|
glsym_##sym = dlsym(RTLD_DEFAULT, #sym);
|
||||||
|
|
||||||
LINK2GENERIC(evas_gl_symbols);
|
LINK2GENERIC(evas_gl_symbols);
|
||||||
LINK2GENERIC(evas_gl_common_context_new);
|
LINK2GENERIC(evas_gl_common_context_new);
|
||||||
LINK2GENERIC(evas_gl_common_context_free);
|
LINK2GENERIC(evas_gl_common_context_free);
|
||||||
|
|
|
@ -1846,11 +1846,13 @@ eng_canvas_alpha_get(void *engine)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
eng_output_dump(void *engine EINA_UNUSED, void *data)
|
eng_output_dump(void *engine, void *data)
|
||||||
{
|
{
|
||||||
Render_Engine *re = data;
|
Render_Engine *re = data;
|
||||||
|
Render_Engine_GL_Generic *e = engine;
|
||||||
|
|
||||||
eng_window_use(eng_get_ob(re));
|
eng_window_use(eng_get_ob(re));
|
||||||
|
generic_cache_dump(e->software.surface_cache);
|
||||||
evas_common_image_image_all_unload();
|
evas_common_image_image_all_unload();
|
||||||
evas_common_font_font_all_unload();
|
evas_common_font_font_all_unload();
|
||||||
glsym_evas_gl_common_image_all_unload(eng_get_ob(re)->gl_context);
|
glsym_evas_gl_common_image_all_unload(eng_get_ob(re)->gl_context);
|
||||||
|
|
|
@ -83,7 +83,7 @@ struct _Render_Output_Software_Generic
|
||||||
struct _Render_Engine_Software_Generic
|
struct _Render_Engine_Software_Generic
|
||||||
{
|
{
|
||||||
Eina_List *outputs;
|
Eina_List *outputs;
|
||||||
|
Generic_Cache *surface_cache;
|
||||||
struct {
|
struct {
|
||||||
int w, h;
|
int w, h;
|
||||||
Eina_Bool strict;
|
Eina_Bool strict;
|
||||||
|
|
|
@ -3859,6 +3859,8 @@ eng_engine_new(void)
|
||||||
engine = calloc(1, sizeof (Render_Engine_Software_Generic));
|
engine = calloc(1, sizeof (Render_Engine_Software_Generic));
|
||||||
if (!engine) return NULL;
|
if (!engine) return NULL;
|
||||||
|
|
||||||
|
engine->surface_cache = generic_cache_new(engine, eng_image_free);
|
||||||
|
|
||||||
return engine;
|
return engine;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3868,6 +3870,8 @@ eng_engine_free(void *engine)
|
||||||
Render_Engine_Software_Generic *e = engine;
|
Render_Engine_Software_Generic *e = engine;
|
||||||
Render_Output_Software_Generic *output;
|
Render_Output_Software_Generic *output;
|
||||||
|
|
||||||
|
generic_cache_destroy(e->surface_cache);
|
||||||
|
|
||||||
EINA_LIST_FREE(e->outputs, output)
|
EINA_LIST_FREE(e->outputs, output)
|
||||||
ERR("Output %p not properly cleaned before engine destruction.", output);
|
ERR("Output %p not properly cleaned before engine destruction.", output);
|
||||||
|
|
||||||
|
|
|
@ -748,9 +748,10 @@ eng_output_dump(void *engine EINA_UNUSED, void *data)
|
||||||
{
|
{
|
||||||
Outbuf *ob;
|
Outbuf *ob;
|
||||||
Render_Engine *re;
|
Render_Engine *re;
|
||||||
|
Render_Engine_GL_Generic *e = engine;
|
||||||
|
|
||||||
if (!(re = (Render_Engine *)data)) return;
|
if (!(re = (Render_Engine *)data)) return;
|
||||||
|
generic_cache_dump(e->software.surface_cache);
|
||||||
evas_common_image_image_all_unload();
|
evas_common_image_image_all_unload();
|
||||||
evas_common_font_font_all_unload();
|
evas_common_font_font_all_unload();
|
||||||
ob = eng_get_ob(re);
|
ob = eng_get_ob(re);
|
||||||
|
|
Loading…
Reference in New Issue