Reverts "Remove #if SHELL_ENABLE_METAL checks in iOS code (#51636)" (flutter/engine#51941)

Reverts: flutter/engine#51636
Initiated by: jmagman
Reason for reverting: This caused a slew of unexpected Scuba changes b/333039358
Original PR Author: jmagman

Reviewed By: {cbracken}

This change reverts the following previous change:
All physical iOS devices Flutter supports (iOS 12+) can run Metal.  The only time Flutter doesn't use Metal afaik is for iOS simulators running < iOS 13, which is covered by a few `if (@available(iOS METAL_IOS_VERSION_BASELINE, *))` checks.

aef5775087/shell/platform/darwin/ios/rendering_api_selection.h (L37-L41)

Remove hardware checks for physical devices.

Remove `shell_enable_metal` from the gn files and the `#if SHELL_ENABLE_METAL` checks in the iOS embedder.

I limited this PR to just iOS, but I imagine it's safe to remove `shell_enable_metal` everywhere? 
97b286ca62/shell/platform/darwin/macos/BUILD.gn (L18)
97b286ca62/tools/gn (L673-L679)
This commit is contained in:
auto-submit[bot] 2024-04-05 18:55:44 +00:00 committed by GitHub
parent 13e5db8467
commit ea0283f762
4 changed files with 51 additions and 17 deletions

View File

@ -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",

View File

@ -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 @@ std::unique_ptr<IOSContext> IOSContext::Create(
"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<IOSContextSoftware>();
#if SHELL_ENABLE_METAL
case IOSRenderingAPI::kMetal:
switch (backend) {
case IOSRenderingBackend::kSkia:
@ -36,6 +40,7 @@ std::unique_ptr<IOSContext> IOSContext::Create(
case IOSRenderingBackend::kImpeller:
return std::make_unique<IOSContextMetalImpeller>(is_gpu_disabled_sync_switch);
}
#endif // SHELL_ENABLE_METAL
default:
break;
}

View File

@ -4,10 +4,14 @@
#import "flutter/shell/platform/darwin/ios/ios_surface.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"
#import "flutter/shell/platform/darwin/ios/ios_surface_software.h"
#include "flutter/shell/platform/darwin/ios/rendering_api_selection.h"
#endif // SHELL_ENABLE_METAL
namespace flutter {
@ -16,6 +20,7 @@ std::unique_ptr<IOSSurface> IOSSurface::Create(std::shared_ptr<IOSContext> conte
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 @@ std::unique_ptr<IOSSurface> IOSSurface::Create(std::shared_ptr<IOSContext> conte
}
}
}
#endif // SHELL_ENABLE_METAL
return std::make_unique<IOSSurfaceSoftware>(layer, // layer
std::move(context) // context

View File

@ -5,9 +5,11 @@
#import "flutter/shell/platform/darwin/ios/rendering_api_selection.h"
#include <Foundation/Foundation.h>
#include <Metal/Metal.h>
#include <QuartzCore/CAEAGLLayer.h>
#import <QuartzCore/CAMetalLayer.h>
#if SHELL_ENABLE_METAL
#include <Metal/Metal.h>
#endif // SHELL_ENABLE_METAL
#import <TargetConditionals.h>
#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