From b22f3a788e8ff4f7bf54e959d0adbd889a228030 Mon Sep 17 00:00:00 2001 From: Kevin Kofler Date: Wed, 29 Jan 2014 03:26:07 +0100 Subject: [PATCH] use software OpenGL (llvmpipe) if the hardware driver doesn't support OpenGL 2 * Wed Jan 29 2014 Kevin Kofler - 5.2.0-9 - use software OpenGL (llvmpipe) if the hardware driver doesn't support OpenGL 2 --- 10-qt5-check-opengl2.sh | 6 ++ qt5-qtbase.spec | 24 ++++++- ...rce-src-5.2.0-allow-forcing-llvmpipe.patch | 70 +++++++++++++++++++ 3 files changed, 99 insertions(+), 1 deletion(-) create mode 100755 10-qt5-check-opengl2.sh create mode 100644 qtbase-opensource-src-5.2.0-allow-forcing-llvmpipe.patch diff --git a/10-qt5-check-opengl2.sh b/10-qt5-check-opengl2.sh new file mode 100755 index 0000000..31cb501 --- /dev/null +++ b/10-qt5-check-opengl2.sh @@ -0,0 +1,6 @@ +#!/bin/sh +OPENGL_VERSION=`LANG=C glxinfo | grep '^OpenGL version string: ' | sed -e 's/^OpenGL version string: \([0-9]\).*$/\1/g'` +if [ "$OPENGL_VERSION" -lt 2 ]; then + QT_XCB_FORCE_SOFTWARE_OPENGL=1 + export QT_XCB_FORCE_SOFTWARE_OPENGL +fi diff --git a/qt5-qtbase.spec b/qt5-qtbase.spec index d7f14f9..b70c43c 100644 --- a/qt5-qtbase.spec +++ b/qt5-qtbase.spec @@ -26,7 +26,7 @@ Summary: Qt5 - QtBase components Name: qt5-qtbase Version: 5.2.0 -Release: 8%{?dist} +Release: 9%{?dist} # See LGPL_EXCEPTIONS.txt, LICENSE.GPL3, respectively, for exception details License: LGPLv2 with exceptions or GPLv3 with exceptions @@ -45,6 +45,10 @@ Source0: http://download.qt-project.org/official_releases/qt/5.2/%{version}/subm # https://bugzilla.redhat.com/show_bug.cgi?id=1036956 Source5: qconfig-multilib.h +# xinitrc script to check for OpenGL 1 only drivers and automatically set +# QT_XCB_FORCE_SOFTWARE_OPENGL for them +Source6: 10-qt5-check-opengl2.sh + # help build on some lowmem archs, e.g. drop hard-coded -O3 optimization on some files Patch1: qtbase-opensource-src-5.0.2-lowmem.patch @@ -60,6 +64,10 @@ Patch4: qt-everywhere-opensource-src-4.8.5-QTBUG-35459.patch # fix QTBUG-35460 (error message for CVE-2013-4549 is misspelled) Patch5: qt-everywhere-opensource-src-4.8.5-QTBUG-35460.patch +# add a QT_XCB_FORCE_SOFTWARE_OPENGL environment variable to allow forcing +# LIBGL_ALWAYS_SOFTWARE (llvmpipe) for Qt 5 apps only +Patch6: qtbase-opensource-src-5.2.0-allow-forcing-llvmpipe.patch + # unconditionally enable freetype lcdfilter support Patch12: qtbase-opensource-src-5.2.0-enable_ft_lcdfilter.patch @@ -237,6 +245,13 @@ Summary: Qt5 GUI-related libraries Requires: %{name}%{?_isa} = %{version}-%{release} Obsoletes: qt5-qtbase-x11 < 5.2.0 Provides: qt5-qtbase-x11 = %{version}-%{release} + +# for Source6: 10-qt5-check-opengl2.sh: +# directory ownership +Requires: xorg-x11-xinit +# glxinfo +Requires: glx-utils + %description gui Qt5 libraries used for drawing widgets and OpenGL items. @@ -251,6 +266,7 @@ rm -fv mkspecs/linux-g++*/qmake.conf.multilib-optflags %patch3 -p1 -b .qatomic-ppc %patch4 -p1 -b .QTBUG-35459 %patch5 -p1 -b .QTBUG-35460 +%patch6 -p1 -b .allow-forcing-llvmpipe %patch12 -p1 -b .enable_ft_lcdfilter #patch50 -p1 -b .poll @@ -450,6 +466,8 @@ for prl_file in libQt5*.prl ; do done popd +install -p -m755 -D %{SOURCE6} %{_sysconfdir}/X11/xinit/xinitrc.d/10-qt5-check-opengl2.sh + ## work-in-progress, doesn't work yet -- rex %check @@ -646,6 +664,7 @@ popd %postun gui -p /sbin/ldconfig %files gui +%{_sysconfdir}/X11/xinit/xinitrc.d/10-qt5-check-opengl2.sh %{_qt5_libdir}/libQt5Gui.so.5* %{_qt5_libdir}/libQt5OpenGL.so.5* %{_qt5_libdir}/libQt5PrintSupport.so.5* @@ -669,6 +688,9 @@ popd %changelog +* Wed Jan 29 2014 Kevin Kofler - 5.2.0-9 +- use software OpenGL (llvmpipe) if the hardware driver doesn't support OpenGL 2 + * Tue Jan 28 2014 Rex Dieter 5.2.0-8 - (re)enable -docs diff --git a/qtbase-opensource-src-5.2.0-allow-forcing-llvmpipe.patch b/qtbase-opensource-src-5.2.0-allow-forcing-llvmpipe.patch new file mode 100644 index 0000000..7ad97e8 --- /dev/null +++ b/qtbase-opensource-src-5.2.0-allow-forcing-llvmpipe.patch @@ -0,0 +1,70 @@ +diff -ur qtbase-opensource-src-5.2.0/src/plugins/platforms/xcb/qglxintegration.cpp qtbase-opensource-src-5.2.0-allow-forcing-llvmpipe/src/plugins/platforms/xcb/qglxintegration.cpp +--- qtbase-opensource-src-5.2.0/src/plugins/platforms/xcb/qglxintegration.cpp 2013-12-08 18:09:53.000000000 +0100 ++++ qtbase-opensource-src-5.2.0-allow-forcing-llvmpipe/src/plugins/platforms/xcb/qglxintegration.cpp 2014-01-29 02:58:13.000000000 +0100 +@@ -173,6 +173,27 @@ + if (m_format.renderableType() != QSurfaceFormat::OpenGL && m_format.renderableType() != QSurfaceFormat::OpenGLES) + return; + ++ // Allow forcing LIBGL_ALWAYS_SOFTWARE for Qt 5 applications only. ++ // This is most useful with drivers that only support OpenGL 1. ++ // We need OpenGL 2, but the user probably doesn't want ++ // LIBGL_ALWAYS_SOFTWARE in OpenGL 1 apps. ++ static bool checkedForceSoftwareOpenGL = false; ++ static bool forceSoftwareOpenGL = false; ++ if (!checkedForceSoftwareOpenGL) { ++ // If LIBGL_ALWAYS_SOFTWARE is already set, don't mess with it. ++ // We want to unset LIBGL_ALWAYS_SOFTWARE at the end so it does not ++ // get inherited by other processes, of course only if it wasn't ++ // already set before. ++ if (!qEnvironmentVariableIsEmpty("QT_XCB_FORCE_SOFTWARE_OPENGL") ++ && qEnvironmentVariableIsEmpty("LIBGL_ALWAYS_SOFTWARE")) ++ forceSoftwareOpenGL = true; ++ ++ checkedForceSoftwareOpenGL = true; ++ } ++ ++ if (forceSoftwareOpenGL) ++ qputenv("LIBGL_ALWAYS_SOFTWARE", "1"); ++ + if (share) + m_shareContext = static_cast(share)->glxContext(); + +@@ -267,8 +288,12 @@ + // Could not create a context using glXCreateContextAttribsARB, falling back to glXCreateNewContext. + if (!m_context) { + // requesting an OpenGL ES context requires glXCreateContextAttribsARB, so bail out +- if (m_format.renderableType() == QSurfaceFormat::OpenGLES) ++ if (m_format.renderableType() == QSurfaceFormat::OpenGLES) { ++ // unset LIBGL_ALWAYS_SOFTWARE now so other processes don't inherit it ++ if (forceSoftwareOpenGL) ++ qunsetenv("LIBGL_ALWAYS_SOFTWARE"); + return; ++ } + + m_context = glXCreateNewContext(DISPLAY_FROM_XCB(screen), config, GLX_RGBA_TYPE, m_shareContext, true); + if (!m_context && m_shareContext) { +@@ -287,8 +312,12 @@ + window = createDummyWindow(screen, config); + } else { + // requesting an OpenGL ES context requires glXCreateContextAttribsARB, so bail out +- if (m_format.renderableType() == QSurfaceFormat::OpenGLES) ++ if (m_format.renderableType() == QSurfaceFormat::OpenGLES) { ++ // unset LIBGL_ALWAYS_SOFTWARE now so other processes don't inherit it ++ if (forceSoftwareOpenGL) ++ qunsetenv("LIBGL_ALWAYS_SOFTWARE"); + return; ++ } + + // Note that m_format gets updated with the used surface format + visualInfo = qglx_findVisualInfo(DISPLAY_FROM_XCB(screen), screen->screenNumber(), &m_format); +@@ -317,6 +346,10 @@ + + // Destroy our temporary window + XDestroyWindow(DISPLAY_FROM_XCB(screen), window); ++ ++ // unset LIBGL_ALWAYS_SOFTWARE now so other processes don't inherit it ++ if (forceSoftwareOpenGL) ++ qunsetenv("LIBGL_ALWAYS_SOFTWARE"); + } + + QGLXContext::~QGLXContext()