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.
This commit is contained in:
Cedric BAIL 2013-03-26 11:48:23 +09:00
parent 284e6c963d
commit d583d08814
7 changed files with 30 additions and 39 deletions

View File

@ -1684,7 +1684,7 @@ EAPI void evas_obscured_clear(Evas *e) EINA_ARG_NONNULL(1);
* @ingroup Evas_Canvas * @ingroup Evas_Canvas
* @since 1.8 * @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. * Force immediate renderization of the given Evas canvas.
@ -3715,13 +3715,11 @@ enum
* *
* Render canvas asynchronously * 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 * @param[out] ret Whether or not a frame will get rendered after the call
* *
* @see evas_render_async * @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)

View File

@ -61,7 +61,7 @@ struct _Render_Updates
}; };
static Eina_Bool 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 #ifdef EVAS_RENDER_DEBUG_TIMING
static double static double
@ -1424,7 +1424,6 @@ evas_render_updates_internal(Evas *eo_e,
unsigned char do_draw, unsigned char do_draw,
Evas_Render_Done_Cb done_func, Evas_Render_Done_Cb done_func,
void *done_data, void *done_data,
Evas_Event_Cb updates_func, void *updates_data,
Eina_Bool do_async) Eina_Bool do_async)
{ {
Evas_Object *eo_obj; Evas_Object *eo_obj;
@ -1828,8 +1827,6 @@ evas_render_updates_internal(Evas *eo_e,
{ {
eo_ref(eo_e); eo_ref(eo_e);
e->rendering = EINA_TRUE; 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); 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_Bool haveup = EINA_FALSE;
Eina_List *ret_updates = NULL; Eina_List *ret_updates = NULL;
Evas_Public_Data *e = eo_data_get(eo_e, EVAS_CLASS); 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) EINA_LIST_FREE(e->render.updates, ru)
{ {
@ -2014,17 +2009,12 @@ evas_render_wakeup(Evas *eo_e)
eina_array_clean(&e->texts_unref_queue); eina_array_clean(&e->texts_unref_queue);
/* post rendering */ /* 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; e->rendering = EINA_FALSE;
post.updated_area = ret_updates; post.updated_area = ret_updates;
evas_event_callback_call(eo_e, EVAS_CALLBACK_RENDER_POST, &post); evas_event_callback_call(eo_e, EVAS_CALLBACK_RENDER_POST, &post);
if (up_cb) up_cb(up_data, eo_e, ret_updates); evas_render_updates_free(ret_updates);
else evas_render_updates_free(ret_updates);
eo_unref(eo_e); eo_unref(eo_e);
} }
@ -2052,26 +2042,24 @@ evas_render_updates_free(Eina_List *updates)
} }
EAPI Eina_Bool 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); MAGIC_CHECK(eo_e, Evas, MAGIC_EVAS);
return EINA_FALSE; return EINA_FALSE;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
Eina_Bool ret = EINA_FALSE; 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; return ret;
} }
void void
_canvas_render_async(Eo *eo_e, void *_pd, va_list *list) _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 *); Eina_Bool *ret = va_arg(*list, Eina_Bool *);
Evas_Public_Data *e = _pd; Evas_Public_Data *e = _pd;
*ret = evas_render_updates_internal(eo_e, 1, 1, evas_render_pipe_wakeup, *ret = evas_render_updates_internal(eo_e, 1, 1, evas_render_pipe_wakeup,
e, func, data, EINA_TRUE); e, EINA_TRUE);
} }
EAPI Eina_List * 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); Evas_Public_Data *e = eo_data_get(eo_e, EVAS_CLASS);
if (!evas_render_updates_internal(eo_e, make_updates, do_draw, NULL, if (!evas_render_updates_internal(eo_e, make_updates, do_draw, NULL,
NULL, NULL, NULL, EINA_FALSE)) NULL, EINA_FALSE))
return NULL; return NULL;
ret = e->render.updates; ret = e->render.updates;

View File

@ -378,8 +378,6 @@ struct _Evas_Public_Data
struct { struct {
Eina_List *updates; Eina_List *updates;
Evas_Event_Cb updates_cb;
void *data;
} render; } render;
Eina_Array delete_objects; Eina_Array delete_objects;

View File

@ -36,7 +36,7 @@ static void _ecore_evas_wayland_resize(Ecore_Evas *ee, int location);
/* local function prototypes */ /* local function prototypes */
static int _ecore_evas_wl_common_render_updates_process(Ecore_Evas *ee, Eina_List *updates); 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 */ /* Frame listener */
static void _ecore_evas_wl_frame_complete(void *data, struct wl_callback *callback, uint32_t tm); 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 else
evas_norender(ee->evas); evas_norender(ee->evas);
evas_render_updates_free(updates);
if (ee->func.fn_post_render) ee->func.fn_post_render(ee); if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
return rend; return rend;
@ -780,18 +778,17 @@ _ecore_evas_wl_common_pre_render(Ecore_Evas *ee)
return rend; return rend;
} }
static void void
_ecore_evas_wl_common_render_updates(void *data, Evas *evas EINA_UNUSED, void *event) _ecore_evas_wl_common_render_updates(void *data, Evas *evas EINA_UNUSED, void *event)
{ {
Ecore_Evas *ee; Evas_Event_Render_Post *ev = event;
Eina_List *updates; Ecore_Evas *ee = data;
if (!(ee = data)) return; if (!(ee) || !(ev)) return;
if (!(updates = event)) return;
ee->in_async_render = EINA_FALSE; 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 void
@ -871,13 +868,13 @@ _ecore_evas_wl_common_render(Ecore_Evas *ee)
updates = evas_render_updates(ee->evas); updates = evas_render_updates(ee->evas);
rend = _ecore_evas_wl_common_render_updates_process(ee, updates); rend = _ecore_evas_wl_common_render_updates_process(ee, updates);
evas_render_updates_free(updates);
if (rend) if (rend)
win->frame_pending = EINA_TRUE; win->frame_pending = EINA_TRUE;
} }
} }
else if (evas_render_async(ee->evas, else if (evas_render_async(ee->evas))
_ecore_evas_wl_common_render_updates, ee))
{ {
ee->in_async_render = EINA_TRUE; ee->in_async_render = EINA_TRUE;
rend = 1; rend = 1;

View File

@ -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_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_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_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); Evas_Object * _ecore_evas_wl_common_frame_add(Evas *evas);

View File

@ -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_size_set(ee->evas, ee->w + fw, ee->h + fh);
evas_output_viewport_set(ee->evas, 0, 0, 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 */ /* FIXME: This needs to be set based on theme & scale */
if (ee->prop.draw_frame) if (ee->prop.draw_frame)
evas_output_framespace_set(ee->evas, fx, fy, fw, fh); evas_output_framespace_set(ee->evas, fx, fy, fw, fh);

View File

@ -557,7 +557,6 @@ _render_updates_process(Ecore_Evas *ee, Eina_List *updates)
} }
else else
evas_norender(ee->evas); evas_norender(ee->evas);
evas_render_updates_free(updates);
if (ee->func.fn_post_render) ee->func.fn_post_render(ee); 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 static void
_ecore_evas_x_render_updates(void *data, Evas *e EINA_UNUSED, void *event_info) _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; Ecore_Evas *ee = data;
Eina_List *updates = event_info;
if (!ev) return ;
EDBG("ee=%p finished asynchronous render.", ee); EDBG("ee=%p finished asynchronous render.", ee);
ee->in_async_render = EINA_FALSE; ee->in_async_render = EINA_FALSE;
_render_updates_process(ee, updates); _render_updates_process(ee, ev->updated_area);
if (ee->delayed.resize_shape) if (ee->delayed.resize_shape)
{ {
@ -655,8 +656,9 @@ _ecore_evas_x_render(Ecore_Evas *ee)
{ {
Eina_List *updates = evas_render_updates(ee->evas); Eina_List *updates = evas_render_updates(ee->evas);
rend = _render_updates_process(ee, updates); 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); EDBG("ee=%p started asynchronous render.", ee);
ee->in_async_render = EINA_TRUE; 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); _ecore_evas_x_flush_pre, ee);
evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST,
_ecore_evas_x_flush_post, ee); _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_data_attach_set(ee->evas, ee);
evas_output_method_set(ee->evas, rmethod); evas_output_method_set(ee->evas, rmethod);
evas_output_size_set(ee->evas, w, h); evas_output_size_set(ee->evas, w, h);