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 }