diff --git a/shell/platform/darwin/ios/BUILD.gn b/shell/platform/darwin/ios/BUILD.gn index 60f98dd61d5d6..2c8d038e9ccfe 100644 --- a/shell/platform/darwin/ios/BUILD.gn +++ b/shell/platform/darwin/ios/BUILD.gn @@ -19,7 +19,7 @@ shell_gpu_configuration("ios_gpu_configuration") { enable_software = true enable_gl = false enable_vulkan = false - enable_metal = true + enable_metal = shell_enable_metal } # The headers that will be copied to the Flutter.framework and be accessed @@ -147,22 +147,12 @@ source_set("flutter_framework_source") { "framework/Source/vsync_waiter_ios.mm", "ios_context.h", "ios_context.mm", - "ios_context_metal_impeller.h", - "ios_context_metal_impeller.mm", - "ios_context_metal_skia.h", - "ios_context_metal_skia.mm", "ios_context_software.h", "ios_context_software.mm", - "ios_external_texture_metal.h", - "ios_external_texture_metal.mm", "ios_external_view_embedder.h", "ios_external_view_embedder.mm", "ios_surface.h", "ios_surface.mm", - "ios_surface_metal_impeller.h", - "ios_surface_metal_impeller.mm", - "ios_surface_metal_skia.h", - "ios_surface_metal_skia.mm", "ios_surface_software.h", "ios_surface_software.mm", "platform_message_handler_ios.h", @@ -180,6 +170,23 @@ source_set("flutter_framework_source") { defines += [ "APPLICATION_EXTENSION_API_ONLY=1" ] } + if (shell_enable_metal) { + sources += [ + "ios_context_metal_impeller.h", + "ios_context_metal_impeller.mm", + "ios_context_metal_skia.h", + "ios_context_metal_skia.mm", + "ios_external_texture_metal.h", + "ios_external_texture_metal.mm", + "ios_surface_metal_impeller.h", + "ios_surface_metal_impeller.mm", + "ios_surface_metal_skia.h", + "ios_surface_metal_skia.mm", + ] + + deps += [ "//flutter/shell/platform/darwin/graphics" ] + } + deps += [ ":ios_gpu_configuration", "//flutter/common", @@ -193,7 +200,6 @@ source_set("flutter_framework_source") { "//flutter/shell/platform/common:common_cpp_input", "//flutter/shell/platform/darwin/common", "//flutter/shell/platform/darwin/common:framework_common", - "//flutter/shell/platform/darwin/graphics", "//flutter/shell/platform/embedder:embedder_as_internal_library", "//flutter/shell/profiling:profiling", "//flutter/skia", diff --git a/shell/platform/darwin/ios/ios_context.mm b/shell/platform/darwin/ios/ios_context.mm index 2a5fd7bc5de15..0f74ded917fe4 100644 --- a/shell/platform/darwin/ios/ios_context.mm +++ b/shell/platform/darwin/ios/ios_context.mm @@ -6,9 +6,12 @@ #include "flutter/shell/platform/darwin/ios/rendering_api_selection.h" #include "flutter/fml/logging.h" +#include "flutter/shell/platform/darwin/ios/ios_context_software.h" + +#if SHELL_ENABLE_METAL #include "flutter/shell/platform/darwin/ios/ios_context_metal_impeller.h" #include "flutter/shell/platform/darwin/ios/ios_context_metal_skia.h" -#include "flutter/shell/platform/darwin/ios/ios_context_software.h" +#endif // SHELL_ENABLE_METAL namespace flutter { @@ -29,6 +32,7 @@ "in an environment that does not support Metal. Enabling GPU pass through in your " "environment may fix this. If that is not possible, then disable Impeller."; return std::make_unique(); +#if SHELL_ENABLE_METAL case IOSRenderingAPI::kMetal: switch (backend) { case IOSRenderingBackend::kSkia: @@ -36,6 +40,7 @@ case IOSRenderingBackend::kImpeller: return std::make_unique(is_gpu_disabled_sync_switch); } +#endif // SHELL_ENABLE_METAL default: break; } diff --git a/shell/platform/darwin/ios/ios_surface.mm b/shell/platform/darwin/ios/ios_surface.mm index d09778c6001c3..63745aaebefa0 100644 --- a/shell/platform/darwin/ios/ios_surface.mm +++ b/shell/platform/darwin/ios/ios_surface.mm @@ -4,11 +4,15 @@ #import "flutter/shell/platform/darwin/ios/ios_surface.h" -#import "flutter/shell/platform/darwin/ios/ios_surface_metal_impeller.h" -#import "flutter/shell/platform/darwin/ios/ios_surface_metal_skia.h" #import "flutter/shell/platform/darwin/ios/ios_surface_software.h" + #include "flutter/shell/platform/darwin/ios/rendering_api_selection.h" +#if SHELL_ENABLE_METAL +#import "flutter/shell/platform/darwin/ios/ios_surface_metal_impeller.h" +#import "flutter/shell/platform/darwin/ios/ios_surface_metal_skia.h" +#endif // SHELL_ENABLE_METAL + namespace flutter { std::unique_ptr IOSSurface::Create(std::shared_ptr context, @@ -16,6 +20,7 @@ FML_DCHECK(layer); FML_DCHECK(context); +#if SHELL_ENABLE_METAL if (@available(iOS METAL_IOS_VERSION_BASELINE, *)) { if ([layer.get() isKindOfClass:[CAMetalLayer class]]) { switch (context->GetBackend()) { @@ -35,6 +40,7 @@ } } } +#endif // SHELL_ENABLE_METAL return std::make_unique(layer, // layer std::move(context) // context diff --git a/shell/platform/darwin/ios/rendering_api_selection.mm b/shell/platform/darwin/ios/rendering_api_selection.mm index 3cf47c8145338..f7b969066ff0d 100644 --- a/shell/platform/darwin/ios/rendering_api_selection.mm +++ b/shell/platform/darwin/ios/rendering_api_selection.mm @@ -5,9 +5,11 @@ #import "flutter/shell/platform/darwin/ios/rendering_api_selection.h" #include -#include #include #import +#if SHELL_ENABLE_METAL +#include +#endif // SHELL_ENABLE_METAL #import #include "flutter/fml/logging.h" @@ -16,6 +18,18 @@ namespace flutter { +#if SHELL_ENABLE_METAL +bool ShouldUseMetalRenderer() { + bool ios_version_supports_metal = false; + if (@available(iOS METAL_IOS_VERSION_BASELINE, *)) { + auto device = MTLCreateSystemDefaultDevice(); + ios_version_supports_metal = [device supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily1_v3]; + [device release]; + } + return ios_version_supports_metal; +} +#endif // SHELL_ENABLE_METAL + IOSRenderingAPI GetRenderingAPIForProcess(bool force_software) { #if TARGET_OS_SIMULATOR if (force_software) { @@ -28,9 +42,12 @@ IOSRenderingAPI GetRenderingAPIForProcess(bool force_software) { } #endif // TARGET_OS_SIMULATOR - if (@available(iOS METAL_IOS_VERSION_BASELINE, *)) { +#if SHELL_ENABLE_METAL + static bool should_use_metal = ShouldUseMetalRenderer(); + if (should_use_metal) { return IOSRenderingAPI::kMetal; } +#endif // SHELL_ENABLE_METAL // When Metal isn't available we use Skia software rendering since it performs // a little better than emulated OpenGL. Also, omitting an OpenGL backend