forked from enlightenment/efl
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:
parent
284e6c963d
commit
d583d08814
|
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue