[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kwin] plugins/platforms/virtual: Convert virtual backend to per screen rendering
From:       David Edmundson <kde () davidedmundson ! co ! uk>
Date:       2016-11-11 12:56:58
Message-ID: E1c5BO6-0008NE-D4 () code ! kde ! org
[Download RAW message or body]

Git commit 1776b5f927881e5c0733170a810a094caa16b64f by David Edmundson.
Committed on 11/11/2016 at 12:56.
Pushed by davidedmundson into branch 'master'.

Convert virtual backend to per screen rendering

Summary:
Output scaling can't ever work on a single buffer; especially if they're
different scales and overlapping.

This ports the virtual backend to perScreenRendering so that I can use
it for
tests.

ctest fails here, but it fails on the tests that it failed on before..

Reviewers: #plasma

Subscribers: plasma-devel, kwin

Tags: #kwin

Differential Revision: https://phabricator.kde.org/D3306

M  +23   -7    plugins/platforms/virtual/scene_qpainter_virtual_backend.cpp
M  +5    -2    plugins/platforms/virtual/scene_qpainter_virtual_backend.h
M  +1    -0    plugins/platforms/virtual/screens_virtual.h
M  +8    -0    plugins/platforms/virtual/virtual_backend.h

http://commits.kde.org/kwin/1776b5f927881e5c0733170a810a094caa16b64f

diff --git a/plugins/platforms/virtual/scene_qpainter_virtual_backend.cpp \
b/plugins/platforms/virtual/scene_qpainter_virtual_backend.cpp index 84ccecf..7d2c4ab \
                100644
--- a/plugins/platforms/virtual/scene_qpainter_virtual_backend.cpp
+++ b/plugins/platforms/virtual/scene_qpainter_virtual_backend.cpp
@@ -20,6 +20,7 @@ along with this program.  If not, see \
<http://www.gnu.org/licenses/>.  #include "scene_qpainter_virtual_backend.h"
 #include "virtual_backend.h"
 #include "cursor.h"
+#include "screens.h"
 
 #include <QPainter>
 
@@ -27,16 +28,22 @@ namespace KWin
 {
 VirtualQPainterBackend::VirtualQPainterBackend(VirtualBackend *backend)
     : QPainterBackend()
-    , m_backBuffer(backend->size(), QImage::Format_RGB32)
     , m_backend(backend)
 {
+    connect(screens(), &Screens::changed, this, \
&VirtualQPainterBackend::createOutputs); +    createOutputs();
 }
 
 VirtualQPainterBackend::~VirtualQPainterBackend() = default;
 
 QImage *VirtualQPainterBackend::buffer()
 {
-    return &m_backBuffer;
+    return &m_backBuffers[0];
+}
+
+QImage *VirtualQPainterBackend::bufferForScreen(int screen)
+{
+    return &m_backBuffers[screen];
 }
 
 bool VirtualQPainterBackend::needsFullRepaint() const
@@ -48,11 +55,13 @@ void VirtualQPainterBackend::prepareRenderingFrame()
 {
 }
 
-void VirtualQPainterBackend::screenGeometryChanged(const QSize &size)
+void VirtualQPainterBackend::createOutputs()
 {
-    if (m_backBuffer.size() != size) {
-        m_backBuffer = QImage(size, QImage::Format_RGB32);
-        m_backBuffer.fill(Qt::black);
+    m_backBuffers.clear();
+    for (int i = 0; i < screens()->count(); ++i) {
+        QImage buffer(screens()->size(i), QImage::Format_RGB32);
+        buffer.fill(Qt::black);
+        m_backBuffers << buffer;
     }
 }
 
@@ -61,7 +70,9 @@ void VirtualQPainterBackend::present(int mask, const QRegion \
&damage)  Q_UNUSED(mask)
     Q_UNUSED(damage)
     if (m_backend->saveFrames()) {
-        m_backBuffer.save(QStringLiteral("%1/%2.png").arg(m_backend->screenshotDirPath()).arg(QString::number(m_frameCounter++)));
 +        for (int i=0; i < m_backBuffers.size() ; i++) {
+            m_backBuffers[i].save(QStringLiteral("%1/screen%2-%3.png").arg(m_backend->screenshotDirPath(), \
QString::number(i), QString::number(m_frameCounter++))); +        }
     }
 }
 
@@ -70,4 +81,9 @@ bool VirtualQPainterBackend::usesOverlayWindow() const
     return false;
 }
 
+bool VirtualQPainterBackend::perScreenRendering() const
+{
+    return true;
+}
+
 }
diff --git a/plugins/platforms/virtual/scene_qpainter_virtual_backend.h \
b/plugins/platforms/virtual/scene_qpainter_virtual_backend.h index 3c91195..28a2bc5 \
                100644
--- a/plugins/platforms/virtual/scene_qpainter_virtual_backend.h
+++ b/plugins/platforms/virtual/scene_qpainter_virtual_backend.h
@@ -37,14 +37,17 @@ public:
     virtual ~VirtualQPainterBackend();
 
     QImage *buffer() override;
+    QImage *bufferForScreen(int screenId) override;
     bool needsFullRepaint() const override;
     bool usesOverlayWindow() const override;
     void prepareRenderingFrame() override;
     void present(int mask, const QRegion &damage) override;
-    void screenGeometryChanged(const QSize &size) override;
+    bool perScreenRendering() const override;
 
 private:
-    QImage m_backBuffer;
+    void createOutputs();
+
+    QVector<QImage> m_backBuffers;
     VirtualBackend *m_backend;
     int m_frameCounter = 0;
 };
diff --git a/plugins/platforms/virtual/screens_virtual.h \
b/plugins/platforms/virtual/screens_virtual.h index 7885818..c5fdbb6 100644
--- a/plugins/platforms/virtual/screens_virtual.h
+++ b/plugins/platforms/virtual/screens_virtual.h
@@ -39,6 +39,7 @@ public:
     void updateCount() override;
 
 private:
+    void createOutputs();
     VirtualBackend *m_backend;
     QVector<QRect> m_geometries;
 };
diff --git a/plugins/platforms/virtual/virtual_backend.h \
b/plugins/platforms/virtual/virtual_backend.h index c42bc3b..9a03362 100644
--- a/plugins/platforms/virtual/virtual_backend.h
+++ b/plugins/platforms/virtual/virtual_backend.h
@@ -50,6 +50,9 @@ public:
     int outputCount() const {
         return m_outputCount;
     }
+    qreal outputScale() const {
+        return m_outputScale;
+    }
 
     bool saveFrames() const {
         return !m_screenshotDir.isNull();
@@ -64,6 +67,10 @@ public:
         m_outputCount = count;
     }
 
+    Q_INVOKABLE void setOutputScale(qreal scale) {
+        m_outputScale = scale;
+    }
+
     int drmFd() const {
         return m_drmFd;
     }
@@ -85,6 +92,7 @@ Q_SIGNALS:
 private:
     QSize m_size;
     int m_outputCount = 1;
+    qreal m_outputScale = 1;
     QScopedPointer<QTemporaryDir> m_screenshotDir;
     int m_drmFd = -1;
     gbm_device *m_gbmDevice = nullptr;


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic