Merge "Pass more ANGLE info from runtime"
diff --git a/libs/graphicsenv/GraphicsEnv.cpp b/libs/graphicsenv/GraphicsEnv.cpp
index 80daeb9..282b468 100644
--- a/libs/graphicsenv/GraphicsEnv.cpp
+++ b/libs/graphicsenv/GraphicsEnv.cpp
@@ -56,14 +56,25 @@
     mDriverPath = path;
 }
 
-void GraphicsEnv::setAnglePath(const std::string path) {
+void GraphicsEnv::setAngleInfo(const std::string path, const std::string appName,
+                               bool developerOptIn) {
     if (!mAnglePath.empty()) {
         ALOGV("ignoring attempt to change ANGLE path from '%s' to '%s'", mAnglePath.c_str(),
               path.c_str());
-        return;
+    } else {
+        ALOGV("setting ANGLE path to '%s'", path.c_str());
+        mAnglePath = path;
     }
-    ALOGV("setting ANGLE path to '%s'", path.c_str());
-    mAnglePath = path;
+
+    if (!mAngleAppName.empty()) {
+        ALOGV("ignoring attempt to change ANGLE app name from '%s' to '%s'", mAngleAppName.c_str(),
+              appName.c_str());
+    } else {
+        ALOGV("setting ANGLE app name to '%s'", appName.c_str());
+        mAngleAppName = appName;
+    }
+
+    mAngleDeveloperOptIn = developerOptIn;
 }
 
 void GraphicsEnv::setLayerPaths(NativeLoaderNamespace* appNamespace, const std::string layerPaths) {
@@ -80,6 +91,15 @@
     return mAppNamespace;
 }
 
+const char* GraphicsEnv::getAngleAppName() {
+    if (mAngleAppName.empty()) return nullptr;
+    return mAngleAppName.c_str();
+}
+
+bool GraphicsEnv::getAngleDeveloperOptIn() {
+    return mAngleDeveloperOptIn;
+}
+
 const std::string GraphicsEnv::getLayerPaths(){
     return mLayerPaths;
 }
@@ -139,4 +159,10 @@
 android_namespace_t* android_getAngleNamespace() {
     return android::GraphicsEnv::getInstance().getAngleNamespace();
 }
+const char* android_getAngleAppName() {
+    return android::GraphicsEnv::getInstance().getAngleAppName();
+}
+bool android_getAngleDeveloperOptIn() {
+    return android::GraphicsEnv::getInstance().getAngleDeveloperOptIn();
+}
 }
diff --git a/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h b/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h
index ea38a97..58d4582 100644
--- a/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h
+++ b/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h
@@ -42,8 +42,10 @@
     // (libraries must be stored uncompressed and page aligned); such elements
     // in the search path must have a '!' after the zip filename, e.g.
     //     /system/app/ANGLEPrebuilt/ANGLEPrebuilt.apk!/lib/arm64-v8a
-    void setAnglePath(const std::string path);
+    void setAngleInfo(const std::string path, const std::string appName, const bool optIn);
     android_namespace_t* getAngleNamespace();
+    const char* getAngleAppName();
+    bool getAngleDeveloperOptIn();
 
     void setLayerPaths(NativeLoaderNamespace* appNamespace, const std::string layerPaths);
     NativeLoaderNamespace* getAppNamespace();
@@ -57,6 +59,8 @@
     GraphicsEnv() = default;
     std::string mDriverPath;
     std::string mAnglePath;
+    std::string mAngleAppName;
+    bool mAngleDeveloperOptIn;
     std::string mDebugLayers;
     std::string mLayerPaths;
     android_namespace_t* mDriverNamespace = nullptr;
@@ -77,7 +81,11 @@
  *  - the EGLsyncKHR synchronization in BufferQueue, which is deprecated and
  *    will be removed soon.
  */
-extern "C" android_namespace_t* android_getDriverNamespace();
-extern "C" android_namespace_t* android_getAngleNamespace();
+extern "C" {
+android_namespace_t* android_getDriverNamespace();
+android_namespace_t* android_getAngleNamespace();
+const char* android_getAngleAppName();
+bool android_getAngleDeveloperOptIn();
+}
 
 #endif // ANDROID_UI_GRAPHICS_ENV_H
diff --git a/opengl/libs/EGL/Loader.cpp b/opengl/libs/EGL/Loader.cpp
index 2e01965..531bb20 100644
--- a/opengl/libs/EGL/Loader.cpp
+++ b/opengl/libs/EGL/Loader.cpp
@@ -475,7 +475,7 @@
     return nullptr;
 }
 
-static void* load_angle(const char* kind, android_namespace_t* ns, egl_connection_t* cnx) {
+static void* load_angle(const char* kind, egl_connection_t* cnx) {
     // Only attempt to load ANGLE libs
     if (strcmp(kind, "EGL") != 0 && strcmp(kind, "GLESv2") != 0 && strcmp(kind, "GLESv1_CM") != 0)
         return nullptr;
@@ -483,11 +483,20 @@
     void* so = nullptr;
     std::string name;
 
+    android_namespace_t* ns = android_getAngleNamespace();
+    const char* app_name = android_getAngleAppName();
+    bool developer_opt_in = android_getAngleDeveloperOptIn();
+
     if (ns) {
-        so = load_angle_from_namespace(kind, ns);
+        // If we got a namespce for ANGLE, check any other conditions
+        // before loading from it.
+        if (developer_opt_in) {
+            so = load_angle_from_namespace(kind, ns);
+        }
     }
 
     if (so) {
+        ALOGD("Loaded ANGLE libraries for %s", app_name ? app_name : "nullptr");
         cnx->useAngle = true;
         // Find and load vendor libEGL for ANGLE
         if (!cnx->vendorEGL) {
@@ -530,11 +539,10 @@
     ATRACE_CALL();
 
     void* dso = nullptr;
-    android_namespace_t* ns = android_getAngleNamespace();
-    dso = load_angle(kind, ns, cnx);
+    dso = load_angle(kind, cnx);
 #ifndef __ANDROID_VNDK__
     if (!dso) {
-        ns = android_getDriverNamespace();
+        android_namespace_t* ns = android_getDriverNamespace();
         if (ns) {
             dso = load_updated_driver(kind, ns);
         }