[iOS] switch iOS to slimpeller variant. (#163808)

Now that skia can no longer be used on both iOS devices and Simulators,
we can switch the iOS engine to the "slimpeller" variant which removes
some (not all!) of the Skia dependencies. This should reduce binary size
and build time.

I also did some cleanups as some tests we're still opting into Skia
behaviors (though not actually running skia) and we now flag these as
errors.
This commit is contained in:
Jonah Williams 2025-02-24 11:05:21 -08:00 committed by GitHub
parent 1e2583eff2
commit a488d104f2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
25 changed files with 127 additions and 399 deletions

View File

@ -473,87 +473,6 @@
"script": "flutter/testing/ios_scenario_app/run_ios_tests.sh"
}
]
},
{
"cas_archive": false,
"drone_dimensions":
[
"os=Mac-13|Mac-14",
"device_type=none"
],
"gclient_variables":
{
"download_android_deps": false,
"use_rbe": true
},
"gn":
[
"--ios",
"--runtime-mode",
"release",
"--no-stripped",
"--no-lto",
"--xcode-symlinks",
"--rbe",
"--no-goma",
"--slimpeller"
],
"name": "ci/macos/ios_release_slimpeller",
"description": "Builds a Slimpeller release mode engine that targets iOS from a macOS host.",
"ninja":
{
"config": "ios_release_slimpeller",
"targets":
[]
},
"properties":
{
"$flutter/osx_sdk":
{
"sdk_version": "15a240d"
}
}
},
{
"cas_archive": false,
"drone_dimensions":
[
"os=Mac-13|Mac-14",
"device_type=none"
],
"gclient_variables":
{
"download_android_deps": false,
"use_rbe": true
},
"gn":
[
"--ios",
"--runtime-mode",
"debug",
"--unoptimized",
"--no-stripped",
"--no-lto",
"--xcode-symlinks",
"--rbe",
"--no-goma",
"--slimpeller"
],
"name": "ci/macos/ios_debug_unopt_slimpeller",
"description": "Builds an unoptimized debug mode engine with Slimpeller that targets iOS from a macOS host.",
"ninja":
{
"config": "ios_debug_unopt_slimpeller",
"targets":
[]
},
"properties":
{
"$flutter/osx_sdk":
{
"sdk_version": "15a240d"
}
}
}
]
}

View File

@ -76,7 +76,7 @@ static sk_sp<DlImage> CreateDeferredImage(
std::unique_ptr<LayerTree> layer_tree,
fml::TaskRunnerAffineWeakPtr<SnapshotDelegate> snapshot_delegate,
fml::RefPtr<fml::TaskRunner> raster_task_runner,
fml::RefPtr<SkiaUnrefQueue> unref_queue) {
const fml::RefPtr<SkiaUnrefQueue>& unref_queue) {
#if IMPELLER_SUPPORTS_RENDERING
if (impeller) {
return DlDeferredImageGPUImpeller::Make(std::move(layer_tree),
@ -95,7 +95,7 @@ static sk_sp<DlImage> CreateDeferredImage(
kRGBA_8888_SkColorType, kPremul_SkAlphaType);
return DlDeferredImageGPUSkia::MakeFromLayerTree(
image_info, std::move(layer_tree), std::move(snapshot_delegate),
raster_task_runner, std::move(unref_queue));
raster_task_runner, unref_queue);
#endif // SLIMPELLER
}
@ -113,8 +113,7 @@ void Scene::RasterizeToImage(uint32_t width,
auto image = CanvasImage::Create();
auto dl_image = CreateDeferredImage(
dart_state->IsImpellerEnabled(), BuildLayerTree(width, height),
std::move(snapshot_delegate), std::move(raster_task_runner),
std::move(unref_queue));
std::move(snapshot_delegate), std::move(raster_task_runner), unref_queue);
image->set_image(dl_image);
image->AssociateWithDartWrapper(raw_image_handle);
}

View File

@ -16,14 +16,14 @@ std::unique_ptr<ImageDecoder> ImageDecoder::Make(
const Settings& settings,
const TaskRunners& runners,
std::shared_ptr<fml::ConcurrentTaskRunner> concurrent_task_runner,
fml::WeakPtr<IOManager> io_manager,
const fml::WeakPtr<IOManager>& io_manager,
const std::shared_ptr<fml::SyncSwitch>& gpu_disabled_switch) {
#if IMPELLER_SUPPORTS_RENDERING
if (settings.enable_impeller) {
return std::make_unique<ImageDecoderImpeller>(
runners, //
std::move(concurrent_task_runner), //
std::move(io_manager), //
io_manager, //
settings.enable_wide_gamut, //
gpu_disabled_switch);
}
@ -32,7 +32,7 @@ std::unique_ptr<ImageDecoder> ImageDecoder::Make(
return std::make_unique<ImageDecoderSkia>(
runners, //
std::move(concurrent_task_runner), //
std::move(io_manager) //
io_manager //
);
#else // !SLIMPELLER
FML_LOG(FATAL) << "Could not setup an image decoder.";

View File

@ -27,7 +27,7 @@ class ImageDecoder {
const Settings& settings,
const TaskRunners& runners,
std::shared_ptr<fml::ConcurrentTaskRunner> concurrent_task_runner,
fml::WeakPtr<IOManager> io_manager,
const fml::WeakPtr<IOManager>& io_manager,
const std::shared_ptr<fml::SyncSwitch>& gpu_disabled_switch);
virtual ~ImageDecoder();

View File

@ -55,10 +55,10 @@ static void InvokeNextFrameCallback(
std::pair<sk_sp<DlImage>, std::string>
MultiFrameCodec::State::GetNextFrameImage(
fml::WeakPtr<GrDirectContext> resourceContext,
const fml::WeakPtr<GrDirectContext>& resourceContext,
const std::shared_ptr<const fml::SyncSwitch>& gpu_disable_sync_switch,
const std::shared_ptr<impeller::Context>& impeller_context,
fml::RefPtr<flutter::SkiaUnrefQueue> unref_queue) {
const fml::RefPtr<flutter::SkiaUnrefQueue>& unref_queue) {
SkBitmap bitmap = SkBitmap();
SkImageInfo info = generator_->GetInfo().makeColorType(kN32_SkColorType);
if (info.alphaType() == kUnpremul_SkAlphaType) {
@ -175,7 +175,7 @@ MultiFrameCodec::State::GetNextFrameImage(
}
}));
return std::make_pair(DlImageGPU::Make({skImage, std::move(unref_queue)}),
return std::make_pair(DlImageGPU::Make({skImage, unref_queue}),
std::string());
#else // !SLIMPELLER
return std::make_pair(nullptr, "Unsupported backend.");
@ -185,8 +185,8 @@ MultiFrameCodec::State::GetNextFrameImage(
void MultiFrameCodec::State::GetNextFrameAndInvokeCallback(
std::unique_ptr<tonic::DartPersistentValue> callback,
const fml::RefPtr<fml::TaskRunner>& ui_task_runner,
fml::WeakPtr<GrDirectContext> resourceContext,
fml::RefPtr<flutter::SkiaUnrefQueue> unref_queue,
const fml::WeakPtr<GrDirectContext>& resourceContext,
const fml::RefPtr<flutter::SkiaUnrefQueue>& unref_queue,
const std::shared_ptr<const fml::SyncSwitch>& gpu_disable_sync_switch,
size_t trace_id,
const std::shared_ptr<impeller::Context>& impeller_context) {
@ -205,9 +205,8 @@ void MultiFrameCodec::State::GetNextFrameAndInvokeCallback(
int duration = 0;
sk_sp<DlImage> dlImage;
std::string decode_error;
std::tie(dlImage, decode_error) =
GetNextFrameImage(std::move(resourceContext), gpu_disable_sync_switch,
impeller_context, std::move(unref_queue));
std::tie(dlImage, decode_error) = GetNextFrameImage(
resourceContext, gpu_disable_sync_switch, impeller_context, unref_queue);
if (dlImage) {
image = CanvasImage::Create();
image->set_image(dlImage);

View File

@ -60,16 +60,16 @@ class MultiFrameCodec : public Codec {
std::optional<SkIRect> restoreBGColorRect_;
std::pair<sk_sp<DlImage>, std::string> GetNextFrameImage(
fml::WeakPtr<GrDirectContext> resourceContext,
const fml::WeakPtr<GrDirectContext>& resourceContext,
const std::shared_ptr<const fml::SyncSwitch>& gpu_disable_sync_switch,
const std::shared_ptr<impeller::Context>& impeller_context,
fml::RefPtr<flutter::SkiaUnrefQueue> unref_queue);
const fml::RefPtr<flutter::SkiaUnrefQueue>& unref_queue);
void GetNextFrameAndInvokeCallback(
std::unique_ptr<tonic::DartPersistentValue> callback,
const fml::RefPtr<fml::TaskRunner>& ui_task_runner,
fml::WeakPtr<GrDirectContext> resourceContext,
fml::RefPtr<flutter::SkiaUnrefQueue> unref_queue,
const fml::WeakPtr<GrDirectContext>& resourceContext,
const fml::RefPtr<flutter::SkiaUnrefQueue>& unref_queue,
const std::shared_ptr<const fml::SyncSwitch>& gpu_disable_sync_switch,
size_t trace_id,
const std::shared_ptr<impeller::Context>& impeller_context);

View File

@ -62,7 +62,7 @@ static sk_sp<DlImage> CreateDeferredImage(
uint32_t height,
fml::TaskRunnerAffineWeakPtr<SnapshotDelegate> snapshot_delegate,
fml::RefPtr<fml::TaskRunner> raster_task_runner,
fml::RefPtr<SkiaUnrefQueue> unref_queue) {
const fml::RefPtr<SkiaUnrefQueue>& unref_queue) {
#if IMPELLER_SUPPORTS_RENDERING
if (impeller) {
return DlDeferredImageGPUImpeller::Make(
@ -77,9 +77,9 @@ static sk_sp<DlImage> CreateDeferredImage(
#else // SLIMPELLER
const SkImageInfo image_info = SkImageInfo::Make(
width, height, kRGBA_8888_SkColorType, kPremul_SkAlphaType);
return DlDeferredImageGPUSkia::Make(
image_info, std::move(display_list), std::move(snapshot_delegate),
raster_task_runner, std::move(unref_queue));
return DlDeferredImageGPUSkia::Make(image_info, std::move(display_list),
std::move(snapshot_delegate),
raster_task_runner, unref_queue);
#endif // !SLIMPELLER
}
@ -99,8 +99,7 @@ void Picture::RasterizeToImageSync(sk_sp<DisplayList> display_list,
auto image = CanvasImage::Create();
auto dl_image = CreateDeferredImage(
dart_state->IsImpellerEnabled(), std::move(display_list), width, height,
std::move(snapshot_delegate), std::move(raster_task_runner),
std::move(unref_queue));
std::move(snapshot_delegate), std::move(raster_task_runner), unref_queue);
image->set_image(dl_image);
image->AssociateWithDartWrapper(raw_image_handle);
}

View File

@ -24,7 +24,7 @@ class SnapshotDelegate {
/// @brief A data structure used by the Skia implementation of deferred
/// GPU based images.
struct GpuImageResult {
GpuImageResult(
explicit GpuImageResult(
#if !SLIMPELLER
const GrBackendTexture& p_texture,
#endif // !SLIMPELLER

View File

@ -48,7 +48,7 @@ flutter::Settings FLTDefaultSettingsForBundle(NSBundle* bundle, NSProcessInfo* p
auto command_line = flutter::CommandLineFromNSProcessInfo(processInfoOrNil);
// Precedence:
// 1. Settings from the specified NSBundle (except for enable-impeller).
// 1. Settings from the specified NSBundle.
// 2. Settings passed explicitly via command-line arguments.
// 3. Settings from the NSBundle with the default bundle ID.
// 4. Settings from the main NSBundle and default values.
@ -403,8 +403,4 @@ flutter::Settings FLTDefaultSettingsForBundle(NSBundle* bundle, NSProcessInfo* p
return _settings.enable_wide_gamut;
}
- (BOOL)isImpellerEnabled {
return _settings.enable_impeller;
}
@end

View File

@ -225,34 +225,6 @@ FLUTTER_ASSERT_ARC
}
}
- (void)testRequestsWarningWhenImpellerOptOut {
auto settings = FLTDefaultSettingsForBundle();
XCTAssertEqual(settings.warn_on_impeller_opt_out, YES);
}
- (void)testEnableImpellerSettingIsCorrectlyParsed {
id mockMainBundle = OCMPartialMock([NSBundle mainBundle]);
OCMStub([mockMainBundle objectForInfoDictionaryKey:@"FLTEnableImpeller"]).andReturn(@"YES");
auto settings = FLTDefaultSettingsForBundle();
// Check settings.enable_impeller value is same as the value defined in Info.plist.
XCTAssertEqual(settings.enable_impeller, YES);
[mockMainBundle stopMocking];
}
- (void)testEnableImpellerSettingIsCorrectlyOverriddenByCommandLine {
id mockMainBundle = OCMPartialMock([NSBundle mainBundle]);
OCMStub([mockMainBundle objectForInfoDictionaryKey:@"FLTEnableImpeller"]).andReturn(@"NO");
id mockProcessInfo = OCMPartialMock([NSProcessInfo processInfo]);
NSArray* arguments = @[ @"process_name", @"--enable-impeller" ];
OCMStub([mockProcessInfo arguments]).andReturn(arguments);
auto settings = FLTDefaultSettingsForBundle(nil, mockProcessInfo);
// Check settings.enable_impeller value is same as the value on command line.
XCTAssertEqual(settings.enable_impeller, YES);
[mockMainBundle stopMocking];
}
- (void)testEnableDartAssertsCommandLineArgument {
id mockMainBundle = OCMPartialMock([NSBundle mainBundle]);
OCMStub([mockMainBundle objectForInfoDictionaryKey:@"FLTEnableDartAsserts"]).andReturn(@"YES");

View File

@ -19,7 +19,6 @@ flutter::Settings FLTDefaultSettingsForBundle(NSBundle* _Nullable bundle = nil,
@interface FlutterDartProject ()
@property(nonatomic, readonly) BOOL isWideGamutEnabled;
@property(nonatomic, readonly) BOOL isImpellerEnabled;
/**
* This is currently used for *only for tests* to override settings.

View File

@ -264,7 +264,7 @@ static constexpr int kNumProfilerSamplesPerSec = 5;
}
- (void)recreatePlatformViewsController {
_renderingApi = flutter::GetRenderingAPIForProcess(FlutterView.forceSoftwareRendering);
_renderingApi = flutter::GetRenderingAPIForProcess(/*force_software=*/false);
_platformViewsController = [[FlutterPlatformViewsController alloc] init];
}
@ -743,7 +743,7 @@ static flutter::ThreadHost MakeThreadHost(NSString* thread_label,
fml::MessageLoop::EnsureInitializedForCurrentThread();
uint32_t threadHostType = flutter::ThreadHost::Type::kRaster | flutter::ThreadHost::Type::kIo;
if (!settings.enable_impeller || !settings.merged_platform_ui_thread) {
if (!settings.merged_platform_ui_thread) {
threadHostType |= flutter::ThreadHost::Type::kUi;
}
@ -802,8 +802,6 @@ static void SetEntryPoint(flutter::Settings* settings, NSString* entrypoint, NSS
self.initialRoute = [NSString stringWithUTF8String:settings.route.c_str()];
}
FlutterView.forceSoftwareRendering = settings.enable_software_rendering;
auto platformData = [self.dartProject defaultPlatformData];
SetEntryPoint(&settings, entrypoint, libraryURI);
@ -1497,10 +1495,6 @@ static void SetEntryPoint(flutter::Settings* settings, NSString* entrypoint, NSS
return self.dartProject;
}
- (BOOL)isUsingImpeller {
return self.project.isImpellerEnabled;
}
@end
@implementation FlutterEngineRegistrar {

View File

@ -72,16 +72,14 @@ NS_ASSUME_NONNULL_BEGIN
///
/// Called from the raster thread.
- (flutter::PostPrerollResult)postPrerollActionWithThreadMerger:
(const fml::RefPtr<fml::RasterThreadMerger>&)rasterThreadMerger
impellerEnabled:(BOOL)impellerEnabled;
(const fml::RefPtr<fml::RasterThreadMerger>&)rasterThreadMerger;
/// @brief Mark the end of a compositor frame.
///
/// May determine changes are required to the thread merging state.
/// Called from the raster thread.
- (void)endFrameWithResubmit:(BOOL)shouldResubmitFrame
threadMerger:(const fml::RefPtr<fml::RasterThreadMerger>&)rasterThreadMerger
impellerEnabled:(BOOL)impellerEnabled;
threadMerger:(const fml::RefPtr<fml::RasterThreadMerger>&)rasterThreadMerger;
/// @brief Returns the Canvas for the overlay slice for the given platform view.
///

View File

@ -448,14 +448,12 @@ static bool ClipRRectContainsPlatformViewBoundingRect(const SkRRect& clip_rrect,
}
- (flutter::PostPrerollResult)postPrerollActionWithThreadMerger:
(const fml::RefPtr<fml::RasterThreadMerger>&)rasterThreadMerger
impellerEnabled:(BOOL)impellerEnabled {
(const fml::RefPtr<fml::RasterThreadMerger>&)rasterThreadMerger {
return flutter::PostPrerollResult::kSuccess;
}
- (void)endFrameWithResubmit:(BOOL)shouldResubmitFrame
threadMerger:(const fml::RefPtr<fml::RasterThreadMerger>&)rasterThreadMerger
impellerEnabled:(BOOL)impellerEnabled {
threadMerger:(const fml::RefPtr<fml::RasterThreadMerger>&)rasterThreadMerger {
}
- (void)pushFilterToVisitedPlatformViews:(const std::shared_ptr<flutter::DlImageFilter>&)filter

View File

@ -324,9 +324,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -388,9 +386,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -485,9 +481,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -571,9 +565,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -657,9 +649,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -744,9 +734,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -876,9 +864,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -1035,9 +1021,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -1339,9 +1323,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -1675,9 +1657,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -1745,9 +1725,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -1858,9 +1836,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -1943,9 +1919,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -2024,9 +1998,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -2104,9 +2076,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -2189,9 +2159,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -2294,9 +2262,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -2406,9 +2372,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -2535,9 +2499,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -2648,9 +2610,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -2778,9 +2738,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -2849,9 +2807,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -2977,9 +2933,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -3094,9 +3048,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -3162,9 +3114,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -3271,9 +3221,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -3336,9 +3284,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -3401,9 +3347,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -3462,9 +3406,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -3522,9 +3464,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -3607,9 +3547,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -3665,9 +3603,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -3739,9 +3675,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -3793,15 +3727,12 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
[flutterPlatformViewsController prerollCompositeEmbeddedView:1
withParams:std::move(embeddedViewParams2)];
// SKSurface is required if the root FlutterView is present.
const SkImageInfo image_info = SkImageInfo::MakeN32Premul(1000, 1000);
sk_sp<SkSurface> mock_sk_surface = SkSurfaces::Raster(image_info);
flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
std::move(mock_sk_surface), framebuffer_info,
nullptr, framebuffer_info,
[](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return true; },
[](const flutter::SurfaceFrame& surface_frame) { return true; },
/*frame_size=*/SkISize::Make(800, 600));
/*frame_size=*/SkISize::Make(800, 600), nullptr, /*display_list_fallback=*/true);
XCTAssertTrue([flutterPlatformViewsController
submitFrame:std::move(mock_surface)
withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
@ -3826,12 +3757,11 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
[flutterPlatformViewsController prerollCompositeEmbeddedView:0
withParams:std::move(embeddedViewParams1)];
mock_sk_surface = SkSurfaces::Raster(image_info);
mock_surface = std::make_unique<flutter::SurfaceFrame>(
std::move(mock_sk_surface), framebuffer_info,
nullptr, framebuffer_info,
[](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return true; },
[](const flutter::SurfaceFrame& surface_frame) { return true; },
/*frame_size=*/SkISize::Make(800, 600));
/*frame_size=*/SkISize::Make(800, 600), nullptr, /*display_list_fallback=*/true);
XCTAssertTrue([flutterPlatformViewsController
submitFrame:std::move(mock_surface)
withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
@ -3855,9 +3785,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -3909,15 +3837,12 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
[flutterPlatformViewsController prerollCompositeEmbeddedView:1
withParams:std::move(embeddedViewParams2)];
// SKSurface is required if the root FlutterView is present.
const SkImageInfo image_info = SkImageInfo::MakeN32Premul(1000, 1000);
sk_sp<SkSurface> mock_sk_surface = SkSurfaces::Raster(image_info);
flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
std::move(mock_sk_surface), framebuffer_info,
nullptr, framebuffer_info,
[](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return true; },
[](const flutter::SurfaceFrame& surface_frame) { return true; },
/*frame_size=*/SkISize::Make(800, 600));
/*frame_size=*/SkISize::Make(800, 600), nullptr, /*display_list_fallback=*/true);
XCTAssertTrue([flutterPlatformViewsController
submitFrame:std::move(mock_surface)
withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
@ -3942,12 +3867,11 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
[flutterPlatformViewsController prerollCompositeEmbeddedView:1
withParams:std::move(embeddedViewParams2)];
mock_sk_surface = SkSurfaces::Raster(image_info);
mock_surface = std::make_unique<flutter::SurfaceFrame>(
std::move(mock_sk_surface), framebuffer_info,
nullptr, framebuffer_info,
[](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return true; },
[](const flutter::SurfaceFrame& surface_frame) { return true; },
/*frame_size=*/SkISize::Make(800, 600));
/*frame_size=*/SkISize::Make(800, 600), nullptr, /*display_list_fallback=*/true);
XCTAssertTrue([flutterPlatformViewsController
submitFrame:std::move(mock_surface)
withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
@ -4056,9 +3980,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -4162,9 +4084,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -4255,9 +4175,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -4357,9 +4275,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -4423,14 +4339,13 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
result:disposeResult];
[self waitForExpectationsWithTimeout:30 handler:nil];
const SkImageInfo image_info = SkImageInfo::MakeN32Premul(1000, 1000);
sk_sp<SkSurface> mock_sk_surface = SkSurfaces::Raster(image_info);
flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
std::move(mock_sk_surface), framebuffer_info,
nullptr, framebuffer_info,
[](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return true; },
[](const flutter::SurfaceFrame& surface_frame) { return true; },
/*frame_size=*/SkISize::Make(800, 600));
/*frame_size=*/SkISize::Make(800, 600), nullptr,
/*display_list_fallback=*/true);
XCTAssertTrue([flutterPlatformViewsController
submitFrame:std::move(mock_surface)
withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
@ -4452,14 +4367,12 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
[flutterPlatformViewsController prerollCompositeEmbeddedView:1
withParams:std::move(embeddedViewParams1)];
const SkImageInfo image_info = SkImageInfo::MakeN32Premul(1000, 1000);
sk_sp<SkSurface> mock_sk_surface = SkSurfaces::Raster(image_info);
flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
std::move(mock_sk_surface), framebuffer_info,
nullptr, framebuffer_info,
[](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return true; },
[](const flutter::SurfaceFrame& surface_frame) { return true; },
/*frame_size=*/SkISize::Make(800, 600));
/*frame_size=*/SkISize::Make(800, 600), nullptr, /*display_list_fallback=*/true);
XCTAssertTrue([flutterPlatformViewsController
submitFrame:std::move(mock_surface)
withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
@ -4483,9 +4396,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -4529,15 +4440,12 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
[flutterPlatformViewsController prerollCompositeEmbeddedView:2
withParams:std::move(embeddedViewParams)];
// SKSurface is required if the root FlutterView is present.
const SkImageInfo image_info = SkImageInfo::MakeN32Premul(1000, 1000);
sk_sp<SkSurface> mock_sk_surface = SkSurfaces::Raster(image_info);
flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
std::move(mock_sk_surface), framebuffer_info,
nullptr, framebuffer_info,
[](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return true; },
[](const flutter::SurfaceFrame& surface_frame) { return true; },
/*frame_size=*/SkISize::Make(800, 600));
/*frame_size=*/SkISize::Make(800, 600), nullptr, /*display_list_fallback=*/true);
[flutterPlatformViewsController submitFrame:std::move(mock_surface)
withIosContext:std::make_shared<flutter::IOSContextNoop>()];
@ -4562,9 +4470,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -4609,15 +4515,12 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
[flutterPlatformViewsController prerollCompositeEmbeddedView:2
withParams:std::move(embeddedViewParams)];
// SKSurface is required if the root FlutterView is present.
const SkImageInfo image_info = SkImageInfo::MakeN32Premul(1000, 1000);
sk_sp<SkSurface> mock_sk_surface = SkSurfaces::Raster(image_info);
flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
std::move(mock_sk_surface), framebuffer_info,
nullptr, framebuffer_info,
[](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return true; },
[](const flutter::SurfaceFrame& surface_frame) { return true; },
/*frame_size=*/SkISize::Make(800, 600));
/*frame_size=*/SkISize::Make(800, 600), nullptr, /*display_list_fallback=*/true);
[flutterPlatformViewsController submitFrame:std::move(mock_surface)
withIosContext:std::make_shared<flutter::IOSContextNoop>()];
@ -4669,9 +4572,7 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
flutterPlatformViewsController.taskRunner = GetDefaultTaskRunner();
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/mock_delegate.settings_.enable_impeller
? flutter::IOSRenderingAPI::kMetal
: flutter::IOSRenderingAPI::kSoftware,
/*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
/*platform_views_controller=*/flutterPlatformViewsController,
/*task_runners=*/runners,
/*worker_task_runner=*/nil,
@ -4721,19 +4622,17 @@ fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
[flutterPlatformViewsController prerollCompositeEmbeddedView:1
withParams:std::move(embeddedViewParams2)];
// SKSurface is required if the root FlutterView is present.
const SkImageInfo image_info = SkImageInfo::MakeN32Premul(1000, 1000);
sk_sp<SkSurface> mock_sk_surface = SkSurfaces::Raster(image_info);
flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
std::optional<flutter::SurfaceFrame::SubmitInfo> submit_info;
auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
std::move(mock_sk_surface), framebuffer_info,
nullptr, framebuffer_info,
[](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return true; },
[&](const flutter::SurfaceFrame& surface_frame) {
submit_info = surface_frame.submit_info();
return true;
},
/*frame_size=*/SkISize::Make(800, 600));
/*frame_size=*/SkISize::Make(800, 600), nullptr,
/*display_list_fallback=*/true);
mock_surface->set_submit_info({
.frame_damage = SkIRect::MakeWH(800, 600),
.buffer_damage = SkIRect::MakeWH(400, 600),

View File

@ -13,7 +13,6 @@
@protocol FlutterViewEngineDelegate <NSObject>
@property(nonatomic, readonly) BOOL isUsingImpeller;
@property(nonatomic, readonly) FlutterPlatformViewsController* platformViewsController;
- (flutter::Rasterizer::Screenshot)takeScreenshot:(flutter::Rasterizer::ScreenshotType)type
@ -44,8 +43,6 @@
- (UIScreen*)screen;
- (MTLPixelFormat)pixelFormat;
// Set by FlutterEngine or FlutterViewController to override software rendering.
@property(class, nonatomic) BOOL forceSoftwareRendering;
@end
#endif // FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_SOURCE_FLUTTERVIEW_H_

View File

@ -51,10 +51,6 @@ FLUTTER_ASSERT_ARC
return MTLPixelFormatBGRA8Unorm;
}
- (BOOL)isWideGamutSupported {
if (!self.delegate.isUsingImpeller) {
return NO;
}
FML_DCHECK(self.screen);
// This predicates the decision on the capabilities of the iOS device's
@ -105,12 +101,11 @@ static void PrintWideGamutWarningOnce() {
layer.contentsScale = screenScale;
layer.rasterizationScale = screenScale;
layer.framebufferOnly = flutter::Settings::kSurfaceDataAccessible ? NO : YES;
BOOL isWideGamutSupported = self.isWideGamutSupported;
if (_isWideGamutEnabled && isWideGamutSupported) {
if (_isWideGamutEnabled && self.isWideGamutSupported) {
fml::CFRef<CGColorSpaceRef> srgb(CGColorSpaceCreateWithName(kCGColorSpaceExtendedSRGB));
layer.colorspace = srgb;
layer.pixelFormat = MTLPixelFormatBGRA10_XR;
} else if (_isWideGamutEnabled && !isWideGamutSupported) {
} else if (_isWideGamutEnabled && !self.isWideGamutSupported) {
PrintWideGamutWarningOnce();
}
}
@ -118,19 +113,9 @@ static void PrintWideGamutWarningOnce() {
[super layoutSubviews];
}
static BOOL _forceSoftwareRendering;
+ (BOOL)forceSoftwareRendering {
return _forceSoftwareRendering;
}
+ (void)setForceSoftwareRendering:(BOOL)forceSoftwareRendering {
_forceSoftwareRendering = forceSoftwareRendering;
}
+ (Class)layerClass {
return flutter::GetCoreAnimationLayerClassForRenderingAPI(
flutter::GetRenderingAPIForProcess(FlutterView.forceSoftwareRendering));
flutter::GetRenderingAPIForProcess(/*force_software=*/false));
}
- (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context {

View File

@ -256,7 +256,6 @@ typedef struct MouseState {
if (!project) {
project = [[FlutterDartProject alloc] init];
}
FlutterView.forceSoftwareRendering = project.settings.enable_software_rendering;
FlutterEngine* engine = [[FlutterEngine alloc] initWithName:@"io.flutter"
project:project
allowHeadlessExecution:self.engineAllowHeadlessExecution

View File

@ -10,7 +10,6 @@ FLUTTER_ASSERT_ARC
@interface FakeDelegate : NSObject <FlutterViewEngineDelegate>
@property(nonatomic) BOOL callbackCalled;
@property(nonatomic, assign) BOOL isUsingImpeller;
@end
@implementation FakeDelegate
@ -52,16 +51,6 @@ FLUTTER_ASSERT_ARC
XCTAssertNil(view.backgroundColor);
}
- (void)testIgnoreWideColorWithoutImpeller {
FakeDelegate* delegate = [[FakeDelegate alloc] init];
delegate.isUsingImpeller = NO;
FlutterView* view = [[FlutterView alloc] initWithDelegate:delegate opaque:NO enableWideGamut:YES];
[view layoutSubviews];
XCTAssertTrue([view.layer isKindOfClass:[CAMetalLayer class]]);
CAMetalLayer* layer = (CAMetalLayer*)view.layer;
XCTAssertEqual(layer.pixelFormat, MTLPixelFormatBGRA8Unorm);
}
- (void)testLayerScalesMatchScreenAfterLayoutSubviews {
FakeDelegate* delegate = [[FakeDelegate alloc] init];
FlutterView* view = [[FlutterView alloc] initWithDelegate:delegate opaque:NO enableWideGamut:NO];

View File

@ -39,7 +39,7 @@ class IOSContext {
public:
//----------------------------------------------------------------------------
/// @brief Create an iOS context object capable of creating the on-screen
/// and off-screen GPU context for use by Skia.
/// and off-screen GPU context for use by Impeller.
///
/// In case the engine does not support the specified client
/// rendering API, this a `nullptr` may be returned.

View File

@ -7,7 +7,6 @@
#include "flutter/fml/macros.h"
#include "flutter/shell/platform/darwin/graphics/FlutterDarwinContextMetalImpeller.h"
#include "flutter/shell/platform/darwin/graphics/FlutterDarwinContextMetalSkia.h"
#include "flutter/shell/platform/darwin/ios/ios_context.h"
#include "impeller/display_list/aiks_context.h"

View File

@ -59,10 +59,8 @@ PostPrerollResult IOSExternalViewEmbedder::PostPrerollAction(
const fml::RefPtr<fml::RasterThreadMerger>& raster_thread_merger) {
TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::PostPrerollAction");
FML_CHECK(platform_views_controller_);
BOOL impeller_enabled = ios_context_->GetBackend() != IOSRenderingBackend::kSkia;
PostPrerollResult result =
[platform_views_controller_ postPrerollActionWithThreadMerger:raster_thread_merger
impellerEnabled:impeller_enabled];
[platform_views_controller_ postPrerollActionWithThreadMerger:raster_thread_merger];
return result;
}
@ -94,10 +92,8 @@ void IOSExternalViewEmbedder::EndFrame(
bool should_resubmit_frame,
const fml::RefPtr<fml::RasterThreadMerger>& raster_thread_merger) {
TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::EndFrame");
BOOL impeller_enabled = ios_context_->GetBackend() != IOSRenderingBackend::kSkia;
[platform_views_controller_ endFrameWithResubmit:should_resubmit_frame
threadMerger:raster_thread_merger
impellerEnabled:impeller_enabled];
threadMerger:raster_thread_merger];
}
// |ExternalViewEmbedder|

View File

@ -30,7 +30,7 @@ namespace flutter {
* The shell provides and requests for UI related data and this PlatformView subclass fulfills
* it with iOS specific capabilities. As an example, the iOS embedding (the `FlutterEngine` and the
* `FlutterViewController`) sends pointer data to the shell and receives the shell's request for a
* Skia GrDirectContext and supplies it.
* Impeller AiksContext and supplies it.
*
* Despite the name "view", this class is unrelated to UIViews on iOS and doesn't have the same
* lifecycle. It's a long lived bridge owned by the `FlutterEngine` and can be attached and

View File

@ -64,7 +64,6 @@ void main(List<String> args) async {
deviceIdentifier: results.option('device-identifier')!,
osRuntime: results.option('os-runtime')!,
osVersion: results.option('os-version')!,
withImpeller: results.flag('with-impeller'),
dumpXcresultOnFailure: dumpXcresultOnFailurePath,
);
completer.complete();
@ -111,7 +110,6 @@ Future<void> _run(
required String deviceIdentifier,
required String osRuntime,
required String osVersion,
required bool withImpeller,
required String? dumpXcresultOnFailure,
}) async {
// Terminate early on SIGINT.
@ -132,37 +130,35 @@ Future<void> _run(
cleanup.add(() => _deleteIfPresent(resultBundle));
if (withImpeller) {
final process = await _runTests(
outScenariosPath: scenarioPath,
resultBundlePath: resultBundle.path,
osVersion: osVersion,
deviceName: deviceName,
iosEngineVariant: iosEngineVariant,
);
cleanup.add(process.kill);
final process = await _runTests(
outScenariosPath: scenarioPath,
resultBundlePath: resultBundle.path,
osVersion: osVersion,
deviceName: deviceName,
iosEngineVariant: iosEngineVariant,
);
cleanup.add(process.kill);
// Create a temporary directory, if needed.
var storePath = dumpXcresultOnFailure;
if (storePath == null) {
final dumpDir = io.Directory.systemTemp.createTempSync();
storePath = dumpDir.path;
cleanup.add(() => dumpDir.delete(recursive: true));
}
if (await process.exitCode != 0) {
final String outputPath = _zipAndStoreFailedTestResults(
iosEngineVariant: iosEngineVariant,
resultBundle: resultBundle,
storePath: storePath,
);
io.stderr.writeln('Failed test results are stored at $outputPath');
throw _ToolFailure('test failed.');
} else {
io.stderr.writeln('test succcess.');
}
_deleteIfPresent(resultBundle);
// Create a temporary directory, if needed.
var storePath = dumpXcresultOnFailure;
if (storePath == null) {
final dumpDir = io.Directory.systemTemp.createTempSync();
storePath = dumpDir.path;
cleanup.add(() => dumpDir.delete(recursive: true));
}
if (await process.exitCode != 0) {
final String outputPath = _zipAndStoreFailedTestResults(
iosEngineVariant: iosEngineVariant,
resultBundle: resultBundle,
storePath: storePath,
);
io.stderr.writeln('Failed test results are stored at $outputPath');
throw _ToolFailure('test failed.');
} else {
io.stderr.writeln('test succcess.');
}
_deleteIfPresent(resultBundle);
}
/// Exception thrown when the tool should halt execution intentionally.
@ -198,11 +194,6 @@ final _args =
help: 'The OS version of the iOS simulator device to use.',
defaultsTo: '17.0',
)
..addFlag(
'with-impeller',
help: 'Whether to use the Impeller backend to run the tests.',
defaultsTo: true,
)
..addOption(
'dump-xcresult-on-failure',
help:

View File

@ -451,7 +451,7 @@ def to_gn_args(args):
gn_args['is_clang'] = True
else:
gn_args['is_clang'] = args.clang
if args.slimpeller:
if args.target_os == 'ios' or args.slimpeller:
gn_args['skia_enable_graphite'] = False
gn_args['skia_enable_ganesh'] = False
gn_args['slimpeller'] = True