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
|
||||
* @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)
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -378,8 +378,6 @@ struct _Evas_Public_Data
|
|||
|
||||
struct {
|
||||
Eina_List *updates;
|
||||
Evas_Event_Cb updates_cb;
|
||||
void *data;
|
||||
} render;
|
||||
|
||||
Eina_Array delete_objects;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue