summaryrefslogtreecommitdiffstats
path: root/src/client/qwaylandwindow.cpp
diff options
context:
space:
mode:
authorAleix Pol <aleixpol@kde.org>2020-09-30 13:37:12 +0200
committerAleix Pol <aleixpol@kde.org>2020-10-22 00:21:10 +0200
commitcc779e0ed47ec4759dc3c23953dd02cfacc6885c (patch)
treefc843e2ef9bbc9b2690217132e6dbfa8deead858 /src/client/qwaylandwindow.cpp
parentf637fcdbbabeb060cdd223d8bc6662d5cace6b90 (diff)
Issue set_opaque_region on opaque surfaces
The application will tell Qt whether the background is transparent through either Qt::WA_TranslucentBackground or QQuickWindow::setColor. These will set a QSurfaceFormat. This change checks the QSurfaceFormat and issues the opacity information so we can properly implement culling optimizations in the compositor. Change-Id: I4f7562467449eac7931f3011d4b835934212adad Reviewed-by: David Edmundson <davidedmundson@kde.org> (cherry picked from commit 0db685834f8377e41b147d3367b8ec514841eff5)
Diffstat (limited to 'src/client/qwaylandwindow.cpp')
-rw-r--r--src/client/qwaylandwindow.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
index 1e26ee91e..bc031ed5a 100644
--- a/src/client/qwaylandwindow.cpp
+++ b/src/client/qwaylandwindow.cpp
@@ -364,6 +364,9 @@ void QWaylandWindow::setGeometry(const QRect &rect)
if (mShellSurface)
mShellSurface->setWindowGeometry(windowContentGeometry());
+
+ if (isOpaque() && mMask.isEmpty())
+ setOpaqueArea(rect);
}
void QWaylandWindow::resizeFromApplyConfigure(const QSize &sizeWithMargins, const QPoint &offset)
@@ -463,10 +466,16 @@ void QWaylandWindow::setMask(const QRegion &mask)
if (mMask.isEmpty()) {
mSurface->set_input_region(nullptr);
+
+ if (isOpaque())
+ setOpaqueArea(QRect(QPoint(0, 0), geometry().size()));
} else {
struct ::wl_region *region = mDisplay->createRegion(mMask);
mSurface->set_input_region(region);
wl_region_destroy(region);
+
+ if (isOpaque())
+ setOpaqueArea(mMask);
}
mSurface->commit();
@@ -1215,6 +1224,23 @@ bool QtWaylandClient::QWaylandWindow::startSystemMove()
return false;
}
+bool QWaylandWindow::isOpaque() const
+{
+ return window()->requestedFormat().alphaBufferSize() <= 0;
+}
+
+void QWaylandWindow::setOpaqueArea(const QRegion &opaqueArea)
+{
+ if (opaqueArea == mOpaqueArea || !mSurface)
+ return;
+
+ mOpaqueArea = opaqueArea;
+
+ struct ::wl_region *region = mDisplay->createRegion(opaqueArea);
+ mSurface->set_opaque_region(region);
+ wl_region_destroy(region);
+}
+
}
QT_END_NAMESPACE