Loading opengl/libs/EGL/Loader.cpp +66 −11 Original line number Diff line number Diff line Loading @@ -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); } // ---------------------------------------------------------------------------- Loading Loading @@ -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) Loading @@ -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) { Loading @@ -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"); } Loading Loading
opengl/libs/EGL/Loader.cpp +66 −11 Original line number Diff line number Diff line Loading @@ -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); } // ---------------------------------------------------------------------------- Loading Loading @@ -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) Loading @@ -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) { Loading @@ -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"); } Loading