summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/xcb/gl_integrations
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/xcb/gl_integrations')
-rw-r--r--src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp60
-rw-r--r--src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxintegration.cpp4
2 files changed, 27 insertions, 37 deletions
diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp
index 93cd3e215f..2ffb5d2629 100644
--- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp
+++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp
@@ -51,6 +51,7 @@
#undef register
#include <GL/glx.h>
+#include <QtCore/QRegularExpression>
#include <QtGui/QOpenGLContext>
#include <QtGui/QOffscreenSurface>
@@ -690,32 +691,6 @@ static const char *qglx_threadedgl_blacklist_renderer[] = {
0
};
-// This disables threaded rendering on anything using mesa, e.g.
-// - nvidia/nouveau
-// - amd/gallium
-// - intel
-// - some software opengl implementations
-//
-// The client glx vendor string is used to identify those setups as that seems to show the least
-// variance between the bad configurations. It's always "Mesa Project and SGI". There are some
-// configurations which don't use mesa and which can do threaded rendering (amd and nvidia chips
-// with their own proprietary drivers).
-//
-// This, of course, is very broad and disables threaded rendering on a lot of devices which would
-// be able to use it. However, the bugs listed below don't follow any easily recognizable pattern
-// and we should rather be safe.
-//
-// http://cgit.freedesktop.org/xcb/libxcb/commit/?id=be0fe56c3bcad5124dcc6c47a2fad01acd16f71a will
-// fix some of the issues. Basically, the proprietary drivers seem to have a way of working around
-// a fundamental flaw with multithreaded access to xcb, but mesa doesn't. The blacklist should be
-// reevaluated once that patch is released in some version of xcb.
-static const char *qglx_threadedgl_blacklist_vendor[] = {
- "Mesa Project and SGI", // QTCREATORBUG-10875 (crash in creator)
- // QTBUG-34492 (flickering in fullscreen)
- // QTBUG-38221
- 0
-};
-
void QGLXContext::queryDummyContext()
{
if (m_queriedDummyContext)
@@ -775,18 +750,33 @@ void QGLXContext::queryDummyContext()
}
}
- if (glxvendor) {
- for (int i = 0; qglx_threadedgl_blacklist_vendor[i]; ++i) {
- if (strstr(glxvendor, qglx_threadedgl_blacklist_vendor[i]) != 0) {
- qCDebug(lcQpaGl).nospace() << "Multithreaded OpenGL disabled: "
- "blacklisted vendor \""
- << qglx_threadedgl_blacklist_vendor[i]
- << "\"";
+ if (glxvendor && m_supportsThreading) {
+ // Blacklist Mesa drivers due to QTCREATORBUG-10875 (crash in creator),
+ // QTBUG-34492 (flickering in fullscreen) and QTBUG-38221
+ const char *mesaVersionStr = nullptr;
+ if (strstr(glxvendor, "Mesa Project") != 0) {
+ mesaVersionStr = (const char *) glGetString(GL_VERSION);
+ m_supportsThreading = false;
+ }
- m_supportsThreading = false;
- break;
+ if (mesaVersionStr) {
+ // The issue was fixed in Xcb 1.11, but we can't check for that
+ // at runtime, so instead assume it fixed with recent Mesa versions
+ // released several years after the Xcb fix.
+ QRegularExpression versionTest(QStringLiteral("Mesa (\\d+)"));
+ QRegularExpressionMatch result = versionTest.match(QString::fromLatin1(mesaVersionStr));
+ int versionNr = 0;
+ if (result.hasMatch())
+ versionNr = result.captured(1).toInt();
+ if (versionNr >= 17) {
+ // White-listed
+ m_supportsThreading = true;
}
}
+ if (!m_supportsThreading) {
+ qCDebug(lcQpaGl).nospace() << "Multithreaded OpenGL disabled: "
+ "blacklisted vendor \"Mesa Project\"";
+ }
}
context.doneCurrent();
diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxintegration.cpp b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxintegration.cpp
index a7641baea1..b751aaf8a3 100644
--- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxintegration.cpp
+++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxintegration.cpp
@@ -163,9 +163,9 @@ bool QXcbGlxIntegration::handleXcbEvent(xcb_generic_event_t *event, uint respons
// Unlock the display before calling the native event filter
XUnlockDisplay(xdisplay);
locked = false;
- QByteArray genericEventFilterType = m_connection->nativeInterface()->genericEventFilterType();
+ auto eventType = m_connection->nativeInterface()->nativeEventType();
long result = 0;
- handled = dispatcher->filterNativeEvent(genericEventFilterType, &ev, &result);
+ handled = dispatcher->filterNativeEvent(eventType, &ev, &result);
}
#endif
}