From 0f435b7eaec2eb9d3de63afa0a2fd87f6c6c9256 Mon Sep 17 00:00:00 2001 From: Ulisses Furquim Date: Mon, 14 Jan 2013 20:02:43 +0000 Subject: [PATCH] evas/async_render: fixing mix of sync and async rendering SVN revision: 82776 --- src/lib/evas/canvas/evas_render.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index 42563cf5ec..0b7a056eda 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -1352,10 +1352,15 @@ evas_render_updates_internal(Evas *eo_e, if (e->rendering) { - if (!do_async) - ERR("Cannot render sync as already doing async render! e=%p [%s]", - e, e->engine.module->definition->name); - return EINA_FALSE; + if (do_async) + return EINA_FALSE; + else + { + WRN("Mixing render sync as already doing async " + "render! Syncing! e=%p [%s]", e, + e->engine.module->definition->name); + evas_render_rendering_wait(e); + } } #ifdef EVAS_CSERVE2 @@ -1845,6 +1850,8 @@ evas_render_wakeup(Evas *eo_e) Eina_Bool haveup = EINA_FALSE; Eina_List *ret_updates = NULL; Evas_Public_Data *e = eo_data_get(eo_e, EVAS_CLASS); + Evas_Event_Cb up_cb; + void *up_data; EINA_LIST_FREE(e->render.updates, ru) { @@ -1881,14 +1888,15 @@ evas_render_wakeup(Evas *eo_e) eina_array_foreach(&e->glyph_unref_queue, _drop_glyph_ref, NULL); eina_array_clean(&e->glyph_unref_queue); - evas_event_callback_call(eo_e, EVAS_CALLBACK_RENDER_POST, NULL); - - if (e->render.updates_cb) - e->render.updates_cb(e->render.data, eo_e, ret_updates); - - e->rendering = EINA_FALSE; + up_cb = e->render.updates_cb; + up_data = e->render.data; e->render.updates_cb = NULL; e->render.data = NULL; + e->rendering = EINA_FALSE; + + evas_event_callback_call(eo_e, EVAS_CALLBACK_RENDER_POST, NULL); + + if (up_cb) up_cb(up_data, eo_e, ret_updates); eo_unref(eo_e); }