diff options
author | Akihiko Odaki <akihiko.odaki.4i@stu.hosei.ac.jp> | 2016-06-02 10:14:41 +0900 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2016-07-13 17:07:50 +0000 |
commit | f2c7c89d9f31b79a1db403602195362bca40c4bb (patch) | |
tree | a160dab34769a2662003581b78e6de1443bfda76 | |
parent | 1e83a2d1b61b13323163dfe8cac64dad397cb202 (diff) | |
download | qtwebengine-f2c7c89d9f31b79a1db403602195362bca40c4bb.tar.gz |
Improve OpenGL implementation check
Qt WebEngine uses `isOpenGLES` to know whether the OpenGL implementation is
EGL with OpenGL ES 2.0. However, some non-ES OpenGL implementation such as
eglfs_x11 uses EGL and are compatible with OpenGL ES 2.0. This change
allows to use them.
Also the change will allow to detect incompatible combinations.
(i.e. EGL + ES-incompatible OpenGL, API other than EGL + OpenGL ES)
Change-Id: I0abea253696d06ec365bde2176663700e8567f45
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
-rw-r--r-- | src/core/web_engine_context.cpp | 46 |
1 files changed, 38 insertions, 8 deletions
diff --git a/src/core/web_engine_context.cpp b/src/core/web_engine_context.cpp index 4bd29dddf..3289a3c23 100644 --- a/src/core/web_engine_context.cpp +++ b/src/core/web_engine_context.cpp @@ -78,8 +78,10 @@ #include "web_engine_library_info.h" #include <QFileInfo> #include <QGuiApplication> +#include <QOffscreenSurface> #include <QOpenGLContext> #include <QStringList> +#include <QSurfaceFormat> #include <QVector> #include <qpa/qplatformnativeinterface.h> @@ -261,15 +263,40 @@ WebEngineContext::WebEngineContext() GLContextHelper::initialize(); - if (usingANGLE() || usingSoftwareDynamicGL() || usingQtQuick2DRenderer()) { - parsedCommandLine->AppendSwitch(switches::kDisableGpu); - } else { - const char *glType = 0; + const char *glType = 0; + if (!usingANGLE() && !usingSoftwareDynamicGL() && !usingQtQuick2DRenderer()) { if (qt_gl_global_share_context()) { - if (qt_gl_global_share_context()->isOpenGLES()) { - glType = gfx::kGLImplementationEGLName; + if (!strcmp(qt_gl_global_share_context()->nativeHandle().typeName(), "QEGLNativeContext")) { + if (qt_gl_global_share_context()->isOpenGLES()) { + glType = gfx::kGLImplementationEGLName; + } else { + QOpenGLContext context; + QSurfaceFormat format; + + format.setRenderableType(QSurfaceFormat::OpenGLES); + format.setVersion(2, 0); + + context.setFormat(format); + context.setShareContext(qt_gl_global_share_context()); + if (context.create()) { + QOffscreenSurface surface; + + surface.setFormat(format); + surface.create(); + + if (context.makeCurrent(&surface)) { + if (context.hasExtension("GL_ARB_ES2_compatibility")) + glType = gfx::kGLImplementationEGLName; + + context.doneCurrent(); + } + + surface.destroy(); + } + } } else { - glType = gfx::kGLImplementationDesktopName; + if (!qt_gl_global_share_context()->isOpenGLES()) + glType = gfx::kGLImplementationDesktopName; } } else { qWarning("WebEngineContext used before QtWebEngine::initialize()"); @@ -283,9 +310,12 @@ WebEngineContext::WebEngineContext() break; } } + } + if (glType) parsedCommandLine->AppendSwitchASCII(switches::kUseGL, glType); - } + else + parsedCommandLine->AppendSwitch(switches::kDisableGpu); content::UtilityProcessHostImpl::RegisterUtilityMainThreadFactory(content::CreateInProcessUtilityThread); content::RenderProcessHostImpl::RegisterRendererMainThreadFactory(content::CreateInProcessRendererThread); |