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 }