evas - fix pending object set tracking to not multi-add the same object
authorMarcel Hollerbach <mail@marcel-hollerbach.de>
Mon, 29 Oct 2018 20:50:45 +0000 (21:50 +0100)
committerYeongjong Lee <yj34.lee@samsung.com>
Thu, 8 Nov 2018 06:40:48 +0000 (15:40 +0900)
flag if obj in pending array and don't add if already there. fixes
run-away slowness in rendering in some cases

src/lib/evas/canvas/evas_render.c
src/lib/evas/include/evas_private.h

index 0979cf4..f307957 100644 (file)
@@ -758,6 +758,7 @@ _evas_render_phase1_object_restack_handle(Phase1_Context *p1ctx,
      {
         OBJ_ARRAY_PUSH(&(p1ctx->e->pending_objects), obj);
         obj->changed = EINA_TRUE;
+        obj->in_pending_objects = EINA_TRUE;
      }
    obj->restack = EINA_TRUE;
 }
@@ -1359,7 +1360,9 @@ pending_change(void *data, void *gdata EINA_UNUSED)
      }
 
    //FIXME: after evas_object_change_reset(), obj->changed is always false...
-   return obj->changed ? EINA_TRUE : EINA_FALSE;
+   Eina_Bool val = obj->changed ? EINA_TRUE : EINA_FALSE;
+   obj->in_pending_objects = val;
+   return val;
 }
 
 static Eina_Bool
@@ -3691,6 +3694,7 @@ evas_render_updates_internal(Evas *eo_e,
                                               EFL_CANVAS_OBJECT_CLASS);
              evas_object_change(obj->smart.parent, smart_parent);
           }
+        obj->changed = EINA_TRUE;
      }
    eina_evlog("-render_post_change", eo_e, 0.0, NULL);
 
@@ -4216,8 +4220,9 @@ evas_render_object_recalc(Evas_Object_Protected_Data *obj)
 
        e = obj->layer->evas;
        if ((!e) || (e->cleanup)) return;
-       OBJ_ARRAY_PUSH(&e->pending_objects, obj);
-       obj->changed = EINA_TRUE;
+       if (!obj->in_pending_objects)
+         OBJ_ARRAY_PUSH(&e->pending_objects, obj);
+       obj->in_pending_objects = obj->changed = EINA_TRUE;
      }
 }
 
index bdb5fb5..a8a9de1 100755 (executable)
@@ -1150,6 +1150,7 @@ struct _Evas_Object_Protected_Data
 
    Eina_Bool                   is_active : 1;
    Eina_Bool                   changed : 1;
+   Eina_Bool                   in_pending_objects : 1;
    Eina_Bool                   restack : 1;
    Eina_Bool                   is_smart : 1;
    Eina_Bool                   is_event_parent : 1;