Buffer Filters

Pekka Paalanen ppaalanen at gmail.com
Sat Apr 27 23:24:54 PDT 2013


On Fri, 26 Apr 2013 09:48:19 -0500
Jason Ekstrand <jason at jlekstrand.net> wrote:

> Wayland Devs,
> 
> What follows is an idea that's been kicking around my head for a little
> while now due to a discussion on the list a month or so ago.  The basic
> idea is to add an interface that provides some additional buffer types that
> don't have any back-end data of their own, but act as filters for other
> buffers.
> 
> As you would expect, the interface would have an enum representing all of
> the filters supported by the compositor and an event that would announce
> all of the supported filters upon binding by the client.  Then, there would
> be a series of "create_" requests that would take a new_id of type
> wl_buffer (for the newly created filter), a object argument of type
> wl_buffer for the buffer being wrapped, and possibly some other arguments
> depending on the filter.  In theory, you could stack filters, but that
> might get dicey and we would have to define some semantics for that.  I'm
> sure there are more filters that would be useful, but here are a couple
> that come to mind.
> 
> INVISIBLE
> 
> This is not really a filter.  Rather, it would be a buffer that has a size,
> but no content whatsoever.  The compositor would know that the surface to
> which this buffer is attached and, while it would be mapped onscreen would
> never be rendered.
> 
> I can think of a few different possible uses for this (mostly having to do
> with sub-ssurfaces).  For example, you could use an invisible buffer the
> size of your entire window to catch all of the input events and then patch
> the window together out of input-unaware subsurfaces.  I don't remember all
> of the details of subsurfaces and input, but this seems useful to me.

I don't really like the idea of a shortcut invisible buffer. The
problems you pointed out with sub-surfaces and the surface tree
structure; I have started to think all those difficulties are due
to not having a protocol object for a window. A window object could
be just a container for wl_surfaces, without any of its own
content, but adding that now would be too disruptive, I guess.

> SCALE/ZOOM
> 
> This would create a buffer whose content is provided by another buffer but
> has a different size.  The compositor would scale via GL or hardware
> overlays.  We would probably need an additional argument for the type of
> scaling (linear, cubic, etc.)
> 
> One possible use for this would be, for example, a video player.  A
> standard DVD video is encoded at 720x480 but is *always* scaled (720x480 is
> neither 16:9 or 4:3).  This would allow a media player to provide a 720x480
> video stream at 24 or 30 FPS and then have the compositor scale it up to
> 1920x1080 or whatever.  For fullscreen surfaces, this isn't a problem, but
> if they have a non-fullscreen but still big window, the client currently
> has to provide it at full resolution.
> 
> This has huge bandwidth advantages if the client is using wl_shm.  Also, it
> would allow the compositor to use hardware overlays when available to do
> the scaling which are (from what I know) more efficient and often provide
> better scaling than a client will get even with GL.

FWIW, on Friday afternoon I already wrote half of the XML protocol
spec for a crop & scale extension for wl_surfaces. The basic idea
is similar to sub-surfaces and shell surfaces: a global factory,
which you use to create an additional interface object for a
wl_surface. This interface object then allows you to set the source
rectangle to be read from a buffer, and destination size, which
will become the surface size on the next commit.

> This is just a quick list of a couple ideas.  Perhaps more immediate
> questions are, Is this useful? and, Is this too much of an abuse of
> wl_buffer?

For the use cases you mentioned, I am sceptical. It would certainly
be complex. For instance, as you have wl_buffers referencing other
wl_buffers, how do you implement buffer releasing logic? The
logical possibility of stacking you mentioned is also a problem: if
it is not supported, do we need a non-fatal way to notify about it?
If we do, that essentially becomes a roundtrip requirement: "did
this operation succeed?"

Right now, the wl_buffer reservance logic is fairly simple. A
committed attach makes a wl_buffer reserved by the server, and when
the server is guaranteed to not need the buffer anymore, it sends
the release event. If we have wl_buffers referencing wl_buffers,
when does a wl_buffer become reserved or released?

I would need to see more compelling use cases for your scheme to
be able to support it.


Thanks,
pq


More information about the wayland-devel mailing list