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