File indexing completed on 2024-05-19 16:33:45
0001 /* 0002 KWin - the KDE window manager 0003 This file is part of the KDE project. 0004 0005 SPDX-FileCopyrightText: 2015 Martin Gräßlin <mgraesslin@kde.org> 0006 0007 SPDX-License-Identifier: GPL-2.0-or-later 0008 */ 0009 #pragma once 0010 #include "core/outputbackend.h" 0011 0012 #include "dpmsinputeventfilter.h" 0013 0014 #include <QPointer> 0015 #include <QSize> 0016 #include <QSocketNotifier> 0017 #include <QVector> 0018 0019 #include <memory> 0020 0021 struct gbm_bo; 0022 0023 namespace KWin 0024 { 0025 0026 class Session; 0027 class Udev; 0028 class UdevMonitor; 0029 class UdevDevice; 0030 0031 class DrmAbstractOutput; 0032 class Cursor; 0033 class DrmGpu; 0034 class DrmVirtualOutput; 0035 class DrmRenderBackend; 0036 0037 class KWIN_EXPORT DrmBackend : public OutputBackend 0038 { 0039 Q_OBJECT 0040 0041 public: 0042 explicit DrmBackend(Session *session, QObject *parent = nullptr); 0043 ~DrmBackend() override; 0044 0045 Session *session() const; 0046 0047 std::unique_ptr<InputBackend> createInputBackend() override; 0048 std::unique_ptr<QPainterBackend> createQPainterBackend() override; 0049 std::unique_ptr<OpenGLBackend> createOpenGLBackend() override; 0050 0051 std::optional<DmaBufParams> testCreateDmaBuf(const QSize &size, quint32 format, const QVector<uint64_t> &modifiers) override; 0052 std::shared_ptr<DmaBufTexture> createDmaBufTexture(const QSize &size, quint32 format, const uint64_t modifier) override; 0053 bool initialize() override; 0054 0055 Outputs outputs() const override; 0056 0057 void createDpmsFilter(); 0058 void checkOutputsAreOn(); 0059 0060 QVector<CompositingType> supportedCompositors() const override; 0061 0062 QString supportInformation() const override; 0063 Output *createVirtualOutput(const QString &name, const QSize &size, double scale) override; 0064 void removeVirtualOutput(Output *output) override; 0065 0066 DrmGpu *primaryGpu() const; 0067 DrmGpu *findGpu(dev_t deviceId) const; 0068 size_t gpuCount() const; 0069 0070 bool isActive() const; 0071 0072 void setRenderBackend(DrmRenderBackend *backend); 0073 DrmRenderBackend *renderBackend() const; 0074 0075 void releaseBuffers(); 0076 void updateOutputs(); 0077 0078 const std::vector<std::unique_ptr<DrmGpu>> &gpus() const; 0079 0080 public Q_SLOTS: 0081 void turnOutputsOn(); 0082 void sceneInitialized() override; 0083 0084 Q_SIGNALS: 0085 void activeChanged(); 0086 void gpuAdded(DrmGpu *gpu); 0087 void gpuRemoved(DrmGpu *gpu); 0088 0089 protected: 0090 bool applyOutputChanges(const OutputConfiguration &config) override; 0091 0092 private: 0093 friend class DrmGpu; 0094 void addOutput(DrmAbstractOutput *output); 0095 void removeOutput(DrmAbstractOutput *output); 0096 void activate(bool active); 0097 void reactivate(); 0098 void deactivate(); 0099 void handleUdevEvent(); 0100 DrmGpu *addGpu(const QString &fileName); 0101 0102 std::unique_ptr<Udev> m_udev; 0103 std::unique_ptr<UdevMonitor> m_udevMonitor; 0104 std::unique_ptr<QSocketNotifier> m_socketNotifier; 0105 Session *m_session; 0106 QVector<DrmAbstractOutput *> m_outputs; 0107 DrmVirtualOutput *m_placeHolderOutput = nullptr; 0108 0109 bool m_active = false; 0110 const QStringList m_explicitGpus; 0111 std::vector<std::unique_ptr<DrmGpu>> m_gpus; 0112 std::unique_ptr<DpmsInputEventFilter> m_dpmsFilter; 0113 DrmRenderBackend *m_renderBackend = nullptr; 0114 0115 gbm_bo *createBo(const QSize &size, quint32 format, const QVector<uint64_t> &modifiers); 0116 }; 0117 0118 }