Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 636beeba authored by Tim Van Patten's avatar Tim Van Patten Committed by Android (Google) Code Review
Browse files

Merge "Update ANGLE Developer Options"

parents 2eb3473d 3c612844
Loading
Loading
Loading
Loading
+99 −19
Original line number Diff line number Diff line
@@ -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);
    }

    /**
     * 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;
@@ -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);
}
+18 −2
Original line number Diff line number Diff line
@@ -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.
+4 −3
Original line number Diff line number Diff line
@@ -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<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) },
+9 −5
Original line number Diff line number Diff line
@@ -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;

+3 −1
Original line number Diff line number Diff line
@@ -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