| From bdfd084296681bcead17c42f1e5cf0e24ee04f65 Mon Sep 17 00:00:00 2001 |
| From: Viktor Engelmann <viktor.engelmann@qt.io> |
| Date: Fri, 7 Jul 2017 12:56:19 +0200 |
| Subject: [PATCH] Load libEGL and libGLES2 symbols implicitly |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=utf-8 |
| Content-Transfer-Encoding: 8bit |
| |
| Instead of explicitly loading libraries from hard-coded locations, |
| we now just call dlopen(NULL, RTLD_LAZY). This returns a handle to |
| the host process'es context, which already contains the symbols of |
| both these libraries, because we link against them. |
| It was necessary to bypass LoadLibrary, because that expects a non-NULL |
| file path, so we couldn't pass NULL through that interface. |
| |
| Upstream-Status: Merged |
| Task-number: QTBUG-57761 |
| Change-Id: I29f037dfe542222b5188a33c7727c81a464a87bb |
| Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io> |
| Reviewed-by: Michal Klocek <michal.klocek@qt.io> |
| Signed-off-by: Gaël PORTAY <gael.portay@savoirfairelinux.com> |
| [gportay: backport from 5.9 and merge conflicts] |
| --- |
| src/core/surface_factory_qt.cpp | 40 ++++++++-------------------------------- |
| 1 file changed, 8 insertions(+), 32 deletions(-) |
| |
| diff --git a/src/core/surface_factory_qt.cpp b/src/core/surface_factory_qt.cpp |
| index 48c91bfc..c6059b67 100644 |
| --- a/src/core/surface_factory_qt.cpp |
| +++ b/src/core/surface_factory_qt.cpp |
| @@ -51,51 +51,27 @@ |
| #if defined(USE_OZONE) |
| |
| #include <EGL/egl.h> |
| - |
| -#ifndef QT_LIBDIR_EGL |
| -#define QT_LIBDIR_EGL "/usr/lib" |
| -#endif |
| -#ifndef QT_LIBDIR_GLES2 |
| -#define QT_LIBDIR_GLES2 QT_LIBDIR_EGL |
| -#endif |
| +#include <dlfcn.h> |
| |
| namespace QtWebEngineCore { |
| |
| -base::NativeLibrary LoadLibrary(const base::FilePath& filename) { |
| - base::NativeLibraryLoadError error; |
| - base::NativeLibrary library = base::LoadNativeLibrary(filename, &error); |
| - if (!library) { |
| - LOG(ERROR) << "Failed to load " << filename.MaybeAsASCII() << ": " << error.ToString(); |
| - return NULL; |
| - } |
| - return library; |
| -} |
| - |
| bool SurfaceFactoryQt::LoadEGLGLES2Bindings(AddGLLibraryCallback add_gl_library, SetGLGetProcAddressProcCallback set_gl_get_proc_address) |
| { |
| - base::FilePath libEGLPath = QtWebEngineCore::toFilePath(QT_LIBDIR_EGL); |
| - libEGLPath = libEGLPath.Append("libEGL.so.1"); |
| - base::NativeLibrary eglLibrary = LoadLibrary(libEGLPath); |
| - if (!eglLibrary) |
| - return false; |
| - |
| - base::FilePath libGLES2Path = QtWebEngineCore::toFilePath(QT_LIBDIR_GLES2); |
| - libGLES2Path = libGLES2Path.Append("libGLESv2.so.2"); |
| - base::NativeLibrary gles2Library = LoadLibrary(libGLES2Path); |
| - if (!gles2Library) |
| + base::NativeLibrary eglgles2Library = dlopen(NULL, RTLD_LAZY); |
| + if (!eglgles2Library) { |
| + LOG(ERROR) << "Failed to open EGL/GLES2 context " << dlerror(); |
| return false; |
| + } |
| |
| - gfx::GLGetProcAddressProc get_proc_address = reinterpret_cast<gfx::GLGetProcAddressProc>(base::GetFunctionPointerFromNativeLibrary(eglLibrary, "eglGetProcAddress")); |
| + gfx::GLGetProcAddressProc get_proc_address = reinterpret_cast<gfx::GLGetProcAddressProc>(base::GetFunctionPointerFromNativeLibrary(eglgles2Library, "eglGetProcAddress")); |
| if (!get_proc_address) { |
| LOG(ERROR) << "eglGetProcAddress not found."; |
| - base::UnloadNativeLibrary(eglLibrary); |
| - base::UnloadNativeLibrary(gles2Library); |
| + base::UnloadNativeLibrary(eglgles2Library); |
| return false; |
| } |
| |
| gfx::SetGLGetProcAddressProc(get_proc_address); |
| - gfx::AddGLNativeLibrary(eglLibrary); |
| - gfx::AddGLNativeLibrary(gles2Library); |
| + gfx::AddGLNativeLibrary(eglgles2Library); |
| return true; |
| } |
| |
| -- |
| 2.15.0 |
| |