diff --git a/shell/platform/android/context/android_context.h b/shell/platform/android/context/android_context.h index ac3b7d49dee8a..a967ca2451ace 100644 --- a/shell/platform/android/context/android_context.h +++ b/shell/platform/android/context/android_context.h @@ -16,6 +16,9 @@ enum class AndroidRenderingAPI { kSoftware, kOpenGLES, kVulkan, + /// @brief Attempt to create a Vulkan surface, if that fails then fall back + /// to GLES. + kAutoselect, }; //------------------------------------------------------------------------------ diff --git a/shell/platform/android/io/flutter/embedding/engine/loader/FlutterLoader.java b/shell/platform/android/io/flutter/embedding/engine/loader/FlutterLoader.java index fc5c9417e4190..8265cd46a8858 100644 --- a/shell/platform/android/io/flutter/embedding/engine/loader/FlutterLoader.java +++ b/shell/platform/android/io/flutter/embedding/engine/loader/FlutterLoader.java @@ -327,8 +327,10 @@ public void ensureInitializationComplete( if (metaData.getBoolean(ENABLE_VULKAN_VALIDATION_META_DATA_KEY, false)) { shellArgs.add("--enable-vulkan-validation"); } - String backend = metaData.getString(IMPELLER_BACKEND_META_DATA_KEY, "opengles"); - shellArgs.add("--impeller-backend=" + backend); + String backend = metaData.getString(IMPELLER_BACKEND_META_DATA_KEY); + if (backend != null) { + shellArgs.add("--impeller-backend=" + backend); + } } final String leakVM = isLeakVM(metaData) ? "true" : "false"; diff --git a/shell/platform/android/platform_view_android.cc b/shell/platform/android/platform_view_android.cc index 7e8b10f778d03..a1053fbcaaa13 100644 --- a/shell/platform/android/platform_view_android.cc +++ b/shell/platform/android/platform_view_android.cc @@ -72,10 +72,8 @@ static std::shared_ptr CreateAndroidContext( return std::make_shared(AndroidRenderingAPI::kSoftware); } if (enable_impeller) { - // TODO(gaaclarke): We need to devise a more complete heuristic about what - // backend to use by default. - // Default value is OpenGLES. - AndroidRenderingAPI backend = AndroidRenderingAPI::kOpenGLES; + // Default value is Vulkan with GLES fallback. + AndroidRenderingAPI backend = AndroidRenderingAPI::kAutoselect; if (impeller_backend.has_value()) { if (impeller_backend.value() == "opengles") { backend = AndroidRenderingAPI::kOpenGLES; @@ -93,6 +91,15 @@ static std::shared_ptr CreateAndroidContext( case AndroidRenderingAPI::kVulkan: return std::make_unique( enable_vulkan_validation, worker_task_runner); + case AndroidRenderingAPI::kAutoselect: { + auto vulkan_backend = std::make_unique( + enable_vulkan_validation, worker_task_runner); + if (!vulkan_backend->IsValid()) { + return std::make_unique( + std::make_unique()); + } + return vulkan_backend; + } default: FML_UNREACHABLE(); }