From d583d08814f7809eb69e2d89c14e31f7ca6fb0de Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Tue, 26 Mar 2013 11:48:23 +0900 Subject: [PATCH] evas: no need for a callback per async call. Let's not multiply our callback infrastructure without any serious need. We already have to many of them. --- src/lib/evas/Evas.h | 6 ++--- src/lib/evas/canvas/evas_render.c | 24 +++++-------------- src/lib/evas/include/evas_private.h | 2 -- .../wayland/ecore_evas_wayland_common.c | 19 +++++++-------- .../wayland/ecore_evas_wayland_private.h | 1 + .../engines/wayland/ecore_evas_wayland_shm.c | 4 ++++ .../ecore_evas/engines/x/ecore_evas_x.c | 13 ++++++---- 7 files changed, 30 insertions(+), 39 deletions(-) diff --git a/src/lib/evas/Evas.h b/src/lib/evas/Evas.h index fe8ee81648..e6ce153e4e 100644 --- a/src/lib/evas/Evas.h +++ b/src/lib/evas/Evas.h @@ -1684,7 +1684,7 @@ EAPI void evas_obscured_clear(Evas *e) EINA_ARG_NONNULL(1); * @ingroup Evas_Canvas * @since 1.8 */ -EAPI Eina_Bool evas_render_async(Evas *e, Evas_Event_Cb func, void *data) EINA_ARG_NONNULL(1); +EAPI Eina_Bool evas_render_async(Evas *e) EINA_ARG_NONNULL(1); /** * Force immediate renderization of the given Evas canvas. @@ -3715,13 +3715,11 @@ enum * * Render canvas asynchronously * - * @param[in] func Callback function for list of updates - * @param[in] data User data pointer to pass to func * @param[out] ret Whether or not a frame will get rendered after the call * * @see evas_render_async */ -#define evas_canvas_render_async(func, data, ret) EVAS_CANVAS_ID(EVAS_CANVAS_SUB_ID_RENDER_ASYNC), EO_TYPECHECK(Evas_Event_Cb, func), EO_TYPECHECK(void *, data), EO_TYPECHECK(Eina_Bool *, ret) +#define evas_canvas_render_async(ret) EVAS_CANVAS_ID(EVAS_CANVAS_SUB_ID_RENDER_ASYNC), EO_TYPECHECK(Eina_Bool *, ret) diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index aa0576308c..f1095182d3 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -61,7 +61,7 @@ struct _Render_Updates }; static Eina_Bool -evas_render_updates_internal(Evas *eo_e, unsigned char make_updates, unsigned char do_draw, Evas_Render_Done_Cb done_func, void *done_data, Evas_Event_Cb updates_func, void *updates_data, Eina_Bool do_async); +evas_render_updates_internal(Evas *eo_e, unsigned char make_updates, unsigned char do_draw, Evas_Render_Done_Cb done_func, void *done_data, Eina_Bool do_async); #ifdef EVAS_RENDER_DEBUG_TIMING static double @@ -1424,7 +1424,6 @@ evas_render_updates_internal(Evas *eo_e, unsigned char do_draw, Evas_Render_Done_Cb done_func, void *done_data, - Evas_Event_Cb updates_func, void *updates_data, Eina_Bool do_async) { Evas_Object *eo_obj; @@ -1828,8 +1827,6 @@ evas_render_updates_internal(Evas *eo_e, { eo_ref(eo_e); e->rendering = EINA_TRUE; - e->render.data = updates_data; - e->render.updates_cb = updates_func; evas_thread_queue_flush((Evas_Thread_Command_Cb)done_func, done_data); } @@ -1970,8 +1967,6 @@ 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) { @@ -2014,17 +2009,12 @@ evas_render_wakeup(Evas *eo_e) eina_array_clean(&e->texts_unref_queue); /* post rendering */ - up_cb = e->render.updates_cb; - up_data = e->render.data; - e->render.updates_cb = NULL; - e->render.data = NULL; e->rendering = EINA_FALSE; post.updated_area = ret_updates; evas_event_callback_call(eo_e, EVAS_CALLBACK_RENDER_POST, &post); - if (up_cb) up_cb(up_data, eo_e, ret_updates); - else evas_render_updates_free(ret_updates); + evas_render_updates_free(ret_updates); eo_unref(eo_e); } @@ -2052,26 +2042,24 @@ evas_render_updates_free(Eina_List *updates) } EAPI Eina_Bool -evas_render_async(Evas *eo_e, Evas_Event_Cb func, void *data) +evas_render_async(Evas *eo_e) { MAGIC_CHECK(eo_e, Evas, MAGIC_EVAS); return EINA_FALSE; MAGIC_CHECK_END(); Eina_Bool ret = EINA_FALSE; - eo_do(eo_e, evas_canvas_render_async(func, data, &ret)); + eo_do(eo_e, evas_canvas_render_async(&ret)); return ret; } void _canvas_render_async(Eo *eo_e, void *_pd, va_list *list) { - Evas_Event_Cb func = va_arg(*list, Evas_Event_Cb); - void *data = va_arg(*list, void *); Eina_Bool *ret = va_arg(*list, Eina_Bool *); Evas_Public_Data *e = _pd; *ret = evas_render_updates_internal(eo_e, 1, 1, evas_render_pipe_wakeup, - e, func, data, EINA_TRUE); + e, EINA_TRUE); } EAPI Eina_List * @@ -2094,7 +2082,7 @@ evas_render_updates_internal_wait(Evas *eo_e, Evas_Public_Data *e = eo_data_get(eo_e, EVAS_CLASS); if (!evas_render_updates_internal(eo_e, make_updates, do_draw, NULL, - NULL, NULL, NULL, EINA_FALSE)) + NULL, EINA_FALSE)) return NULL; ret = e->render.updates; diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index 1d0def1555..e3270b9900 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -378,8 +378,6 @@ struct _Evas_Public_Data struct { Eina_List *updates; - Evas_Event_Cb updates_cb; - void *data; } render; Eina_Array delete_objects; diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c index 347a1d5875..9914d63a96 100644 --- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c @@ -36,7 +36,7 @@ static void _ecore_evas_wayland_resize(Ecore_Evas *ee, int location); /* local function prototypes */ static int _ecore_evas_wl_common_render_updates_process(Ecore_Evas *ee, Eina_List *updates); -static void _ecore_evas_wl_common_render_updates(void *data, Evas *evas EINA_UNUSED, void *event); +void _ecore_evas_wl_common_render_updates(void *data, Evas *evas EINA_UNUSED, void *event); /* Frame listener */ static void _ecore_evas_wl_frame_complete(void *data, struct wl_callback *callback, uint32_t tm); @@ -73,8 +73,6 @@ _ecore_evas_wl_common_render_updates_process(Ecore_Evas *ee, Eina_List *updates) else evas_norender(ee->evas); - evas_render_updates_free(updates); - if (ee->func.fn_post_render) ee->func.fn_post_render(ee); return rend; @@ -780,18 +778,17 @@ _ecore_evas_wl_common_pre_render(Ecore_Evas *ee) return rend; } -static void +void _ecore_evas_wl_common_render_updates(void *data, Evas *evas EINA_UNUSED, void *event) { - Ecore_Evas *ee; - Eina_List *updates; + Evas_Event_Render_Post *ev = event; + Ecore_Evas *ee = data; - if (!(ee = data)) return; - if (!(updates = event)) return; + if (!(ee) || !(ev)) return; ee->in_async_render = EINA_FALSE; - _ecore_evas_wl_common_render_updates_process(ee, updates); + _ecore_evas_wl_common_render_updates_process(ee, ev->updated_area); } void @@ -871,13 +868,13 @@ _ecore_evas_wl_common_render(Ecore_Evas *ee) updates = evas_render_updates(ee->evas); rend = _ecore_evas_wl_common_render_updates_process(ee, updates); + evas_render_updates_free(updates); if (rend) win->frame_pending = EINA_TRUE; } } - else if (evas_render_async(ee->evas, - _ecore_evas_wl_common_render_updates, ee)) + else if (evas_render_async(ee->evas)) { ee->in_async_render = EINA_TRUE; rend = 1; diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h index b9688250b6..dabd6ce85e 100644 --- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h @@ -67,6 +67,7 @@ int _ecore_evas_wl_common_render(Ecore_Evas *ee); void _ecore_evas_wl_common_screen_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int *h); void _ecore_evas_wl_common_screen_dpi_get(const Ecore_Evas *ee, int *xdpi, int *ydpi); void _ecore_evas_wl_common_state_change(void *data); +void _ecore_evas_wl_common_render_updates(void *data, Evas *evas, void *event); Evas_Object * _ecore_evas_wl_common_frame_add(Evas *evas); diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c index 5b64dbd550..49b23cb8cf 100644 --- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c @@ -171,6 +171,10 @@ ecore_evas_wayland_shm_new_internal(const char *disp_name, unsigned int parent, evas_output_size_set(ee->evas, ee->w + fw, ee->h + fh); evas_output_viewport_set(ee->evas, 0, 0, ee->w + fw, ee->h + fh); + if (ee->can_async_render) + evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_POST, + _ecore_evas_wl_common_render_updates, ee); + /* FIXME: This needs to be set based on theme & scale */ if (ee->prop.draw_frame) evas_output_framespace_set(ee->evas, fx, fy, fw, fh); diff --git a/src/modules/ecore_evas/engines/x/ecore_evas_x.c b/src/modules/ecore_evas/engines/x/ecore_evas_x.c index 534bae6ee4..5f614a75f5 100644 --- a/src/modules/ecore_evas/engines/x/ecore_evas_x.c +++ b/src/modules/ecore_evas/engines/x/ecore_evas_x.c @@ -557,7 +557,6 @@ _render_updates_process(Ecore_Evas *ee, Eina_List *updates) } else evas_norender(ee->evas); - evas_render_updates_free(updates); if (ee->func.fn_post_render) ee->func.fn_post_render(ee); @@ -585,14 +584,16 @@ _render_updates_process(Ecore_Evas *ee, Eina_List *updates) static void _ecore_evas_x_render_updates(void *data, Evas *e EINA_UNUSED, void *event_info) { + Evas_Event_Render_Post *ev = event_info; Ecore_Evas *ee = data; - Eina_List *updates = event_info; + + if (!ev) return ; EDBG("ee=%p finished asynchronous render.", ee); ee->in_async_render = EINA_FALSE; - _render_updates_process(ee, updates); + _render_updates_process(ee, ev->updated_area); if (ee->delayed.resize_shape) { @@ -655,8 +656,9 @@ _ecore_evas_x_render(Ecore_Evas *ee) { Eina_List *updates = evas_render_updates(ee->evas); rend = _render_updates_process(ee, updates); + evas_render_updates_free(updates); } - else if (evas_render_async(ee->evas, _ecore_evas_x_render_updates, ee)) + else if (evas_render_async(ee->evas)) { EDBG("ee=%p started asynchronous render.", ee); ee->in_async_render = EINA_TRUE; @@ -3224,6 +3226,9 @@ ecore_evas_software_x11_new_internal(const char *disp_name, Ecore_X_Window paren _ecore_evas_x_flush_pre, ee); evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee); + if (ee->can_async_render) + evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_POST, + _ecore_evas_x_render_updates, ee); evas_data_attach_set(ee->evas, ee); evas_output_method_set(ee->evas, rmethod); evas_output_size_set(ee->evas, w, h);