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

Commit fdd0229d authored by Cody Northrop's avatar Cody Northrop Committed by Android (Google) Code Review
Browse files

Merge "Find and load ANGLE rules, pass to libEGL"

parents a28e38fa 7fd4421f
Loading
Loading
Loading
Loading
+38 −2
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package android.os;
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;
@@ -30,6 +31,7 @@ import dalvik.system.VMRuntime;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -54,6 +56,7 @@ public class GraphicsEnvironment {
    private static final String PROPERTY_GFX_DRIVER_WHITELIST = "ro.gfx.driver.whitelist.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 static final String ANGLE_RULES_FILE = "a4a_rules.json";

    private ClassLoader mClassLoader;
    private String mLayerPath;
@@ -250,8 +253,40 @@ public class GraphicsEnvironment {

        if (DEBUG) Log.v(TAG, "ANGLE package libs: " + paths);

        // Pass the rules file to loader for ANGLE decisions
        AssetManager angleAssets = null;
        try {
            angleAssets =
                context.getPackageManager().getResourcesForApplication(angleInfo).getAssets();
        } catch (PackageManager.NameNotFoundException e) {
            Log.w(TAG, "Failed to get AssetManager for '" + ANGLE_PACKAGE_NAME + "'");
            return;
        }

        AssetFileDescriptor assetsFd = null;
        try {
            assetsFd = angleAssets.openFd(ANGLE_RULES_FILE);
        } catch (IOException e) {
            Log.w(TAG, "Failed to get AssetFileDescriptor for " + ANGLE_RULES_FILE + " from "
                       + "'" + ANGLE_PACKAGE_NAME + "'");
            return;
        }

        FileDescriptor rulesFd = null;
        long rulesOffset = 0;
        long rulesLength = 0;
        if (assetsFd != null) {
            rulesFd = assetsFd.getFileDescriptor();
            rulesOffset = assetsFd.getStartOffset();
            rulesLength = assetsFd.getLength();
        } else {
            Log.w(TAG, "Failed to get file descriptor for " + ANGLE_RULES_FILE);
            return;
        }

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

    /**
@@ -391,5 +426,6 @@ public class GraphicsEnvironment {
    private static native void setDebugLayers(String layers);
    private static native void setDriverPath(String path);
    private static native void setAngleInfo(String path, String appPackage, String appPref,
                                            boolean devOptIn);
                                            boolean devOptIn, FileDescriptor rulesFd,
                                            long rulesOffset, long rulesLength);
}
+7 −3
Original line number Diff line number Diff line
@@ -32,12 +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, jstring appPref, jboolean devOptIn) {
void setAngleInfo_native(JNIEnv* env, jobject clazz, jstring path, jstring appName, jstring appPref, jboolean devOptIn,
                         jobject rulesFd, jlong rulesOffset, jlong rulesLength) {
    ScopedUtfChars pathChars(env, path);
    ScopedUtfChars appNameChars(env, appName);
    ScopedUtfChars appPrefChars(env, appPref);

    int rulesFd_native = jniGetFDFromFileDescriptor(env, rulesFd);

    android::GraphicsEnv::getInstance().setAngleInfo(pathChars.c_str(), appNameChars.c_str(),
            appPrefChars.c_str(), devOptIn);
            appPrefChars.c_str(), devOptIn, rulesFd_native, rulesOffset, rulesLength);
}

void setLayerPaths_native(JNIEnv* env, jobject clazz, jobject classLoader, jstring layerPaths) {
@@ -57,7 +61,7 @@ void setDebugLayers_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;Ljava/lang/String;Z)V", reinterpret_cast<void*>(setAngleInfo_native) },
    { "setAngleInfo", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLjava/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) },
};