summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brüning <michael.bruning@qt.io>2020-02-11 18:26:58 +0100
committerMichael Brüning <michael.bruning@qt.io>2020-07-06 09:47:01 +0200
commitdaf822dc41ce7c8acb7225cf17bbb269d6cc77ee (patch)
treee30051ef58800645fbdb1743fb6c9186a769577f
parentf41dbaad0f0b554b3168df5456e57c3016bd5e43 (diff)
Create an OpenGL 4.1 CoreProfile on macOS unless requested otherwise
Chromium has blacklisted OpenGL version prior to 4.1 on macOS. To re-enable hardware acceleration in WebEngine on macOS, set the default surface format to a 4.1 CoreProfile before creating the shared OpenGL context, unless the surface format has been set to a specific other version. According to https://support.apple.com/en-us/HT202823 , the newest Mac that only had support for OpenGL 3.3 was released in Mid 2011, so this should be okay on the majority of machines. If the user requests an OpenGL 3.2 profile, it will also work as the Cocoa QPA plugin enables sharing between 3.2 and 4.x contexts. If the surface format has been requested to be a version lower than OpenGL 3.2 or not a core profile, warn the user about the lack of hardware acceleration. To ensure that we have actually created native contexts for the requested profile and not a context backed by the Apple Software Renderer, we query the context native renderer ID using Cocoa methods. Task-number: QTBUG-81693 Task-number: QTBUG-75262 Change-Id: I94e2e9913c8481fa8db37eb8381a89769026c919 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io> Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
-rw-r--r--src/core/api/qtwebenginecoreglobal.cpp48
-rw-r--r--src/core/core_chromium.pri4
-rw-r--r--src/core/macos_context_type_helper.h42
-rw-r--r--src/core/macos_context_type_helper.mm49
4 files changed, 143 insertions, 0 deletions
diff --git a/src/core/api/qtwebenginecoreglobal.cpp b/src/core/api/qtwebenginecoreglobal.cpp
index ce4362741..3c9387a10 100644
--- a/src/core/api/qtwebenginecoreglobal.cpp
+++ b/src/core/api/qtwebenginecoreglobal.cpp
@@ -45,6 +45,8 @@
#ifdef Q_OS_MACOS
#include <sys/types.h>
#include <sys/sysctl.h>
+#include <QOffscreenSurface>
+#include "macos_context_type_helper.h"
#endif
#endif
#include <QThread>
@@ -127,6 +129,52 @@ Q_WEBENGINECORE_PRIVATE_EXPORT void initialize()
shareContext = new QOpenGLContext;
QSurfaceFormat format = QSurfaceFormat::defaultFormat();
// format.setOption(QSurfaceFormat::ResetNotification);
+
+#ifdef Q_OS_MACOS
+ if (format == QSurfaceFormat()) {
+ QOpenGLContext testContext;
+
+ // Chromium turns off OpenGL for CoreProfiles with versions < 4.1
+ // The newest Mac that only supports 3.3 was released in Mid 2011,
+ // so it should be safe to request 4.1, but we still double check it
+ // works in order not to set an invalid default surface format.
+ format.setVersion(4, 1);
+ format.setProfile(QSurfaceFormat::CoreProfile);
+
+ testContext.setFormat(format);
+ if (testContext.create()) {
+ QOffscreenSurface surface;
+ surface.setFormat(format);
+ surface.create();
+
+ if (testContext.makeCurrent(&surface)) {
+ // The Cocoa QPA integration allows sharing between OpenGL 3.2 and 4.1 contexts,
+ // which means even though we requested a 4.1 context, if we only get a 3.2 context,
+ // it will still work an Chromium will not black list it.
+ if (testContext.format().version() >= qMakePair(3, 2) &&
+ testContext.format().profile() == QSurfaceFormat::CoreProfile &&
+ !isCurrentContextSoftware()) {
+ QSurfaceFormat::setDefaultFormat(format);
+ } else {
+ qWarning("The available OpenGL surface format was either not version 3.2 or higher or not a Core Profile.\n"
+ "Chromium on macOS will fall back to software rendering in this case.\n"
+ "Hardware acceleration and features such as WebGL will not be available.");
+ format = QSurfaceFormat::defaultFormat();
+ }
+ testContext.doneCurrent();
+ }
+ surface.destroy();
+ }
+ } else {
+ // The user explicitly requested a specific surface format that does not fit Chromium's requirements. Warn them about this.
+ if (format.version() < qMakePair(3,2) || format.profile() != QSurfaceFormat::CoreProfile) {
+ qWarning("An OpenGL surfcace format was requested that is either not version 3.2 or higher or a not Core Profile.\n"
+ "Chromium on macOS will fall back to software rendering in this case.\n"
+ "Hardware acceleration and features such as WebGL will not be available.");
+ }
+ }
+#endif
+
shareContext->setFormat(format);
shareContext->create();
qAddPostRoutine(deleteShareContext);
diff --git a/src/core/core_chromium.pri b/src/core/core_chromium.pri
index e1f5cd7ac..4e4f529ab 100644
--- a/src/core/core_chromium.pri
+++ b/src/core/core_chromium.pri
@@ -310,6 +310,10 @@ contains(QT_CONFIG, opengl) {
compositor/display_gl_output_surface.h \
compositor/stream_video_node.h \
compositor/yuv_video_node.h
+ macos {
+ HEADERS+=macos_context_type_helper.h
+ SOURCES+=macos_context_type_helper.mm
+ }
}
qtConfig(webengine-geolocation) {
diff --git a/src/core/macos_context_type_helper.h b/src/core/macos_context_type_helper.h
new file mode 100644
index 000000000..d234a2bff
--- /dev/null
+++ b/src/core/macos_context_type_helper.h
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtWebEngine module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef MACOS_CONTEXT_TYPE_HELPER_H_
+#define MACOS_CONTEXT_TYPE_HELPER_H_
+bool isCurrentContextSoftware();
+#endif // MACOS_CONTEXT_TYPE_HELPER_H_
diff --git a/src/core/macos_context_type_helper.mm b/src/core/macos_context_type_helper.mm
new file mode 100644
index 000000000..c814d2849
--- /dev/null
+++ b/src/core/macos_context_type_helper.mm
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtWebEngine module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#import <Foundation/Foundation.h>
+#import <AppKit/AppKit.h>
+
+#include "macos_context_type_helper.h"
+
+bool isCurrentContextSoftware()
+{
+ int rendererID = 0;
+ [NSOpenGLContext.currentContext getValues:&rendererID forParameter:NSOpenGLContextParameterCurrentRendererID];
+ return (rendererID & kCGLRendererIDMatchingMask) == kCGLRendererGenericFloatID;
+}