ecore-evas-wayland: add frame callback listener during render
authorMike Blumenkrantz <zmike@osg.samsung.com>
Fri, 16 Oct 2015 19:51:06 +0000 (15:51 -0400)
committerMike Blumenkrantz <zmike@osg.samsung.com>
Fri, 16 Oct 2015 19:55:40 +0000 (15:55 -0400)
when a render occurs, frame callbacks must be managed in order to ensure
successful rendering for future frames. the best place to do this is in the
engine here, since this is the lowest-level place which has access to both
the wl_surface as well as the evas rendering state

ref T2784

src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c
src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h

index 379dcb1..41b0112 100644 (file)
@@ -451,6 +451,8 @@ _ecore_evas_wl_common_free(Ecore_Evas *ee)
 
    if (!ee) return;
    wdata = ee->engine.data;
+   if (wdata->anim_callback)
+     wl_callback_destroy(wdata->anim_callback);
    if (wdata->win) ecore_wl_window_free(wdata->win);
    wdata->win = NULL;
    free(wdata);
@@ -1258,6 +1260,22 @@ _ecore_evas_wl_common_pre_render(Ecore_Evas *ee)
    return rend;
 }
 
+static void
+_anim_cb_animate(void *data, struct wl_callback *callback, uint32_t serial EINA_UNUSED)
+{
+   Ecore_Evas_Engine_Wl_Data *wdata = data;
+
+   if ((wdata->anim_callback) && (callback != wdata->anim_callback)) return;
+
+   wl_callback_destroy(callback);
+   wdata->anim_callback = NULL;
+}
+
+static const struct wl_callback_listener _anim_listener =
+{
+   _anim_cb_animate
+};
+
 void 
 _ecore_evas_wl_common_render_updates(void *data, Evas *evas EINA_UNUSED, void *event)
 {
@@ -1268,7 +1286,13 @@ _ecore_evas_wl_common_render_updates(void *data, Evas *evas EINA_UNUSED, void *e
 
    ee->in_async_render = EINA_FALSE;
 
-   _ecore_evas_wl_common_render_updates_process(ee, ev->updated_area);
+   if (_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)
      {
index 206d178..48e9a3f 100644 (file)
@@ -35,6 +35,7 @@ struct _Ecore_Evas_Engine_Wl_Data
 #ifdef BUILD_ECORE_EVAS_WAYLAND_EGL
    struct wl_egl_window *egl_win;
 #endif
+   struct wl_callback *anim_callback;
 };
 
 Ecore_Evas_Interface_Wayland *_ecore_evas_wl_interface_new(void);