[PATCH wayland v2] protocol: Clarify the behaviour of wl_surface.attach

Pekka Paalanen ppaalanen at gmail.com
Thu Feb 16 09:58:42 UTC 2017


On Wed, 15 Feb 2017 11:49:33 -0600
Derek Foreman <derekf at osg.samsung.com> wrote:

> On 15/02/17 06:50 AM, Pekka Paalanen wrote:
> > On Wed, 15 Feb 2017 12:17:10 +0800
> > Jonas Ã…dahl <jadahl at gmail.com> wrote:
> >  
> >> On Tue, Feb 14, 2017 at 10:20:06AM -0600, Derek Foreman wrote:  
> >>> Attaching a NULL wl_buffer to a surface is not always valid, but
> >>> the previous text indicated it was.
> >>>
> >>> Instead, let's define what NULL attachment does for all the surface
> >>> roles defined in wayland.xml, stop giving a blanket definition of
> >>> its behavior in wl_surface.attach, and warn developers that they
> >>> should refer to other protocol documentation for a full understanding
> >>> of wl_surface.attach.  
> >>
> >> Good to see these things cleared up. Have some comments on the wording
> >> below, and the "cursor" role behaviour seems still undefined when
> >> attaching a NULL buffer.
> >>  
> >>>
> >>> Signed-off-by: Derek Foreman <derekf at osg.samsung.com>
> >>> ---
> >>>
> >>> Changes from v1:
> >>>  pretty much everything - define NULL attach for wl_shell specifically
> >>>  and remove the generic statement from wl_surface.attach
> >>>  refer readers to "other documentation"
> >>>
> >>>  protocol/wayland.xml | 10 +++++++---
> >>>  1 file changed, 7 insertions(+), 3 deletions(-)
> >>>
> >>> diff --git a/protocol/wayland.xml b/protocol/wayland.xml
> >>> index 29b63be..1a76e60 100644
> >>> --- a/protocol/wayland.xml
> >>> +++ b/protocol/wayland.xml
> >>> @@ -1002,6 +1002,10 @@
> >>>        the related wl_surface is destroyed. On the client side,
> >>>        wl_shell_surface_destroy() must be called before destroying
> >>>        the wl_surface object.
> >>> +
> >>> +      Attaching a NULL wl_buffer to a surface assigned a role by
> >>> +      wl_shell will remove the content from the surface after the
> >>> +      next commit.  
> >>
> >> How is "removes the content" compared to unmaps? Does this mean a shell
> >> implementation need to keep track of the position when the shell surface
> >> is later remapped? That would be a new requirement that was previously
> >> undefined behaviour, and is not what mutter does at the moment.  
> >
> > Maintaining position has been how I have always read it, but then I
> > shouldn't be allowed near desktop shell protocols. I even thought that
> > unmap also maintains the position.
> >  
> >>>      </description>
> >>>
> >>>      <request name="pong">
> >>> @@ -1324,6 +1328,9 @@
> >>>        <description summary="set the surface contents">
> >>>  	Set a buffer as the content of this surface.
> >>>
> >>> +	The role of the surface influences the behaviour of attach,
> >>> +	so this documentation is incomplete without further reading.
> >>> +  
> >>
> >> Possible alternative wording, possibly in the end of the <description/>,
> >> as it talks about things that is specified below:
> >>
> >> 	The effect committing an attached buffer to a surface depends on
> >> 	what role the surface has been or is going to be assigned to.
> >> 	See the corresponding role specification for further details.  
> >
> > Is it missing the case for "is currently"? I forget our rules about
> > changing an assigned role, but I think the wording you want here is for
> > current or the next assigned role, to cover the case where a
> > wl_surface.commit makes the wl_surface illegal for a following role
> > assignment, not just for doing an illegal thing while the role is
> > already assigned. What role it may have had in the past should not
> > matter.  
> 
> We can't re-assign a role - the wl_surface text is clear that a 
> wl_surface, once given a role, retains it for its lifetime... but we 
> could attach to a surface that does not yet have an assigned role.

Ok, right, so that's what the spec needs to cover then.

> The commit can change the role, though, so I guess what we're ultimately 
> interested in is the role the surface will have after the commit completes.

IIRC not all roles require a commit to become set. But that should be
irrelevant for wl_surface spec.

> I guess things get sticky when we attach a buffer to a surface, commit, 
> then attempt to create an xdg v6 shell surface from it.

I would expect the xdg_shell spec to explicitly forbid that.

> Or even attach a buffer to a surface (no commit!), then attempt to 
> create an xdg v6 surface from it.

And this too, since the idea IIRC was to not draw anything until the
client knows what size it should be.

> In both of these cases the error is not generated by the attach, or by 
> the commit, but by the attempt to generate an xdg v6 surface later, 
> which does not actually try set a role at that point at all :).

I'd say those details need to be explained in the xdg_shell spec.

> This leaves me banging my head on my desk because that puts me very 
> close to where I started:
> 
> The text for attach needs to explain what happens when there is no 
> surface role present.  ie)  I can attach, commit, attach NULL, commit. 
> This will remove the surface content, and I should then be able to 
> create an xdg v6 surface from the surface safely, because no buffer is 

Yes.

> attached.  (This seems like it could be interpreted as an error based on 
> one way of reading xdgv6, but weston does not appear to post an error 
> for this)

To me it would be silly to assume or require that compositors need to
track the whole history of a wl_surface to generate errors. What
actually matters, IMO, is the current and pending wl_surface state at
the time of any related request (not just commit).

To me, these are completely the same from the wl_surface state point of
view in the scope of this discussion:
- create wl_surface
- create wl_surface, attach NULL buffer
- create wl_surface, attach and commit NULL buffer
- create wl_surface, (attach a real buffer){0..n}, attach and commit
  NULL buffer
- create wl_surface, (attach and commit a real buffer){0..n}, attach
  and commit NULL buffer

> What I was originally interested in seems to be more along the lines of:
> Some roles do not allow surfaces to have their content removed.

Sounds like you've come a full circle in the above. :-)
I wouldn't write that in the wl_surface spec, though. It's both too
specific and unhelpfully vague.

> xdg v6 for example, expects no content at creation time, but after you 
> commit content in response to the first configure, you may never remove 
> the content again?

I'll let xdg_shell devs answer that. I have happily forgot all about
why they didn't want to allow committing a NULL buffer.


Thanks,
pq

> 
> Thanks,
> Derek
> 
> >>
> >> This makes read more as the behaviour of *attach* does not change, but
> >> the effect of having attached and committed a buffer.  
> >
> > Yes, it is important to make that distiction. Attach alone does
> > nothing, since a following attach may overwrite the pending buffer
> > again before it is committed. Not that clients would be sane to do
> > that, but for completeness.
> >
> > With the fixed wording:
> > Acked-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
> >
> > Not R-b because I have not read all the affected role specs in
> > wayland.xml.
> >
> >
> > Thanks,
> > pq
> >  
> >>
> >>
> >> Jonas
> >>  
> >>>  	The new size of the surface is calculated based on the buffer
> >>>  	size transformed by the inverse buffer_transform and the
> >>>  	inverse buffer_scale. This means that the supplied buffer
> >>> @@ -1358,9 +1365,6 @@
> >>>  	the surface contents. However, if the client destroys the
> >>>  	wl_buffer before receiving the wl_buffer.release event, the surface
> >>>  	contents become undefined immediately.
> >>> -
> >>> -	If wl_surface.attach is sent with a NULL wl_buffer, the
> >>> -	following wl_surface.commit will remove the surface content.
> >>>        </description>
> >>>        <arg name="buffer" type="object" interface="wl_buffer" allow-null="true"
> >>>  	   summary="buffer of surface contents"/>
> >>> --
> >>> 2.11.0
> >>>  
> >  
> 

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 801 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20170216/6e169f04/attachment.sig>


More information about the wayland-devel mailing list