summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 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;