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

Commit 841c3d9b authored by Cody Northrop's avatar Cody Northrop Committed by Courtney Goeltzenleuchter
Browse files

Allow specifying ANGLE in manifest via meta-data

This CL allows the application's manifest to specify whether
to use ANGLE or native drivers for GLES via meta-data.

To enable, place the following within <application> and it
will be detected by the platform:

    <meta-data
        android:name:"com.android.angle.GLES_MODE"
        android:value:"angle" />

The manifest can also specify "native" to opt-out of
ANGLE, but native will be the default for Q release.

This method is in service of the tech preview of
ANGLE for Android. For Q release, we should move this
to the Android API.

Test: Manual, verify ANGLE can be selected or rejected
Change-Id: I41af7fe02ca6237db042b5f8bdfbab3c9f76078a
(cherry picked from commit a2e5faf4b23bf0b8b84ffc1d67d545e3dd4f8c63)
parent eb0ca8e5
Loading
Loading
Loading
Loading
+33 −7
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ public class GraphicsEnvironment {
    private static final String TAG = "GraphicsEnvironment";
    private static final String PROPERTY_GFX_DRIVER = "ro.gfx.driver.0";
    private static final String ANGLE_PACKAGE_NAME = "com.android.angle";
    private static final String GLES_MODE_METADATA_KEY = "com.android.angle.GLES_MODE";

    private ClassLoader mClassLoader;
    private String mLayerPath;
@@ -123,7 +124,6 @@ public class GraphicsEnvironment {
                    }
                }
            }

        }

        // Include the app's lib directory in all cases
@@ -143,19 +143,44 @@ public class GraphicsEnvironment {

        String packageName = context.getPackageName();

        boolean optIn = false;

        boolean devOptIn = false;
        if ((angleEnabledApp != null && packageName != null)
                && (!angleEnabledApp.isEmpty() && !packageName.isEmpty())
                && angleEnabledApp.equals(packageName)) {

            if (DEBUG) Log.v(TAG, packageName + " opted in for ANGLE via Developer Setting");

            optIn = true;
            devOptIn = true;
        }

        ApplicationInfo angleInfo;
        ApplicationInfo appInfo;
        try {
            appInfo = context.getPackageManager().getApplicationInfo(packageName,
                PackageManager.GET_META_DATA);
        } catch (PackageManager.NameNotFoundException e) {
            Log.w(TAG, "Failed to get info about current application: " + packageName);
            return;
        }

        String appPref = "dontcare";
        final BaseBundle metadata = appInfo.metaData;
        if (metadata != null) {
            final String glesMode = metadata.getString(GLES_MODE_METADATA_KEY);
            if (glesMode != null) {
                if (glesMode.equals("angle")) {
                    appPref = "angle";
                    if (DEBUG) Log.v(TAG, packageName + " opted for ANGLE via AndroidManifest");
                } else if (glesMode.equals("native")) {
                    appPref = "native";
                    if (DEBUG) Log.v(TAG, packageName + " opted for NATIVE via AndroidManifest");
                } else {
                    Log.w(TAG, "Unrecognized GLES_MODE (\"" + glesMode + "\") for " + packageName
                               + ". Supported values are \"angle\" or \"native\"");
                }
            }
        }

        ApplicationInfo angleInfo;
        try {
            angleInfo = context.getPackageManager().getApplicationInfo(ANGLE_PACKAGE_NAME,
                PackageManager.MATCH_SYSTEM_ONLY);
@@ -178,7 +203,7 @@ public class GraphicsEnvironment {
        if (DEBUG) Log.v(TAG, "ANGLE package libs: " + paths);

        // Further opt-in logic is handled in native, so pass relevant info down
        setAngleInfo(paths, packageName, optIn);
        setAngleInfo(paths, packageName, appPref, devOptIn);
    }

    /**
@@ -269,5 +294,6 @@ public class GraphicsEnvironment {
    private static native void setLayerPaths(ClassLoader classLoader, String layerPaths);
    private static native void setDebugLayers(String layers);
    private static native void setDriverPath(String path);
    private static native void setAngleInfo(String path, String appPackage, boolean optIn);
    private static native void setAngleInfo(String path, String appPackage, String appPref,
                                            boolean devOptIn);
}
+5 −3
Original line number Diff line number Diff line
@@ -28,10 +28,12 @@ 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 optIn) {
void setAngleInfo_native(JNIEnv* env, jobject clazz, jstring path, jstring appName, jstring appPref, jboolean devOptIn) {
    ScopedUtfChars pathChars(env, path);
    ScopedUtfChars appNameChars(env, appName);
    android::GraphicsEnv::getInstance().setAngleInfo(pathChars.c_str(), appNameChars.c_str(), optIn);
    ScopedUtfChars appPrefChars(env, appPref);
    android::GraphicsEnv::getInstance().setAngleInfo(pathChars.c_str(), appNameChars.c_str(),
            appPrefChars.c_str(), devOptIn);
}

void setLayerPaths_native(JNIEnv* env, jobject clazz, jobject classLoader, jstring layerPaths) {
@@ -50,7 +52,7 @@ void setDebugLayers_native(JNIEnv* env, jobject clazz, jstring layers) {

const JNINativeMethod g_methods[] = {
    { "setDriverPath", "(Ljava/lang/String;)V", reinterpret_cast<void*>(setDriverPath) },
    { "setAngleInfo", "(Ljava/lang/String;Ljava/lang/String;Z)V", reinterpret_cast<void*>(setAngleInfo_native) },
    { "setAngleInfo", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)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) },
};