ecore_evas/wayland: Merge code from egl and shm engines into common.
authorRafael Antognolli <antognolli@gmail.com>
Mon, 28 Jan 2013 20:28:19 +0000 (20:28 +0000)
committerRafael Antognolli <antognolli@gmail.com>
Mon, 28 Jan 2013 20:28:19 +0000 (20:28 +0000)
Since the render code on both engines is using the frame callback, let's
merge it to avoid code duplication.

SVN revision: 83390

src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c
src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c
src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c

index c0cc37d..6b0d5dc 100644 (file)
@@ -24,6 +24,12 @@ static Evas_Smart *_ecore_evas_wl_common_smart = NULL;
 static int _ecore_evas_wl_init_count = 0;
 static Ecore_Event_Handler *_ecore_evas_wl_event_hdls[5];
 
+/* Frame listener */
+static void _ecore_evas_wl_frame_complete(void *data, struct wl_callback *callback, uint32_t tm);
+static const struct wl_callback_listener frame_listener =
+{
+   _ecore_evas_wl_frame_complete,
+};
 
 static Eina_Bool
 _ecore_evas_wl_common_cb_mouse_in(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
@@ -759,12 +765,34 @@ _ecore_evas_wl_common_post_render(Ecore_Evas *ee)
    if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
 }
 
+static void
+_ecore_evas_wl_frame_complete(void *data, struct wl_callback *callback, uint32_t tm EINA_UNUSED)
+{
+   Ecore_Evas *ee = data;
+   Ecore_Wl_Window *win = NULL;
+   Ecore_Evas_Engine_Wl_Data *wdata;
+
+   if (!ee) return;
+   wdata = ee->engine.data;
+   if (!(win = wdata->win)) return;
+
+   win->frame_callback = NULL;
+   win->frame_pending = EINA_FALSE;
+   wl_callback_destroy(callback);
+
+   if (win->surface)
+     {
+        win->frame_callback = wl_surface_frame(win->surface);
+        wl_callback_add_listener(win->frame_callback, &frame_listener, ee);
+     }
+}
+
 int
 _ecore_evas_wl_common_render(Ecore_Evas *ee)
 {
    int rend = 0;
-
-   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   Ecore_Wl_Window *win = NULL;
+   Ecore_Evas_Engine_Wl_Data *wdata;
 
    if (!ee) return 0;
    if (!ee->visible)
@@ -773,10 +801,28 @@ _ecore_evas_wl_common_render(Ecore_Evas *ee)
         return 0;
      }
 
+   wdata = ee->engine.data;
+   if (!(win = wdata->win)) return 0;
+
    rend = _ecore_evas_wl_common_pre_render(ee);
-   rend |= _ecore_evas_wl_common_render_updates(ee);
-   _ecore_evas_wl_common_post_render(ee);
+   if (!(win->frame_pending))
+     {
+        /* FIXME - ideally have an evas_changed_get to return the value
+         * of evas->changed to avoid creating this callback and
+         * destroying it again
+         */
+
+        if (!win->frame_callback)
+          {
+             win->frame_callback = wl_surface_frame(win->surface);
+             wl_callback_add_listener(win->frame_callback, &frame_listener, ee);
+          }
 
+        rend |= _ecore_evas_wl_common_render_updates(ee);
+        if (rend)
+           win->frame_pending = EINA_TRUE;
+     }
+   _ecore_evas_wl_common_post_render(ee);
    return rend;
 }
 
index df7eeb0..b797660 100644 (file)
@@ -10,7 +10,6 @@
 
 
 /* local function prototypes */
-static int _ecore_evas_wl_render(Ecore_Evas *ee);
 static void _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h);
 static void _ecore_evas_wl_show(Ecore_Evas *ee);
 static void _ecore_evas_wl_hide(Ecore_Evas *ee);
@@ -73,7 +72,7 @@ static Ecore_Evas_Engine_Func _ecore_wl_engine_func =
    NULL, // modal set
    NULL, // demand attention set
    NULL, // focus skip set
-   _ecore_evas_wl_render,
+   _ecore_evas_wl_common_render,
    _ecore_evas_wl_common_screen_geometry_get,
    _ecore_evas_wl_common_screen_dpi_get
 };
@@ -229,108 +228,6 @@ ecore_evas_wayland_egl_new_internal(const char *disp_name, unsigned int parent,
    return NULL;
 }
 
-static void
-_ecore_evas_wl_frame_complete (void *data, struct wl_callback *callback, uint32_t time EINA_UNUSED);
-
-static const struct wl_callback_listener frame_listener = {
-   _ecore_evas_wl_frame_complete,
-};
-
-static void
-_ecore_evas_wl_frame_complete (void *data, struct wl_callback *callback, uint32_t time EINA_UNUSED)
-{
-   Ecore_Evas *ee = data;
-   Ecore_Evas_Engine_Wl_Data *wdata = ee->engine.data;
-
-   wdata->win->frame_callback = NULL;
-   wdata->win->frame_pending = EINA_FALSE;
-   wl_callback_destroy(callback);
-
-   wdata->win->frame_callback =
-     wl_surface_frame(wdata->win->surface);
-
-   wl_callback_add_listener(wdata->win->frame_callback,
-                            &frame_listener, ee);
-}
-
-int
-_ecore_evas_wl_render_updates(Ecore_Evas *ee)
-{
-   int rend = 0;
-   Eina_List *updates = NULL;
-   Ecore_Evas_Engine_Wl_Data *wdata = ee->engine.data;
-
-   LOGFN(__FILE__, __LINE__, __FUNCTION__);
-
-   /* eglSwapBuffers is ultimately called by evas_render_updates() if
-    * there is some update to make. So we must pre-emptively create a
-    * frame callback handler. We make sure we always have one of these in
-    * available to track if the event is presented.
-    *
-    * This frame callback will be fired when the frame has been presented
-    * and we can safely call eglSwapBuffers without it blocking. Whether
-    * to render or not is handled by the frame_pending boolean which is
-    * reset on the frame callback event.
-    */
-   if (!wdata->win->frame_pending)
-     {
-        /* FIXME - ideally have an evas_changed_get to return the value
-         * of evas->changed to avoid creating this callback and
-         * destroying it again
-         */
-
-        if (!wdata->win->frame_callback)
-          {
-             wdata->win->frame_callback =
-                wl_surface_frame(wdata->win->surface);
-
-             wl_callback_add_listener(wdata->win->frame_callback,
-                                      &frame_listener, ee);
-          }
-
-        if ((updates = evas_render_updates(ee->evas)))
-          {
-             Eina_List *l = NULL;
-             Eina_Rectangle *r;
-
-             EINA_LIST_FOREACH(updates, l, r)
-                ecore_wl_window_damage(wdata->win,
-                                       r->x, r->y, r->w, r->h);
-
-             ecore_wl_flush();
-
-             evas_render_updates_free(updates);
-
-             wdata->win->frame_pending = EINA_TRUE;
-
-             rend = 1;
-          }
-     }
-
-   return rend;
-}
-
-static int
-_ecore_evas_wl_render(Ecore_Evas *ee)
-{
-   int rend = 0;
-
-   LOGFN(__FILE__, __LINE__, __FUNCTION__);
-
-   if (!ee) return 0;
-   if (!ee->visible)
-     {
-        evas_norender(ee->evas);
-        return 0;
-     }
-
-   rend = _ecore_evas_wl_common_pre_render(ee);
-   rend |= _ecore_evas_wl_render_updates(ee);
-   _ecore_evas_wl_common_post_render(ee);
-
-   return rend;
-}
-
 static void 
 _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
 {
index 6e68cf6..158ae72 100644 (file)
@@ -16,14 +16,6 @@ static void _ecore_evas_wl_show(Ecore_Evas *ee);
 static void _ecore_evas_wl_hide(Ecore_Evas *ee);
 static void _ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha);
 static void _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent);
-static int  _ecore_evas_wl_render(Ecore_Evas *ee);
-
-/* Frame listener */
-static void _ecore_evas_wl_frame_complete(void *data, struct wl_callback *callback, uint32_t tm);
-static const struct wl_callback_listener frame_listener =
-{
-   _ecore_evas_wl_frame_complete,
-};
 
 static Ecore_Evas_Engine_Func _ecore_wl_engine_func = 
 {
@@ -81,7 +73,7 @@ static Ecore_Evas_Engine_Func _ecore_wl_engine_func =
    NULL, // modal set
    NULL, // demand attention set
    NULL, // focus skip set
-   _ecore_evas_wl_render,
+   _ecore_evas_wl_common_render,
    _ecore_evas_wl_common_screen_geometry_get,
    _ecore_evas_wl_common_screen_dpi_get
 };
@@ -463,67 +455,6 @@ _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent)
      ecore_wl_window_update_size(wdata->win, ee->w + fw, ee->h + fh);
 }
 
-static void
-_ecore_evas_wl_frame_complete(void *data, struct wl_callback *callback, uint32_t tm EINA_UNUSED)
-{
-   Ecore_Evas *ee = data;
-   Ecore_Wl_Window *win = NULL;
-   Ecore_Evas_Engine_Wl_Data *wdata;
-
-   if (!ee) return;
-   wdata = ee->engine.data;
-   if (!(win = wdata->win)) return;
-
-   win->frame_callback = NULL;
-   win->frame_pending = EINA_FALSE;
-   wl_callback_destroy(callback);
-
-   if (win->surface)
-     {
-        win->frame_callback = wl_surface_frame(win->surface);
-        wl_callback_add_listener(win->frame_callback, &frame_listener, ee);
-     }
-}
-
-static int
-_ecore_evas_wl_render(Ecore_Evas *ee)
-{
-   int rend = 0;
-   Ecore_Wl_Window *win = NULL;
-   Ecore_Evas_Engine_Wl_Data *wdata;
-
-   if (!ee) return 0;
-   if (!ee->visible)
-     {
-        evas_norender(ee->evas);
-        return 0;
-     }
-
-   wdata = ee->engine.data;
-   if (!(win = wdata->win)) return 0;
-
-   rend = _ecore_evas_wl_common_pre_render(ee);
-   if (!(win->frame_pending))
-     {
-        /* FIXME - ideally have an evas_changed_get to return the value
-         * of evas->changed to avoid creating this callback and
-         * destroying it again
-         */
-
-        if (!win->frame_callback)
-          {
-             win->frame_callback = wl_surface_frame(win->surface);
-             wl_callback_add_listener(win->frame_callback, &frame_listener, ee);
-          }
-
-        rend |= _ecore_evas_wl_common_render_updates(ee);
-        if (rend)
-           win->frame_pending = EINA_TRUE;
-     }
-   _ecore_evas_wl_common_post_render(ee);
-   return rend;
-}
-
 void 
 _ecore_evas_wayland_shm_resize(Ecore_Evas *ee, int location)
 {