diff options
-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; |