forked from enlightenment/efl
ee-wayland: use frame callbacks exclusively to determine render timing
when running in a wayland compositor, the ideal mode of operation is to only prepare/send frames when the compositor has finished with the previous frame to achieve this, manual rendering can be toggled upon creating and completing a frame callback, ensuring that a canvas never has multiple pending buffers at any given time fix T2784
This commit is contained in:
parent
9d3bc82d08
commit
a347a47e75
|
@ -1263,12 +1263,13 @@ _ecore_evas_wl_common_pre_render(Ecore_Evas *ee)
|
||||||
static void
|
static void
|
||||||
_anim_cb_animate(void *data, struct wl_callback *callback, uint32_t serial EINA_UNUSED)
|
_anim_cb_animate(void *data, struct wl_callback *callback, uint32_t serial EINA_UNUSED)
|
||||||
{
|
{
|
||||||
Ecore_Evas_Engine_Wl_Data *wdata = data;
|
Ecore_Evas *ee = data;
|
||||||
|
Ecore_Evas_Engine_Wl_Data *wdata;
|
||||||
if ((wdata->anim_callback) && (callback != wdata->anim_callback)) return;
|
|
||||||
|
|
||||||
|
wdata = ee->engine.data;
|
||||||
wl_callback_destroy(callback);
|
wl_callback_destroy(callback);
|
||||||
wdata->anim_callback = NULL;
|
wdata->anim_callback = NULL;
|
||||||
|
ecore_evas_manual_render_set(ee, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct wl_callback_listener _anim_listener =
|
static const struct wl_callback_listener _anim_listener =
|
||||||
|
@ -1276,6 +1277,18 @@ static const struct wl_callback_listener _anim_listener =
|
||||||
_anim_cb_animate
|
_anim_cb_animate
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
_ecore_evas_wl_common_render_pre(void *data, Evas *evas EINA_UNUSED, void *event EINA_UNUSED)
|
||||||
|
{
|
||||||
|
Ecore_Evas *ee = data;
|
||||||
|
Ecore_Evas_Engine_Wl_Data *wdata;
|
||||||
|
|
||||||
|
wdata = ee->engine.data;
|
||||||
|
wdata->anim_callback = wl_surface_frame(ecore_wl_window_surface_get(wdata->win));
|
||||||
|
wl_callback_add_listener(wdata->anim_callback, &_anim_listener, ee);
|
||||||
|
ecore_evas_manual_render_set(ee, 1);
|
||||||
|
}
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
@ -1286,13 +1299,7 @@ _ecore_evas_wl_common_render_updates(void *data, Evas *evas EINA_UNUSED, void *e
|
||||||
|
|
||||||
ee->in_async_render = EINA_FALSE;
|
ee->in_async_render = EINA_FALSE;
|
||||||
|
|
||||||
if (_ecore_evas_wl_common_render_updates_process(ee, ev->updated_area))
|
_ecore_evas_wl_common_render_updates_process(ee, ev->updated_area);
|
||||||
{
|
|
||||||
Ecore_Evas_Engine_Wl_Data *wdata = ee->engine.data;
|
|
||||||
|
|
||||||
wdata->anim_callback = wl_surface_frame(ecore_wl_window_surface_get(wdata->win));
|
|
||||||
wl_callback_add_listener(wdata->anim_callback, &_anim_listener, wdata);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ee->delayed.alpha_changed)
|
if (ee->delayed.alpha_changed)
|
||||||
{
|
{
|
||||||
|
|
|
@ -227,6 +227,9 @@ ecore_evas_wayland_egl_new_internal(const char *disp_name, unsigned int parent,
|
||||||
evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_POST,
|
evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_POST,
|
||||||
_ecore_evas_wl_common_render_updates, ee);
|
_ecore_evas_wl_common_render_updates, ee);
|
||||||
|
|
||||||
|
evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_PRE,
|
||||||
|
_ecore_evas_wl_common_render_pre, 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);
|
||||||
|
|
|
@ -74,6 +74,7 @@ void _ecore_evas_wl_common_post_render(Ecore_Evas *ee);
|
||||||
int _ecore_evas_wl_common_render(Ecore_Evas *ee);
|
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_render_pre(void *data, Evas *evas EINA_UNUSED, void *event);
|
||||||
void _ecore_evas_wl_common_render_updates(void *data, Evas *evas, void *event);
|
void _ecore_evas_wl_common_render_updates(void *data, Evas *evas, void *event);
|
||||||
void _ecore_evas_wl_common_rotation_set(Ecore_Evas *ee, int rotation, int resize);
|
void _ecore_evas_wl_common_rotation_set(Ecore_Evas *ee, int rotation, int resize);
|
||||||
void _ecore_evas_wl_common_borderless_set(Ecore_Evas *ee, Eina_Bool on);
|
void _ecore_evas_wl_common_borderless_set(Ecore_Evas *ee, Eina_Bool on);
|
||||||
|
|
|
@ -222,6 +222,9 @@ ecore_evas_wayland_shm_new_internal(const char *disp_name, unsigned int parent,
|
||||||
evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_POST,
|
evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_POST,
|
||||||
_ecore_evas_wl_common_render_updates, ee);
|
_ecore_evas_wl_common_render_updates, ee);
|
||||||
|
|
||||||
|
evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_PRE,
|
||||||
|
_ecore_evas_wl_common_render_pre, 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);
|
||||||
|
|
Loading…
Reference in New Issue