[PATCH wayland] protocol: make get_subsurface double-buffered
Yong Bakos
junk at humanoriented.com
Tue May 10 14:17:05 UTC 2016
On May 10, 2016, at 3:19 AM, Pekka Paalanen <ppaalanen at gmail.com> wrote:
>
> On Mon, 9 May 2016 07:58:32 -0500
> Yong Bakos <junk at humanoriented.com> wrote:
>
>> Hi Pekka,
>> Two minor nits in the description, noted inline below.
>>
>> yong
>>
>> On May 9, 2016, at 6:45 AM, Pekka Paalanen <ppaalanen at gmail.com> wrote:
>>>
>>> From: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
>>>
>>> The existing specification was not explicitly clear on when
>>> wl_subcompositor.get_subsurface request actually adds the sub-surface to
>>> the parent in the compositor's scenegraph. The implicit assumption was
>>> that this happens immediately, but it was not written anywhere.
>>>
>>> If it happens immediately, the client doing things in a wrong order may
>>> cause a glitch on screen. Particularly, if the wl_surface B that is
>>> going to be a sub-surface for wl_surface A (the parent) already has a
>>> buffer committed, and the parent surface is mapped, then get_subsurface
>>> will (may?) cause wl_surface B to become mapped immediately. That leaves
>>> no time to set up the sub-surface z-order or position before mapping,
>>> hence there can be a visible glitch.
>>>
>>> The way to avoid that, given that the parent surface is mapped, is to
>>> not commit a buffer to wl_surface B until all the sub-surface setup is
>>> done.
>>>
>>> However, doing the sub-surface setup always requires a wl_surface.commit
>>> on the parent surface unless the defaults happen to be correct.
>>>
>>> To make setting up a subsurface slightly easier by removing one
>>> possibility for a glitch, this patch amends the specification to require
>>> a wl_surface.commit on the parent surface for get_subsurface to
>>> complete. The sub-surface cannot become mapped before a parent commit.
>>>
>>> This change may break existing clients that relied on the glitchy
>>> sequence to not need a parent surface commit to map the sub-surface.
>>> However, presumably all uses would at least issue a
>>> wl_subsurface.set_position, which requires a parent surface commit to
>>> apply. That would guarantee that there is a parent surface commit after
>>> get_subsurface, and so reduces the chances of breaking anything.
>>>
>>> In other cases, this change may simply remove a possibility for the
>>> glitch.
>>>
>>> This patch also adds a note about changing wl_surface.commit behaviour
>>> on wl_subcompositor.get_subsurface. (That could be a separate patch.)
>>>
>>> The behaviour of wl_subsurface.destroy remains as specified, even though
>>> it is now slightly asymmetrical to get_subsurface. This is emphasized by
>>> adding the word "immediately". The effects of destruction were already
>>> explicitly documented, as is the way to achieve synchronized unmapping,
>>> so changing destruction behaviour would likely be more disruptive, and
>>> also open up more corner cases (what would happen between destroy and
>>> unmapping?).
>>>
>>> Bug: https://phabricator.freedesktop.org/T7358
>>> Cc: Martin Gräßlin <mgraesslin at kde.org>
>>> Cc: Jonas Ådahl <jadahl at gmail.com>
>>> Cc: Chris Michael <cpmichael at comcast.net>
>>> Signed-off-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
>>> ---
>>> protocol/wayland.xml | 10 +++++++++-
>>> 1 file changed, 9 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/protocol/wayland.xml b/protocol/wayland.xml
>>> index 92e3f43..1546b46 100644
>>> --- a/protocol/wayland.xml
>>> +++ b/protocol/wayland.xml
>>> @@ -2487,6 +2487,14 @@
>>> The to-be sub-surface must not already have another role, and it
>>> must not have an existing wl_subsurface object. Otherwise a protocol
>>> error is raised.
>>> +
>>> + Adding sub-surfaces to a parent is a double-buffered operation on the
>>> + parent (see wl_surface.commit). The effect of adding a sub-surface
>>> + becomes visible on the next time the state of the parent surface is
>>
>> visible the next time
>>
>
> Yes.
>
>>> + applied.
>>> +
>>> + This request modifies the behaviour of wl_surface.commit request on
>>
>> requests
>
> "request" is used as a noun here and there is only one, so I think it's
> correct as is.
>
> Or which one did you mean? I think the latter is also singular, but I
> was thinking in interface terms, not as "from now on commits will
> behave differently" which would be true too, thinking in runtime terms.
>
> Alternative suggestions?
Ah, I should have been more clear. I was suggesting either:
This request modifies the behaviour of wl_surface.commit requests on
the sub-surface
-or-
This request modifies the behaviour of a wl_surface.commit request on
the sub-surface
yong
>
> Thanks,
> pq
>
>>> + the sub-surface, see the documentation on wl_subsurface interface.
>>> </description>
>>>
>>> <arg name="id" type="new_id" interface="wl_subsurface"
>>> @@ -2557,7 +2565,7 @@
>>> that was turned into a sub-surface with a
>>> wl_subcompositor.get_subsurface request. The wl_surface's association
>>> to the parent is deleted, and the wl_surface loses its role as
>>> - a sub-surface. The wl_surface is unmapped.
>>> + a sub-surface. The wl_surface is unmapped immediately.
>>> </description>
>>> </request>
>>>
>>> --
>>> 2.7.3
>>>
>>> _______________________________________________
>>> wayland-devel mailing list
>>> wayland-devel at lists.freedesktop.org
>>> https://lists.freedesktop.org/mailman/listinfo/wayland-devel
>>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 842 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20160510/2f3e5254/attachment.sig>
More information about the wayland-devel
mailing list