File indexing completed on 2024-05-12 05:31:06
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 <QList> 0013 #include <QPointer> 0014 #include <QSize> 0015 #include <QSocketNotifier> 0016 0017 #include <memory> 0018 #include <sys/types.h> 0019 0020 namespace KWin 0021 { 0022 0023 class Session; 0024 class Udev; 0025 class UdevMonitor; 0026 class UdevDevice; 0027 0028 class DrmAbstractOutput; 0029 class Cursor; 0030 class DrmGpu; 0031 class DrmVirtualOutput; 0032 class DrmRenderBackend; 0033 0034 class KWIN_EXPORT DrmBackend : public OutputBackend 0035 { 0036 Q_OBJECT 0037 0038 public: 0039 explicit DrmBackend(Session *session, QObject *parent = nullptr); 0040 ~DrmBackend() override; 0041 0042 std::unique_ptr<InputBackend> createInputBackend() override; 0043 std::unique_ptr<QPainterBackend> createQPainterBackend() override; 0044 std::unique_ptr<OpenGLBackend> createOpenGLBackend() override; 0045 EglDisplay *sceneEglDisplayObject() const override; 0046 0047 bool initialize() override; 0048 0049 Outputs outputs() const override; 0050 Session *session() const override; 0051 0052 QList<CompositingType> supportedCompositors() const override; 0053 0054 QString supportInformation() const override; 0055 Output *createVirtualOutput(const QString &name, const QSize &size, double scale) override; 0056 void removeVirtualOutput(Output *output) override; 0057 0058 DrmGpu *primaryGpu() const; 0059 DrmGpu *findGpu(dev_t deviceId) const; 0060 size_t gpuCount() const; 0061 0062 void setRenderBackend(DrmRenderBackend *backend); 0063 DrmRenderBackend *renderBackend() const; 0064 0065 void releaseBuffers(); 0066 void updateOutputs(); 0067 0068 const std::vector<std::unique_ptr<DrmGpu>> &gpus() const; 0069 0070 public Q_SLOTS: 0071 void sceneInitialized() override; 0072 0073 Q_SIGNALS: 0074 void gpuAdded(DrmGpu *gpu); 0075 void gpuRemoved(DrmGpu *gpu); 0076 0077 protected: 0078 bool applyOutputChanges(const OutputConfiguration &config) override; 0079 0080 private: 0081 friend class DrmGpu; 0082 void addOutput(DrmAbstractOutput *output); 0083 void removeOutput(DrmAbstractOutput *output); 0084 void handleUdevEvent(); 0085 DrmGpu *addGpu(const QString &fileName); 0086 0087 std::unique_ptr<Udev> m_udev; 0088 std::unique_ptr<UdevMonitor> m_udevMonitor; 0089 std::unique_ptr<QSocketNotifier> m_socketNotifier; 0090 Session *m_session; 0091 QList<DrmAbstractOutput *> m_outputs; 0092 QList<QUuid> m_recentlyUnpluggedDpmsOffOutputs; 0093 0094 const QStringList m_explicitGpus; 0095 std::vector<std::unique_ptr<DrmGpu>> m_gpus; 0096 DrmRenderBackend *m_renderBackend = nullptr; 0097 }; 0098 0099 }