Merge changes from topic "angle_rules_fast_path"

* changes:
  Guard ANGLE rules checking with a whitelist
  Revert "Revert "Enable ANGLE-for-Android rule processing again""
This commit is contained in:
TreeHugger Robot
2019-01-24 18:22:01 +00:00
committed by Android (Google) Code Review
6 changed files with 57 additions and 27 deletions

View File

@@ -368,26 +368,6 @@ public class GraphicsEnvironment {
return false;
}
/**
* Attempt to setup ANGLE with a (temporary) default rules file: b/121153494
* True: Rules file was loaded.
* False: Rules file was *not* loaded.
*/
private boolean setupAngleRulesDebug(String packageName, String paths, String devOptIn) {
// b/121153494
// Skip APK rules file checking.
if (!DEBUG) {
Log.v(TAG, "Skipping loading the rules file.");
// Fill in some default values for now, so the loader can get an answer when it asks.
// Most importantly, we need to indicate which app we are init'ing and what the
// developer options for it are so we can turn on ANGLE if needed.
setAngleInfo(paths, packageName, devOptIn, null, 0, 0);
return true;
}
return false;
}
/**
* Attempt to setup ANGLE with a rules file loaded from the ANGLE APK.
* True: APK rules file was loaded.
@@ -424,17 +404,58 @@ public class GraphicsEnvironment {
return false;
}
/**
* Pull ANGLE whitelist from GlobalSettings and compare against current package
*/
private boolean checkAngleWhitelist(Bundle bundle, String packageName) {
List<String> angleWhitelist =
getGlobalSettingsString(bundle,
Settings.Global.GLOBAL_SETTINGS_ANGLE_WHITELIST);
return angleWhitelist.contains(packageName);
}
/**
* Pass ANGLE details down to trigger enable logic
*/
public void setupAngle(Context context, Bundle bundle, String packageName) {
String devOptIn = getDriverForPkg(bundle, packageName);
if (packageName.isEmpty()) {
Log.v(TAG, "No package name available yet, skipping ANGLE setup");
return;
}
String devOptIn = getDriverForPkg(bundle, packageName);
if (DEBUG) {
Log.v(TAG, "ANGLE Developer option for '" + packageName + "' "
+ "set to: '" + devOptIn + "'");
}
// We only need to check rules if the app is whitelisted or the developer has
// explicitly chosen something other than default driver.
//
// The whitelist will be generated by the ANGLE APK at both boot time and
// ANGLE update time. It will only include apps mentioned in the rules file.
//
// If the user has set the developer option to something other than default,
// we need to call setupAngleRulesApk() with the package name and the developer
// option value (native/angle/other). Then later when we are actually trying to
// load a driver, GraphicsEnv::shouldUseAngle() has seen the package name before
// and can confidently answer yes/no based on the previously set developer
// option value.
boolean whitelisted = checkAngleWhitelist(bundle, packageName);
boolean defaulted = devOptIn.equals(sDriverMap.get(OpenGlDriverChoice.DEFAULT));
boolean rulesCheck = (whitelisted || !defaulted);
if (!rulesCheck) {
return;
}
if (whitelisted) {
Log.v(TAG, "ANGLE whitelist includes " + packageName);
}
if (!defaulted) {
Log.v(TAG, "ANGLE developer option for " + packageName + ": " + devOptIn);
}
String anglePkgName = getAnglePackageName(context);
if (anglePkgName.isEmpty()) {
Log.e(TAG, "Failed to find ANGLE package.");
@@ -466,12 +487,6 @@ public class GraphicsEnvironment {
return;
}
// b/121153494
if (setupAngleRulesDebug(packageName, paths, devOptIn)) {
// We setup ANGLE with defaults, so we're done here.
return;
}
if (setupAngleRulesApk(anglePkgName, angleInfo, context, packageName, paths, devOptIn)) {
// We setup ANGLE with rules from the APK, so we're done here.
return;

View File

@@ -12147,6 +12147,13 @@ public final class Settings {
public static final String GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_VALUES =
"angle_gl_driver_selection_values";
/**
* List of package names that should check ANGLE rules
* @hide
*/
public static final String GLOBAL_SETTINGS_ANGLE_WHITELIST =
"angle_whitelist";
/**
* Game Update Package global preference for all Apps.
* 0 = Default

View File

@@ -451,6 +451,8 @@ message GlobalSettingsProto {
optional SettingProto gup_blacklist = 11;
// List of Apps that are allowed to use Game Driver package.
optional SettingProto game_driver_whitelist = 12;
// ANGLE - List of Apps that can check ANGLE rules
optional SettingProto angle_whitelist = 13;
}
optional Gpu gpu = 59;

View File

@@ -481,6 +481,7 @@ public class SettingsBackupTest {
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.GLOBAL_SETTINGS_ANGLE_WHITELIST,
Settings.Global.GUP_DEV_ALL_APPS,
Settings.Global.GUP_DEV_OPT_IN_APPS,
Settings.Global.GUP_DEV_OPT_OUT_APPS,

View File

@@ -697,6 +697,9 @@ class SettingsProtoDumpUtil {
dumpSetting(s, p,
Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_VALUES,
GlobalSettingsProto.Gpu.ANGLE_GL_DRIVER_SELECTION_VALUES);
dumpSetting(s, p,
Settings.Global.GLOBAL_SETTINGS_ANGLE_WHITELIST,
GlobalSettingsProto.Gpu.ANGLE_WHITELIST);
dumpSetting(s, p,
Settings.Global.GPU_DEBUG_LAYER_APP,
GlobalSettingsProto.Gpu.DEBUG_LAYER_APP);

View File

@@ -61,6 +61,8 @@ final class CoreSettingsObserver extends ContentObserver {
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.GLOBAL_SETTINGS_ANGLE_WHITELIST, 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);