[PATCH weston 6/6] window: honour wl_buffer.release

Kristian Høgsberg hoegsberg at gmail.com
Mon Dec 3 06:53:41 PST 2012


On Mon, Dec 03, 2012 at 01:55:26PM +0200, Pekka Paalanen wrote:
> On Tue, 27 Nov 2012 15:57:30 -0500
> Kristian Høgsberg <hoegsberg at gmail.com> wrote:
> 
> > On Mon, Nov 19, 2012 at 05:16:02PM +0200, Pekka Paalanen wrote:
> > > Listen for wl_buffer.release events in the shm path, and if a previously
> > > posted buffer is still held by the server, allocate another one. The
> > > maximum of two should be enough, since there is no point for a server to
> > > hold more than one buffer at a time.
> > > 
> > > Buffer allocation happens as needed instead of window creation time.
> > > 
> > > Signed-off-by: Pekka Paalanen <ppaalanen at gmail.com>
> > > ---
> > >  clients/window.c |  113 ++++++++++++++++++++++++++++++++++++------------------
> > >  1 files changed, 76 insertions(+), 37 deletions(-)
> > > 
> > > diff --git a/clients/window.c b/clients/window.c
> > > index bda6866..0279aae 100644
> > > --- a/clients/window.c
> > > +++ b/clients/window.c
> > > @@ -782,6 +782,26 @@ display_create_surface(struct display *display,
> > >  					  NULL, NULL);
> > >  }
> > >  
> > > +struct shm_surface_leaf {
> > > +	cairo_surface_t *cairo_surface;
> > > +	/* 'data' is automatically destroyed, when 'cairo_surface' is */
> > > +	struct shm_surface_data *data;
> > > +
> > > +	struct shm_pool *resize_pool;
> > > +	int busy;
> > > +};
> > > +
> > > +static void
> > > +shm_surface_leaf_release(struct shm_surface_leaf *leaf)
> > > +{
> > > +	if (leaf->cairo_surface)
> > > +		cairo_surface_destroy(leaf->cairo_surface);
> > > +	/* leaf->data already destroyed via cairo private */
> > > +
> > > +	if (leaf->resize_pool)
> > > +		shm_pool_destroy(leaf->resize_pool);
> > > +}
> > > +
> > >  struct shm_surface {
> > >  	struct toysurface base;
> > >  	struct display *display;
> > > @@ -789,11 +809,8 @@ struct shm_surface {
> > >  	uint32_t flags;
> > >  	int dx, dy;
> > >  
> > > -	cairo_surface_t *cairo_surface;
> > > -	/* 'data' is automatically destroyed, when 'cairo_surface' is */
> > > -	struct shm_surface_data *data;
> > > -
> > > -	struct shm_pool *resize_pool;
> > > +	struct shm_surface_leaf leaf[2];
> > > +	struct shm_surface_leaf *current;
> > >  };
> > >  
> > >  static struct shm_surface *
> > > @@ -802,50 +819,78 @@ to_shm_surface(struct toysurface *base)
> > >  	return container_of(base, struct shm_surface, base);
> > >  }
> > >  
> > > +static void
> > > +shm_surface_buffer_release(void *data, struct wl_buffer *buffer)
> > > +{
> > > +	struct shm_surface_leaf *leaf = data;
> > > +
> > > +	leaf->busy = 0;
> > 
> > If we end up with both buffers released, should we
> > shm_surface_leaf_release() it?
> 
> Hi Kristian,
> 
> in theory yes, it would be nice, but I do not think such a case can
> occur with the existing backends, ever. The compositor, or backends
> really, do not dynamically switch between allowing single-buffered
> clients and requiring clients to double-buffer. The backends either
> always require double-buffering (egl buffers, and shm buffers on rpi
> with planes enabled), or they pass shm buffers only to the gl-renderer
> and allow single-buffering. I also cannot imagine a realistic scenario,
> where dynamic switching would be useful enough.
> 
> Do you want me to implement it still? Testing it will be a bit of a
> hassle, since I need to force the compositor to dynamically change its
> behaviour.
> 
> Or just add a comment stating the above?

Yeah, ok, I suppose just a comment is fine.

Kristian


More information about the wayland-devel mailing list