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

Commit 1b097780 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Use opt-in/out logic that lives in the ANGLE APK"

parents 160e8630 34474475
Loading
Loading
Loading
Loading
+66 −11
Original line number Diff line number Diff line
@@ -38,6 +38,18 @@

extern "C" {
  android_namespace_t* android_get_exported_namespace(const char*);

  // TODO(ianelliott@): Get this from an ANGLE header:
  typedef enum ANGLEPreference {
      ANGLE_NO_PREFERENCE = 0,
      ANGLE_PREFER_NATIVE = 1,
      ANGLE_PREFER_ANGLE = 2,
  } ANGLEPreference;

  // TODO(ianelliott@): Get this from an ANGLE header:
  typedef bool (*fpANGLEUseForApplication)(const char* appName, const char* deviceMfr,
                                           const char* deviceModel, ANGLEPreference developerOption,
                                           ANGLEPreference appPreference);
}

// ----------------------------------------------------------------------------
@@ -475,6 +487,18 @@ static void* load_angle_from_namespace(const char* kind, android_namespace_t* ns
    return nullptr;
}

static ANGLEPreference getAnglePref(const char* app_pref) {
    if (app_pref == nullptr)
        return ANGLE_NO_PREFERENCE;

    if (strcmp(app_pref, "angle") == 0) {
        return ANGLE_PREFER_ANGLE;
    } else if (strcmp(app_pref, "native") == 0) {
        return ANGLE_PREFER_NATIVE;
    }
    return ANGLE_NO_PREFERENCE;
}

static void* load_angle(const char* kind, egl_connection_t* cnx) {
    // Only attempt to load ANGLE libs
    if (strcmp(kind, "EGL") != 0 && strcmp(kind, "GLESv2") != 0 && strcmp(kind, "GLESv1_CM") != 0)
@@ -489,23 +513,54 @@ static void* load_angle(const char* kind, egl_connection_t* cnx) {
    const char* app_pref = android_getAngleAppPref();
    bool developer_opt_in = android_getAngleDeveloperOptIn();

    if (ns) {
        // If we got a namespce for ANGLE, check any other conditions
        // before loading from it.
        // TODO: Call opt-in logic rather than use pref directly
        //       app_pref will be "angle", "native", or "dontcare"
        if ((developer_opt_in || !strcmp(app_pref, "angle"))) {
            so = load_angle_from_namespace(kind, ns);
    // Determine whether or not to use ANGLE:
    ANGLEPreference developer_option = developer_opt_in ? ANGLE_PREFER_ANGLE : ANGLE_NO_PREFERENCE;
    bool use_angle = (developer_option == ANGLE_PREFER_ANGLE);

    if (use_angle) {
        ALOGV("User set \"Developer Options\" to force the use of ANGLE");
    } else {
        // The "Developer Options" value wasn't set to force the use of ANGLE.  Need to temporarily
        // load ANGLE and call the updatable opt-in/out logic:
        std::string app_name_str = app_name ? app_name : "";
        char manufacturer[PROPERTY_VALUE_MAX];
        char model[PROPERTY_VALUE_MAX];
        property_get("ro.product.manufacturer", manufacturer, "UNSET");
        property_get("ro.product.model", model, "UNSET");
        ANGLEPreference app_preference = getAnglePref(android_getAngleAppPref());

        so = load_angle_from_namespace("GLESv2", ns);
        if (so) {
            ALOGV("Temporarily loaded ANGLE's opt-in/out logic from namespace");
            fpANGLEUseForApplication fp =
                    (fpANGLEUseForApplication)dlsym(so, "ANGLEUseForApplication");
            if (fp) {
                use_angle = (fp)(app_name_str.c_str(), manufacturer, model, developer_option,
                                 app_preference);
                ALOGV("Result of opt-in/out logic is %s", use_angle ? "true" : "false");
            }

            ALOGV("Close temporarily-loaded ANGLE opt-in/out logic");
            dlclose(so);
            so = nullptr;
        } else {
            // We weren't able to load and call the updateable opt-in/out logic.
            // If we can't load the library, there is no ANGLE available.
            use_angle = false;
            ALOGV("Could not temporarily-load the ANGLE opt-in/out logic, cannot use ANGLE.");
        }
    }
    if (use_angle) {
        so = load_angle_from_namespace(kind, ns);
    }

    if (so) {
        ALOGD("Loaded ANGLE %s library for %s (instead of native)",
        ALOGV("Loaded ANGLE %s library for %s (instead of native)",
              kind, app_name ? app_name : "nullptr");
        property_get("debug.angle.backend", prop, "UNSET");
        ALOGD("ANGLE's backend set to %s", prop);
        ALOGV("ANGLE's backend set to %s", prop);
        property_get("debug.hwui.renderer", prop, "UNSET");
        ALOGD("Skia's renderer set to %s", prop);
        ALOGV("Skia's renderer set to %s", prop);
        cnx->useAngle = true;
        // Find and load vendor libEGL for ANGLE
        if (!cnx->vendorEGL) {
@@ -513,7 +568,7 @@ static void* load_angle(const char* kind, egl_connection_t* cnx) {
        }
        return so;
    } else {
        ALOGD("Loaded native %s library for %s (instead of ANGLE)",
        ALOGV("Loaded native %s library for %s (instead of ANGLE)",
              kind, app_name ? app_name : "nullptr");
    }