From d2ec3ce17039dcb16966532a41ccf7bf6cb906e0 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 28 Dec 2018 12:20:15 +0900 Subject: efl gfx_path: remove EFL_GFX_PATH_EVENT_CHANGED Summary: Here is an additional optmization patch for removing unnecessary updation of path, For instance, let's assume this scenario: If one vg object has 20 path nodes(shapes), and every single nodes would have 50 path changes. (like, append_cubic, append_rect, append_xxx ...); There would 1000 events triggering. Furthermore, if there are 20 vector objects in one view, hese events would be triggered 20000 in one frame. It's insane, actually I could figured out that happens. and it took a lot of cpu consumption in some vector usages. efl_gfx_path_commit() is my idea to avoid this. When path is ready, the path need to get this api call in the last to make object changed properly. @feature Reviewers: #committers, cedric Reviewed By: #committers, cedric Subscribers: segfaultxavi, cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D7494 --- src/lib/ector/cairo/ector_renderer_cairo_shape.c | 24 +++++------- src/lib/ector/cairo/ector_renderer_cairo_shape.eo | 1 + src/lib/ector/gl/ector_renderer_gl_shape.c | 21 ++++------- src/lib/ector/gl/ector_renderer_gl_shape.eo | 1 + .../ector/software/ector_renderer_software_shape.c | 43 +++++++--------------- .../software/ector_renderer_software_shape.eo | 2 +- 6 files changed, 33 insertions(+), 59 deletions(-) (limited to 'src/lib/ector') diff --git a/src/lib/ector/cairo/ector_renderer_cairo_shape.c b/src/lib/ector/cairo/ector_renderer_cairo_shape.c index 2605623..87fe2a0 100644 --- a/src/lib/ector/cairo/ector_renderer_cairo_shape.c +++ b/src/lib/ector/cairo/ector_renderer_cairo_shape.c @@ -75,19 +75,15 @@ struct _Ector_Renderer_Cairo_Shape_Data cairo_path_t *path; }; -static void -_ector_renderer_cairo_shape_path_changed(void *data, const Efl_Event *event) +EOLIAN static void +_ector_renderer_cairo_shape_efl_gfx_path_commit(Eo *obj EINA_UNUSED, + Ector_Renderer_Cairo_Shape_Data *pd) { - Ector_Renderer_Cairo_Shape_Data *pd = data; - Efl_Gfx_Path_Change_Event *ev = event->info; - - if (!pd->path) return; - if (ev && !((ev->what & EFL_GFX_CHANGE_FLAG_MATRIX) || - (ev->what & EFL_GFX_CHANGE_FLAG_PATH))) - return; - - cairo_path_destroy(pd->path); - pd->path = NULL; + if (pd->path) + { + cairo_path_destroy(pd->path); + pd->path = NULL; + } } static Eina_Bool @@ -255,9 +251,7 @@ _ector_renderer_cairo_shape_efl_object_constructor(Eo *obj, Ector_Renderer_Cairo pd->shape = efl_data_xref(obj, ECTOR_RENDERER_SHAPE_MIXIN, obj); pd->base = efl_data_xref(obj, ECTOR_RENDERER_CLASS, obj); - efl_event_callback_add(obj, EFL_GFX_PATH_EVENT_CHANGED, _ector_renderer_cairo_shape_path_changed, pd); - - return obj; + return obj; } static Efl_Object * diff --git a/src/lib/ector/cairo/ector_renderer_cairo_shape.eo b/src/lib/ector/cairo/ector_renderer_cairo_shape.eo index b76dd29..7c95844 100644 --- a/src/lib/ector/cairo/ector_renderer_cairo_shape.eo +++ b/src/lib/ector/cairo/ector_renderer_cairo_shape.eo @@ -6,6 +6,7 @@ class Ector.Renderer.Cairo.Shape (Ector.Renderer.Cairo, Ector.Renderer.Shape, Ef Ector.Renderer.prepare; Ector.Renderer.draw; Efl.Gfx.Path.bounds_get; + Efl.Gfx.Path.commit; Ector.Renderer.crc { get; } Ector.Renderer.Cairo.op_fill; Efl.Object.constructor; diff --git a/src/lib/ector/gl/ector_renderer_gl_shape.c b/src/lib/ector/gl/ector_renderer_gl_shape.c index 79e029d..cf2266d 100644 --- a/src/lib/ector/gl/ector_renderer_gl_shape.c +++ b/src/lib/ector/gl/ector_renderer_gl_shape.c @@ -20,18 +20,15 @@ struct _Ector_Renderer_GL_Shape_Data GLshort *vertex; }; -static void -_ector_renderer_gl_shape_path_changed(void *data, const Efl_Event *event EINA_UNUSED) +EOLIAN static void +_ector_renderer_gl_shape_efl_gfx_path_commit(Eo *obj EINA_UNUSED, + Ector_Renderer_GL_Shape_Data *pd) { - Ector_Renderer_GL_Shape_Data *pd = data; - Efl_Gfx_Path_Change_Event *ev = event->info; - - if (ev && !((ev->what & EFL_GFX_CHANGE_FLAG_MATRIX) || - (ev->what & EFL_GFX_CHANGE_FLAG_PATH))) - return; - - free(pd->vertex); - pd->vertex = NULL; + if (pd->vertex) + { + free(pd->vertex); + pd->vertex = NULL; + } } static Eina_Bool @@ -154,8 +151,6 @@ _ector_renderer_gl_shape_efl_object_constructor(Eo *obj, Ector_Renderer_GL_Shape pd->shape = efl_data_xref(obj, ECTOR_RENDERER_SHAPE_MIXIN, obj); pd->base = efl_data_xref(obj, ECTOR_RENDERER_CLASS, obj); - efl_event_callback_add(obj, EFL_GFX_PATH_EVENT_CHANGED, _ector_renderer_gl_shape_path_changed, pd); - return obj; } diff --git a/src/lib/ector/gl/ector_renderer_gl_shape.eo b/src/lib/ector/gl/ector_renderer_gl_shape.eo index 21ef655..6323ef6 100644 --- a/src/lib/ector/gl/ector_renderer_gl_shape.eo +++ b/src/lib/ector/gl/ector_renderer_gl_shape.eo @@ -8,6 +8,7 @@ class Ector.Renderer.GL.Shape (Ector.Renderer.GL, Ector.Renderer.Shape, Efl.Gfx. Ector.Renderer.crc { get; } Ector.Renderer.GL.op_fill; Efl.Gfx.Path.bounds_get; + Efl.Gfx.Path.commit; Efl.Object.constructor; Efl.Object.destructor; } diff --git a/src/lib/ector/software/ector_renderer_software_shape.c b/src/lib/ector/software/ector_renderer_software_shape.c index 396e472..b9cf1fa 100644 --- a/src/lib/ector/software/ector_renderer_software_shape.c +++ b/src/lib/ector/software/ector_renderer_software_shape.c @@ -734,36 +734,20 @@ _ector_renderer_software_shape_ector_renderer_software_op_fill(Eo *obj EINA_UNUS return EINA_FALSE; } -static void -_ector_renderer_software_shape_efl_gfx_path_path_set(Eo *obj, - Ector_Renderer_Software_Shape_Data *pd, - const Efl_Gfx_Path_Command *op, - const double *points) -{ - if (pd->shape_data) ector_software_rasterizer_destroy_rle_data(pd->shape_data); - if (pd->outline_data) ector_software_rasterizer_destroy_rle_data(pd->outline_data); - pd->shape_data = NULL; - pd->outline_data = NULL; - - efl_gfx_path_set(efl_super(obj, MY_CLASS), op, points); -} - - -static void -_ector_renderer_software_shape_path_changed(void *data, const Efl_Event *event EINA_UNUSED) +EOLIAN static void +_ector_renderer_software_shape_efl_gfx_path_commit(Eo *obj EINA_UNUSED, + Ector_Renderer_Software_Shape_Data *pd) { - Ector_Renderer_Software_Shape_Data *pd = data; - Efl_Gfx_Path_Change_Event *ev = event->info; - - if (ev && !((ev->what & EFL_GFX_CHANGE_FLAG_MATRIX) || - (ev->what & EFL_GFX_CHANGE_FLAG_PATH))) - return; - - if (pd->shape_data) ector_software_rasterizer_destroy_rle_data(pd->shape_data); - if (pd->outline_data) ector_software_rasterizer_destroy_rle_data(pd->outline_data); - - pd->shape_data = NULL; - pd->outline_data = NULL; + if (pd->shape_data) + { + ector_software_rasterizer_destroy_rle_data(pd->shape_data); + pd->shape_data = NULL; + } + if (pd->outline_data) + { + ector_software_rasterizer_destroy_rle_data(pd->outline_data); + pd->outline_data = NULL; + } } static Eo * @@ -777,7 +761,6 @@ _ector_renderer_software_shape_efl_object_constructor(Eo *obj, Ector_Renderer_So pd->public_shape = efl_data_xref(obj, EFL_GFX_SHAPE_MIXIN, obj); pd->shape = efl_data_xref(obj, ECTOR_RENDERER_SHAPE_MIXIN, obj); pd->base = efl_data_xref(obj, ECTOR_RENDERER_CLASS, obj); - efl_event_callback_add(obj, EFL_GFX_PATH_EVENT_CHANGED, _ector_renderer_software_shape_path_changed, pd); return obj; } diff --git a/src/lib/ector/software/ector_renderer_software_shape.eo b/src/lib/ector/software/ector_renderer_software_shape.eo index abe8344..04f19ba 100644 --- a/src/lib/ector/software/ector_renderer_software_shape.eo +++ b/src/lib/ector/software/ector_renderer_software_shape.eo @@ -8,7 +8,7 @@ class Ector.Renderer.Software.Shape (Ector.Renderer.Software, Ector.Renderer.Sha Ector.Renderer.Software.op_fill; Ector.Renderer.mask { set; } Ector.Renderer.crc { get; } - Efl.Gfx.Path.path { set; } + Efl.Gfx.Path.commit; Efl.Object.constructor; Efl.Object.destructor; } -- cgit v1.1