Blame SOURCES/0033-Use-wl_surface.damage_buffer-on-the-client-side.patch

e1c9ed
From 3027c9659866101c06252829d99e7597cef19a40 Mon Sep 17 00:00:00 2001
e1c9ed
From: Paul Olav Tvete <paul.tvete@qt.io>
e1c9ed
Date: Mon, 6 Jul 2020 14:37:35 +0200
e1c9ed
Subject: [PATCH 33/40] Use wl_surface.damage_buffer on the client side
e1c9ed
e1c9ed
Prefer the newer, recommended damage_buffer when the compositor
e1c9ed
supports it.
e1c9ed
e1c9ed
Fixes: QTBUG-74929
e1c9ed
Change-Id: I9107966910b616a666931404a7b41bfac14c22c0
e1c9ed
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
e1c9ed
(cherry picked from commit 314fd6db51277224cdc799b039ef79db1101f5cd)
e1c9ed
---
e1c9ed
 src/client/qwaylanddisplay.cpp                  |  2 +-
e1c9ed
 src/client/qwaylandwindow.cpp                   | 16 +++++++++++++---
e1c9ed
 tests/auto/client/shared/coreprotocol.h         |  2 +-
e1c9ed
 tests/auto/client/shared_old/mockcompositor.cpp |  2 +-
e1c9ed
 tests/auto/client/shared_old/mocksurface.cpp    | 10 ++++++++++
e1c9ed
 tests/auto/client/shared_old/mocksurface.h      |  2 ++
e1c9ed
 6 files changed, 28 insertions(+), 6 deletions(-)
e1c9ed
e1c9ed
diff --git a/src/client/qwaylanddisplay.cpp b/src/client/qwaylanddisplay.cpp
e1c9ed
index a7ce280a..6f1bada5 100644
e1c9ed
--- a/src/client/qwaylanddisplay.cpp
e1c9ed
+++ b/src/client/qwaylanddisplay.cpp
e1c9ed
@@ -488,7 +488,7 @@ void QWaylandDisplay::registry_global(uint32_t id, const QString &interface, uin
e1c9ed
     if (interface == QStringLiteral("wl_output")) {
e1c9ed
         mWaitingScreens << new QWaylandScreen(this, version, id);
e1c9ed
     } else if (interface == QStringLiteral("wl_compositor")) {
e1c9ed
-        mCompositorVersion = qMin((int)version, 3);
e1c9ed
+        mCompositorVersion = qMin((int)version, 4);
e1c9ed
         mCompositor.init(registry, id, mCompositorVersion);
e1c9ed
     } else if (interface == QStringLiteral("wl_shm")) {
e1c9ed
         mShm.reset(new QWaylandShm(this, version, id));
e1c9ed
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
e1c9ed
index acfe390e..4c5711a0 100644
e1c9ed
--- a/src/client/qwaylandwindow.cpp
e1c9ed
+++ b/src/client/qwaylandwindow.cpp
e1c9ed
@@ -571,7 +571,11 @@ void QWaylandWindow::attachOffset(QWaylandBuffer *buffer)
e1c9ed
 
e1c9ed
 void QWaylandWindow::damage(const QRect &rect)
e1c9ed
 {
e1c9ed
-    mSurface->damage(rect.x(), rect.y(), rect.width(), rect.height());
e1c9ed
+    const int s = scale();
e1c9ed
+    if (mDisplay->compositorVersion() >= 4)
e1c9ed
+        mSurface->damage_buffer(s * rect.x(), s * rect.y(), s * rect.width(), s * rect.height());
e1c9ed
+    else
e1c9ed
+        mSurface->damage(rect.x(), rect.y(), rect.width(), rect.height());
e1c9ed
 }
e1c9ed
 
e1c9ed
 void QWaylandWindow::safeCommit(QWaylandBuffer *buffer, const QRegion &damage)
e1c9ed
@@ -605,8 +609,14 @@ void QWaylandWindow::commit(QWaylandBuffer *buffer, const QRegion &damage)
e1c9ed
         return;
e1c9ed
 
e1c9ed
     attachOffset(buffer);
e1c9ed
-    for (const QRect &rect: damage)
e1c9ed
-        mSurface->damage(rect.x(), rect.y(), rect.width(), rect.height());
e1c9ed
+    if (mDisplay->compositorVersion() >= 4) {
e1c9ed
+        const int s = scale();
e1c9ed
+        for (const QRect &rect: damage)
e1c9ed
+            mSurface->damage_buffer(s * rect.x(), s * rect.y(), s * rect.width(), s * rect.height());
e1c9ed
+    } else {
e1c9ed
+        for (const QRect &rect: damage)
e1c9ed
+            mSurface->damage(rect.x(), rect.y(), rect.width(), rect.height());
e1c9ed
+    }
e1c9ed
     Q_ASSERT(!buffer->committed());
e1c9ed
     buffer->setCommitted();
e1c9ed
     mSurface->commit();
e1c9ed
diff --git a/tests/auto/client/shared/coreprotocol.h b/tests/auto/client/shared/coreprotocol.h
e1c9ed
index a1af137a..296dbf47 100644
e1c9ed
--- a/tests/auto/client/shared/coreprotocol.h
e1c9ed
+++ b/tests/auto/client/shared/coreprotocol.h
e1c9ed
@@ -158,7 +158,7 @@ class WlCompositor : public Global, public QtWaylandServer::wl_compositor
e1c9ed
 {
e1c9ed
     Q_OBJECT
e1c9ed
 public:
e1c9ed
-    explicit WlCompositor(CoreCompositor *compositor, int version = 3)
e1c9ed
+    explicit WlCompositor(CoreCompositor *compositor, int version = 4)
e1c9ed
         : QtWaylandServer::wl_compositor(compositor->m_display, version)
e1c9ed
         , m_compositor(compositor)
e1c9ed
     {}
e1c9ed
diff --git a/tests/auto/client/shared_old/mockcompositor.cpp b/tests/auto/client/shared_old/mockcompositor.cpp
e1c9ed
index a415cbf5..b1d3d07d 100644
e1c9ed
--- a/tests/auto/client/shared_old/mockcompositor.cpp
e1c9ed
+++ b/tests/auto/client/shared_old/mockcompositor.cpp
e1c9ed
@@ -342,7 +342,7 @@ Compositor::Compositor(MockCompositor *mockCompositor)
e1c9ed
         exit(EXIT_FAILURE);
e1c9ed
     }
e1c9ed
 
e1c9ed
-    wl_global_create(m_display, &wl_compositor_interface, 1, this, bindCompositor);
e1c9ed
+    wl_global_create(m_display, &wl_compositor_interface, 4, this, bindCompositor);
e1c9ed
 
e1c9ed
     m_data_device_manager.reset(new DataDeviceManager(this, m_display));
e1c9ed
 
e1c9ed
diff --git a/tests/auto/client/shared_old/mocksurface.cpp b/tests/auto/client/shared_old/mocksurface.cpp
e1c9ed
index e9df5f90..c3246e4a 100644
e1c9ed
--- a/tests/auto/client/shared_old/mocksurface.cpp
e1c9ed
+++ b/tests/auto/client/shared_old/mocksurface.cpp
e1c9ed
@@ -125,6 +125,16 @@ void Surface::surface_damage(Resource *resource,
e1c9ed
     Q_UNUSED(height);
e1c9ed
 }
e1c9ed
 
e1c9ed
+void Surface::surface_damage_buffer(Resource *resource,
e1c9ed
+                                    int32_t x, int32_t y, int32_t width, int32_t height)
e1c9ed
+{
e1c9ed
+    Q_UNUSED(resource);
e1c9ed
+    Q_UNUSED(x);
e1c9ed
+    Q_UNUSED(y);
e1c9ed
+    Q_UNUSED(width);
e1c9ed
+    Q_UNUSED(height);
e1c9ed
+}
e1c9ed
+
e1c9ed
 void Surface::surface_frame(Resource *resource,
e1c9ed
                             uint32_t callback)
e1c9ed
 {
e1c9ed
diff --git a/tests/auto/client/shared_old/mocksurface.h b/tests/auto/client/shared_old/mocksurface.h
e1c9ed
index 949dc23d..d176837e 100644
e1c9ed
--- a/tests/auto/client/shared_old/mocksurface.h
e1c9ed
+++ b/tests/auto/client/shared_old/mocksurface.h
e1c9ed
@@ -65,6 +65,8 @@ protected:
e1c9ed
                         struct wl_resource *buffer, int x, int y) override;
e1c9ed
     void surface_damage(Resource *resource,
e1c9ed
                         int32_t x, int32_t y, int32_t width, int32_t height) override;
e1c9ed
+    void surface_damage_buffer(Resource *resource,
e1c9ed
+                               int32_t x, int32_t y, int32_t width, int32_t height) override;
e1c9ed
     void surface_frame(Resource *resource,
e1c9ed
                        uint32_t callback) override;
e1c9ed
     void surface_commit(Resource *resource) override;
e1c9ed
-- 
e1c9ed
2.35.1
e1c9ed