diff options
| author | 2017-04-10 01:53:32 +0000 | |
|---|---|---|
| committer | 2017-04-10 01:53:33 +0000 | |
| commit | 8bac3c1fb41e930961f97efa2ce587903595c153 (patch) | |
| tree | c240b10d91cc9b2035dfedb6fc8591e1a6f674bd | |
| parent | 873da45918a80d59323e13b94b878dd593374025 (diff) | |
| parent | 5910dc7365f94ea10a879342710c76d577cb2690 (diff) | |
Merge "Load GL graphics drivers explicitly from sphal namespace" into oc-dev
| -rw-r--r-- | opengl/libs/EGL/Loader.cpp | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/opengl/libs/EGL/Loader.cpp b/opengl/libs/EGL/Loader.cpp index 683e6ca2c6..7d20ba1fa8 100644 --- a/opengl/libs/EGL/Loader.cpp +++ b/opengl/libs/EGL/Loader.cpp @@ -33,6 +33,10 @@ #include "egl_trace.h" #include "egldefs.h" +extern "C" { + android_namespace_t* android_get_exported_namespace(const char*); +} + // ---------------------------------------------------------------------------- namespace android { // ---------------------------------------------------------------------------- @@ -106,6 +110,11 @@ static void* do_dlopen(const char* path, int mode) { return dlopen(path, mode); } +static void* do_android_dlopen_ext(const char* path, int mode, const android_dlextinfo* info) { + ATRACE_CALL(); + return android_dlopen_ext(path, mode, info); +} + // ---------------------------------------------------------------------------- Loader::driver_t::driver_t(void* gles) @@ -414,6 +423,27 @@ static void* load_system_driver(const char* kind) { } const char* const driver_absolute_path = absolutePath.c_str(); + // Try to load drivers from the 'sphal' namespace, if it exist. Fall back to + // the original routine when the namespace does not exist or the load from + // the namespace fails. + // See /system/core/rootdir/etc/ld.config.txt for the configuration of the + // sphal namespace. + android_namespace_t* sphal_namespace = android_get_exported_namespace("sphal"); + if (sphal_namespace != NULL) { + const android_dlextinfo dlextinfo = { + .flags = ANDROID_DLEXT_USE_NAMESPACE, + .library_namespace = sphal_namespace, + }; + void* dso = do_android_dlopen_ext(driver_absolute_path, RTLD_LOCAL | RTLD_NOW, &dlextinfo); + if (dso) { + ALOGD("loaded %s from sphal namespace", driver_absolute_path); + return dso; + } + else { + ALOGW("failed to load %s from sphal namespace: %s", driver_absolute_path, dlerror()); + } + } + void* dso = do_dlopen(driver_absolute_path, RTLD_NOW | RTLD_LOCAL); if (dso == 0) { const char* err = dlerror(); @@ -426,11 +456,6 @@ static void* load_system_driver(const char* kind) { return dso; } -static void* do_android_dlopen_ext(const char* path, int mode, const android_dlextinfo* info) { - ATRACE_CALL(); - return android_dlopen_ext(path, mode, info); -} - static const char* HAL_SUBNAME_KEY_PROPERTIES[2] = { "ro.hardware.egl", "ro.board.platform", |