KWin
Loading...
Searching...
No Matches
drm_gpu.h
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2020 Xaver Hugl <xaver.hugl@gmail.com>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9#pragma once
10
11#include "drm_pipeline.h"
13
14#include <QList>
15#include <QPointer>
16#include <QSize>
17#include <QSocketNotifier>
18#include <qobject.h>
19
20#include <epoxy/egl.h>
21#include <sys/types.h>
22
23struct gbm_device;
24
25namespace KWin
26{
27class DrmOutput;
28class DrmObject;
29class DrmCrtc;
30class DrmConnector;
31class DrmPlane;
32class DrmBackend;
33class EglGbmBackend;
34class DrmAbstractOutput;
35class DrmRenderBackend;
36class DrmVirtualOutput;
37class EglDisplay;
38class GraphicsBuffer;
39class GraphicsBufferAllocator;
40
41class DrmLease : public QObject
42{
43 Q_OBJECT
44public:
45 DrmLease(DrmGpu *gpu, FileDescriptor &&fd, uint32_t lesseeId, const QList<DrmOutput *> &outputs);
46 ~DrmLease();
47
49 uint32_t lesseeId() const;
50
51Q_SIGNALS:
53
54private:
55 DrmGpu *const m_gpu;
56 FileDescriptor m_fd;
57 const uint32_t m_lesseeId;
58 const QList<DrmOutput *> m_outputs;
59};
60
61class DrmGpu : public QObject
62{
63 Q_OBJECT
64public:
65 DrmGpu(DrmBackend *backend, const QString &devNode, int fd, dev_t deviceId);
66 ~DrmGpu();
67
68 int fd() const;
69 dev_t deviceId() const;
70 QString devNode() const;
71
72 bool isRemoved() const;
73 void setRemoved();
74 void setActive(bool active);
75 bool isActive() const;
76
77 bool atomicModeSetting() const;
78 bool addFB2ModifiersSupported() const;
79 bool asyncPageflipSupported() const;
80 bool isI915() const;
81 bool isNVidia() const;
82 gbm_device *gbmDevice() const;
83 EglDisplay *eglDisplay() const;
84 DrmBackend *platform() const;
89 clockid_t presentationClock() const;
90 QSize cursorSize() const;
91
92 QList<DrmVirtualOutput *> virtualOutputs() const;
93 QList<DrmOutput *> drmOutputs() const;
94 const QList<DrmPipeline *> pipelines() const;
95
96 void setEglDisplay(std::unique_ptr<EglDisplay> &&display);
97
98 bool updateOutputs();
99 void removeOutputs();
100
101 DrmVirtualOutput *createVirtualOutput(const QString &name, const QSize &size, double scale);
103
105 bool needsModeset() const;
106 bool maybeModeset();
107
109 std::shared_ptr<DrmFramebuffer> importBuffer(GraphicsBuffer *buffer, FileDescriptor &&explicitFence);
110 void releaseBuffers();
111 void recreateSurfaces();
112
114 std::unique_ptr<DrmLease> leaseOutputs(const QList<DrmOutput *> &outputs);
115 void waitIdle();
116
117Q_SIGNALS:
118 void activeChanged(bool active);
121
122private:
123 void dispatchEvents();
124 DrmOutput *findOutput(quint32 connector);
125 void removeOutput(DrmOutput *output);
126 void initDrmResources();
127
128 DrmPipeline::Error checkCrtcAssignment(QList<DrmConnector *> connectors, const QList<DrmCrtc *> &crtcs);
129 DrmPipeline::Error testPipelines();
130 QList<DrmObject *> unusedObjects() const;
131
132 static void pageFlipHandler(int fd, unsigned int sequence, unsigned int sec, unsigned int usec, unsigned int crtc_id, void *user_data);
133
134 const int m_fd;
135 const dev_t m_deviceId;
136 const QString m_devNode;
137 bool m_atomicModeSetting;
138 bool m_addFB2ModifiersSupported = false;
139 bool m_isNVidia;
140 bool m_isI915;
141 bool m_isVirtualMachine;
142 bool m_supportsCursorPlaneHotspot = false;
143 bool m_asyncPageflipSupported = false;
144 bool m_isRemoved = false;
145 bool m_isActive = true;
146 bool m_forceModeset = false;
147 clockid_t m_presentationClock;
148 gbm_device *m_gbmDevice;
149 FileDescriptor m_gbmFd;
150 std::unique_ptr<GraphicsBufferAllocator> m_allocator;
151 std::unique_ptr<EglDisplay> m_eglDisplay;
152 DrmBackend *const m_platform;
153
154 std::vector<std::unique_ptr<DrmPlane>> m_planes;
155 std::vector<std::unique_ptr<DrmCrtc>> m_crtcs;
156 std::vector<std::shared_ptr<DrmConnector>> m_connectors;
157 QList<DrmObject *> m_allObjects;
158 QList<DrmPipeline *> m_pipelines;
159
160 QList<DrmOutput *> m_drmOutputs;
161 QList<DrmVirtualOutput *> m_virtualOutputs;
162
163 std::unique_ptr<QSocketNotifier> m_socketNotifier;
164 QSize m_cursorSize;
165};
166
167}
void waitIdle()
Definition drm_gpu.cpp:493
bool asyncPageflipSupported() const
Definition drm_gpu.cpp:688
std::unique_ptr< DrmLease > leaseOutputs(const QList< DrmOutput * > &outputs)
Definition drm_gpu.cpp:611
void setActive(bool active)
Definition drm_gpu.cpp:713
QList< DrmOutput * > drmOutputs() const
Definition drm_gpu.cpp:643
void releaseBuffers()
Definition drm_gpu.cpp:806
void outputRemoved(DrmAbstractOutput *output)
void setEglDisplay(std::unique_ptr< EglDisplay > &&display)
Definition drm_gpu.cpp:678
DrmVirtualOutput * createVirtualOutput(const QString &name, const QSize &size, double scale)
Definition drm_gpu.cpp:595
EglDisplay * eglDisplay() const
Definition drm_gpu.cpp:673
void outputAdded(DrmAbstractOutput *output)
bool isNVidia() const
Definition drm_gpu.cpp:698
FileDescriptor createNonMasterFd() const
Definition drm_gpu.cpp:127
bool isRemoved() const
Definition drm_gpu.cpp:703
bool addFB2ModifiersSupported() const
Definition drm_gpu.cpp:683
const QList< DrmPipeline * > pipelines() const
Definition drm_gpu.cpp:590
clockid_t presentationClock() const
Definition drm_gpu.cpp:144
bool isActive() const
Definition drm_gpu.cpp:738
void setRemoved()
Definition drm_gpu.cpp:708
bool needsModeset() const
Definition drm_gpu.cpp:743
int fd() const
Definition drm_gpu.cpp:648
bool maybeModeset()
Definition drm_gpu.cpp:750
void recreateSurfaces()
Definition drm_gpu.cpp:823
QString devNode() const
Definition drm_gpu.cpp:663
DrmBackend * platform() const
Definition drm_gpu.cpp:585
std::shared_ptr< DrmFramebuffer > importBuffer(GraphicsBuffer *buffer, FileDescriptor &&explicitFence)
Definition drm_gpu.cpp:839
void activeChanged(bool active)
GraphicsBufferAllocator * graphicsBufferAllocator() const
Definition drm_gpu.cpp:834
DrmGpu(DrmBackend *backend, const QString &devNode, int fd, dev_t deviceId)
Definition drm_gpu.cpp:47
QSize cursorSize() const
Definition drm_gpu.cpp:801
void removeOutputs()
Definition drm_gpu.cpp:362
DrmPipeline::Error testPendingConfiguration()
Definition drm_gpu.cpp:431
dev_t deviceId() const
Definition drm_gpu.cpp:653
void removeVirtualOutput(DrmVirtualOutput *output)
Definition drm_gpu.cpp:603
QList< DrmVirtualOutput * > virtualOutputs() const
Definition drm_gpu.cpp:638
bool isI915() const
Definition drm_gpu.cpp:693
bool updateOutputs()
Definition drm_gpu.cpp:239
gbm_device * gbmDevice() const
Definition drm_gpu.cpp:668
bool atomicModeSetting() const
Definition drm_gpu.cpp:658
FileDescriptor & fd()
Definition drm_gpu.cpp:937
uint32_t lesseeId() const
Definition drm_gpu.cpp:942
void revokeRequested()
DrmLease(DrmGpu *gpu, FileDescriptor &&fd, uint32_t lesseeId, const QList< DrmOutput * > &outputs)
Definition drm_gpu.cpp:917