Call frameRendered for undamaged Wayland surfaces

Currently, if a Wayland surface registers a frame callback but does
not send a damage event, the callback will not be serviced even after
KWin has completed a compositing cycle and is therefore ready to
render a new frame for the surface. Since some clients, including any
using NVIDIA's Wayland EGL implementation, wait for frame events
before preparing each frame this behavior can result in hangs if a
compositing cycle occurs between registering the frame callback and
sending the damage event.

Instead, in accordance with the Wayland specification, frame callbacks
should be serviced (via KWayland::Server::SurfaceInterface::frameRendered)
for all visible windows - not just those damaged since the last
compositing cycle.
icc-effect-5.17.5
Erik Kurzinger 2019-01-29 12:37:17 -08:00
parent 18dd0327c2
commit f294e7a035
1 changed files with 1 additions and 1 deletions

View File

@ -764,7 +764,7 @@ void Compositor::performCompositing()
m_timeSinceStart += m_timeSinceLastVBlank;
if (waylandServer()) {
for (Toplevel *win : qAsConst(damaged)) {
for (Toplevel *win : qAsConst(windows)) {
if (auto surface = win->surface()) {
surface->frameRendered(m_timeSinceStart);
}