diff options
author | 2023-11-04 00:18:14 +0000 | |
---|---|---|
committer | 2023-11-04 00:18:14 +0000 | |
commit | 940e127e7159c2d656f46863ca0da3c7c62456a5 (patch) | |
tree | dc468b53c751089b0c990745bbea025564c0592a | |
parent | 1d1f7ac538473bc368a5358c9fb9f4d8c25ad142 (diff) | |
parent | 9fc4cf3f8159c5f2572dc92f58c5e07f7957f361 (diff) |
Merge "Avoid double initialization of ANGLE platform." into main
-rw-r--r-- | opengl/libs/EGL/Loader.cpp | 6 | ||||
-rw-r--r-- | opengl/libs/EGL/egl_angle_platform.cpp | 53 | ||||
-rw-r--r-- | opengl/libs/EGL/egl_angle_platform.h | 4 | ||||
-rw-r--r-- | opengl/libs/EGL/egl_display.cpp | 4 | ||||
-rw-r--r-- | opengl/libs/EGL/egldefs.h | 7 |
5 files changed, 23 insertions, 51 deletions
diff --git a/opengl/libs/EGL/Loader.cpp b/opengl/libs/EGL/Loader.cpp index 0e685bc15b..10857a0e47 100644 --- a/opengl/libs/EGL/Loader.cpp +++ b/opengl/libs/EGL/Loader.cpp @@ -611,8 +611,10 @@ Loader::driver_t* Loader::attempt_to_load_angle(egl_connection_t* cnx) { } void Loader::attempt_to_init_angle_backend(void* dso, egl_connection_t* cnx) { - void* pANGLEGetDisplayPlatform = dlsym(dso, "ANGLEGetDisplayPlatform"); - if (pANGLEGetDisplayPlatform) { + cnx->angleGetDisplayPlatformFunc = dlsym(dso, "ANGLEGetDisplayPlatform"); + cnx->angleResetDisplayPlatformFunc = dlsym(dso, "ANGLEResetDisplayPlatform"); + + if (cnx->angleGetDisplayPlatformFunc) { ALOGV("ANGLE GLES library loaded"); cnx->angleLoaded = true; android::GraphicsEnv::getInstance().setDriverToLoad(android::GpuStatsInfo::Driver::ANGLE); diff --git a/opengl/libs/EGL/egl_angle_platform.cpp b/opengl/libs/EGL/egl_angle_platform.cpp index a8395d99c4..f0054a7cf7 100644 --- a/opengl/libs/EGL/egl_angle_platform.cpp +++ b/opengl/libs/EGL/egl_angle_platform.cpp @@ -35,12 +35,6 @@ namespace angle { -constexpr char kAngleEs2Lib[] = "libGLESv2_angle.so"; -constexpr int kAngleDlFlags = RTLD_LOCAL | RTLD_NOW; - -static GetDisplayPlatformFunc angleGetDisplayPlatform = nullptr; -static ResetDisplayPlatformFunc angleResetDisplayPlatform = nullptr; - static time_t startTime = time(nullptr); static const unsigned char* getTraceCategoryEnabledFlag(PlatformMethods* /*platform*/, @@ -111,50 +105,19 @@ static void assignAnglePlatformMethods(PlatformMethods* platformMethods) { } // Initialize function ptrs for ANGLE PlatformMethods struct, used for systrace -bool initializeAnglePlatform(EGLDisplay dpy) { - // Since we're inside libEGL, use dlsym to lookup fptr for ANGLEGetDisplayPlatform - android_namespace_t* ns = android::GraphicsEnv::getInstance().getAngleNamespace(); - void* so = nullptr; - if (ns) { - const android_dlextinfo dlextinfo = { - .flags = ANDROID_DLEXT_USE_NAMESPACE, - .library_namespace = ns, - }; - so = android_dlopen_ext(kAngleEs2Lib, kAngleDlFlags, &dlextinfo); - if (so) { - ALOGD("dlopen_ext from APK (%s) success at %p", kAngleEs2Lib, so); - } else { - ALOGE("dlopen_ext(\"%s\") failed: %s", kAngleEs2Lib, dlerror()); - return false; - } - } else { - // If we are here, ANGLE is loaded as the default OpenGL ES driver. - so = dlopen(kAngleEs2Lib, kAngleDlFlags); - if (so) { - ALOGD("dlopen (%s) success at %p", kAngleEs2Lib, so); - } else { - ALOGE("%s failed to dlopen %s: %s!", __FUNCTION__, kAngleEs2Lib, dlerror()); - return false; - } - } - - angleGetDisplayPlatform = - reinterpret_cast<GetDisplayPlatformFunc>(dlsym(so, "ANGLEGetDisplayPlatform")); - - if (!angleGetDisplayPlatform) { - ALOGE("dlsym lookup of ANGLEGetDisplayPlatform in libEGL_angle failed!"); - dlclose(so); +bool initializeAnglePlatform(EGLDisplay dpy, android::egl_connection_t* const cnx) { + if (cnx->angleGetDisplayPlatformFunc == nullptr) { + ALOGE("ANGLEGetDisplayPlatform is not initialized!"); return false; } - angleResetDisplayPlatform = - reinterpret_cast<ResetDisplayPlatformFunc>(dlsym(so, "ANGLEResetDisplayPlatform")); + GetDisplayPlatformFunc angleGetDisplayPlatform = + reinterpret_cast<GetDisplayPlatformFunc>(cnx->angleGetDisplayPlatformFunc); PlatformMethods* platformMethods = nullptr; if (!((angleGetDisplayPlatform)(dpy, g_PlatformMethodNames, g_NumPlatformMethods, nullptr, &platformMethods))) { ALOGE("ANGLEGetDisplayPlatform call failed!"); - dlclose(so); return false; } if (platformMethods) { @@ -166,8 +129,10 @@ bool initializeAnglePlatform(EGLDisplay dpy) { return true; } -void resetAnglePlatform(EGLDisplay dpy) { - if (angleResetDisplayPlatform) { +void resetAnglePlatform(EGLDisplay dpy, android::egl_connection_t* const cnx) { + if (cnx->angleResetDisplayPlatformFunc) { + ResetDisplayPlatformFunc angleResetDisplayPlatform = + reinterpret_cast<ResetDisplayPlatformFunc>(cnx->angleResetDisplayPlatformFunc); angleResetDisplayPlatform(dpy); } } diff --git a/opengl/libs/EGL/egl_angle_platform.h b/opengl/libs/EGL/egl_angle_platform.h index 6c24aa5418..63806c2a4c 100644 --- a/opengl/libs/EGL/egl_angle_platform.h +++ b/opengl/libs/EGL/egl_angle_platform.h @@ -25,8 +25,8 @@ namespace angle { -bool initializeAnglePlatform(EGLDisplay dpy); -void resetAnglePlatform(EGLDisplay dpy); +bool initializeAnglePlatform(EGLDisplay dpy, android::egl_connection_t* const cnx); +void resetAnglePlatform(EGLDisplay dpy, android::egl_connection_t* const cnx); }; // namespace angle diff --git a/opengl/libs/EGL/egl_display.cpp b/opengl/libs/EGL/egl_display.cpp index 3317347066..55a2682ac0 100644 --- a/opengl/libs/EGL/egl_display.cpp +++ b/opengl/libs/EGL/egl_display.cpp @@ -168,7 +168,7 @@ static EGLDisplay getPlatformDisplayAngle(EGLNativeDisplayType display, egl_conn if (dpy == EGL_NO_DISPLAY) { ALOGE("eglGetPlatformDisplay failed!"); } else { - if (!angle::initializeAnglePlatform(dpy)) { + if (!angle::initializeAnglePlatform(dpy, cnx)) { ALOGE("initializeAnglePlatform failed!"); } } @@ -433,7 +433,7 @@ EGLBoolean egl_display_t::terminate() { if (cnx->dso && disp.state == egl_display_t::INITIALIZED) { // If we're using ANGLE reset any custom DisplayPlatform if (cnx->angleLoaded) { - angle::resetAnglePlatform(disp.dpy); + angle::resetAnglePlatform(disp.dpy, cnx); } if (cnx->egl.eglTerminate(disp.dpy) == EGL_FALSE) { ALOGW("eglTerminate(%p) failed (%s)", disp.dpy, diff --git a/opengl/libs/EGL/egldefs.h b/opengl/libs/EGL/egldefs.h index 3bd37cb399..90a3c199a9 100644 --- a/opengl/libs/EGL/egldefs.h +++ b/opengl/libs/EGL/egldefs.h @@ -42,7 +42,9 @@ struct egl_connection_t { libGles1(nullptr), libGles2(nullptr), systemDriverUnloaded(false), - angleLoaded(false) { + angleLoaded(false), + angleGetDisplayPlatformFunc(nullptr), + angleResetDisplayPlatformFunc(nullptr) { const char* const* entries = platform_names; EGLFuncPointer* curr = reinterpret_cast<EGLFuncPointer*>(&platform); while (*entries) { @@ -75,6 +77,9 @@ struct egl_connection_t { bool systemDriverUnloaded; bool angleLoaded; // Was ANGLE successfully loaded + + void* angleGetDisplayPlatformFunc; + void* angleResetDisplayPlatformFunc; }; extern gl_hooks_t gHooks[2]; |