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

Kristian Høgsberg hoegsberg at gmail.com
Thu Feb 14 09:29:11 PST 2013


On Wed, Feb 13, 2013 at 04:17:12PM +0200, Pekka Paalanen wrote:
> 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.

Hehe, yeah, I remember we talked about this.  Committed.

Kristian

> 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