From 849d457f2585c010599080f6d142bd2de27910c8 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Tue, 15 Jan 2019 20:22:29 +0900 Subject: [PATCH] evas vg: improve cache logic. 1. drop cached surface if the size is changed, 2. only cache target needs to acquire cached surface. --- src/lib/evas/canvas/efl_canvas_vg_object.c | 23 ++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/lib/evas/canvas/efl_canvas_vg_object.c b/src/lib/evas/canvas/efl_canvas_vg_object.c index 653e9dfd53..32832701a3 100644 --- a/src/lib/evas/canvas/efl_canvas_vg_object.c +++ b/src/lib/evas/canvas/efl_canvas_vg_object.c @@ -621,6 +621,8 @@ _cache_vg_entry_render(Evas_Object_Protected_Data *obj, Vg_Cache_Entry *vg_entry = pd->vg_entry; Efl_VG *root; Eina_Position2D offset = {0, 0}; //Offset after keeping aspect ratio. + Eina_Bool drop_cache = EINA_FALSE; + void *buffer = NULL; // if the size changed in between path set and the draw call; if ((vg_entry->w != w) || @@ -662,13 +664,23 @@ _cache_vg_entry_render(Evas_Object_Protected_Data *obj, if (offset.y > 0) offset.y /= 2; w = size.w; h = size.h; + + //Size is changed, cached data is invalid. + drop_cache = EINA_TRUE; } root = evas_cache_vg_tree_get(vg_entry, pd->frame_idx); if (!root) return; - void *buffer = NULL; - if (pd->frame_idx == pd->cached_frame_idx) - buffer = ENFN->ector_surface_cache_get(engine, (void *) root); + if (cacheable) + { + if (drop_cache) + { + //if the size doesn't match, drop previous cache surface. + ENFN->ector_surface_cache_drop(engine, (void *) root); + } + else if (pd->frame_idx == pd->cached_frame_idx) + buffer = ENFN->ector_surface_cache_get(engine, (void *) root); + } if (!buffer) buffer = _render_to_buffer(obj, pd, engine, root, w, h, root, NULL, @@ -703,7 +715,10 @@ _user_vg_entry_render(Evas_Object_Protected_Data *obj, } //if the buffer is not created yet - void *buffer = ENFN->ector_surface_cache_get(engine, user_entry->root); + void *buffer = NULL; + + if (cacheable) + buffer = ENFN->ector_surface_cache_get(engine, user_entry->root); if (!buffer) {