Loading core/java/android/os/GraphicsEnvironment.java +99 −19 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 { Loading Loading @@ -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); } Loading Loading @@ -192,24 +196,101 @@ public class GraphicsEnvironment { setLayerPaths(mClassLoader, layerPaths); } /** * Pass ANGLE details down to trigger enable logic */ private static void setupAngle(Context context, Bundle coreSettings) { enum OpenGlDriverChoice { DEFAULT, NATIVE, ANGLE } String angleEnabledApp = coreSettings.getString(Settings.Global.ANGLE_ENABLED_APP); 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"); String packageName = context.getPackageName(); 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; } boolean devOptIn = false; if ((angleEnabledApp != null && packageName != null) && (!angleEnabledApp.isEmpty() && !packageName.isEmpty()) && angleEnabledApp.equals(packageName)) { 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 } Log.i(TAG, packageName + " opted in for ANGLE via Developer Setting"); 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); devOptIn = true; // 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 void setupAngle(Context context, String packageName) { String devOptIn = getDriverForPkg(context, packageName); if (DEBUG) { Log.v(TAG, "ANGLE Developer option for '" + packageName + "' " + "set to: '" + devOptIn + "'"); } ApplicationInfo angleInfo; Loading Loading @@ -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); } /** Loading Loading @@ -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); } core/java/android/provider/Settings.java +18 −2 Original line number Diff line number Diff line Loading @@ -11878,10 +11878,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 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 ANGLE_ENABLED_APP = "angle_enabled_app"; 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. Loading core/jni/android_os_GraphicsEnvironment.cpp +4 −3 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -67,7 +68,7 @@ void setDebugLayersGLES_native(JNIEnv* env, jobject clazz, jstring layers) { 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) }, Loading core/proto/android/providers/settings/global.proto +9 −5 Original line number Diff line number Diff line Loading @@ -417,16 +417,20 @@ message GlobalSettingsProto { // 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; Loading core/tests/coretests/src/android/provider/SettingsBackupTest.java +3 −1 Original line number Diff line number Diff line Loading @@ -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, Loading Loading
core/java/android/os/GraphicsEnvironment.java +99 −19 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 { Loading Loading @@ -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); } Loading Loading @@ -192,24 +196,101 @@ public class GraphicsEnvironment { setLayerPaths(mClassLoader, layerPaths); } /** * Pass ANGLE details down to trigger enable logic */ private static void setupAngle(Context context, Bundle coreSettings) { enum OpenGlDriverChoice { DEFAULT, NATIVE, ANGLE } String angleEnabledApp = coreSettings.getString(Settings.Global.ANGLE_ENABLED_APP); 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"); String packageName = context.getPackageName(); 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; } boolean devOptIn = false; if ((angleEnabledApp != null && packageName != null) && (!angleEnabledApp.isEmpty() && !packageName.isEmpty()) && angleEnabledApp.equals(packageName)) { 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 } Log.i(TAG, packageName + " opted in for ANGLE via Developer Setting"); 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); devOptIn = true; // 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 void setupAngle(Context context, String packageName) { String devOptIn = getDriverForPkg(context, packageName); if (DEBUG) { Log.v(TAG, "ANGLE Developer option for '" + packageName + "' " + "set to: '" + devOptIn + "'"); } ApplicationInfo angleInfo; Loading Loading @@ -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); } /** Loading Loading @@ -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); }
core/java/android/provider/Settings.java +18 −2 Original line number Diff line number Diff line Loading @@ -11878,10 +11878,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 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 ANGLE_ENABLED_APP = "angle_enabled_app"; 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. Loading
core/jni/android_os_GraphicsEnvironment.cpp +4 −3 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -67,7 +68,7 @@ void setDebugLayersGLES_native(JNIEnv* env, jobject clazz, jstring layers) { 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) }, Loading
core/proto/android/providers/settings/global.proto +9 −5 Original line number Diff line number Diff line Loading @@ -417,16 +417,20 @@ message GlobalSettingsProto { // 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; Loading
core/tests/coretests/src/android/provider/SettingsBackupTest.java +3 −1 Original line number Diff line number Diff line Loading @@ -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, Loading