Update ANGLE Developer Options
Update ANGLE developer options to allow selecting the OpenGL driver
(default, ANGLE, native) for each app as well as forcing ANGLE for all
apps.
Bug: 118384925
Test: Verify the default/ANGLE/native values are saved and applied and
used by the loader.
Change-Id: I189889b9b780eabe812298c0dd02838f70f97a03
diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java
index 8cafbde..7abe913 100644
--- a/core/java/android/os/GraphicsEnvironment.java
+++ b/core/java/android/os/GraphicsEnvironment.java
@@ -16,14 +16,13 @@
package android.os;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.opengl.EGL14;
-import android.os.Build;
-import android.os.SystemProperties;
import android.provider.Settings;
import android.util.Log;
@@ -37,6 +36,11 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
/** @hide */
public class GraphicsEnvironment {
@@ -67,7 +71,7 @@
*/
public void setup(Context context, Bundle coreSettings) {
setupGpuLayers(context, coreSettings);
- setupAngle(context, coreSettings);
+ setupAngle(context, context.getPackageName());
chooseDriver(context, coreSettings);
}
@@ -192,24 +196,101 @@
setLayerPaths(mClassLoader, layerPaths);
}
+ enum OpenGlDriverChoice {
+ DEFAULT,
+ NATIVE,
+ ANGLE
+ }
+
+ private static final Map<OpenGlDriverChoice, String> sDriverMap = buildMap();
+ private static Map<OpenGlDriverChoice, String> buildMap() {
+ Map<OpenGlDriverChoice, String> map = new HashMap<>();
+ map.put(OpenGlDriverChoice.DEFAULT, "default");
+ map.put(OpenGlDriverChoice.ANGLE, "angle");
+ map.put(OpenGlDriverChoice.NATIVE, "native");
+
+ return map;
+ }
+
+
+ private static List<String> getGlobalSettingsString(Context context, String globalSetting) {
+ List<String> valueList = null;
+ ContentResolver contentResolver = context.getContentResolver();
+ String settingsValue = Settings.Global.getString(contentResolver, globalSetting);
+
+ if (settingsValue != null) {
+ valueList = new ArrayList<>(Arrays.asList(settingsValue.split(",")));
+ } else {
+ valueList = new ArrayList<>();
+ }
+
+ return valueList;
+ }
+
+ private static int getGlobalSettingsPkgIndex(String pkgName,
+ List<String> globalSettingsDriverPkgs) {
+ for (int pkgIndex = 0; pkgIndex < globalSettingsDriverPkgs.size(); pkgIndex++) {
+ if (globalSettingsDriverPkgs.get(pkgIndex).equals(pkgName)) {
+ return pkgIndex;
+ }
+ }
+
+ return -1;
+ }
+
+ private static String getDriverForPkg(Context context, String packageName) {
+ try {
+ ContentResolver contentResolver = context.getContentResolver();
+ int allUseAngle = Settings.Global.getInt(contentResolver,
+ Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_ALL_ANGLE);
+ if (allUseAngle == 1) {
+ return sDriverMap.get(OpenGlDriverChoice.ANGLE);
+ }
+ } catch (Settings.SettingNotFoundException e) {
+ // Do nothing and move on
+ }
+
+ List<String> globalSettingsDriverPkgs =
+ getGlobalSettingsString(context,
+ Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_PKGS);
+ List<String> globalSettingsDriverValues =
+ getGlobalSettingsString(context,
+ Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_VALUES);
+
+ // Make sure we have a good package name
+ if ((packageName == null) || (packageName.isEmpty())) {
+ return sDriverMap.get(OpenGlDriverChoice.DEFAULT);
+ }
+ // Make sure we have good settings to use
+ if (globalSettingsDriverPkgs.isEmpty() || globalSettingsDriverValues.isEmpty()
+ || (globalSettingsDriverPkgs.size() != globalSettingsDriverValues.size())) {
+ Log.w(TAG,
+ "Global.Settings values are invalid: "
+ + "globalSettingsDriverPkgs.size = "
+ + globalSettingsDriverPkgs.size() + ", "
+ + "globalSettingsDriverValues.size = "
+ + globalSettingsDriverValues.size());
+ return sDriverMap.get(OpenGlDriverChoice.DEFAULT);
+ }
+
+ int pkgIndex = getGlobalSettingsPkgIndex(packageName, globalSettingsDriverPkgs);
+
+ if (pkgIndex < 0) {
+ return sDriverMap.get(OpenGlDriverChoice.DEFAULT);
+ }
+
+ return globalSettingsDriverValues.get(pkgIndex);
+ }
+
/**
* Pass ANGLE details down to trigger enable logic
*/
- private static void setupAngle(Context context, Bundle coreSettings) {
+ private void setupAngle(Context context, String packageName) {
+ String devOptIn = getDriverForPkg(context, packageName);
- String angleEnabledApp =
- coreSettings.getString(Settings.Global.ANGLE_ENABLED_APP);
-
- String packageName = context.getPackageName();
-
- boolean devOptIn = false;
- if ((angleEnabledApp != null && packageName != null)
- && (!angleEnabledApp.isEmpty() && !packageName.isEmpty())
- && angleEnabledApp.equals(packageName)) {
-
- Log.i(TAG, packageName + " opted in for ANGLE via Developer Setting");
-
- devOptIn = true;
+ if (DEBUG) {
+ Log.v(TAG, "ANGLE Developer option for '" + packageName + "' "
+ + "set to: '" + devOptIn + "'");
}
ApplicationInfo angleInfo;
@@ -303,8 +384,7 @@
// Further opt-in logic is handled in native, so pass relevant info down
// TODO: Move the ANGLE selection logic earlier so we don't need to keep these
// file descriptors open.
- setAngleInfo(paths, packageName, devOptIn,
- rulesFd, rulesOffset, rulesLength);
+ setAngleInfo(paths, packageName, devOptIn, rulesFd, rulesOffset, rulesLength);
}
/**
@@ -452,6 +532,6 @@
private static native void setDebugLayersGLES(String layers);
private static native void setDriverPath(String path);
private static native void setAngleInfo(String path, String appPackage,
- boolean devOptIn, FileDescriptor rulesFd,
+ String devOptIn, FileDescriptor rulesFd,
long rulesOffset, long rulesLength);
}
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index f86296b8..ac7b851 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -11874,10 +11874,26 @@
public static final String GPU_DEBUG_APP = "gpu_debug_app";
/**
- * App should try to use ANGLE
+ * Force all PKGs to use ANGLE, regardless of any other settings
+ * The value is a boolean (1 or 0).
* @hide
*/
- public static final String ANGLE_ENABLED_APP = "angle_enabled_app";
+ public static final String GLOBAL_SETTINGS_ANGLE_GL_DRIVER_ALL_ANGLE =
+ "angle_gl_driver_all_angle";
+
+ /**
+ * List of PKGs that have an OpenGL driver selected
+ * @hide
+ */
+ public static final String GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_PKGS =
+ "angle_gl_driver_selection_pkgs";
+
+ /**
+ * List of selected OpenGL drivers, corresponding to the PKGs in GLOBAL_SETTINGS_DRIVER_PKGS
+ * @hide
+ */
+ public static final String GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_VALUES =
+ "angle_gl_driver_selection_values";
/**
* App that is selected to use updated graphics driver.
diff --git a/core/jni/android_os_GraphicsEnvironment.cpp b/core/jni/android_os_GraphicsEnvironment.cpp
index b1a9866..06625b3 100644
--- a/core/jni/android_os_GraphicsEnvironment.cpp
+++ b/core/jni/android_os_GraphicsEnvironment.cpp
@@ -32,15 +32,16 @@
android::GraphicsEnv::getInstance().setDriverPath(pathChars.c_str());
}
-void setAngleInfo_native(JNIEnv* env, jobject clazz, jstring path, jstring appName, jboolean devOptIn,
+void setAngleInfo_native(JNIEnv* env, jobject clazz, jstring path, jstring appName, jstring devOptIn,
jobject rulesFd, jlong rulesOffset, jlong rulesLength) {
ScopedUtfChars pathChars(env, path);
ScopedUtfChars appNameChars(env, appName);
+ ScopedUtfChars devOptInChars(env, devOptIn);
int rulesFd_native = jniGetFDFromFileDescriptor(env, rulesFd);
android::GraphicsEnv::getInstance().setAngleInfo(pathChars.c_str(), appNameChars.c_str(),
- devOptIn, rulesFd_native, rulesOffset, rulesLength);
+ devOptInChars.c_str(), rulesFd_native, rulesOffset, rulesLength);
}
void setLayerPaths_native(JNIEnv* env, jobject clazz, jobject classLoader, jstring layerPaths) {
@@ -67,7 +68,7 @@
const JNINativeMethod g_methods[] = {
{ "getCanLoadSystemLibraries", "()I", reinterpret_cast<void*>(getCanLoadSystemLibraries_native) },
{ "setDriverPath", "(Ljava/lang/String;)V", reinterpret_cast<void*>(setDriverPath) },
- { "setAngleInfo", "(Ljava/lang/String;Ljava/lang/String;ZLjava/io/FileDescriptor;JJ)V", reinterpret_cast<void*>(setAngleInfo_native) },
+ { "setAngleInfo", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/io/FileDescriptor;JJ)V", reinterpret_cast<void*>(setAngleInfo_native) },
{ "setLayerPaths", "(Ljava/lang/ClassLoader;Ljava/lang/String;)V", reinterpret_cast<void*>(setLayerPaths_native) },
{ "setDebugLayers", "(Ljava/lang/String;)V", reinterpret_cast<void*>(setDebugLayers_native) },
{ "setDebugLayersGLES", "(Ljava/lang/String;)V", reinterpret_cast<void*>(setDebugLayersGLES_native) },
diff --git a/core/proto/android/providers/settings/global.proto b/core/proto/android/providers/settings/global.proto
index ca8da55..da6e208 100644
--- a/core/proto/android/providers/settings/global.proto
+++ b/core/proto/android/providers/settings/global.proto
@@ -417,16 +417,20 @@
// Ordered GPU debug layer list for Vulkan
// i.e. <layer1>:<layer2>:...:<layerN>
optional SettingProto debug_layers = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // App will load ANGLE instead of native GLES drivers.
- optional SettingProto angle_enabled_app = 3;
+ // ANGLE - Force all PKGs to use ANGLE, regardless of any other settings
+ optional SettingProto angle_gl_driver_all_angle = 3;
+ // ANGLE - List of PKGs that specify an OpenGL driver
+ optional SettingProto angle_gl_driver_selection_pkgs = 4;
+ // ANGLE - Corresponding OpenGL driver selection for the PKG
+ optional SettingProto angle_gl_driver_selection_values = 5;
// App that can provide layer libraries.
- optional SettingProto debug_layer_app = 4;
+ optional SettingProto debug_layer_app = 6;
// Ordered GPU debug layer list for GLES
// i.e. <layer1>:<layer2>:...:<layerN>
- optional SettingProto debug_layers_gles = 5;
+ optional SettingProto debug_layers_gles = 7;
// App opt in to load updated graphics driver instead of
// native graphcis driver through developer options.
- optional SettingProto updated_gfx_driver_dev_opt_in_app = 6;
+ optional SettingProto updated_gfx_driver_dev_opt_in_app = 8;
}
optional Gpu gpu = 59;
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index 1d72a03..79eaab8 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -470,7 +470,9 @@
Settings.Global.GPU_DEBUG_APP,
Settings.Global.GPU_DEBUG_LAYERS,
Settings.Global.GPU_DEBUG_LAYERS_GLES,
- Settings.Global.ANGLE_ENABLED_APP,
+ Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_ALL_ANGLE,
+ Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_PKGS,
+ Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_VALUES,
Settings.Global.UPDATED_GFX_DRIVER_DEV_OPT_IN_APP,
Settings.Global.GPU_DEBUG_LAYER_APP,
Settings.Global.ENABLE_GNSS_RAW_MEAS_FULL_TRACKING,