Loading opengl/libs/EGL/egl_angle_platform.cpp +25 −6 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ #pragma GCC diagnostic ignored "-Wunused-parameter" #include <EGL/Platform.h> #pragma GCC diagnostic pop #include <android-base/properties.h> #include <android/dlext.h> #include <dlfcn.h> #include <graphicsenv/GraphicsEnv.h> Loading @@ -33,7 +35,6 @@ namespace angle { constexpr char kAngleEs2Lib[] = "libGLESv2_angle.so"; constexpr int kAngleDlFlags = RTLD_LOCAL | RTLD_NOW; static GetDisplayPlatformFunc angleGetDisplayPlatform = nullptr; Loading Loading @@ -107,19 +108,37 @@ bool initializeAnglePlatform(EGLDisplay dpy) { android_namespace_t* ns = android::GraphicsEnv::getInstance().getAngleNamespace(); void* so = nullptr; if (ns) { // Loading from an APK, so hard-code the suffix to "_angle". constexpr char kAngleEs2Lib[] = "libGLESv2_angle.so"; 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 built-in gl driver in the sphal. so = android_load_sphal_library(kAngleEs2Lib, kAngleDlFlags); // Get the specified ANGLE library filename suffix. std::string angleEs2LibSuffix = android::base::GetProperty("ro.hardware.egl", ""); if (angleEs2LibSuffix.empty()) { ALOGE("%s failed to get valid ANGLE library filename suffix!", __FUNCTION__); return false; } if (!so) { ALOGE("%s failed to dlopen %s!", __FUNCTION__, kAngleEs2Lib); std::string angleEs2LibName = "libGLESv2_" + angleEs2LibSuffix + ".so"; so = android_load_sphal_library(angleEs2LibName.c_str(), kAngleDlFlags); if (so) { ALOGD("dlopen (%s) success at %p", angleEs2LibName.c_str(), so); } else { ALOGE("%s failed to dlopen %s!", __FUNCTION__, angleEs2LibName.c_str()); return false; } } angleGetDisplayPlatform = reinterpret_cast<GetDisplayPlatformFunc>(dlsym(so, "ANGLEGetDisplayPlatform")); Loading Loading
opengl/libs/EGL/egl_angle_platform.cpp +25 −6 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ #pragma GCC diagnostic ignored "-Wunused-parameter" #include <EGL/Platform.h> #pragma GCC diagnostic pop #include <android-base/properties.h> #include <android/dlext.h> #include <dlfcn.h> #include <graphicsenv/GraphicsEnv.h> Loading @@ -33,7 +35,6 @@ namespace angle { constexpr char kAngleEs2Lib[] = "libGLESv2_angle.so"; constexpr int kAngleDlFlags = RTLD_LOCAL | RTLD_NOW; static GetDisplayPlatformFunc angleGetDisplayPlatform = nullptr; Loading Loading @@ -107,19 +108,37 @@ bool initializeAnglePlatform(EGLDisplay dpy) { android_namespace_t* ns = android::GraphicsEnv::getInstance().getAngleNamespace(); void* so = nullptr; if (ns) { // Loading from an APK, so hard-code the suffix to "_angle". constexpr char kAngleEs2Lib[] = "libGLESv2_angle.so"; 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 built-in gl driver in the sphal. so = android_load_sphal_library(kAngleEs2Lib, kAngleDlFlags); // Get the specified ANGLE library filename suffix. std::string angleEs2LibSuffix = android::base::GetProperty("ro.hardware.egl", ""); if (angleEs2LibSuffix.empty()) { ALOGE("%s failed to get valid ANGLE library filename suffix!", __FUNCTION__); return false; } if (!so) { ALOGE("%s failed to dlopen %s!", __FUNCTION__, kAngleEs2Lib); std::string angleEs2LibName = "libGLESv2_" + angleEs2LibSuffix + ".so"; so = android_load_sphal_library(angleEs2LibName.c_str(), kAngleDlFlags); if (so) { ALOGD("dlopen (%s) success at %p", angleEs2LibName.c_str(), so); } else { ALOGE("%s failed to dlopen %s!", __FUNCTION__, angleEs2LibName.c_str()); return false; } } angleGetDisplayPlatform = reinterpret_cast<GetDisplayPlatformFunc>(dlsym(so, "ANGLEGetDisplayPlatform")); Loading