blob: 4ab40c46fe229a4d34092e353065a2e4bdbcab11 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qeglfshooks_p.h"
#include <QLoggingCategory>
QT_BEGIN_NAMESPACE
Q_DECLARE_LOGGING_CATEGORY(qLcEglDevDebug)
#ifdef EGLFS_PLATFORM_HOOKS
QEglFSDeviceIntegration *qt_egl_device_integration()
{
extern QEglFSHooks *platformHooks;
return platformHooks;
}
#else
namespace {
class DeviceIntegration
{
public:
DeviceIntegration();
~DeviceIntegration() { delete m_integration; }
QEglFSDeviceIntegration *integration() { return m_integration; }
private:
QEglFSDeviceIntegration *m_integration;
};
}
Q_GLOBAL_STATIC(DeviceIntegration, deviceIntegration)
DeviceIntegration::DeviceIntegration()
: m_integration(nullptr)
{
QStringList pluginKeys = QEglFSDeviceIntegrationFactory::keys();
if (!pluginKeys.isEmpty()) {
// Some built-in logic: Prioritize either X11 or KMS/DRM.
if (qEnvironmentVariableIsSet("DISPLAY")) {
const QString x11key = QStringLiteral("eglfs_x11");
if (pluginKeys.contains(x11key)) {
pluginKeys.removeOne(x11key);
pluginKeys.prepend(x11key);
}
} else {
const QString kmskey = QStringLiteral("eglfs_kms");
if (pluginKeys.contains(kmskey)) {
pluginKeys.removeOne(kmskey);
pluginKeys.prepend(kmskey);
}
}
QByteArray requested;
// The environment variable can override everything.
if (qEnvironmentVariableIsSet("QT_QPA_EGLFS_INTEGRATION")) {
requested = qgetenv("QT_QPA_EGLFS_INTEGRATION");
} else {
// Device-specific makespecs may define a preferred plugin.
#ifdef EGLFS_PREFERRED_PLUGIN
#define DEFAULT_PLUGIN EGLFS_PREFERRED_PLUGIN
#define STR(s) #s
#define STRQ(s) STR(s)
requested = STRQ(DEFAULT_PLUGIN);
#endif
}
// Treat "none" as special. There has to be a way to indicate
// that plugins must be ignored when the device is known to be
// functional with the default, non-specialized integration.
if (requested != QByteArrayLiteral("none")) {
if (!requested.isEmpty()) {
QString reqStr = QString::fromLocal8Bit(requested);
pluginKeys.removeOne(reqStr);
pluginKeys.prepend(reqStr);
}
qCDebug(qLcEglDevDebug) << "EGL device integration plugin keys (sorted):" << pluginKeys;
while (!m_integration && !pluginKeys.isEmpty()) {
QString key = pluginKeys.takeFirst();
qCDebug(qLcEglDevDebug) << "Trying to load device EGL integration" << key;
m_integration = QEglFSDeviceIntegrationFactory::create(key);
}
}
}
if (!m_integration) {
// Use a default, non-specialized device integration when no plugin is available.
// For some systems this is sufficient.
qCDebug(qLcEglDevDebug) << "Using base device integration";
m_integration = new QEglFSDeviceIntegration;
}
}
QEglFSDeviceIntegration *qt_egl_device_integration()
{
return deviceIntegration()->integration();
}
#endif // EGLFS_PLATFORM_HOOKS
QT_END_NAMESPACE
|