diff options
author | 2023-11-03 05:18:53 +0000 | |
---|---|---|
committer | 2023-11-03 05:37:14 +0000 | |
commit | 9fc4cf3f8159c5f2572dc92f58c5e07f7957f361 (patch) | |
tree | d1cbbc6b94d0123956213395b9d3107a1b0d13f1 | |
parent | aa21941f474c12e391ce62a8959c34ed8a1ab653 (diff) |
Avoid double initialization of ANGLE platform.
Previously when ANGLE libraries were loaded, the loader already
attempted to dlsym the ANGLEGetDisplayPlatform method, but when
EGLDisplay is called everytime, it will always call into open the ANGLE
library again and attempt to dlsym ANGLEGetDisplayPlatform and
ANGLEResetDisplayPlatform, since ANGLE is already opened, the loader
should just dlsym once and bookkeep the results.
Bug: b/236050939
Test: trace no longer shows duplicate display platform call
Change-Id: I8ce2596c3b0968a4a2e9f7651f59d2ad67efbc64
-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 3d31e67289..ba5a20125f 100644 --- a/opengl/libs/EGL/Loader.cpp +++ b/opengl/libs/EGL/Loader.cpp @@ -608,8 +608,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]; |