summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>2022-11-30 13:16:51 +0100
committerEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>2022-12-07 10:35:03 +0100
commit510fc8325774d3bef2ed474b8a28f90d31c5aebc (patch)
tree8c28b4ebf34c5e907f93abd7259b7dc51a4c514d
parent8f9fa232ac72a5f0caf58e120f3825820423c4de (diff)
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>
-rw-r--r--src/compositor/compositor_api/qwaylandsurface.cpp45
-rw-r--r--src/compositor/compositor_api/qwaylandsurface_p.h4
2 files changed, 22 insertions, 27 deletions
diff --git a/src/compositor/compositor_api/qwaylandsurface.cpp b/src/compositor/compositor_api/qwaylandsurface.cpp
index 84fef3c00..cc89219bb 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 c0beec7d5..54c2282a7 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;