antognolli pushed a commit to branch ecore-1.7.

commit 35d36f85a03cf1e64526ef24fc9af2dced600900
Author: Rafael Antognolli <[email protected]>
Date:   Mon Apr 15 17:16:32 2013 -0300

    ecore_evas/wayland: Backport the frame_callback patch to 1.7.
    
    This will solve some rendering issues caused by the buffer being written
    before the compositor getting its content.
---
 src/lib/ecore_evas/ecore_evas_wayland_shm.c | 89 +++++++++++++++++++++++------
 src/lib/ecore_wayland/Ecore_Wayland.h       |  3 +
 2 files changed, 73 insertions(+), 19 deletions(-)

diff --git a/src/lib/ecore_evas/ecore_evas_wayland_shm.c 
b/src/lib/ecore_evas/ecore_evas_wayland_shm.c
index 3bf7fea..f47774f 100644
--- a/src/lib/ecore_evas/ecore_evas_wayland_shm.c
+++ b/src/lib/ecore_evas/ecore_evas_wayland_shm.c
@@ -66,6 +66,12 @@ struct _EE_Wl_Smart_Data
    Evas_Coord x, y, w, h;
 };
 
+struct _Ecore_Evas_Engine_Wl_Data
+{
+   Ecore_Wl_Window *win;
+   Evas_Object *frame;
+};
+
 /* local function prototypes */
 static int _ecore_evas_wl_init(void);
 static int _ecore_evas_wl_shutdown(void);
@@ -103,6 +109,8 @@ static void _ecore_evas_wl_screen_dpi_get(const Ecore_Evas 
*ee __UNUSED__, int *
 static void _ecore_evas_wl_ensure_pool_size(Ecore_Evas *ee, int w, int h);
 static struct wl_shm_pool *_ecore_evas_wl_shm_pool_create(int size, void 
**data);
 
+static void _ecore_evas_wl_frame_complete(void *data, struct wl_callback 
*callback, uint32_t tm EINA_UNUSED);
+
 static void _ecore_evas_wl_buffer_new(Ecore_Evas *ee, struct wl_shm_pool 
*pool);
 
 static Eina_Bool _ecore_evas_wl_cb_mouse_in(void *data __UNUSED__, int type 
__UNUSED__, void *event);
@@ -127,6 +135,11 @@ static Evas_Object *_ecore_evas_wl_frame_add(Evas *evas);
 static int _ecore_evas_wl_init_count = 0;
 static Ecore_Event_Handler *_ecore_evas_wl_event_hdls[5];
 
+static const struct wl_callback_listener frame_listener =
+{
+   _ecore_evas_wl_frame_complete,
+};
+
 static Ecore_Evas_Engine_Func _ecore_wl_engine_func = 
 {
    _ecore_evas_wl_free,
@@ -930,22 +943,45 @@ _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int 
transparent)
      }
 }
 
+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;
+
+   if (!ee) return;
+   if (!(win = ee->engine.wl.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;
+
+   if (!(win = ee->engine.wl.win)) return 0;
 
    if (!ee) return 0;
    if (!ee->visible)
      evas_norender(ee->evas);
    else
      {
-        Eina_List *ll = NULL, *updates = NULL;
+        Eina_List *ll = NULL;
         Ecore_Evas *ee2 = NULL;
 
         if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
 
-        EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2) 
+        EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
           {
              if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
              if (ee2->engine.func->fn_render)
@@ -953,27 +989,42 @@ _ecore_evas_wl_render(Ecore_Evas *ee)
              if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
           }
 
-        if ((updates = evas_render_updates(ee->evas))) 
+        if (!win->frame_pending)
           {
-             Eina_List *l = NULL;
-             Eina_Rectangle *r;
+             Eina_List *updates;
 
-             LOGFN(__FILE__, __LINE__, __FUNCTION__);
+             if (!win->frame_callback)
+               {
+                  win->frame_callback = wl_surface_frame(win->surface);
+                  wl_callback_add_listener(win->frame_callback,
+                                           &frame_listener, ee);
+               }
 
-             ecore_wl_window_buffer_attach(ee->engine.wl.win,
-                                           ee->engine.wl.buffer, 0, 0);
-             EINA_LIST_FOREACH(updates, l, r) 
-               ecore_wl_window_damage(ee->engine.wl.win, 
-                                      r->x, r->y, r->w, r->h);
-             ecore_wl_window_commit(ee->engine.wl.win);
-             ecore_wl_flush();
-
-             evas_render_updates_free(updates);
-             _ecore_evas_idle_timeout_update(ee);
-             rend = 1;
-          }
+             if ((updates = evas_render_updates(ee->evas)))
+               {
+                  Eina_List *l = NULL;
+                  Eina_Rectangle *r;
+
+                  LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+                  ecore_wl_window_buffer_attach(ee->engine.wl.win,
+                                                ee->engine.wl.buffer, 0, 0);
+                  EINA_LIST_FOREACH(updates, l, r)
+                     ecore_wl_window_damage(ee->engine.wl.win,
+                                            r->x, r->y, r->w, r->h);
+                  ecore_wl_window_commit(ee->engine.wl.win);
+                  ecore_wl_flush();
+
+                  evas_render_updates_free(updates);
+                  _ecore_evas_idle_timeout_update(ee);
+                  rend = 1;
 
-        if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
+                  if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
+
+                  win->frame_pending = EINA_TRUE;
+
+               }
+          }
      }
    return rend;
 }
diff --git a/src/lib/ecore_wayland/Ecore_Wayland.h 
b/src/lib/ecore_wayland/Ecore_Wayland.h
index 0ce3b62..a62d55f 100644
--- a/src/lib/ecore_wayland/Ecore_Wayland.h
+++ b/src/lib/ecore_wayland/Ecore_Wayland.h
@@ -218,6 +218,9 @@ struct _Ecore_Wl_Window
    Ecore_Wl_Input *pointer_device;
    Ecore_Wl_Input *keyboard_device;
 
+   Eina_Bool frame_pending;
+   struct wl_callback *frame_callback;
+
    /* FIXME: Ideally we should record the cursor name for this window 
     * so we can compare and avoid unnecessary cursor set calls to wayland */
 

-- 

------------------------------------------------------------------------------
Precog is a next-generation analytics platform capable of advanced
analytics on semi-structured data. The platform includes APIs for building
apps and a phenomenal toolset for data science. Developers can use
our toolset for easy data analysis & visualization. Get a free account!
http://www2.precog.com/precogplatform/slashdotnewsletter

Reply via email to