diff options
author | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io> | 2022-11-30 13:16:51 +0100 |
---|---|---|
committer | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io> | 2022-12-07 10:35:03 +0100 |
commit | 510fc8325774d3bef2ed474b8a28f90d31c5aebc (patch) | |
tree | 8c28b4ebf34c5e907f93abd7259b7dc51a4c514d /src | |
parent | 8f9fa232ac72a5f0caf58e120f3825820423c4de (diff) | |
download | qtwayland-510fc8325774d3bef2ed474b8a28f90d31c5aebc.tar.gz |
compositor: Fix warning on damage/damage_buffer mix
The damage() request has been deprecated in favor of the
damage_buffer() request, which is the one we use in Qt 6
as long as the version is 4 or higher. See change:
314fd6db51277224cdc799b039ef79db1101f5cd.
However, eglSwapBuffers() will in some drivers still send
the old request, causing us to get a mix of incompatible
requests, since they are in different coordinate systems.
We need to store these separately so that we can apply
them both correctly once we get a commit.
Fixes: QTBUG-108765
Change-Id: I9bbe0c87731847a4fa1927957dfd8945bd49c474
Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/compositor/compositor_api/qwaylandsurface.cpp | 45 | ||||
-rw-r--r-- | src/compositor/compositor_api/qwaylandsurface_p.h | 4 |
2 files changed, 22 insertions, 27 deletions
diff --git a/src/compositor/compositor_api/qwaylandsurface.cpp b/src/compositor/compositor_api/qwaylandsurface.cpp index 84fef3c0..cc89219b 100644 --- a/src/compositor/compositor_api/qwaylandsurface.cpp +++ b/src/compositor/compositor_api/qwaylandsurface.cpp @@ -177,18 +177,12 @@ void QWaylandSurfacePrivate::surface_attach(Resource *, struct wl_resource *buff void QWaylandSurfacePrivate::surface_damage(Resource *, int32_t x, int32_t y, int32_t width, int32_t height) { - if (Q_UNLIKELY(pending.damageInBufferCoordinates && !pending.damage.isNull())) - qCWarning(qLcWaylandCompositor) << "Unsupported: Client is using both wl_surface.damage_buffer and wl_surface.damage."; - pending.damage = pending.damage.united(QRect(x, y, width, height)); - pending.damageInBufferCoordinates = false; + pending.surfaceDamage = pending.surfaceDamage.united(QRect(x, y, width, height)); } void QWaylandSurfacePrivate::surface_damage_buffer(Resource *, int32_t x, int32_t y, int32_t width, int32_t height) { - if (Q_UNLIKELY(!pending.damageInBufferCoordinates && !pending.damage.isNull())) - qCWarning(qLcWaylandCompositor) << "Unsupported: Client is using both wl_surface.damage_buffer and wl_surface.damage."; - pending.damage = pending.damage.united(QRect(x, y, width, height)); - pending.damageInBufferCoordinates = true; + pending.bufferDamage = pending.bufferDamage.united(QRect(x, y, width, height)); } void QWaylandSurfacePrivate::surface_frame(Resource *resource, uint32_t callback) @@ -232,22 +226,23 @@ void QWaylandSurfacePrivate::surface_commit(Resource *) sourceGeometry = !pending.sourceGeometry.isValid() ? QRect(QPoint(), surfaceSize) : pending.sourceGeometry; destinationSize = pending.destinationSize.isEmpty() ? sourceGeometry.size().toSize() : pending.destinationSize; QRect destinationRect(QPoint(), destinationSize); - if (!pending.damageInBufferCoordinates || pending.bufferScale == 1) { - // pending.damage is already in surface coordinates - damage = pending.damage.intersected(QRect(QPoint(), destinationSize)); - } else { - // We must transform pending.damage from buffer coordinate system to surface coordinates - // TODO(QTBUG-85461): Also support wp_viewport setting more complex transformations - auto xform = [](const QRect &r, int scale) -> QRect { - QRect res{ - QPoint{ r.x() / scale, r.y() / scale }, - QPoint{ (r.right() + scale - 1) / scale, (r.bottom() + scale - 1) / scale } + // pending.damage is already in surface coordinates + damage = pending.surfaceDamage.intersected(destinationRect); + if (!pending.bufferDamage.isNull()) { + if (bufferScale == 1) { + damage |= pending.bufferDamage.intersected(destinationRect); // Already in surface coordinates + } else { + // We must transform pending.damage from buffer coordinate system to surface coordinates + // TODO(QTBUG-85461): Also support wp_viewport setting more complex transformations + auto xform = [](const QRect &r, int scale) -> QRect { + QRect res{ + QPoint{ r.x() / scale, r.y() / scale }, + QPoint{ (r.right() + scale - 1) / scale, (r.bottom() + scale - 1) / scale } + }; + return res; }; - return res; - }; - damage = {}; - for (const QRect &r : pending.damage) { - damage |= xform(r, bufferScale).intersected(destinationRect); + for (const QRect &r : pending.bufferDamage) + damage |= xform(r, bufferScale).intersected(destinationRect); } } hasContent = bufferRef.hasContent(); @@ -269,8 +264,8 @@ void QWaylandSurfacePrivate::surface_commit(Resource *) pending.buffer = QWaylandBufferRef(); pending.offset = QPoint(); pending.newlyAttached = false; - pending.damage = QRegion(); - pending.damageInBufferCoordinates = false; + pending.bufferDamage = QRegion(); + pending.surfaceDamage = QRegion(); pendingFrameCallbacks.clear(); // Notify buffers and views diff --git a/src/compositor/compositor_api/qwaylandsurface_p.h b/src/compositor/compositor_api/qwaylandsurface_p.h index c0beec7d..54c2282a 100644 --- a/src/compositor/compositor_api/qwaylandsurface_p.h +++ b/src/compositor/compositor_api/qwaylandsurface_p.h @@ -114,8 +114,8 @@ public: //member variables struct { QWaylandBufferRef buffer; - QRegion damage; - bool damageInBufferCoordinates = false; + QRegion surfaceDamage; + QRegion bufferDamage; QPoint offset; bool newlyAttached = false; QRegion inputRegion; |