From 47e6bbb3979af692e6c06fc6375c3d0208405e39 Mon Sep 17 00:00:00 2001 From: Marcel Hollerbach Date: Mon, 29 Oct 2018 21:50:45 +0100 Subject: [PATCH] evas - fix pending object set tracking to not multi-add the same object 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 | 11 ++++++++--- src/lib/evas/include/evas_private.h | 1 + 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index e4d76ed710..814666cde2 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -752,6 +752,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; } @@ -1353,7 +1354,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 @@ -3636,6 +3639,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); @@ -4161,8 +4165,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; } } diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index aad7c2f5c3..00841fa8ca 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -1146,6 +1146,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;