From 385acef7f9d0bd733bd47165496168b52bd99f3f Mon Sep 17 00:00:00 2001 From: Cedric Bail Date: Wed, 3 May 2017 16:08:36 -0700 Subject: [PATCH] ecore_evas: introduce a generic rendering function. --- src/lib/ecore_evas/ecore_evas.c | 86 ++++++++++++++++++++++++- src/lib/ecore_evas/ecore_evas_private.h | 6 ++ 2 files changed, 90 insertions(+), 2 deletions(-) diff --git a/src/lib/ecore_evas/ecore_evas.c b/src/lib/ecore_evas/ecore_evas.c index d34fa8e6e3..50ad308dfa 100644 --- a/src/lib/ecore_evas/ecore_evas.c +++ b/src/lib/ecore_evas/ecore_evas.c @@ -142,6 +142,75 @@ _ecore_evas_idle_exiter(void *data EINA_UNUSED) return ECORE_CALLBACK_RENEW; } +EAPI void +ecore_evas_render_wait(Ecore_Evas *ee) +{ + if (ee->in_async_render) evas_sync(ee->evas); +} + +EAPI Eina_Bool +ecore_evas_render(Ecore_Evas *ee) +{ + Eina_List *ll; + Ecore_Evas *ee2; + Eina_Bool rend = EINA_FALSE; + + if (ee->in_async_render) + { + DBG("ee=%p is rendering, skip.", ee); + return EINA_TRUE; + } + + if (ee->engine.func->fn_prepare) + if (!ee->engine.func->fn_prepare(ee)) + return EINA_FALSE; + + EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2) + { + if (ee2->engine.func->fn_render) + rend |= ee2->engine.func->fn_render(ee2); + else + rend |= ecore_evas_render(ee2); + } + // We do not force the child to be sync, so we should wait for them to be done + EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2) + ecore_evas_render_wait(ee2); + + if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee); + + ee->in_async_render = 1; + + if (!ee->visible) + { + evas_norender(ee->evas); + } + else if (ee->can_async_render && !ee->manual_render) + { + rend |= !!evas_render_async(ee->evas); + } + else + { + Eina_List *updates; + + updates = evas_render_updates(ee->evas); + rend |= !!updates; + evas_render_updates_free(updates); + } + + return rend; +} + +static void +_evas_evas_buffer_rendered(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Ecore_Evas *ee = data; + + _ecore_evas_idle_timeout_update(ee); + + if (ee->func.fn_post_render) ee->func.fn_post_render(ee); + ee->in_async_render = 0; +} + static Eina_Bool _ecore_evas_idle_enter(void *data EINA_UNUSED) { @@ -221,8 +290,12 @@ _ecore_evas_idle_enter(void *data EINA_UNUSED) if (ee->engine.func->fn_render) { change = ee->engine.func->fn_render(ee); - rend |= change; } + else + { + change = ecore_evas_render(ee); + } + rend |= change; /* * Some engines that generate their own ticks based on hardware * events need to know that render has been considered, and @@ -2470,7 +2543,14 @@ ecore_evas_manual_render(Ecore_Evas *ee) { ECORE_EVAS_CHECK(ee); if (ee->engine.func->fn_render) - ee->engine.func->fn_render(ee); + { + ee->engine.func->fn_render(ee); + } + else + { + ecore_evas_render(ee); + ecore_evas_render_wait(ee); + } } EAPI void @@ -3027,6 +3107,8 @@ _ecore_evas_register(Ecore_Evas *ee) if (_ecore_evas_render_sync) ee->first_frame = EINA_TRUE; if (!_general_tick) _ecore_evas_tick_source_find(); + if (!ee->engine.func->fn_render) + evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_POST, _evas_evas_buffer_rendered, ee); } EAPI void diff --git a/src/lib/ecore_evas/ecore_evas_private.h b/src/lib/ecore_evas/ecore_evas_private.h index 25fa6def0d..6f1d8293ef 100644 --- a/src/lib/ecore_evas/ecore_evas_private.h +++ b/src/lib/ecore_evas/ecore_evas_private.h @@ -167,6 +167,8 @@ struct _Ecore_Evas_Engine_Func void (*fn_callback_device_mouse_in_set) (Ecore_Evas *ee, Ecore_Evas_Mouse_IO_Cb func); void (*fn_callback_device_mouse_out_set) (Ecore_Evas *ee, Ecore_Evas_Mouse_IO_Cb func); void (*fn_pointer_device_xy_get)(const Ecore_Evas *ee, const Efl_Input_Device *pointer, Evas_Coord *x, Evas_Coord *y); + + Eina_Bool (*fn_prepare)(Ecore_Evas *ee); }; struct _Ecore_Evas_Interface @@ -474,6 +476,10 @@ EAPI void _ecore_evas_default_cursor_hide(Ecore_Evas *ee); Eina_Bool _ecore_evas_cursors_init(Ecore_Evas *ee); +EAPI void ecore_evas_render_wait(Ecore_Evas *ee); +EAPI Eina_Bool ecore_evas_render(Ecore_Evas *ee); + + #undef EAPI #define EAPI