summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZeno Albisser <zeno.albisser@digia.com>2014-04-02 02:27:31 -0700
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-04-09 18:13:50 +0200
commit8e1a9c88431bbae3a47d09799395d81f76626ec0 (patch)
treed09be6d92354ac9afdc46d809f17fe617f9a66c4
parent6de87734c623d0b6ecfea0440ee396a00d59d74f (diff)
Add GLContextHelper class for EGL context creation.
Shared EGL contexts should always be created on the same thread, as otherwise context creation might fail. We use a GLContextHelper singleton that is initialized on startup and creates the contexts when requested through a BlockingQueuedConnection. There is a pretty and a correct solution for this problem. This is the pretty one. It is based on the assumption that Chromium decides to use the same or a similar enough configuration for the EGLContext as Qt previously did. But we prefer pretty over correct as the correct solution would potentially impose a layering violation. This is enabled for all embedded linux devices. Change-Id: I910cc90d0f87fd6d1fe0a475b17ba56cd8c503f6 Reviewed-by: Jocelyn Turcotte <jocelyn.turcotte@digia.com>
-rw-r--r--src/core/config/embedded_linux.gypi9
-rw-r--r--src/core/config/embedded_linux.pri2
-rw-r--r--src/core/core_gyp_generator.pro2
-rw-r--r--src/core/gl_context_qt.cpp90
-rw-r--r--src/core/gl_context_qt.h69
-rw-r--r--src/core/web_engine_context.cpp3
6 files changed, 174 insertions, 1 deletions
diff --git a/src/core/config/embedded_linux.gypi b/src/core/config/embedded_linux.gypi
new file mode 100644
index 000000000..f192243ce
--- /dev/null
+++ b/src/core/config/embedded_linux.gypi
@@ -0,0 +1,9 @@
+{
+ 'target_defaults': {
+ # patterns used to exclude chromium files from the build when we have a drop-in replacement
+ 'sources/': [
+ # We are using gl_context_qt.cc instead.
+ ['exclude', 'gl_context_ozone.cc$'],
+ ],
+ },
+}
diff --git a/src/core/config/embedded_linux.pri b/src/core/config/embedded_linux.pri
index d90072ef3..8aaff3e93 100644
--- a/src/core/config/embedded_linux.pri
+++ b/src/core/config/embedded_linux.pri
@@ -1,4 +1,4 @@
-GYP_ARGS += "-D qt_os=\"embedded_linux\""
+GYP_ARGS += "-D qt_os=\"embedded_linux\" -I config/embedded_linux.gypi"
GYP_CONFIG += \
embedded=1 \
diff --git a/src/core/core_gyp_generator.pro b/src/core/core_gyp_generator.pro
index f6b513a21..4012f198a 100644
--- a/src/core/core_gyp_generator.pro
+++ b/src/core/core_gyp_generator.pro
@@ -39,6 +39,7 @@ SOURCES = \
delegated_frame_node.cpp \
dev_tools_http_handler_delegate_qt.cpp \
download_manager_delegate_qt.cpp \
+ gl_context_qt.cpp \
javascript_dialog_controller.cpp \
javascript_dialog_manager_qt.cpp \
process_main.cpp \
@@ -77,6 +78,7 @@ HEADERS = \
dev_tools_http_handler_delegate_qt.h \
download_manager_delegate_qt.h \
chromium_gpu_helper.h \
+ gl_context_qt.h \
javascript_dialog_controller_p.h \
javascript_dialog_controller.h \
javascript_dialog_manager_qt.h \
diff --git a/src/core/gl_context_qt.cpp b/src/core/gl_context_qt.cpp
new file mode 100644
index 000000000..1d51292dc
--- /dev/null
+++ b/src/core/gl_context_qt.cpp
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** 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 Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "gl_context_qt.h"
+
+#include "ui/gl/gl_context_egl.h"
+
+QT_BEGIN_NAMESPACE
+
+GLContextHelper* GLContextHelper::contextHelper = 0;
+
+void GLContextHelper::initialize()
+{
+ if (!contextHelper)
+ contextHelper = new GLContextHelper;
+}
+
+bool GLContextHelper::initializeContextOnBrowserThread(gfx::GLContext* context, gfx::GLSurface* surface)
+{
+ return context->Initialize(surface, gfx::PreferDiscreteGpu);
+}
+
+bool GLContextHelper::initializeContext(gfx::GLContext* context, gfx::GLSurface* surface)
+{
+ bool ret = false;
+ QMetaObject::invokeMethod(contextHelper, "initializeContextOnBrowserThread", Qt::BlockingQueuedConnection,
+ Q_RETURN_ARG(bool, ret),
+ Q_ARG(gfx::GLContext*, context),
+ Q_ARG(gfx::GLSurface*, surface));
+ return ret;
+}
+
+QT_END_NAMESPACE
+
+#if defined(USE_OZONE)
+
+namespace gfx {
+
+scoped_refptr<GLContext> GLContext::CreateGLContext(GLShareGroup* share_group, GLSurface* compatible_surface, GpuPreference gpu_preference)
+{
+ scoped_refptr<GLContext> context(new GLContextEGL(share_group));
+ if (!GLContextHelper::initializeContext(context.get(), compatible_surface))
+ return NULL;
+
+ return context;
+}
+
+} // namespace gfx
+
+#endif // defined(USE_OZONE)
+
+
diff --git a/src/core/gl_context_qt.h b/src/core/gl_context_qt.h
new file mode 100644
index 000000000..efe8958be
--- /dev/null
+++ b/src/core/gl_context_qt.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** 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 Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef GL_GL_CONTEXT_QT_H_
+#define GL_GL_CONTEXT_QT_H_
+
+#include <QObject>
+
+QT_BEGIN_NAMESPACE
+
+namespace gfx {
+class GLContext;
+class GLSurface;
+}
+
+class GLContextHelper : public QObject {
+ Q_OBJECT
+public:
+ static void initialize();
+ static bool initializeContext(gfx::GLContext* context, gfx::GLSurface* surface);
+
+private:
+ Q_INVOKABLE bool initializeContextOnBrowserThread(gfx::GLContext* context, gfx::GLSurface* surface);
+
+ static GLContextHelper* contextHelper;
+};
+
+QT_END_NAMESPACE
+
+#endif
+
diff --git a/src/core/web_engine_context.cpp b/src/core/web_engine_context.cpp
index 7fd7e577d..b4e54aae1 100644
--- a/src/core/web_engine_context.cpp
+++ b/src/core/web_engine_context.cpp
@@ -68,6 +68,7 @@
#include "content_browser_client_qt.h"
#include "content_client_qt.h"
#include "content_main_delegate_qt.h"
+#include "gl_context_qt.h"
#include "type_conversion.h"
#include "web_engine_library_info.h"
#include <QGuiApplication>
@@ -152,6 +153,8 @@ WebEngineContext::WebEngineContext()
parsedCommandLine->AppendSwitch(cc::switches::kDisable4444Textures);
#endif
+ GLContextHelper::initialize();
+
// Tell Chromium to use EGL instead of GLX if the Qt xcb plugin also does.
if (qApp->platformName() == QStringLiteral("xcb") && qApp->platformNativeInterface()->nativeResourceForWindow(QByteArrayLiteral("egldisplay"), 0))
parsedCommandLine->AppendSwitchASCII(switches::kUseGL, gfx::kGLImplementationEGLName);