aboutsummaryrefslogtreecommitdiff
path: root/dev-qt
diff options
context:
space:
mode:
authorAndreas Sturmlechner <asturm@gentoo.org>2018-06-18 23:05:49 +0200
committerAndreas Sturmlechner <asturm@gentoo.org>2018-06-20 16:30:49 +0200
commit938edc9a6b2179e4aabcf5ab340ebd64d90a77d1 (patch)
tree71adb391aa5fe7e219572622aa482415404a86fb /dev-qt
parentdev-qt/qtwebengine: Fix build with ffmpeg-4 (diff)
downloadqt-938edc9a6b2179e4aabcf5ab340ebd64d90a77d1.tar.gz
qt-938edc9a6b2179e4aabcf5ab340ebd64d90a77d1.tar.bz2
qt-938edc9a6b2179e4aabcf5ab340ebd64d90a77d1.zip
dev-qt/qtwebengine: Disable GPU when using nouveau
One upstream backport, the other one kindly borrowed from opensuse (disable-gpu-when-using-nouveau-boo-1005323.diff). Bug: https://bugs.gentoo.org/609752 Package-Manager: Portage-2.3.40, Repoman-2.3.9
Diffstat (limited to 'dev-qt')
-rw-r--r--dev-qt/qtwebengine/files/qtwebengine-5.11.1-eglGetProcAddress-fallback-lookup.patch68
-rw-r--r--dev-qt/qtwebengine/files/qtwebengine-5.11.1-nouveau-disable-gpu.patch98
-rw-r--r--dev-qt/qtwebengine/qtwebengine-5.11.1.ebuild2
3 files changed, 168 insertions, 0 deletions
diff --git a/dev-qt/qtwebengine/files/qtwebengine-5.11.1-eglGetProcAddress-fallback-lookup.patch b/dev-qt/qtwebengine/files/qtwebengine-5.11.1-eglGetProcAddress-fallback-lookup.patch
new file mode 100644
index 00000000..4b2676fa
--- /dev/null
+++ b/dev-qt/qtwebengine/files/qtwebengine-5.11.1-eglGetProcAddress-fallback-lookup.patch
@@ -0,0 +1,68 @@
+From a66d4cd82972996d76edff52d17464c150dec6a6 Mon Sep 17 00:00:00 2001
+From: Samuli Piippo <samuli.piippo@qt.io>
+Date: Mon, 11 Jun 2018 16:16:55 +0300
+Subject: Add fallback lookup for eglGetProcAddress
+
+Use the GLContext to find address for eglGetProcAddress symbol, if it's
+not found with dlopen.
+
+Change-Id: I3f5330c21ecc9b66e5e376d50d3fc6965b227f85
+Reviewed-by: Michal Klocek <michal.klocek@qt.io>
+---
+ src/core/gl_context_qt.cpp | 11 +++++++++++
+ src/core/gl_context_qt.h | 1 +
+ src/core/gl_surface_qt.cpp | 4 ++++
+ 3 files changed, 16 insertions(+)
+
+diff --git a/src/core/gl_context_qt.cpp b/src/core/gl_context_qt.cpp
+index 9ed1db8b..95491709 100644
+--- a/src/core/gl_context_qt.cpp
++++ b/src/core/gl_context_qt.cpp
+@@ -155,6 +155,17 @@ QFunctionPointer GLContextHelper::getGlXGetProcAddress()
+ return get_proc_address;
+ }
+
++QFunctionPointer GLContextHelper::getEglGetProcAddress()
++{
++ QFunctionPointer get_proc_address = nullptr;
++#ifndef QT_NO_OPENGL
++ if (QOpenGLContext *context = qt_gl_global_share_context()) {
++ get_proc_address = context->getProcAddress("eglGetProcAddress");
++ }
++#endif
++ return get_proc_address;
++}
++
+ QT_END_NAMESPACE
+
+ #if defined(USE_OZONE) || defined(OS_WIN)
+diff --git a/src/core/gl_context_qt.h b/src/core/gl_context_qt.h
+index 8ffdad58..cecceabc 100644
+--- a/src/core/gl_context_qt.h
++++ b/src/core/gl_context_qt.h
+@@ -63,6 +63,7 @@ public:
+ static void* getXDisplay();
+ static void* getNativeDisplay();
+ static QFunctionPointer getGlXGetProcAddress();
++ static QFunctionPointer getEglGetProcAddress();
+ private:
+ Q_INVOKABLE bool initializeContextOnBrowserThread(gl::GLContext* context, gl::GLSurface* surface, gl::GLContextAttribs attribs);
+
+diff --git a/src/core/gl_surface_qt.cpp b/src/core/gl_surface_qt.cpp
+index 7e579246..4d38d7c2 100644
+--- a/src/core/gl_surface_qt.cpp
++++ b/src/core/gl_surface_qt.cpp
+@@ -227,6 +227,10 @@ bool InitializeStaticGLBindings(GLImplementation implementation) {
+ base::GetFunctionPointerFromNativeLibrary(library,
+ "eglGetProcAddress"));
+ if (!get_proc_address) {
++ QFunctionPointer address = GLContextHelper::getEglGetProcAddress();
++ get_proc_address = reinterpret_cast<gl::GLGetProcAddressProc>(address);
++ }
++ if (!get_proc_address) {
+ LOG(ERROR) << "eglGetProcAddress not found.";
+ base::UnloadNativeLibrary(library);
+ return false;
+--
+cgit v1.1-6-g87c4
+
diff --git a/dev-qt/qtwebengine/files/qtwebengine-5.11.1-nouveau-disable-gpu.patch b/dev-qt/qtwebengine/files/qtwebengine-5.11.1-nouveau-disable-gpu.patch
new file mode 100644
index 00000000..aaf3aae4
--- /dev/null
+++ b/dev-qt/qtwebengine/files/qtwebengine-5.11.1-nouveau-disable-gpu.patch
@@ -0,0 +1,98 @@
+From: Antonio Larrosa <alarrosa@suse.com>
+Subject: Disable GPU when using nouveau or running on wayland
+References: boo#1005323, boo#1060990
+
+Qt WebEngine uses multi-threaded OpenGL, which nouveau does not support.
+It also crashes when running on wayland, the cause is not yet known.
+Work around these issues by not doing GPU-accelerated rendering in such
+cases.
+
+Index: qtwebengine-everywhere-src-5.11.0/src/core/web_engine_context.cpp
+===================================================================
+--- qtwebengine-everywhere-src-5.11.0.orig/src/core/web_engine_context.cpp
++++ qtwebengine-everywhere-src-5.11.0/src/core/web_engine_context.cpp
+@@ -100,6 +100,7 @@
+ #include <QOffscreenSurface>
+ #ifndef QT_NO_OPENGL
+ # include <QOpenGLContext>
++# include <QOpenGLFunctions>
+ #endif
+ #include <QQuickWindow>
+ #include <QStringList>
+@@ -178,6 +179,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<QOffscreenSurface> 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<const char *>(p));
++ }
++
++ context.doneCurrent();
++ if (oldContext && oldSurface)
++ oldContext->makeCurrent(oldSurface);
++
++ return vendor;
++}
++#endif
++
+ } // namespace
+
+ namespace QtWebEngineCore {
+@@ -414,6 +448,27 @@ WebEngineContext::WebEngineContext()
+ const char *glType = 0;
+ #ifndef QT_NO_OPENGL
+
++ bool disableGpu = qEnvironmentVariableIsSet("QT_WEBENGINE_DISABLE_GPU");
++
++ if (!qEnvironmentVariableIsSet("QT_WEBENGINE_DISABLE_WAYLAND_WORKAROUND") && platform.startsWith("wayland", Qt::CaseInsensitive))
++ {
++ qWarning() << "Running on wayland. Qt WebEngine will disable usage of the GPU.\n"
++ "Note: you can set the QT_WEBENGINE_DISABLE_WAYLAND_WORKAROUND\n"
++ "environment variable before running this application, but this is \n"
++ "not recommended since this usually causes applications to crash.";
++ disableGpu = true;
++ }
++
++ 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;
++ }
++
+ bool tryGL =
+ !usingANGLE()
+ && (!usingSoftwareDynamicGL()
+@@ -424,7 +479,7 @@ WebEngineContext::WebEngineContext()
+ || enableWebGLSoftwareRendering
+ #endif
+ )
+- && !usingQtQuick2DRenderer();
++ && !usingQtQuick2DRenderer() && !disableGpu;
+
+ if (tryGL) {
+ if (qt_gl_global_share_context() && qt_gl_global_share_context()->isValid()) {
diff --git a/dev-qt/qtwebengine/qtwebengine-5.11.1.ebuild b/dev-qt/qtwebengine/qtwebengine-5.11.1.ebuild
index 9c54aa9e..05007972 100644
--- a/dev-qt/qtwebengine/qtwebengine-5.11.1.ebuild
+++ b/dev-qt/qtwebengine/qtwebengine-5.11.1.ebuild
@@ -82,6 +82,8 @@ DEPEND="${RDEPEND}
PATCHES+=(
"${FILESDIR}/${P}-libxml2-disable-catalogs.patch" # bug 653078
"${FILESDIR}/${P}-ffmpeg4.patch"
+ "${FILESDIR}/${P}-eglGetProcAddress-fallback-lookup.patch" # 5.11 branch
+ "${FILESDIR}/${P}-nouveau-disable-gpu.patch" # bug 609752
)
src_prepare() {