56QEglFSDeviceIntegration *QEglFSDeviceIntegrationFactory::create(
const QString &key)
58 QEglFSDeviceIntegration *integration =
nullptr;
60 integration = qLoadPlugin<QEglFSDeviceIntegration, QEglFSDeviceIntegrationPlugin>(loader(), key);
62 qCDebug(qLcEglDevDebug) <<
"Using EGL device integration" << key;
64 qCWarning(qLcEglDevDebug) <<
"Failed to load EGL device integration" << key;
84int QEglFSDeviceIntegration::framebufferIndex()
const
87#if QT_CONFIG(regularexpression)
88 QRegularExpression fbIndexRx(
"fb(\\d+)"_L1);
89 QFileInfo fbinfo(QString::fromLocal8Bit(fbDeviceName()));
90 QRegularExpressionMatch match;
91 if (fbinfo.isSymLink())
92 match = fbIndexRx.match(fbinfo.symLinkTarget());
94 match = fbIndexRx.match(fbinfo.fileName());
96 fbIndex = match.captured(1).toInt();
101void QEglFSDeviceIntegration::platformInit()
103#if defined(Q_OS_LINUX) || defined(Q_OS_VXWORKS)
104 QByteArray fbDev = fbDeviceName();
106 framebuffer = qt_safe_open(fbDev, O_RDONLY);
108 if (Q_UNLIKELY(framebuffer == -1)) {
109 qWarning(
"EGLFS: Failed to open %s", fbDev.constData());
110 qFatal(
"EGLFS: Can't continue without a display");
114 ioctl(framebuffer, FBIOBLANK, VESA_NO_BLANKING);
206QSurfaceFormat QEglFSDeviceIntegration::surfaceFormatFor(
const QSurfaceFormat &inputFormat)
const
208 QSurfaceFormat format = inputFormat;
210 static const bool force888 = qEnvironmentVariableIntValue(
"QT_QPA_EGLFS_FORCE888");
212 format.setRedBufferSize(8);
213 format.setGreenBufferSize(8);
214 format.setBlueBufferSize(8);
267void QEglFSDeviceIntegration::waitForVSync(QPlatformSurface *surface)
const
271#if defined(Q_OS_LINUX) && defined(FBIO_WAITFORVSYNC)
272 static const bool forceSync = qEnvironmentVariableIntValue(
"QT_QPA_EGLFS_FORCEVSYNC");
273 if (forceSync && framebuffer != -1) {
275 if (ioctl(framebuffer, FBIO_WAITFORVSYNC, &arg) == -1)
276 qWarning(
"Could not wait for vsync.");
278#elif defined(Q_OS_VXWORKS) && defined(FB_IOCTL_VSYNC)
279 static const bool forceSync = qEnvironmentVariableIntValue(
"QT_QPA_EGLFS_FORCEVSYNC");
280 if (forceSync && framebuffer != -1) {
282 if (ioctl(framebuffer, FB_IOCTL_VSYNC, &arg) == -1)
283 qWarning(
"Could not wait for vsync.");
327EGLConfig QEglFSDeviceIntegration::chooseConfig(EGLDisplay display,
const QSurfaceFormat &format)
329 class Chooser :
public QEglConfigChooser {
331 Chooser(EGLDisplay display)
332 : QEglConfigChooser(display) { }
333 bool filterConfig(EGLConfig config)
const override {
334 return qt_egl_device_integration()->filterConfig(display(), config)
335 && QEglConfigChooser::filterConfig(config);
339 Chooser chooser(display);
340 chooser.setSurfaceType(qt_egl_device_integration()->surfaceType());
341 chooser.setSurfaceFormat(format);
342 return chooser.chooseConfig();