summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/xcb/qxcbconnection.cpp
diff options
context:
space:
mode:
authorAlexander Volkov <a.volkov@rusbitech.ru>2018-09-18 14:26:22 +0300
committerShawn Rutledge <shawn.rutledge@qt.io>2018-09-29 09:33:04 +0000
commit60cecc86f8cde0b2d4e727b9d0fe8a6cb994d660 (patch)
tree823b6a1f0f8bd21854e2e32da1939c91642cfa22 /src/plugins/platforms/xcb/qxcbconnection.cpp
parente4a5483eaedaba8437441868dd87e14d1f605430 (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.cpp64
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) {