Index: qtwebengine-opensource-src-5.9.1/src/core/web_engine_context.cpp =================================================================== --- qtwebengine-opensource-src-5.9.1.orig/src/core/web_engine_context.cpp +++ qtwebengine-opensource-src-5.9.1/src/core/web_engine_context.cpp @@ -90,6 +90,7 @@ #include #ifndef QT_NO_OPENGL # include +# include #endif #include #include @@ -179,6 +180,39 @@ void dummyGetPluginCallback(const std::v } #endif +#ifndef QT_NO_OPENGL +QString openGLVendor() +{ + QString vendor; + + QOpenGLContext *oldContext = QOpenGLContext::currentContext(); + QSurface *oldSurface = 0; + if (oldContext) + oldSurface = oldContext->surface(); + + QScopedPointer surface( new QOffscreenSurface ); + surface->create(); + QOpenGLContext context; + if (!context.create()) { + qDebug() << "Error creating openGL context"; + } + else if (!context.makeCurrent(surface.data())) { + qDebug() << "Error making openGL context current context"; + } else { + const GLubyte *p; + QOpenGLFunctions *f = context.functions(); + if ((p = f->glGetString(GL_VENDOR))) + vendor = QString::fromLatin1(reinterpret_cast(p)); + } + + context.doneCurrent(); + if (oldContext && oldSurface) + oldContext->makeCurrent(oldSurface); + + return vendor; +} +#endif + } // namespace namespace QtWebEngineCore { @@ -349,9 +383,23 @@ WebEngineContext::WebEngineContext() GLContextHelper::initialize(); +#ifndef QT_NO_OPENGL + bool disableGpu = qEnvironmentVariableIsSet("QT_WEBENGINE_DISABLE_GPU"); + + if (!qEnvironmentVariableIsSet("QT_WEBENGINE_DISABLE_NOUVEAU_WORKAROUND") && openGLVendor() == QStringLiteral("nouveau")) + { + qWarning() << "Nouveau openGL driver detected. Qt WebEngine will disable usage of the GPU.\n" + "Note: you can set the QT_WEBENGINE_DISABLE_NOUVEAU_WORKAROUND\n" + "environment variable before running this application, but this is \n" + "not recommended since this usually causes applications to crash as\n" + "Nouveau openGL drivers don't support multithreaded rendering"; + disableGpu = true; + } +#endif + const char *glType = 0; #ifndef QT_NO_OPENGL - if (!usingANGLE() && !usingSoftwareDynamicGL() && !usingQtQuick2DRenderer()) { + if (!usingANGLE() && !usingSoftwareDynamicGL() && !usingQtQuick2DRenderer() && !disableGpu) { if (qt_gl_global_share_context() && qt_gl_global_share_context()->isValid()) { // If the native handle is QEGLNativeContext try to use GL ES/2, if there is no native handle // assume we are using wayland and try GL ES/2, and finally Ozone demands GL ES/2 too.