diff options
Diffstat (limited to 'host/libs/virglrenderer')
3 files changed, 40 insertions, 3 deletions
diff --git a/host/libs/virglrenderer/OpenGLESDispatch/EGLDispatch.cpp b/host/libs/virglrenderer/OpenGLESDispatch/EGLDispatch.cpp index c068ee3b2..5b64ba5c0 100644 --- a/host/libs/virglrenderer/OpenGLESDispatch/EGLDispatch.cpp +++ b/host/libs/virglrenderer/OpenGLESDispatch/EGLDispatch.cpp @@ -15,6 +15,9 @@ */ #include "OpenGLESDispatch/EGLDispatch.h" +#include "android/base/synchronization/Lock.h" +#include "android/base/memory/LazyInstance.h" + #include "emugl/common/shared_library.h" #include <stdio.h> @@ -25,7 +28,11 @@ EGLDispatch s_egl; #define DEFAULT_EGL_LIB EMUGL_LIBNAME("EGL_translator") #define RENDER_EGL_LOAD_FIELD(return_type, function_name, signature) \ - s_egl. function_name = (function_name ## _t) lib->findSymbol(#function_name); + s_egl. function_name = (function_name ## _t) lib->findSymbol(#function_name); \ + +#define RENDER_EGL_LOAD_FIELD_WITH_EGL(return_type, function_name, signature) \ + if ((!s_egl. function_name) && s_egl.eglGetProcAddress) s_egl. function_name = \ + (function_name ## _t) s_egl.eglGetProcAddress(#function_name); \ #define RENDER_EGL_LOAD_OPTIONAL_FIELD(return_type, function_name, signature) \ if (s_egl.eglGetProcAddress) s_egl. function_name = \ @@ -33,7 +40,19 @@ EGLDispatch s_egl; if (!s_egl.function_name || !s_egl.eglGetProcAddress) \ RENDER_EGL_LOAD_FIELD(return_type, function_name, signature) +struct AsyncEGLInitData { + bool initialized = false; + android::base::Lock lock; +}; + +static android::base::LazyInstance<AsyncEGLInitData> sInitData = + LAZY_INSTANCE_INIT; + bool init_egl_dispatch() { + android::base::AutoLock lock(sInitData->lock); + + if (sInitData->initialized) return true; + const char *libName = getenv("ANDROID_EGL_LIB"); if (!libName) libName = DEFAULT_EGL_LIB; char error[256]; @@ -42,9 +61,13 @@ bool init_egl_dispatch() { printf("Failed to open %s: [%s]\n", libName, error); return false; } + LIST_RENDER_EGL_FUNCTIONS(RENDER_EGL_LOAD_FIELD) + LIST_RENDER_EGL_FUNCTIONS(RENDER_EGL_LOAD_FIELD_WITH_EGL) LIST_RENDER_EGL_EXTENSIONS_FUNCTIONS(RENDER_EGL_LOAD_OPTIONAL_FIELD) LIST_RENDER_EGL_SNAPSHOT_FUNCTIONS(RENDER_EGL_LOAD_FIELD) + sInitData->initialized = true; + return true; } diff --git a/host/libs/virglrenderer/OpenGLESDispatch/GLESv1Dispatch.cpp b/host/libs/virglrenderer/OpenGLESDispatch/GLESv1Dispatch.cpp index 3e0d59c88..f40cb03ed 100644 --- a/host/libs/virglrenderer/OpenGLESDispatch/GLESv1Dispatch.cpp +++ b/host/libs/virglrenderer/OpenGLESDispatch/GLESv1Dispatch.cpp @@ -16,6 +16,8 @@ #include "OpenGLESDispatch/GLESv1Dispatch.h" #include "OpenGLESDispatch/GLESv2Dispatch.h" +#include "OpenGLESDispatch/EGLDispatch.h" + #include "android/utils/debug.h" #include <stdio.h> @@ -114,6 +116,8 @@ LIST_GLES12_TR_FUNCTIONS(DEFINE_DUMMY_FUNCTION); } while(0); bool gles1_dispatch_init(GLESv1Dispatch* dispatch_table) { + init_egl_dispatch(); + dispatch_table->underlying_gles2_api = NULL; const char* libName = getenv("ANDROID_GLESv1_LIB"); @@ -146,7 +150,10 @@ bool gles1_dispatch_init(GLESv1Dispatch* dispatch_table) { #define LOOKUP_SYMBOL(return_type,function_name,signature,callargs) do { \ dispatch_table-> function_name = reinterpret_cast< function_name ## _t >( \ s_gles1_lib->findSymbol(#function_name)); \ - } while(0); + if ((!dispatch_table-> function_name) && s_egl.eglGetProcAddress) \ + dispatch_table-> function_name = reinterpret_cast< function_name ## _t >( \ + s_egl.eglGetProcAddress(#function_name)); \ + } while(0); \ LIST_GLES1_FUNCTIONS(LOOKUP_SYMBOL,LOOKUP_SYMBOL) diff --git a/host/libs/virglrenderer/OpenGLESDispatch/GLESv3Dispatch.cpp b/host/libs/virglrenderer/OpenGLESDispatch/GLESv3Dispatch.cpp index 2ba6f94b2..4aecc14d8 100644 --- a/host/libs/virglrenderer/OpenGLESDispatch/GLESv3Dispatch.cpp +++ b/host/libs/virglrenderer/OpenGLESDispatch/GLESv3Dispatch.cpp @@ -15,6 +15,8 @@ */ #include "OpenGLESDispatch/GLESv2Dispatch.h" +#include "OpenGLESDispatch/EGLDispatch.h" + #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -42,6 +44,8 @@ static GLESDispatchMaxVersion s_max_supported_gles_version = GLES_DISPATCH_MAX_V // bool gles2_dispatch_init(GLESv2Dispatch* dispatch_table) { + init_egl_dispatch(); + const char *libName = getenv("ANDROID_GLESv2_LIB"); if (!libName) { libName = DEFAULT_GLES_V2_LIB; @@ -60,7 +64,10 @@ bool gles2_dispatch_init(GLESv2Dispatch* dispatch_table) // #define LOOKUP_SYMBOL(return_type,function_name,signature,callargs) \ dispatch_table-> function_name = reinterpret_cast< function_name ## _t >( \ - s_gles2_lib->findSymbol(#function_name)); + s_gles2_lib->findSymbol(#function_name)); \ + if ((!dispatch_table-> function_name) && s_egl.eglGetProcAddress) \ + dispatch_table-> function_name = reinterpret_cast< function_name ## _t >( \ + s_egl.eglGetProcAddress(#function_name)); \ LIST_GLES2_FUNCTIONS(LOOKUP_SYMBOL,LOOKUP_SYMBOL) |