From 06d820619260850d69bc5403f6802c9bbcea27ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Tue, 5 May 2015 13:32:33 +0200 Subject: [PATCH] [wayland] Move DrmQPainterBackend into backends/drm --- CMakeLists.txt | 1 + backends/drm/drm_backend.cpp | 2 +- backends/drm/scene_qpainter_drm_backend.cpp | 122 ++++++++++++++++++++ backends/drm/scene_qpainter_drm_backend.h | 59 ++++++++++ scene_qpainter.cpp | 104 ----------------- scene_qpainter.h | 31 ----- 6 files changed, 183 insertions(+), 136 deletions(-) create mode 100644 backends/drm/scene_qpainter_drm_backend.cpp create mode 100644 backends/drm/scene_qpainter_drm_backend.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 5412b16973..6377a15e54 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -453,6 +453,7 @@ if(HAVE_WAYLAND) ${kwin_KDEINIT_SRCS} backends/drm/drm_backend.cpp backends/drm/screens_drm.cpp + backends/drm/scene_qpainter_drm_backend.cpp ) endif() if(HAVE_GBM) diff --git a/backends/drm/drm_backend.cpp b/backends/drm/drm_backend.cpp index a55eecb43d..35f6cfd1d5 100644 --- a/backends/drm/drm_backend.cpp +++ b/backends/drm/drm_backend.cpp @@ -21,7 +21,7 @@ along with this program. If not, see . #include "composite.h" #include "cursor.h" #include "logind.h" -#include "scene_qpainter.h" +#include "scene_qpainter_drm_backend.h" #include "screens_drm.h" #include "udev.h" #include "utils.h" diff --git a/backends/drm/scene_qpainter_drm_backend.cpp b/backends/drm/scene_qpainter_drm_backend.cpp new file mode 100644 index 0000000000..bb2a389997 --- /dev/null +++ b/backends/drm/scene_qpainter_drm_backend.cpp @@ -0,0 +1,122 @@ +/******************************************************************** + KWin - the KDE window manager + This file is part of the KDE project. + +Copyright (C) 2015 Martin Gräßlin + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ +#include "scene_qpainter_drm_backend.h" +#include "drm_backend.h" +#include "virtual_terminal.h" + +namespace KWin +{ + +DrmQPainterBackend::DrmQPainterBackend(DrmBackend *backend) + : QObject() + , QPainterBackend() + , m_backend(backend) +{ + const auto outputs = m_backend->outputs(); + for (auto output: outputs) { + initOutput(output); + } + connect(m_backend, &DrmBackend::outputAdded, this, &DrmQPainterBackend::initOutput); + connect(m_backend, &DrmBackend::outputRemoved, this, + [this] (DrmOutput *o) { + auto it = std::find_if(m_outputs.begin(), m_outputs.end(), + [o] (const Output &output) { + return output.output == o; + } + ); + if (it == m_outputs.end()) { + return; + } + delete (*it).buffer[0]; + delete (*it).buffer[1]; + m_outputs.erase(it); + } + ); +} + +DrmQPainterBackend::~DrmQPainterBackend() +{ + for (auto it = m_outputs.begin(); it != m_outputs.end(); ++it) { + delete (*it).buffer[0]; + delete (*it).buffer[1]; + } +} + +void DrmQPainterBackend::initOutput(DrmOutput *output) +{ + Output o; + auto initBuffer = [&o, output, this] (int index) { + o.buffer[index] = m_backend->createBuffer(output->size()); + o.buffer[index]->map(); + o.buffer[index]->image()->fill(Qt::black); + }; + initBuffer(0); + initBuffer(1); + o.output = output; + m_outputs << o; +} + +QImage *DrmQPainterBackend::buffer() +{ + return bufferForScreen(0); +} + +QImage *DrmQPainterBackend::bufferForScreen(int screenId) +{ + const Output &o = m_outputs.at(screenId); + return o.buffer[o.index]->image(); +} + +bool DrmQPainterBackend::needsFullRepaint() const +{ + return true; +} + +void DrmQPainterBackend::prepareRenderingFrame() +{ + for (auto it = m_outputs.begin(); it != m_outputs.end(); ++it) { + (*it).index = ((*it).index + 1) % 2; + } +} + +void DrmQPainterBackend::present(int mask, const QRegion &damage) +{ + Q_UNUSED(mask) + Q_UNUSED(damage) + if (!VirtualTerminal::self()->isActive()) { + return; + } + for (auto it = m_outputs.begin(); it != m_outputs.end(); ++it) { + const Output &o = *it; + m_backend->present(o.buffer[o.index], o.output); + } +} + +bool DrmQPainterBackend::usesOverlayWindow() const +{ + return false; +} + +bool DrmQPainterBackend::perScreenRendering() const +{ + return true; +} + +} \ No newline at end of file diff --git a/backends/drm/scene_qpainter_drm_backend.h b/backends/drm/scene_qpainter_drm_backend.h new file mode 100644 index 0000000000..77731ca342 --- /dev/null +++ b/backends/drm/scene_qpainter_drm_backend.h @@ -0,0 +1,59 @@ +/******************************************************************** + KWin - the KDE window manager + This file is part of the KDE project. + +Copyright (C) 2015 Martin Gräßlin + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ +#ifndef KWIN_SCENE_QPAINTER_DRM_BACKEND_H +#define KWIN_SCENE_QPAINTER_DRM_BACKEND_H +#include "scene_qpainter.h" +#include + +namespace KWin +{ + +class DrmBackend; +class DrmBuffer; +class DrmOutput; + +class DrmQPainterBackend : public QObject, public QPainterBackend +{ + Q_OBJECT +public: + DrmQPainterBackend(DrmBackend *backend); + virtual ~DrmQPainterBackend(); + + QImage *buffer() override; + QImage *bufferForScreen(int screenId); + bool needsFullRepaint() const override; + bool usesOverlayWindow() const override; + void prepareRenderingFrame() override; + void present(int mask, const QRegion &damage) override; + bool perScreenRendering() const override; + +private: + void initOutput(DrmOutput *output); + struct Output { + DrmBuffer *buffer[2]; + DrmOutput *output; + int index = 0; + }; + QVector m_outputs; + DrmBackend *m_backend; +}; +} + +#endif diff --git a/scene_qpainter.cpp b/scene_qpainter.cpp index ca2faac2cb..dc13b42447 100644 --- a/scene_qpainter.cpp +++ b/scene_qpainter.cpp @@ -28,9 +28,6 @@ along with this program. If not, see . #include "screens.h" #include "toplevel.h" #if HAVE_WAYLAND -#if HAVE_DRM -#include "backends/drm/drm_backend.h" -#endif #include "backends/fbdev/fb_backend.h" #include "virtual_terminal.h" #include "backends/wayland/wayland_backend.h" @@ -347,107 +344,6 @@ void FramebufferQPainterBackend::renderCursor(QPainter *painter) m_backend->markCursorAsRendered(); } -#if HAVE_DRM -//**************************************** -// DrmQPainterBackend -//**************************************** -DrmQPainterBackend::DrmQPainterBackend(DrmBackend *backend) - : QObject() - , QPainterBackend() - , m_backend(backend) -{ - const auto outputs = m_backend->outputs(); - for (auto output: outputs) { - initOutput(output); - } - connect(m_backend, &DrmBackend::outputAdded, this, &DrmQPainterBackend::initOutput); - connect(m_backend, &DrmBackend::outputRemoved, this, - [this] (DrmOutput *o) { - auto it = std::find_if(m_outputs.begin(), m_outputs.end(), - [o] (const Output &output) { - return output.output == o; - } - ); - if (it == m_outputs.end()) { - return; - } - delete (*it).buffer[0]; - delete (*it).buffer[1]; - m_outputs.erase(it); - } - ); -} - -DrmQPainterBackend::~DrmQPainterBackend() -{ - for (auto it = m_outputs.begin(); it != m_outputs.end(); ++it) { - delete (*it).buffer[0]; - delete (*it).buffer[1]; - } -} - -void DrmQPainterBackend::initOutput(DrmOutput *output) -{ - Output o; - auto initBuffer = [&o, output, this] (int index) { - o.buffer[index] = m_backend->createBuffer(output->size()); - o.buffer[index]->map(); - o.buffer[index]->image()->fill(Qt::black); - }; - initBuffer(0); - initBuffer(1); - o.output = output; - m_outputs << o; -} - -QImage *DrmQPainterBackend::buffer() -{ - return bufferForScreen(0); -} - -QImage *DrmQPainterBackend::bufferForScreen(int screenId) -{ - const Output &o = m_outputs.at(screenId); - return o.buffer[o.index]->image(); -} - -bool DrmQPainterBackend::needsFullRepaint() const -{ - return true; -} - -void DrmQPainterBackend::prepareRenderingFrame() -{ - for (auto it = m_outputs.begin(); it != m_outputs.end(); ++it) { - (*it).index = ((*it).index + 1) % 2; - } -} - -void DrmQPainterBackend::present(int mask, const QRegion &damage) -{ - Q_UNUSED(mask) - Q_UNUSED(damage) - if (!VirtualTerminal::self()->isActive()) { - return; - } - for (auto it = m_outputs.begin(); it != m_outputs.end(); ++it) { - const Output &o = *it; - m_backend->present(o.buffer[o.index], o.output); - } -} - -bool DrmQPainterBackend::usesOverlayWindow() const -{ - return false; -} - -bool DrmQPainterBackend::perScreenRendering() const -{ - return true; -} - -#endif - #endif //**************************************** diff --git a/scene_qpainter.h b/scene_qpainter.h index 007fd2ccb1..d0d762e48b 100644 --- a/scene_qpainter.h +++ b/scene_qpainter.h @@ -44,9 +44,6 @@ namespace Wayland { class WaylandBackend; } -class DrmBackend; -class DrmBuffer; -class DrmOutput; class FramebufferBackend; class X11WindowedBackend; @@ -190,34 +187,6 @@ private: FramebufferBackend *m_backend; }; -#if HAVE_DRM -class DrmQPainterBackend : public QObject, public QPainterBackend -{ - Q_OBJECT -public: - DrmQPainterBackend(DrmBackend *backend); - virtual ~DrmQPainterBackend(); - - QImage *buffer() override; - QImage *bufferForScreen(int screenId); - bool needsFullRepaint() const override; - bool usesOverlayWindow() const override; - void prepareRenderingFrame() override; - void present(int mask, const QRegion &damage) override; - bool perScreenRendering() const override; - -private: - void initOutput(DrmOutput *output); - struct Output { - DrmBuffer *buffer[2]; - DrmOutput *output; - int index = 0; - }; - QVector m_outputs; - DrmBackend *m_backend; -}; -#endif - #endif class SceneQPainter : public Scene