diff options
| -rw-r--r-- | opengl/libs/EGL/Loader.cpp | 29 | ||||
| -rw-r--r-- | opengl/libs/EGL/egl_display.cpp | 51 | ||||
| -rw-r--r-- | opengl/libs/EGL/egldefs.h | 1 |
3 files changed, 29 insertions, 52 deletions
diff --git a/opengl/libs/EGL/Loader.cpp b/opengl/libs/EGL/Loader.cpp index a7fea33b90..6624976c4f 100644 --- a/opengl/libs/EGL/Loader.cpp +++ b/opengl/libs/EGL/Loader.cpp @@ -36,6 +36,7 @@ #include "egl_platform_entries.h" #include "egl_trace.h" #include "egldefs.h" +#include <EGL/eglext_angle.h> extern "C" { android_namespace_t* android_get_exported_namespace(const char*); @@ -541,6 +542,8 @@ static void* load_angle(const char* kind, android_namespace_t* ns, egl_connectio if (use_angle) { ALOGV("User set \"Developer Options\" to force the use of ANGLE"); + } else if (cnx->angleDecided) { + use_angle = cnx->useAngle; } 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: @@ -610,6 +613,7 @@ static void* load_angle(const char* kind, android_namespace_t* ns, egl_connectio use_angle = false; ALOGV("Could not temporarily-load the ANGLE opt-in/out logic, cannot use ANGLE."); } + cnx->angleDecided = true; } if (use_angle) { so = load_angle_from_namespace(kind, ns); @@ -618,13 +622,30 @@ static void* load_angle(const char* kind, android_namespace_t* ns, egl_connectio if (so) { ALOGV("Loaded ANGLE %s library for %s (instead of native)", kind, app_name ? app_name : "nullptr"); - property_get("debug.angle.backend", prop, "UNSET"); - ALOGV("ANGLE's backend set to %s", prop); property_get("debug.hwui.renderer", prop, "UNSET"); ALOGV("Skia's renderer set to %s", prop); cnx->useAngle = true; - // Find and load vendor libEGL for ANGLE - if (!cnx->vendorEGL) { + + EGLint angleBackendDefault = EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE; + + char prop[PROPERTY_VALUE_MAX]; + property_get("debug.angle.backend", prop, "0"); + switch (atoi(prop)) { + case 1: + ALOGV("%s: Requesting OpenGLES back-end", __FUNCTION__); + angleBackendDefault = EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE; + break; + case 2: + ALOGV("%s: Requesting Vulkan back-end", __FUNCTION__); + angleBackendDefault = EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE; + break; + default: + break; + } + + cnx->angleBackend = angleBackendDefault; + if (!cnx->vendorEGL && (cnx->angleBackend == EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE)) { + // Find and load vendor libEGL for ANGLE's GL back-end to use. cnx->vendorEGL = load_system_driver("EGL"); } return so; diff --git a/opengl/libs/EGL/egl_display.cpp b/opengl/libs/EGL/egl_display.cpp index 476b304bc8..113f0a6170 100644 --- a/opengl/libs/EGL/egl_display.cpp +++ b/opengl/libs/EGL/egl_display.cpp @@ -128,56 +128,10 @@ EGLDisplay egl_display_t::getFromNativeDisplay(EGLNativeDisplayType disp, return sDisplay[uintptr_t(disp)].getPlatformDisplay(disp, attrib_list); } -static bool addAnglePlatformAttributes(egl_connection_t* const cnx, const EGLAttrib* attrib_list, +static bool addAnglePlatformAttributes(egl_connection_t* const cnx, std::vector<EGLAttrib>& attrs) { intptr_t vendorEGL = (intptr_t)cnx->vendorEGL; - EGLint angleBackendDefault = EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE; - if (attrib_list) { - while (*attrib_list != EGL_NONE) { - EGLAttrib attr = *attrib_list++; - EGLAttrib value = *attrib_list++; - if (attr == EGL_PLATFORM_ANGLE_TYPE_ANGLE) { - switch (value) { - case EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE: - angleBackendDefault = EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE; - break; - case EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE: - case EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE: - angleBackendDefault = value; - break; - default: - ALOGW("Invalid EGL_PLATFORM_ANGLE_TYPE_ANGLE attribute: 0x%" PRIxPTR, - value); - break; - } - } - } - } - - // Allow debug property to override application's - char prop[PROPERTY_VALUE_MAX]; - property_get("debug.angle.backend", prop, "0"); - switch (atoi(prop)) { - case 1: - ALOGV("addAnglePlatformAttributes: Requesting OpenGLES back-end"); - angleBackendDefault = EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE; - break; - case 2: - ALOGV("addAnglePlatformAttributes: Requesting Vulkan back-end"); - angleBackendDefault = EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE; - break; - default: - break; - } - - if (cnx->angleBackend == 0) { - // Haven't been initialized yet, so set it. - cnx->angleBackend = angleBackendDefault; - } else if (cnx->angleBackend != angleBackendDefault) { - return false; - } - attrs.reserve(4 * 2); attrs.push_back(EGL_PLATFORM_ANGLE_TYPE_ANGLE); @@ -186,6 +140,7 @@ static bool addAnglePlatformAttributes(egl_connection_t* const cnx, const EGLAtt switch (cnx->angleBackend) { case EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE: ALOGV("%s: Requesting Vulkan ANGLE back-end", __FUNCTION__); + char prop[PROPERTY_VALUE_MAX]; property_get("debug.angle.validation", prop, "0"); attrs.push_back(EGL_PLATFORM_ANGLE_DEBUG_LAYERS_ENABLED_ANGLE); attrs.push_back(atoi(prop)); @@ -260,7 +215,7 @@ static EGLDisplay getPlatformDisplayAngle(EGLNativeDisplayType display, egl_conn } } - if (!addAnglePlatformAttributes(cnx, attrib_list, attrs)) { + if (!addAnglePlatformAttributes(cnx, attrs)) { ALOGE("eglGetDisplay(%p) failed: Mismatch display request", display); *error = EGL_BAD_PARAMETER; return EGL_NO_DISPLAY; diff --git a/opengl/libs/EGL/egldefs.h b/opengl/libs/EGL/egldefs.h index 7c710d58d9..e19fa387bb 100644 --- a/opengl/libs/EGL/egldefs.h +++ b/opengl/libs/EGL/egldefs.h @@ -76,6 +76,7 @@ struct egl_connection_t { void* libGles1; void* libGles2; + bool angleDecided; bool useAngle; EGLint angleBackend; void* vendorEGL; |