diff options
author | Alexander Volkov <a.volkov@rusbitech.ru> | 2018-09-18 14:26:22 +0300 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2018-09-29 09:33:04 +0000 |
commit | 60cecc86f8cde0b2d4e727b9d0fe8a6cb994d660 (patch) | |
tree | 823b6a1f0f8bd21854e2e32da1939c91642cfa22 /src/plugins/platforms/xcb/qxcbconnection.cpp | |
parent | e4a5483eaedaba8437441868dd87e14d1f605430 (diff) |
xcb: Initialize OpenGL integration only when required
In some cases OpenGL integration may be unnecessary, e.g.
an application may set Qt::AA_ForceRasterWidgets attribute
and don't use OpenGL in any other way. In addition OpenGL
initialization can take noticeable time on some configurations.
So do it on demand only.
Change-Id: If88953f8d5c826bc96fd49eb397b5e1ad693546d
Reviewed-by: Gatis Paeglis <gatis.paeglis@qt.io>
Diffstat (limited to 'src/plugins/platforms/xcb/qxcbconnection.cpp')
-rw-r--r-- | src/plugins/platforms/xcb/qxcbconnection.cpp | 64 |
1 files changed, 36 insertions, 28 deletions
diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp index 48715e0812..6dda6487c8 100644 --- a/src/plugins/platforms/xcb/qxcbconnection.cpp +++ b/src/plugins/platforms/xcb/qxcbconnection.cpp @@ -654,34 +654,6 @@ QXcbConnection::QXcbConnection(xcb_connection_t *c, int primaryScreenNumber, if (!m_startupId.isNull()) qunsetenv("DESKTOP_STARTUP_ID"); - - QStringList glIntegrationNames; - glIntegrationNames << QStringLiteral("xcb_glx") << QStringLiteral("xcb_egl"); - QString glIntegrationName = QString::fromLocal8Bit(qgetenv("QT_XCB_GL_INTEGRATION")); - if (!glIntegrationName.isEmpty()) { - qCDebug(lcQpaGl) << "QT_XCB_GL_INTEGRATION is set to" << glIntegrationName; - if (glIntegrationName != QLatin1String("none")) { - glIntegrationNames.removeAll(glIntegrationName); - glIntegrationNames.prepend(glIntegrationName); - } else { - glIntegrationNames.clear(); - } - } - - if (!glIntegrationNames.isEmpty()) { - qCDebug(lcQpaGl) << "Choosing xcb gl-integration based on following priority\n" << glIntegrationNames; - for (int i = 0; i < glIntegrationNames.size() && !m_glIntegration; i++) { - m_glIntegration = QXcbGlIntegrationFactory::create(glIntegrationNames.at(i)); - if (m_glIntegration && !m_glIntegration->initialize(this)) { - qCDebug(lcQpaGl) << "Failed to initialize xcb gl-integration" << glIntegrationNames.at(i); - delete m_glIntegration; - m_glIntegration = nullptr; - } - } - if (!m_glIntegration) - qCDebug(lcQpaGl) << "Failed to create xcb gl-integration"; - } - sync(); } @@ -2304,6 +2276,42 @@ Qt::KeyboardModifiers QXcbConnection::queryKeyboardModifiers() const return keyboard()->translateModifiers(stateMask); } +QXcbGlIntegration *QXcbConnection::glIntegration() const +{ + if (m_glIntegrationInitialized) + return m_glIntegration; + + QStringList glIntegrationNames; + glIntegrationNames << QStringLiteral("xcb_glx") << QStringLiteral("xcb_egl"); + QString glIntegrationName = QString::fromLocal8Bit(qgetenv("QT_XCB_GL_INTEGRATION")); + if (!glIntegrationName.isEmpty()) { + qCDebug(lcQpaGl) << "QT_XCB_GL_INTEGRATION is set to" << glIntegrationName; + if (glIntegrationName != QLatin1String("none")) { + glIntegrationNames.removeAll(glIntegrationName); + glIntegrationNames.prepend(glIntegrationName); + } else { + glIntegrationNames.clear(); + } + } + + if (!glIntegrationNames.isEmpty()) { + qCDebug(lcQpaGl) << "Choosing xcb gl-integration based on following priority\n" << glIntegrationNames; + for (int i = 0; i < glIntegrationNames.size() && !m_glIntegration; i++) { + m_glIntegration = QXcbGlIntegrationFactory::create(glIntegrationNames.at(i)); + if (m_glIntegration && !m_glIntegration->initialize(const_cast<QXcbConnection *>(this))) { + qCDebug(lcQpaGl) << "Failed to initialize xcb gl-integration" << glIntegrationNames.at(i); + delete m_glIntegration; + m_glIntegration = nullptr; + } + } + if (!m_glIntegration) + qCDebug(lcQpaGl) << "Failed to create xcb gl-integration"; + } + + m_glIntegrationInitialized = true; + return m_glIntegration; +} + bool QXcbConnection::event(QEvent *e) { if (e->type() == QEvent::User + 1) { |