Loading opengl/libs/EGL/Loader.cpp +4 −2 Original line number Diff line number Diff line Loading @@ -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); Loading opengl/libs/EGL/egl_angle_platform.cpp +9 −44 Original line number Diff line number Diff line Loading @@ -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*/, Loading Loading @@ -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) { Loading @@ -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); } } Loading opengl/libs/EGL/egl_angle_platform.h +2 −2 Original line number Diff line number Diff line Loading @@ -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 Loading opengl/libs/EGL/egl_display.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -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!"); } } Loading Loading @@ -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, Loading opengl/libs/EGL/egldefs.h +6 −1 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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]; Loading Loading
opengl/libs/EGL/Loader.cpp +4 −2 Original line number Diff line number Diff line Loading @@ -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); Loading
opengl/libs/EGL/egl_angle_platform.cpp +9 −44 Original line number Diff line number Diff line Loading @@ -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*/, Loading Loading @@ -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) { Loading @@ -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); } } Loading
opengl/libs/EGL/egl_angle_platform.h +2 −2 Original line number Diff line number Diff line Loading @@ -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 Loading
opengl/libs/EGL/egl_display.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -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!"); } } Loading Loading @@ -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, Loading
opengl/libs/EGL/egldefs.h +6 −1 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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]; Loading