Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qkmsdevice_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// Copyright (C) 2016 Pelagicore AG
3// Copyright (C) 2015 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
4// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
5
6#ifndef QKMSDEVICE_P_H
7#define QKMSDEVICE_P_H
8
9//
10// W A R N I N G
11// -------------
12//
13// This file is not part of the Qt API. It exists purely as an
14// implementation detail. This header file may change from version to
15// version without notice, or even be removed.
16//
17// We mean it.
18//
19
20#include <QtGui/private/qtguiglobal_p.h>
21#include <qpa/qplatformscreen.h>
22#include <QtCore/QMap>
23#include <QtCore/QVariant>
24#include <QtCore/QThreadStorage>
25
26#include <xf86drm.h>
27#include <xf86drmMode.h>
28#include <drm_fourcc.h>
29
30#include <functional>
31
32// In less fortunate cases one may need to build on a system with dev headers
33// from the dark ages. Let's pull a GL and define the missing stuff ourselves.
34
36#define DRM_PLANE_TYPE_OVERLAY 0
37#endif
39#define DRM_PLANE_TYPE_PRIMARY 1
40#endif
42#define DRM_PLANE_TYPE_CURSOR 2
43#endif
44
45#ifndef DRM_CLIENT_CAP_UNIVERSAL_PLANES
46#define DRM_CLIENT_CAP_UNIVERSAL_PLANES 2
47#endif
48#ifndef DRM_CLIENT_CAP_ATOMIC
49#define DRM_CLIENT_CAP_ATOMIC 3
50#endif
51
52#ifndef DRM_MODE_PROP_EXTENDED_TYPE
53#define DRM_MODE_PROP_EXTENDED_TYPE 0x0000ffc0
54#endif
55#ifndef DRM_MODE_PROP_TYPE
56#define DRM_MODE_PROP_TYPE(n) ((n) << 6)
57#endif
58#ifndef DRM_MODE_PROP_OBJECT
59#define DRM_MODE_PROP_OBJECT DRM_MODE_PROP_TYPE(1)
60#endif
61#ifndef DRM_MODE_PROP_SIGNED_RANGE
62#define DRM_MODE_PROP_SIGNED_RANGE DRM_MODE_PROP_TYPE(2)
63#endif
64
65QT_BEGIN_NAMESPACE
66
67class QKmsDevice;
68
70{
71public:
76
78 virtual ~QKmsScreenConfig() {}
79
80 QString devicePath() const { return m_devicePath; }
81
82 bool headless() const { return m_headless; }
83 QSize headlessSize() const { return m_headlessSize; }
84 bool hwCursor() const { return m_hwCursor; }
85 bool separateScreens() const { return m_separateScreens; }
86 bool supportsPBuffers() const { return m_pbuffers; }
88
89 QMap<QString, QVariantMap> outputSettings() const { return m_outputSettings; }
90 virtual void loadConfig();
91 void refreshConfig();
92
93protected:
96 QSize m_headlessSize{ 1024, 768 };
102};
103
104// NB! QKmsPlane does not store the current state and offers no functions to
105// change object properties. Any such functionality belongs to subclasses since
106// in some cases atomic operations will be desired where a mere
107// drmModeObjectSetProperty would not be acceptable.
151
152Q_DECLARE_OPERATORS_FOR_FLAGS(QKmsPlane::Rotations)
153
155{
157 uint32_t connector_id = 0;
158 uint32_t crtc_index = 0;
159 uint32_t crtc_id = 0;
161 int preferred_mode = -1; // index of preferred mode in list below
162 int mode = -1; // index of selected mode in list below
163 bool mode_set = false;
164 drmModeCrtcPtr saved_crtc = nullptr;
166 int subpixel = DRM_MODE_SUBPIXEL_UNKNOWN;
167 drmModePropertyPtr dpms_prop = nullptr;
168 drmModePropertyBlobPtr edid_blob = nullptr;
169 bool wants_forced_plane = false;
170 uint32_t forced_plane_id = 0;
171 bool forced_plane_set = false;
176 struct QKmsPlane *eglfs_plane = nullptr;
178 uint32_t crtcIdPropertyId = 0;
179 uint32_t modeIdPropertyId = 0;
180 uint32_t activePropertyId = 0;
181
182 uint32_t mode_blob_id = 0;
183
184 void restoreMode(QKmsDevice *device);
185 void cleanup(QKmsDevice *device);
187 void setPowerState(QKmsDevice *device, QPlatformScreen::PowerState state);
188};
189
191{
192public:
199
201 {
203 OrderedScreen(QPlatformScreen *screen, const ScreenInfo &vinfo);
206 };
207
208 QKmsDevice(QKmsScreenConfig *screenConfig, const QString &path = QString());
209 virtual ~QKmsDevice();
210
211 virtual bool open() = 0;
212 virtual void close() = 0;
213 virtual void *nativeDisplay() const = 0;
214
215 bool hasAtomicSupport();
216
217#if QT_CONFIG(drm_atomic)
221#endif
223 void updateScreens();
224 void createScreens();
225
226 int fd() const;
227 QString devicePath() const;
228
230
231protected:
232 void registerScreens(QList<uint32_t> newConnects = QList<uint32_t>());
233 virtual QPlatformScreen *createScreen(const QKmsOutput &output) = 0;
235 virtual void registerScreenCloning(QPlatformScreen *screen,
236 QPlatformScreen *screenThisScreenClones,
237 const QList<QPlatformScreen *> &screensCloningThisScreen);
238 virtual void registerScreen(QPlatformScreen *screen,
239 bool isPrimary,
240 const QPoint &virtualPos,
241 const QList<QPlatformScreen *> &virtualSiblings) = 0;
242 virtual void unregisterScreen(QPlatformScreen *screen);
243 virtual void updateScreen(QPlatformScreen *screen, const QPoint &virtualPos,
244 const QList<QPlatformScreen *> &virtualSiblings);
245 virtual void updateScreenOutput(QPlatformScreen *screen, const QKmsOutput &output);
246
247 void setFd(int fd);
248 int crtcForConnector(drmModeResPtr resources, drmModeConnectorPtr connector);
249 bool createScreenInfoForConnector(drmModeResPtr resources, drmModeConnectorPtr connector,
250 ScreenInfo &vinfo);
251 drmModePropertyPtr connectorProperty(drmModeConnectorPtr connector, const QByteArray &name);
252 drmModePropertyBlobPtr connectorPropertyBlob(drmModeConnectorPtr connector, const QByteArray &name);
253 typedef std::function<void(drmModePropertyPtr, quint64)> PropCallback;
254 void enumerateProperties(drmModeObjectPropertiesPtr objProps, PropCallback callback);
255 void discoverPlanes();
256 void parseConnectorProperties(uint32_t connectorId, QKmsOutput *output);
257 void parseCrtcProperties(uint32_t crtcId, QKmsOutput *output);
258
262
264
265#if QT_CONFIG(drm_atomic)
266 struct AtomicReqs {
267 drmModeAtomicReq *request = nullptr;
269 };
271#endif
273
277
278private:
280};
281
282QT_END_NAMESPACE
283
284#endif
virtual void * nativeDisplay() const =0
quint32 m_crtc_allocator
QPlatformScreen * m_headlessScreen
void enumerateProperties(drmModeObjectPropertiesPtr objProps, PropCallback callback)
int fd() const
void discoverPlanes()
void checkConnectedScreens()
QList< QKmsPlane > m_planes
drmModePropertyPtr connectorProperty(drmModeConnectorPtr connector, const QByteArray &name)
virtual void unregisterScreen(QPlatformScreen *screen)
void parseCrtcProperties(uint32_t crtcId, QKmsOutput *output)
void setFd(int fd)
QKmsScreenConfig * screenConfig() const
virtual QPlatformScreen * createHeadlessScreen()
virtual ~QKmsDevice()
void updateScreens()
QKmsScreenConfig * m_screenConfig
QMap< uint32_t, OrderedScreen > m_registeredScreens
void createScreens()
virtual QPlatformScreen * createScreen(const QKmsOutput &output)=0
int crtcForConnector(drmModeResPtr resources, drmModeConnectorPtr connector)
std::function< void(drmModePropertyPtr, quint64)> PropCallback
void parseConnectorProperties(uint32_t connectorId, QKmsOutput *output)
QKmsDevice(QKmsScreenConfig *screenConfig, const QString &path=QString())
virtual void close()=0
QString devicePath() const
virtual void updateScreen(QPlatformScreen *screen, const QPoint &virtualPos, const QList< QPlatformScreen * > &virtualSiblings)
virtual void registerScreen(QPlatformScreen *screen, bool isPrimary, const QPoint &virtualPos, const QList< QPlatformScreen * > &virtualSiblings)=0
bool m_has_atomic_support
drmModePropertyBlobPtr connectorPropertyBlob(drmModeConnectorPtr connector, const QByteArray &name)
bool createScreenInfoForConnector(drmModeResPtr resources, drmModeConnectorPtr connector, ScreenInfo &vinfo)
virtual void registerScreenCloning(QPlatformScreen *screen, QPlatformScreen *screenThisScreenClones, const QList< QPlatformScreen * > &screensCloningThisScreen)
QString m_path
virtual void updateScreenOutput(QPlatformScreen *screen, const QKmsOutput &output)
virtual bool open()=0
void registerScreens(QList< uint32_t > newConnects=QList< uint32_t >())
bool hasAtomicSupport()
bool headless() const
QSize headlessSize() const
QMap< QString, QVariantMap > m_outputSettings
virtual ~QKmsScreenConfig()
bool separateScreens() const
VirtualDesktopLayout virtualDesktopLayout() const
virtual void loadConfig()
VirtualDesktopLayout m_virtualDesktopLayout
QMap< QString, QVariantMap > outputSettings() const
QString devicePath() const
bool supportsPBuffers() const
bool hwCursor() const
Q_STATIC_LOGGING_CATEGORY(lcAccessibilityCore, "qt.accessibility.core")
QDebug operator<<(QDebug dbg, const NSObject *nsObject)
Definition qcore_mac.mm:201
static void assignPlane(QKmsOutput *output, QKmsPlane *plane)
static const char *const connector_type_names[]
QDebug operator<<(QDebug dbg, const QKmsDevice::OrderedScreen &s)
static bool orderedScreenLessThan(const QKmsDevice::OrderedScreen &a, const QKmsDevice::OrderedScreen &b)
static bool propTypeIs(drmModePropertyPtr prop, uint32_t type)
static QByteArray nameForConnector(const drmModeConnectorPtr connector)
static bool parseModeline(const QByteArray &text, drmModeModeInfoPtr mode)
OutputConfiguration
@ OutputConfigModeline
@ OutputConfigSkip
@ OutputConfigPreferred
@ OutputConfigMode
@ OutputConfigOff
@ OutputConfigCurrent
#define ARRAY_LENGTH(a)
#define DRM_PLANE_TYPE_OVERLAY
#define DRM_CLIENT_CAP_UNIVERSAL_PLANES
#define DRM_PLANE_TYPE_PRIMARY
#define DRM_MODE_PROP_SIGNED_RANGE
#define DRM_PLANE_TYPE_CURSOR
#define DRM_MODE_PROP_TYPE(n)
#define DRM_MODE_PROP_EXTENDED_TYPE
#define DRM_MODE_PROP_OBJECT
OrderedScreen(QPlatformScreen *screen, const ScreenInfo &vinfo)
QPlatformScreen * screen
void restoreMode(QKmsDevice *device)
uint32_t modeIdPropertyId
QString name
uint32_t forced_plane_id
struct QKmsPlane * eglfs_plane
QString clone_source
drmModePropertyPtr dpms_prop
uint32_t mode_blob_id
void setPowerState(QKmsDevice *device, QPlatformScreen::PowerState state)
QList< QKmsPlane > available_planes
uint32_t crtc_id
bool forced_plane_set
drmModeCrtcPtr saved_crtc
QList< drmModeModeInfo > modes
drmModePropertyBlobPtr edid_blob
QPlatformScreen::SubpixelAntialiasingType subpixelAntialiasingTypeHint() const
void cleanup(QKmsDevice *device)
QSizeF physical_size
uint32_t activePropertyId
uint32_t drm_format
bool drm_format_requested_by_user
uint32_t crtc_index
uint32_t crtcIdPropertyId
bool wants_forced_plane
uint32_t connector_id
uint32_t srcheightPropertyId
uint32_t zposPropertyId
uint32_t crtcXPropertyId
uint32_t activeCrtcId
uint32_t srcXPropertyId
uint32_t framebufferPropertyId
uint32_t crtcwidthPropertyId
uint32_t crtcPropertyId
uint32_t rotationPropertyId
Rotations initialRotation
QList< uint32_t > supportedFormats
uint32_t srcYPropertyId
uint32_t crtcheightPropertyId
uint32_t crtcYPropertyId
int possibleCrtcs
uint32_t srcwidthPropertyId
uint32_t blendOpPropertyId
Rotations availableRotations