[Differential] [Request, 645 lines] D1191: Reworking subsurface support
graesslin (Martin Gräßlin)
noreply at phabricator.kde.org
Mon Mar 21 15:17:34 UTC 2016
graesslin created this revision.
graesslin added a subscriber: Plasma.
graesslin set the repository for this revision to rKWAYLAND KWayland.
graesslin added a project: Plasma.
Herald added a subscriber: plasma-devel.
REVISION SUMMARY
This is a commit series consisting of the following individual commits. If needed I can create reviews for the individual commits.
commit 710f9eaf042f65799518e3987de82018cedcfbde
Author: Martin Gräßlin <mgraesslin at kde.org>
Date: Fri Mar 18 09:11:28 2016 +0100
[tests] Add a sub-surface test application
The test application creates a sub-surface tree consisting of overall
three surfaces:
* blue main surface
* red sub surface
* green sub surface to the red sub surface
All surfaces are in synchronized mode. There is a timer to turn the
green surface into yellow after five seconds.
commit c1db900ad8621b6364b22a7889370423a72154cc
Author: Martin Gräßlin <mgraesslin at kde.org>
Date: Fri Mar 18 09:13:27 2016 +0100
[server] Send frameRendered to all sub-surfaces
If a surface got rendered it implies that all sub-surfaces also got
rendered. So pass the frameRendered to the complete sub-surface tree.
commit 43b7e10e1a31f1e09b0a86d8f9c32a8f155bfc53
Author: Martin Gräßlin <mgraesslin at kde.org>
Date: Fri Mar 18 10:41:56 2016 +0100
[server] Add a bool SubSurfaceInterface::isSynchronized() const
The mode is not sufficient to determine whether a SubSurface is in
synchronized mode.
Quoting spec:
"Even if a sub-surface is in desynchronized mode, it will behave as in
synchronized mode, if its parent surface behaves as in synchronized mode.
This rule is applied recursively throughout the tree of surfaces.
This means, that one can set a sub-surface into synchronized mode, and
then assume that all its child and grand-child sub-surfaces are
synchronized, too, without explicitly setting them."
commit 43b7e10e1a31f1e09b0a86d8f9c32a8f155bfc53
Author: Martin Gräßlin <mgraesslin at kde.org>
Date: Fri Mar 18 10:41:56 2016 +0100
[server] Add a bool SubSurfaceInterface::isSynchronized() const
The mode is not sufficient to determine whether a SubSurface is in
synchronized mode.
Quoting spec:
"Even if a sub-surface is in desynchronized mode, it will behave as in
synchronized mode, if its parent surface behaves as in synchronized mode.
This rule is applied recursively throughout the tree of surfaces.
When committing the state of a sub-surface, the state should not
be immediately applied if the sub-surface is in synchronized mode.
Instead it should be cached and only applied after the parent surface's
state is applied.
To implement this the Surface::Private has now a third cached state
buffer. When committing the state is either swapped between pending and
current or pending and subSurfacePending. Once the parent state is
applied the state is swapped between subSurfacePending and current.
The logic for applying state changes is changed. Instead of copying the
complete state object, the individual state changes are now copied and the
source gets completely reset to default values. Only the children tree is
copied back, as that list needs to be modified.
commit c61ad393e0b3a7ec44ac5f301a77137233c9feba
Author: Martin Gräßlin <mgraesslin at kde.org>
Date: Fri Mar 18 09:57:46 2016 +0100
[server] Cache the state of synchronized sub surfaces
When committing the state of a sub-surface, the state should not
be immediately applied if the sub-surface is in synchronized mode.
Instead it should be cached and only applied after the parent surface's
state is applied.
To implement this the Surface::Private has now a third cached state
buffer. When committing the state is either swapped between pending and
current or pending and subSurfacePending. Once the parent state is
applied the state is swapped between subSurfacePending and current.
The logic for applying state changes is changed. Instead of copying the
complete state object, the individual state changes are now copied and the
source gets completely reset to default values. Only the children tree is
copied back, as that list needs to be modified.
commit f616dc48b548580a1fe831b5d1e47e50e09d96b6
Author: Martin Gräßlin <mgraesslin at kde.org>
Date: Mon Mar 21 14:32:31 2016 +0100
[server] Add a subSurfaceTreeChanged signal to SurfaceInterface
The idea behind this signal is to notify whenever the tree of sub
surfaces changes in a way that a repaint of the Surface is required.
Possible situations are:
* surface damaged
* surface unmapped
* subsurface added/removed
* subsurface moved (position changed)
* subsurface stacking changed
Ideally it would be possible to provide the actual area which needs
repainting, but due to the possible complexity of the tree, synced
and desynced changes this doesn't look worth the effort. A user of
the signal might trigger too many repaints with it, but if it really
wants to be only notified about the actual changes, it can just track
the individual sub-surfaces.
commit 045f2b6de1462961004919d6ab0935c7b435571a
Author: Martin Gräßlin <mgraesslin at kde.org>
Date: Mon Mar 21 15:53:13 2016 +0100
[server] Don't double buffer adding/removing of sub-surfaces
QtWayland doesn't commit the parent surface when creating a sub-surface.
This results in a QtWayland application to freeze as it renders to the
surface and waits for the frame rendered, which it will never get as the
Compositor waits for the commit on the parent prior to mapping the
sub-surface.
To work around this behavior, we apply the adding/removing directly.
The behavior around this is actually not fully documented, so QtWayland
is not wrong per se. See:
https://lists.freedesktop.org/archives/wayland-devel/2016-March/027540.html
Once this is properly clarified and implemented in the Client, we should
revert this change.
TEST PLAN
Most of the testing is done with the added test case in f616dc48b548580a1fe831b5d1e47e50e09d96b6
REPOSITORY
rKWAYLAND KWayland
BRANCH
subsurface-fixes
REVISION DETAIL
https://phabricator.kde.org/D1191
AFFECTED FILES
autotests/client/test_wayland_subsurface.cpp
src/server/subcompositor_interface.cpp
src/server/subcompositor_interface.h
src/server/surface_interface.cpp
src/server/surface_interface.h
src/server/surface_interface_p.h
tests/CMakeLists.txt
tests/subsurfacetest.cpp
EMAIL PREFERENCES
https://phabricator.kde.org/settings/panel/emailpreferences/
To: graesslin
Cc: plasma-devel, Plasma
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/plasma-devel/attachments/20160321/e8b21b7e/attachment-0001.html>
More information about the Plasma-devel
mailing list