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
* @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)

View File

@ -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;

View File

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

View File

@ -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;

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_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);

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_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);

View File

@ -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);