antognolli pushed a commit to branch ecore-1.7.

commit 5e0291d829ea47ce1aed99e061476ed62c4c201e
Author: Rafael Antognolli <[email protected]>
Date:   Tue Apr 30 14:22:53 2013 -0300

    ecore_evas/wayland_shm: Don't destroy a non-released buffer.
    
    If the buffer is attached and committed, one must wait for its release
    callback before destroying it, otherwise some artifacts will appear on
    the window surface.
---
 ChangeLog                                   |  3 +++
 src/lib/ecore_evas/ecore_evas_private.h     |  1 +
 src/lib/ecore_evas/ecore_evas_wayland_shm.c | 41 +++++++++++++++++++++++++----
 3 files changed, 40 insertions(+), 5 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index b26987e..307e26b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1152,3 +1152,6 @@
 
         * ecore_evas/wayland_shm: Attach the buffer before adding damage.
         * ecore_evas/wayland_shm: Backport frame_callback implementation.
+
+2013-04-30  Rafael Antognolli
+        * ecore_evas/wayland_shm: Don't destroy a non-released buffer.
diff --git a/src/lib/ecore_evas/ecore_evas_private.h 
b/src/lib/ecore_evas/ecore_evas_private.h
index 6d45999..efeaa52 100644
--- a/src/lib/ecore_evas/ecore_evas_private.h
+++ b/src/lib/ecore_evas/ecore_evas_private.h
@@ -289,6 +289,7 @@ struct _Ecore_Evas_Engine
         size_t pool_size;
         void *pool_data;
         struct wl_buffer *buffer;
+        Eina_Bool buffer_valid;
 # endif
 
      } wl;
diff --git a/src/lib/ecore_evas/ecore_evas_wayland_shm.c 
b/src/lib/ecore_evas/ecore_evas_wayland_shm.c
index f47774f..d4ebf80 100644
--- a/src/lib/ecore_evas/ecore_evas_wayland_shm.c
+++ b/src/lib/ecore_evas/ecore_evas_wayland_shm.c
@@ -547,8 +547,18 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
         if (ee->engine.wl.frame)
           evas_object_resize(ee->engine.wl.frame, w, h);
 
-        if (ee->engine.wl.buffer) wl_buffer_destroy(ee->engine.wl.buffer);
-        ee->engine.wl.buffer = NULL;
+        if (ee->engine.wl.buffer)
+          {
+             if(!ee->engine.wl.buffer_valid)
+               {
+                  wl_buffer_destroy(ee->engine.wl.buffer);
+               }
+             else
+               {
+                  ee->engine.wl.buffer_valid = EINA_FALSE;
+               }
+             ee->engine.wl.buffer = NULL;
+          }
 
         _ecore_evas_wl_ensure_pool_size(ee, w, h);
 
@@ -569,8 +579,6 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
           {
 //             if (!ee->prop.fullscreen)
                ecore_wl_window_update_size(ee->engine.wl.win, w, h);
-             ecore_wl_window_buffer_attach(ee->engine.wl.win, 
-                                           ee->engine.wl.buffer, 0, 0);
           }
 
         if (ee->func.fn_resize) ee->func.fn_resize(ee);
@@ -652,6 +660,7 @@ _ecore_evas_wl_show(Ecore_Evas *ee)
      {
         ecore_wl_window_show(ee->engine.wl.win);
         ecore_wl_window_update_size(ee->engine.wl.win, ee->w, ee->h);
+        ee->engine.wl.buffer_valid = EINA_TRUE;
         ecore_wl_window_buffer_attach(ee->engine.wl.win, 
                                       ee->engine.wl.buffer, 0, 0);
 
@@ -899,6 +908,7 @@ _ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha)
    if (ee->engine.wl.win)
      {
         ecore_wl_window_update_size(ee->engine.wl.win, ee->w, ee->h);
+        ee->engine.wl.buffer_valid = EINA_TRUE;
         ecore_wl_window_buffer_attach(ee->engine.wl.win, 
                                       ee->engine.wl.buffer, 0, 0);
      }
@@ -938,6 +948,7 @@ _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int 
transparent)
    if (ee->engine.wl.win)
      {
         ecore_wl_window_update_size(ee->engine.wl.win, ee->w, ee->h);
+        ee->engine.wl.buffer_valid = EINA_TRUE;
         ecore_wl_window_buffer_attach(ee->engine.wl.win, 
                                       ee->engine.wl.buffer, 0, 0);
      }
@@ -1007,6 +1018,7 @@ _ecore_evas_wl_render(Ecore_Evas *ee)
 
                   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
+                  ee->engine.wl.buffer_valid = EINA_TRUE;
                   ecore_wl_window_buffer_attach(ee->engine.wl.win,
                                                 ee->engine.wl.buffer, 0, 0);
                   EINA_LIST_FOREACH(updates, l, r)
@@ -1097,6 +1109,22 @@ _ecore_evas_wl_shm_pool_create(int size, void **data)
    return pool;
 }
 
+static void
+_ecore_evas_wl_buffer_release(void *data, struct wl_buffer *buffer)
+{
+   Ecore_Evas *ee = data;
+
+   if (ee->engine.wl.buffer == buffer)
+     ee->engine.wl.buffer_valid = EINA_FALSE;
+   else
+     wl_buffer_destroy(buffer);
+}
+
+static const struct wl_buffer_listener _buffer_listener_release =
+{
+   _ecore_evas_wl_buffer_release
+};
+
 static void 
 _ecore_evas_wl_buffer_new(Ecore_Evas *ee, struct wl_shm_pool *pool)
 {
@@ -1110,8 +1138,11 @@ _ecore_evas_wl_buffer_new(Ecore_Evas *ee, struct 
wl_shm_pool *pool)
 
    stride = (ee->w * sizeof(int));
 
-   ee->engine.wl.buffer = 
+   ee->engine.wl.buffer =
      wl_shm_pool_create_buffer(pool, 0, ee->w, ee->h, stride, format);
+
+   wl_buffer_add_listener(ee->engine.wl.buffer,
+                          &_buffer_listener_release, ee);
 }
 
 void 

-- 

------------------------------------------------------------------------------
Introducing AppDynamics Lite, a free troubleshooting tool for Java/.NET
Get 100% visibility into your production application - at no cost.
Code-level diagnostics for performance bottlenecks with <2% overhead
Download for free and get started troubleshooting in minutes.
http://p.sf.net/sfu/appdyn_d2d_ap1

Reply via email to