hermet pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=7b21b6fb97aa7c069ab378b6af81bc96a6842d9b

commit 7b21b6fb97aa7c069ab378b6af81bc96a6842d9b
Author: Shinwoo Kim <cinoo....@samsung.com>
Date:   Tue May 19 13:14:29 2020 +0900

    evas: do not call evas_object_change in reneder_post
    
    Summary:
    evas_render_updates_internal > eina_array_remove is calling pending_change
    pending_change > render_post could call evas_object_change >
    evas_render_object_recalc.
    
    The eina_array is removing its item from pending_objects, while
    the evas_object_change that is calling evas_render_object_recalc is adding
    item to pending_objects.
    
    As a result, the pending_objects.count is incorrect, and it breaks render.
    
    Reviewers: Hermet, jsuya, herb
    
    Reviewed By: Hermet
    
    Subscribers: cedric, #reviewers, #committers
    
    Tags: #efl
    
    Differential Revision: https://phab.enlightenment.org/D11835
---
 src/lib/evas/canvas/evas_main.c         |  2 ++
 src/lib/evas/canvas/evas_object_image.c |  2 +-
 src/lib/evas/canvas/evas_render.c       | 19 +++++++++++++++++++
 src/lib/evas/include/evas_private.h     |  2 ++
 4 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c
index 956e13dbcf..b6eab9f411 100644
--- a/src/lib/evas/canvas/evas_main.c
+++ b/src/lib/evas/canvas/evas_main.c
@@ -363,6 +363,7 @@ _evas_canvas_efl_object_constructor(Eo *eo_obj, 
Evas_Public_Data *e)
    EVAS_ARRAY_SET(e, glyph_unref_queue);
    EVAS_ARRAY_SET(e, texts_unref_queue);
 
+   eina_array_step_set(&e->render_post_change_objects, 
sizeof(e->render_post_change_objects), 10);
    eina_array_step_set(&e->map_clip_objects, sizeof(e->map_clip_objects), 64);
 
    e->active_objects.version = EINA_ARRAY_VERSION;
@@ -648,6 +649,7 @@ _evas_canvas_efl_object_destructor(Eo *eo_e, 
Evas_Public_Data *e)
    eina_array_flush(&e->texts_unref_queue);
    eina_array_flush(&e->map_clip_objects);
    eina_hash_free(e->focused_objects);
+   eina_array_flush(&e->render_post_change_objects);
 
    SLKL(e->post_render.lock);
    EINA_INLIST_FREE(e->post_render.jobs, job)
diff --git a/src/lib/evas/canvas/evas_object_image.c 
b/src/lib/evas/canvas/evas_object_image.c
index cad6291286..958fabaf00 100644
--- a/src/lib/evas/canvas/evas_object_image.c
+++ b/src/lib/evas/canvas/evas_object_image.c
@@ -3256,7 +3256,7 @@ evas_object_image_render_post(Evas_Object *eo_obj 
EINA_UNUSED,
    /* FIXME: copy strings across */
 
    //Somehow(preloading cancelled) image has been changed, need to redraw.
-   if (o->changed) evas_object_change(eo_obj, obj);
+   if (o->changed) evas_render_post_change_object_push(obj);
 }
 
 static void *
diff --git a/src/lib/evas/canvas/evas_render.c 
b/src/lib/evas/canvas/evas_render.c
index 1d47ba06af..139e292ad3 100644
--- a/src/lib/evas/canvas/evas_render.c
+++ b/src/lib/evas/canvas/evas_render.c
@@ -3761,6 +3761,14 @@ evas_render_updates_internal(Evas *eo_e,
      }
    eina_evlog("-render_post_reset", eo_e, 0.0, NULL);
 
+   for (i = 0; i < e->render_post_change_objects.count; ++i)
+     {
+        obj = eina_array_data_get(&e->render_post_change_objects, i);
+        eo_obj = obj->object;
+        evas_object_change(eo_obj, obj);
+     }
+   OBJS_ARRAY_CLEAN(&e->render_post_change_objects);
+
    eina_evlog("+render_end", eo_e, 0.0, NULL);
    e->changed = EINA_FALSE;
    e->viewport.changed = EINA_FALSE;
@@ -4327,5 +4335,16 @@ evas_post_render_job_add(Evas_Public_Data *pd, void 
(*func)(void *), void *data)
    SLKU(pd->post_render.lock);
 }
 
+void
+evas_render_post_change_object_push(Evas_Object_Protected_Data *obj)
+{
+   Evas_Public_Data *e;
+
+   if (!obj || !obj->layer || !obj->layer->evas) return;
+
+   e = obj->layer->evas;
+   OBJ_ARRAY_PUSH(&e->render_post_change_objects, obj);
+}
+
 /* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/
 
diff --git a/src/lib/evas/include/evas_private.h 
b/src/lib/evas/include/evas_private.h
index 3a24821dd2..6d00cd7a21 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -455,6 +455,7 @@ struct _Evas_Public_Data
    Eina_Array     texts_unref_queue;
    Eina_Array     map_clip_objects;
    Eina_List     *finalize_objects;
+   Eina_Array     render_post_change_objects;
 
    struct {
       Evas_Post_Render_Job *jobs;
@@ -1283,6 +1284,7 @@ void evas_unref_queue_image_put(Evas_Public_Data *pd, 
void *image);
 void evas_unref_queue_glyph_put(Evas_Public_Data *pd, void *glyph);
 void evas_unref_queue_texts_put(Evas_Public_Data *pd, void *glyph);
 void evas_post_render_job_add(Evas_Public_Data *pd, void (*func)(void *), void 
*data);
+void evas_render_post_change_object_push(Evas_Object_Protected_Data *obj);
 
 void evas_draw_image_map_async_check(Evas_Object_Protected_Data *obj,
                                      void *engine, void *data, void *context, 
void *surface,

-- 


Reply via email to