[PATCH weston 01/12] window: destroy the 2nd shm buffer, if both released

Pekka Paalanen ppaalanen at gmail.com
Wed Feb 13 06:17:12 PST 2013


Handle the case when we the compositor somehow migrates from requiring
double buffering into working on single buffering, so we release the
extra shm buffer.

Currently, I do not think this can happen in practice, but in the future
it may happen with sub-surfaces.

Signed-off-by: Pekka Paalanen <ppaalanen at gmail.com>
---
 clients/window.c | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/clients/window.c b/clients/window.c
index 9c21f06..08486be 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -807,6 +807,8 @@ shm_surface_leaf_release(struct shm_surface_leaf *leaf)
 
 	if (leaf->resize_pool)
 		shm_pool_destroy(leaf->resize_pool);
+
+	memset(leaf, 0, sizeof *leaf);
 }
 
 struct shm_surface {
@@ -829,17 +831,17 @@ to_shm_surface(struct toysurface *base)
 static void
 shm_surface_buffer_release(void *data, struct wl_buffer *buffer)
 {
-	struct shm_surface_leaf *leaf = data;
+	struct shm_surface *surface = data;
 
-	leaf->busy = 0;
+	if (surface->leaf[0].data->buffer == buffer)
+		surface->leaf[0].busy = 0;
+	else if (surface->leaf[1].data->buffer == buffer)
+		surface->leaf[1].busy = 0;
+	else
+		assert(0 && "shm_surface_buffer_release: unknown buffer");
 
-	/* If both leaves are now free, we should call
-	 * shm_surface_leaf_release(shm_surface::leaf[1]).
-	 * However, none of Weston's backends switch dynamically
-	 * between early buffer release and requiring double-buffering,
-	 * so if both leaves are free, we never used the second
-	 * leaf to begin with.
-	 */
+	if (!surface->leaf[0].busy && !surface->leaf[1].busy)
+		shm_surface_leaf_release(&surface->leaf[1]);
 }
 
 static const struct wl_buffer_listener shm_surface_buffer_listener = {
@@ -908,7 +910,7 @@ shm_surface_prepare(struct toysurface *base, int dx, int dy,
 					   leaf->resize_pool,
 					   &leaf->data);
 	wl_buffer_add_listener(leaf->data->buffer,
-			       &shm_surface_buffer_listener, leaf);
+			       &shm_surface_buffer_listener, surface);
 
 out:
 	surface->current = leaf;
-- 
1.7.12.4



More information about the wayland-devel mailing list