evas vg: Don't update thorvg shapes when node is not changed. 44/259144/5
authorMichal Szczecinski <m.szczecinsk@partner.samsung.com>
Mon, 31 May 2021 13:26:32 +0000 (15:26 +0200)
committerMichal Szczecinski <m.szczecinsk@partner.samsung.com>
Wed, 2 Jun 2021 10:58:51 +0000 (12:58 +0200)
When node is not changed it is not necessary to update and redraw
canvas. This change speed up lottie rendering process in vg-benchmark up
to 25%.

Change-Id: If0c85d9fb2f8a20de47e1f243f49e5276617d086

src/lib/evas/canvas/efl_canvas_vg_object.c

index 5303be7..95b3166 100644 (file)
@@ -432,20 +432,25 @@ _render_to_tvg_buffer(Evas_Object_Protected_Data *obj, Efl_Canvas_Vg_Object_Data
 }
 
 static void
-_render_tvg_buffer_to_screen(Evas_Object_Protected_Data *obj, void *engine, void *output,
-                             void *context, void *surface, void *buffer, int x, int y,
-                             int w, int h, Eina_Bool do_async)
+_render_tvg_buffer_to_screen(Evas_Object_Protected_Data *obj, Efl_Canvas_Vg_Object_Data *pd,
+                             void *engine, void *output, void *context, void *surface,
+                             int x, int y, Eina_Bool do_async)
 {
    Eina_Bool async_unref = EINA_FALSE;
    Image_Entry *image = NULL;
 
-   if (!buffer)
+   if (!pd || !pd->tvg_buffer)
      return;
 
-   image = ENFN->image_new_from_copied_data(engine, w, h, buffer, 255, EVAS_COLORSPACE_ARGB8888);
+   image = ENFN->image_new_from_copied_data(engine,
+                                            pd->tvg_canvas_size.w,
+                                            pd->tvg_canvas_size.h,
+                                            pd->tvg_buffer, 255,
+                                            EVAS_COLORSPACE_ARGB8888);
 
-   async_unref = ENFN->image_draw(engine, output, context, surface,
-                                  image, 0, 0, w, h, x, y, w, h,
+   async_unref = ENFN->image_draw(engine, output, context, surface, image, 0, 0,
+                                  pd->tvg_canvas_size.w, pd->tvg_canvas_size.h, x, y,
+                                  pd->tvg_canvas_size.w, pd->tvg_canvas_size.h,
                                   EINA_TRUE, do_async);
 
    if (do_async && async_unref)
@@ -465,6 +470,7 @@ _efl_canvas_vg_object_render(Evas_Object *eo_obj EINA_UNUSED,
                              int x, int y, Eina_Bool do_async)
 {
    Efl_Canvas_Vg_Object_Data *pd = type_private_data;
+   Eina_Bool updated = EINA_FALSE;
 
    ENFN->context_color_set(engine, context, 255, 255, 255, 255);
    ENFN->context_multiplier_set(engine, context,
@@ -490,8 +496,11 @@ _efl_canvas_vg_object_render(Evas_Object *eo_obj EINA_UNUSED,
         tvg_swcanvas_set_target(pd->tvg_canvas, pd->tvg_buffer,
                                 size.w, size.w, size.h,
                                 TVG_COLORSPACE_ARGB8888);
+        updated = EINA_TRUE;
      }
 
+   if (pd->changed) updated = EINA_TRUE;
+
    Vg_Cache_Entry *vg_entry = pd->vg_entry;
    if (vg_entry)
      {
@@ -503,20 +512,23 @@ _efl_canvas_vg_object_render(Evas_Object *eo_obj EINA_UNUSED,
               vg_entry = evas_cache_vg_entry_resize(vg_entry, size.w, size.h);
               evas_cache_vg_entry_del(pd->vg_entry);
               pd->vg_entry = vg_entry;
+              pd->changed = EINA_TRUE;
           }
 
         Efl_VG *root = evas_cache_vg_tree_get(pd->vg_entry, pd->frame_idx);
         if (!root) return;
 
-        _render_to_tvg_buffer(obj, pd, root);
+        if (updated)
+          _render_to_tvg_buffer(obj, pd, root);
      }
 
-   if (pd->user_entry)
+   if (pd->user_entry && updated)
      _render_to_tvg_buffer(obj, pd, pd->user_entry->root);
 
-   _render_tvg_buffer_to_screen(obj, engine, output, context, surface,
-                                pd->tvg_buffer, obj->cur->geometry.x + x,
-                                obj->cur->geometry.y + y, size.w, size.h, do_async);
+   _render_tvg_buffer_to_screen(obj, pd, engine, output, context, surface,
+                                obj->cur->geometry.x + x,
+                                obj->cur->geometry.y + y,
+                                do_async);
 
    tvg_canvas_clear(pd->tvg_canvas, EINA_FALSE);
    pd->changed = EINA_FALSE;