diff --git a/engine/src/flutter/impeller/renderer/backend/gles/capabilities_gles.cc b/engine/src/flutter/impeller/renderer/backend/gles/capabilities_gles.cc index 0aa7cefde5a..c824a16be85 100644 --- a/engine/src/flutter/impeller/renderer/backend/gles/capabilities_gles.cc +++ b/engine/src/flutter/impeller/renderer/backend/gles/capabilities_gles.cc @@ -7,8 +7,31 @@ #include "impeller/core/formats.h" #include "impeller/renderer/backend/gles/proc_table_gles.h" +#ifdef FML_OS_ANDROID +#include +#endif // FML_OS_ANDROID + namespace impeller { +namespace { +// Workaround for crashes in Vivante GL driver on Android. +// +// See: +// * https://github.com/flutter/flutter/issues/167850 +// * http://crbug.com/141785 +#ifdef FML_OS_ANDROID +bool IsVivante() { + char product_model[PROP_VALUE_MAX]; + __system_property_get("ro.hardware.egl", product_model); + return strcmp(product_model, "VIVANTE") == 0; +} +#else +bool IsVivante() { + return false; +} +#endif // FML_OS_ANDROID +} // namespace + // https://registry.khronos.org/OpenGL/extensions/EXT/EXT_shader_framebuffer_fetch.txt static const constexpr char* kFramebufferFetchExt = "GL_EXT_shader_framebuffer_fetch"; @@ -124,7 +147,7 @@ CapabilitiesGLES::CapabilitiesGLES(const ProcTableGLES& gl) { supports_decal_sampler_address_mode_ = true; } - if (desc->HasExtension(kMultisampledRenderToTextureExt)) { + if (desc->HasExtension(kMultisampledRenderToTextureExt) && !IsVivante()) { supports_implicit_msaa_ = true; if (desc->HasExtension(kMultisampledRenderToTexture2Ext)) {