summaryrefslogtreecommitdiff
path: root/host/libs/virglrenderer
diff options
context:
space:
mode:
Diffstat (limited to 'host/libs/virglrenderer')
-rw-r--r--host/libs/virglrenderer/OpenGLESDispatch/EGLDispatch.cpp25
-rw-r--r--host/libs/virglrenderer/OpenGLESDispatch/GLESv1Dispatch.cpp9
-rw-r--r--host/libs/virglrenderer/OpenGLESDispatch/GLESv3Dispatch.cpp9
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)