From 3c61284416ca97ba554d8aa155af2d32b615b67f Mon Sep 17 00:00:00 2001 From: Tim Van Patten Date: Fri, 9 Nov 2018 16:48:24 -0700 Subject: [PATCH] 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 --- core/java/android/os/GraphicsEnvironment.java | 120 +++++++++++++++--- core/java/android/provider/Settings.java | 20 ++- core/jni/android_os_GraphicsEnvironment.cpp | 7 +- .../android/providers/settings/global.proto | 14 +- .../android/provider/SettingsBackupTest.java | 4 +- .../settings/SettingsProtoDumpUtil.java | 10 +- .../server/am/CoreSettingsObserver.java | 7 +- 7 files changed, 148 insertions(+), 34 deletions(-) diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java index 8cafbde8e3eb7..7abe913312a1c 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.FileNotFoundException; 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 class GraphicsEnvironment { */ public void setup(Context context, Bundle coreSettings) { setupGpuLayers(context, coreSettings); - setupAngle(context, coreSettings); + setupAngle(context, context.getPackageName()); chooseDriver(context, coreSettings); } @@ -192,24 +196,101 @@ public class GraphicsEnvironment { setLayerPaths(mClassLoader, layerPaths); } + enum OpenGlDriverChoice { + DEFAULT, + NATIVE, + ANGLE + } + + private static final Map sDriverMap = buildMap(); + private static Map buildMap() { + Map map = new HashMap<>(); + map.put(OpenGlDriverChoice.DEFAULT, "default"); + map.put(OpenGlDriverChoice.ANGLE, "angle"); + map.put(OpenGlDriverChoice.NATIVE, "native"); + + return map; + } + + + private static List getGlobalSettingsString(Context context, String globalSetting) { + List 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 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 globalSettingsDriverPkgs = + getGlobalSettingsString(context, + Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_PKGS); + List 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 @@ public class GraphicsEnvironment { // 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 @@ public class GraphicsEnvironment { 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 f86296b85f0e8..ac7b851765067 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -11874,10 +11874,26 @@ public final class Settings { 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 b1a9866efde79..06625b36f1624 100644 --- a/core/jni/android_os_GraphicsEnvironment.cpp +++ b/core/jni/android_os_GraphicsEnvironment.cpp @@ -32,15 +32,16 @@ void setDriverPath(JNIEnv* env, jobject clazz, jstring path) { 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 @@ void setDebugLayersGLES_native(JNIEnv* env, jobject clazz, jstring layers) { const JNINativeMethod g_methods[] = { { "getCanLoadSystemLibraries", "()I", reinterpret_cast(getCanLoadSystemLibraries_native) }, { "setDriverPath", "(Ljava/lang/String;)V", reinterpret_cast(setDriverPath) }, - { "setAngleInfo", "(Ljava/lang/String;Ljava/lang/String;ZLjava/io/FileDescriptor;JJ)V", reinterpret_cast(setAngleInfo_native) }, + { "setAngleInfo", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/io/FileDescriptor;JJ)V", reinterpret_cast(setAngleInfo_native) }, { "setLayerPaths", "(Ljava/lang/ClassLoader;Ljava/lang/String;)V", reinterpret_cast(setLayerPaths_native) }, { "setDebugLayers", "(Ljava/lang/String;)V", reinterpret_cast(setDebugLayers_native) }, { "setDebugLayersGLES", "(Ljava/lang/String;)V", reinterpret_cast(setDebugLayersGLES_native) }, diff --git a/core/proto/android/providers/settings/global.proto b/core/proto/android/providers/settings/global.proto index ca8da55e14c2b..da6e20867cca9 100644 --- a/core/proto/android/providers/settings/global.proto +++ b/core/proto/android/providers/settings/global.proto @@ -417,16 +417,20 @@ message GlobalSettingsProto { // Ordered GPU debug layer list for Vulkan // i.e. ::...: 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. ::...: - 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 1d72a03616902..79eaab8a6e850 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -470,7 +470,9 @@ public class SettingsBackupTest { 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, diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java index 5e7fb850cfe44..533956f69835f 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java @@ -685,8 +685,14 @@ class SettingsProtoDumpUtil { Settings.Global.GPU_DEBUG_LAYERS, GlobalSettingsProto.Gpu.DEBUG_LAYERS); dumpSetting(s, p, - Settings.Global.ANGLE_ENABLED_APP, - GlobalSettingsProto.Gpu.ANGLE_ENABLED_APP); + Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_ALL_ANGLE, + GlobalSettingsProto.Gpu.ANGLE_GL_DRIVER_ALL_ANGLE); + dumpSetting(s, p, + Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_PKGS, + GlobalSettingsProto.Gpu.ANGLE_GL_DRIVER_SELECTION_PKGS); + dumpSetting(s, p, + Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_VALUES, + GlobalSettingsProto.Gpu.ANGLE_GL_DRIVER_SELECTION_VALUES); dumpSetting(s, p, Settings.Global.GPU_DEBUG_LAYER_APP, GlobalSettingsProto.Gpu.DEBUG_LAYER_APP); diff --git a/services/core/java/com/android/server/am/CoreSettingsObserver.java b/services/core/java/com/android/server/am/CoreSettingsObserver.java index 9cfd39ced2941..65cd329b5de8f 100644 --- a/services/core/java/com/android/server/am/CoreSettingsObserver.java +++ b/services/core/java/com/android/server/am/CoreSettingsObserver.java @@ -55,7 +55,12 @@ final class CoreSettingsObserver extends ContentObserver { // add other system settings here... sGlobalSettingToTypeMap.put(Settings.Global.DEBUG_VIEW_ATTRIBUTES, int.class); - sGlobalSettingToTypeMap.put(Settings.Global.ANGLE_ENABLED_APP, String.class); + sGlobalSettingToTypeMap.put( + Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_ALL_ANGLE, String.class); + sGlobalSettingToTypeMap.put( + Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_PKGS, String.class); + sGlobalSettingToTypeMap.put( + Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_VALUES, String.class); sGlobalSettingToTypeMap.put(Settings.Global.ENABLE_GPU_DEBUG_LAYERS, int.class); sGlobalSettingToTypeMap.put(Settings.Global.GPU_DEBUG_APP, String.class); sGlobalSettingToTypeMap.put(Settings.Global.GPU_DEBUG_LAYERS, String.class);