summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHermet Park <chuneon.park@samsung.com>2020-03-23 14:16:48 +0900
committerHermet Park <chuneon.park@samsung.com>2020-03-23 14:23:27 +0900
commit69fd72af2cae8dce07ac2becad40eccbb55b5bc7 (patch)
tree4d8e19467c858e0f561c83404a1f732ea11bef3a
parente1e7272d89e2921902161be225b53661ca91af8b (diff)
downloadefl-69fd72af2cae8dce07ac2becad40eccbb55b5bc7.tar.gz
canvas vg: drop vg cache buffers if object were destroyed.
Previous vg didn't take care of cached buffers which were allocated in it's lifetime because the cache buffers are managed by its own cache buffer mgr, it has a limitation count of buffers also buffers can be cleared when engine is shutdown. This behavior is actually working properly but not well optimized since it lost a chance to clear grown buffers. Now vg do clear used buffers when object is invalidated.
-rw-r--r--src/lib/evas/canvas/efl_canvas_vg_object.c27
-rw-r--r--src/lib/evas/canvas/evas_vg_private.h1
2 files changed, 27 insertions, 1 deletions
diff --git a/src/lib/evas/canvas/efl_canvas_vg_object.c b/src/lib/evas/canvas/efl_canvas_vg_object.c
index 7963776889..46db4be437 100644
--- a/src/lib/evas/canvas/efl_canvas_vg_object.c
+++ b/src/lib/evas/canvas/efl_canvas_vg_object.c
@@ -352,6 +352,15 @@ _efl_canvas_vg_object_efl_object_invalidate(Eo *eo_obj, Efl_Canvas_Vg_Object_Dat
free(pd->user_entry);
}
pd->user_entry = NULL;
+
+ //Drop cache buffers
+ if (pd->vg_entry)
+ {
+ if (pd->ckeys[0])
+ ENFN->ector_surface_cache_drop(_evas_engine_context(obj->layer->evas), pd->ckeys[0]);
+ if (pd->ckeys[1])
+ ENFN->ector_surface_cache_drop(_evas_engine_context(obj->layer->evas), pd->ckeys[1]);
+ }
evas_cache_vg_entry_del(pd->vg_entry);
efl_invalidate(efl_super(eo_obj, MY_CLASS));
@@ -541,7 +550,23 @@ _render_to_buffer(Evas_Object_Protected_Data *obj, Efl_Canvas_Vg_Object_Data *pd
evas_common_draw_context_free(context);
if (buffer_created && ckey)
- ENFN->ector_surface_cache_set(engine, ckey, buffer);
+ {
+ //Drop ex invalid cache buffers.
+ if (pd->frame_idx == 0 && ckey != pd->ckeys[0])
+ {
+ if (pd->ckeys[0])
+ ENFN->ector_surface_cache_drop(engine, ckey);
+ pd->ckeys[0] = ckey;
+ }
+ else if (pd->frame_idx == (int) (evas_cache_vg_anim_frame_count_get(pd->vg_entry) - 1)
+ && ckey != pd->ckeys[1])
+ {
+ if (pd->ckeys[1])
+ ENFN->ector_surface_cache_drop(engine, ckey);
+ pd->ckeys[1] = ckey;
+ }
+ ENFN->ector_surface_cache_set(engine, ckey, buffer);
+ }
return buffer;
}
diff --git a/src/lib/evas/canvas/evas_vg_private.h b/src/lib/evas/canvas/evas_vg_private.h
index a6a27142ed..811e1cb8b6 100644
--- a/src/lib/evas/canvas/evas_vg_private.h
+++ b/src/lib/evas/canvas/evas_vg_private.h
@@ -53,6 +53,7 @@ struct _Efl_Canvas_Vg_Object_Data
double align_x, align_y;
Efl_Canvas_Vg_Fill_Mode fill_mode;
int frame_idx;
+ void *ckeys[2]; //cache keys for first, last frames if animation
Eina_Bool changed : 1;
};