From 8c917daa069f0c646d4f9a92cb372f3da5ecfb16 Mon Sep 17 00:00:00 2001 From: Derek Foreman Date: Fri, 18 Aug 2017 14:13:11 -0500 Subject: [PATCH] wayland: Tick like a boss Instead of the clever but awful manual_render_set hack, actually do ticks based on frame callbacks. Fix T5850 --- .../wayland/ecore_evas_wayland_common.c | 97 ++++++++++++------- .../wayland/ecore_evas_wayland_private.h | 3 +- 2 files changed, 64 insertions(+), 36 deletions(-) diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c index 4fac885900..fe45f8a0d4 100644 --- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c @@ -34,6 +34,58 @@ static void _ecore_evas_wayland_resize(Ecore_Evas *ee, int location); static void _ecore_evas_wl_common_rotation_set(Ecore_Evas *ee, int rotation, int resize); /* local functions */ +static void +_anim_cb_tick(Ecore_Wl2_Window *win EINA_UNUSED, uint32_t timestamp EINA_UNUSED, void *data) +{ + Ecore_Evas *ee = data; + Ecore_Evas_Engine_Wl_Data *edata; + + edata = ee->engine.data; + + if (!edata->ticking) return; + + ecore_evas_animator_tick(ee, NULL, ecore_loop_time_get()); +} + +static void +_ecore_evas_wl_common_animator_register(Ecore_Evas *ee) +{ + Ecore_Evas_Engine_Wl_Data *edata; + + edata = (Ecore_Evas_Engine_Wl_Data *)ee->engine.data; + + EINA_SAFETY_ON_TRUE_RETURN(edata->ticking); + + edata->frame = ecore_wl2_window_frame_callback_add(edata->win, + _anim_cb_tick, ee); + if (!ecore_wl2_window_pending_get(edata->win) && !ee->in_async_render) + ecore_wl2_window_commit(edata->win, EINA_TRUE); + edata->ticking = EINA_TRUE; +} + +static void +_ecore_evas_wl_common_animator_unregister(Ecore_Evas *ee) +{ + Ecore_Evas_Engine_Wl_Data *edata; + + edata = ee->engine.data; + edata->ticking = EINA_FALSE; + ecore_wl2_window_frame_callback_del(edata->frame); + edata->frame = NULL; +} + +static void +_ecore_evas_wl_common_evas_changed(Ecore_Evas *ee, Eina_Bool changed) +{ + Ecore_Evas_Engine_Wl_Data *edata; + + if (changed) return; + + edata = (Ecore_Evas_Engine_Wl_Data *)ee->engine.data; + if (edata->ticking && !ecore_wl2_window_pending_get(edata->win)) + ecore_wl2_window_commit(edata->win, EINA_TRUE); +} + static void _ecore_evas_wl_common_state_update(Ecore_Evas *ee) { @@ -158,8 +210,6 @@ _ecore_evas_wl_common_cb_disconnect(void *data EINA_UNUSED, int type EINA_UNUSED Ecore_Evas_Engine_Wl_Data *wdata = ee->engine.data; if (wdata->display != ev->display) continue; - if (wdata->anim_callback) wl_callback_destroy(wdata->anim_callback); - wdata->anim_callback = NULL; wdata->sync_done = EINA_FALSE; wdata->defer_show = EINA_TRUE; ee->visible = EINA_FALSE; @@ -475,7 +525,6 @@ _ecore_evas_wl_common_cb_window_configure(void *data EINA_UNUSED, int type EINA_ wdata->win->zxdg_configure_ack(wdata->win->zxdg_surface, wdata->win->configure_serial); wdata->win->configure_serial = 0; - ecore_wl2_window_commit(wdata->win, EINA_TRUE); } return ECORE_CALLBACK_RENEW; } @@ -553,6 +602,8 @@ _ecore_evas_wl_common_cb_window_configure_complete(void *data EINA_UNUSED, int t if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo)) ERR("Failed to set Evas Engine Info for '%s'", ee->driver); + ecore_evas_manual_render_set(ee, 0); + return ECORE_CALLBACK_PASS_ON; } @@ -1210,7 +1261,8 @@ _ecore_evas_wl_common_free(Ecore_Evas *ee) ee_list = eina_list_remove(ee_list, ee); eina_list_free(wdata->regen_objs); - if (wdata->anim_callback) wl_callback_destroy(wdata->anim_callback); + if (wdata->frame) ecore_wl2_window_frame_callback_del(wdata->frame); + wdata->frame = NULL; ecore_event_handler_del(wdata->sync_handler); if (wdata->win) ecore_wl2_window_free(wdata->win); ecore_wl2_display_disconnect(wdata->display); @@ -1634,47 +1686,22 @@ _ecore_evas_wl_common_ignore_events_set(Ecore_Evas *ee, int ignore) /* NB: Hmmm, may need to pass this to ecore_wl_window in the future */ } -static void -_anim_cb_animate(void *data, struct wl_callback *callback, uint32_t serial EINA_UNUSED) -{ - Ecore_Evas *ee = data; - Ecore_Evas_Engine_Wl_Data *wdata; - - wdata = ee->engine.data; - wl_callback_destroy(callback); - wdata->anim_callback = NULL; - ecore_evas_manual_render_set(ee, 0); -} - -static const struct wl_callback_listener _anim_listener = -{ - _anim_cb_animate -}; - static void _ecore_evas_wl_common_render_flush_pre(void *data, Evas *evas, void *event EINA_UNUSED) { Ecore_Evas *ee = data; Evas_Engine_Info_Wayland *einfo; Ecore_Evas_Engine_Wl_Data *wdata; - struct wl_surface *surf; int fx, fy; einfo = (Evas_Engine_Info_Wayland *)evas_engine_info_get(evas); if (!einfo) return; - surf = ecore_wl2_window_surface_get(einfo->info.wl2_win); - if (!surf) return; - wdata = ee->engine.data; if (!wdata) return; if (wdata->win->pending.configure) return; - wdata->anim_callback = wl_surface_frame(surf); - wl_callback_add_listener(wdata->anim_callback, &_anim_listener, ee); - ecore_evas_manual_render_set(ee, 1); - if (!ecore_wl2_window_shell_surface_exists(wdata->win)) return; if (wdata->win->zxdg_configure_ack && wdata->win->configure_serial) @@ -2027,6 +2054,7 @@ _ecore_evas_wl_common_show(Ecore_Evas *ee) evas_damage_rectangle_add(ee->evas, 0, 0, ee->w + fw, ee->h + fh); else evas_damage_rectangle_add(ee->evas, 0, 0, ee->h + fh, ee->w + fw); + ecore_evas_manual_render(ee); } } @@ -2076,9 +2104,6 @@ _ecore_evas_wl_common_hide(Ecore_Evas *ee) ee->visible = 0; ee->should_be_visible = 0; ee->draw_ok = EINA_FALSE; - if (wdata->anim_callback) wl_callback_destroy(wdata->anim_callback); - wdata->anim_callback = NULL; - ecore_evas_manual_render_set(ee, 0); if (ee->func.fn_hide) ee->func.fn_hide(ee); } @@ -2318,10 +2343,10 @@ static Ecore_Evas_Engine_Func _ecore_wl_engine_func = NULL, // aux_hints_set - NULL, // fn_animator_register - NULL, // fn_animator_unregister + _ecore_evas_wl_common_animator_register, + _ecore_evas_wl_common_animator_unregister, - NULL, // fn_evas_changed + _ecore_evas_wl_common_evas_changed, NULL, //fn_focus_device_set NULL, //fn_callback_focus_device_in_set NULL, //fn_callback_focus_device_out_set @@ -2491,6 +2516,8 @@ _ecore_evas_wl_common_new_internal(const char *disp_name, unsigned int parent, i ee_list = eina_list_append(ee_list, ee); + ecore_evas_manual_render_set(ee, 1); + return ee; eng_err: diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h index 76ca2d9e70..07832c6e72 100644 --- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h @@ -41,7 +41,7 @@ struct _Ecore_Evas_Engine_Wl_Data Ecore_Event_Handler *sync_handler; int fx, fy, fw, fh; Eina_Rectangle content; - struct wl_callback *anim_callback; + Ecore_Wl2_Frame_Cb_Handle *frame; int x_rel; int y_rel; uint32_t timestamp; @@ -64,6 +64,7 @@ struct _Ecore_Evas_Engine_Wl_Data Eina_Bool defer_show : 1; Eina_Bool reset_pending : 1; Eina_Bool activated : 1; + Eina_Bool ticking : 1; }; /**