Skip to content

Commit d6627c6

Browse files
authored
Reland [ios] Refactor IOSSurface factory and unify surface creation (flutter#22016)
1 parent e4dffc1 commit d6627c6

24 files changed

Lines changed: 231 additions & 53 deletions

ci/licenses_golden/licenses_flutter

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1016,6 +1016,8 @@ FILE: ../../../flutter/shell/platform/darwin/ios/ios_render_target_gl.h
10161016
FILE: ../../../flutter/shell/platform/darwin/ios/ios_render_target_gl.mm
10171017
FILE: ../../../flutter/shell/platform/darwin/ios/ios_surface.h
10181018
FILE: ../../../flutter/shell/platform/darwin/ios/ios_surface.mm
1019+
FILE: ../../../flutter/shell/platform/darwin/ios/ios_surface_factory.h
1020+
FILE: ../../../flutter/shell/platform/darwin/ios/ios_surface_factory.mm
10191021
FILE: ../../../flutter/shell/platform/darwin/ios/ios_surface_gl.h
10201022
FILE: ../../../flutter/shell/platform/darwin/ios/ios_surface_gl.mm
10211023
FILE: ../../../flutter/shell/platform/darwin/ios/ios_surface_metal.h

shell/platform/darwin/ios/BUILD.gn

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ source_set("flutter_framework_source") {
9999
"ios_render_target_gl.mm",
100100
"ios_surface.h",
101101
"ios_surface.mm",
102+
"ios_surface_factory.h",
103+
"ios_surface_factory.mm",
102104
"ios_surface_gl.h",
103105
"ios_surface_gl.mm",
104106
"ios_surface_software.h",
@@ -219,6 +221,7 @@ shared_library("ios_test_flutter") {
219221
deps = [
220222
":flutter_framework_source",
221223
":ios_test_flutter_mrc",
224+
"//flutter/common:common",
222225
"//flutter/shell/platform/darwin/common:framework_shared",
223226
"//flutter/third_party/tonic",
224227
"//flutter/third_party/txt",

shell/platform/darwin/ios/framework/Source/FlutterDartProject.mm

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828
static const char* kApplicationKernelSnapshotFileName = "kernel_blob.bin";
2929

30-
static flutter::Settings DefaultSettingsForProcess(NSBundle* bundle = nil) {
30+
flutter::Settings FLTDefaultSettingsForBundle(NSBundle* bundle) {
3131
auto command_line = flutter::CommandLineFromNSProcessInfo();
3232

3333
// Precedence:
@@ -181,7 +181,17 @@ - (instancetype)initWithPrecompiledDartBundle:(nullable NSBundle*)bundle {
181181
self = [super init];
182182

183183
if (self) {
184-
_settings = DefaultSettingsForProcess(bundle);
184+
_settings = FLTDefaultSettingsForBundle(bundle);
185+
}
186+
187+
return self;
188+
}
189+
190+
- (instancetype)initWithSettings:(const flutter::Settings&)settings {
191+
self = [self initWithPrecompiledDartBundle:nil];
192+
193+
if (self) {
194+
_settings = settings;
185195
}
186196

187197
return self;

shell/platform/darwin/ios/framework/Source/FlutterDartProject_Internal.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,14 @@
1212

1313
NS_ASSUME_NONNULL_BEGIN
1414

15+
flutter::Settings FLTDefaultSettingsForBundle(NSBundle* bundle = nil);
16+
1517
@interface FlutterDartProject ()
1618

19+
/**
20+
* This is currently used for *only for tests* to override settings.
21+
*/
22+
- (instancetype)initWithSettings:(const flutter::Settings&)settings;
1723
- (const flutter::Settings&)settings;
1824
- (const flutter::PlatformData)defaultPlatformData;
1925

shell/platform/darwin/ios/framework/Source/FlutterEngine.mm

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@
2828
#import "flutter/shell/platform/darwin/ios/framework/Source/platform_message_response_darwin.h"
2929
#import "flutter/shell/platform/darwin/ios/framework/Source/profiler_metrics_ios.h"
3030
#import "flutter/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h"
31+
#import "flutter/shell/platform/darwin/ios/ios_context.h"
3132
#import "flutter/shell/platform/darwin/ios/ios_surface.h"
33+
#import "flutter/shell/platform/darwin/ios/ios_surface_factory.h"
3234
#import "flutter/shell/platform/darwin/ios/platform_view_ios.h"
3335
#import "flutter/shell/platform/darwin/ios/rendering_api_selection.h"
3436
#include "flutter/shell/profiling/sampling_profiler.h"
@@ -64,6 +66,8 @@ @implementation FlutterEngine {
6466
fml::scoped_nsobject<FlutterObservatoryPublisher> _publisher;
6567

6668
std::shared_ptr<flutter::FlutterPlatformViewsController> _platformViewsController;
69+
flutter::IOSRenderingAPI _renderingApi;
70+
std::shared_ptr<flutter::IOSSurfaceFactory> _surfaceFactory;
6771
std::unique_ptr<flutter::ProfilerMetricsIOS> _profiler_metrics;
6872
std::unique_ptr<flutter::SamplingProfiler> _profiler;
6973

@@ -128,7 +132,7 @@ - (instancetype)initWithName:(NSString*)labelPrefix
128132

129133
_pluginPublications = [NSMutableDictionary new];
130134
_registrars = [[NSMutableDictionary alloc] init];
131-
_platformViewsController.reset(new flutter::FlutterPlatformViewsController());
135+
[self recreatePlatformViewController];
132136

133137
_binaryMessenger = [[FlutterBinaryMessengerRelay alloc] initWithParent:self];
134138
_connections.reset(new flutter::ConnectionCollection());
@@ -162,6 +166,17 @@ - (instancetype)initWithName:(NSString*)labelPrefix
162166
return self;
163167
}
164168

169+
- (void)recreatePlatformViewController {
170+
_renderingApi = flutter::GetRenderingAPIForProcess(FlutterView.forceSoftwareRendering);
171+
_surfaceFactory = flutter::IOSSurfaceFactory::Create(_renderingApi);
172+
_platformViewsController.reset(new flutter::FlutterPlatformViewsController(_surfaceFactory));
173+
_surfaceFactory->SetPlatformViewsController(_platformViewsController);
174+
}
175+
176+
- (flutter::IOSRenderingAPI)platformViewsRenderingAPI {
177+
return _renderingApi;
178+
}
179+
165180
- (void)dealloc {
166181
/// Notify plugins of dealloc. This should happen first in dealloc since the
167182
/// plugins may be talking to things like the binaryMessenger.
@@ -520,13 +535,12 @@ - (BOOL)createShell:(NSString*)entrypoint
520535
threadHostType};
521536

522537
// Lambda captures by pointers to ObjC objects are fine here because the
523-
// create call is
524-
// synchronous.
538+
// create call is synchronous.
525539
flutter::Shell::CreateCallback<flutter::PlatformView> on_create_platform_view =
526-
[](flutter::Shell& shell) {
540+
[self](flutter::Shell& shell) {
541+
[self recreatePlatformViewController];
527542
return std::make_unique<flutter::PlatformViewIOS>(
528-
shell, flutter::GetRenderingAPIForProcess(FlutterView.forceSoftwareRendering),
529-
shell.GetTaskRunners());
543+
shell, self->_renderingApi, self->_surfaceFactory, shell.GetTaskRunners());
530544
};
531545

532546
flutter::Shell::CreateCallback<flutter::Rasterizer> on_create_rasterizer =
@@ -554,9 +568,6 @@ - (BOOL)createShell:(NSString*)entrypoint
554568
[self setupChannels];
555569
[self onLocaleUpdated:nil];
556570
[self initializeDisplays];
557-
if (!_platformViewsController) {
558-
_platformViewsController.reset(new flutter::FlutterPlatformViewsController());
559-
}
560571
_publisher.reset([[FlutterObservatoryPublisher alloc]
561572
initWithEnableObservatoryPublication:settings.enable_observatory_publication]);
562573
[self maybeSetupPlatformViewChannels];

shell/platform/darwin/ios/framework/Source/FlutterEnginePlatformViewTest.mm

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ - (void)testCallsNotifyLowMemory {
6767
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
6868
/*delegate=*/mock_delegate,
6969
/*rendering_api=*/flutter::IOSRenderingAPI::kSoftware,
70+
flutter::IOSSurfaceFactory::Create(flutter::IOSRenderingAPI::kSoftware),
7071
/*task_runners=*/runners);
7172

7273
id project = OCMClassMock([FlutterDartProject class]);

shell/platform/darwin/ios/framework/Source/FlutterEngineTest.mm

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
#import <OCMock/OCMock.h>
66
#import <XCTest/XCTest.h>
77

8+
#import "flutter/common/settings.h"
89
#import "flutter/shell/platform/darwin/common/framework/Headers/FlutterMacros.h"
910
#import "flutter/shell/platform/darwin/ios/framework/Source/FlutterBinaryMessengerRelay.h"
11+
#import "flutter/shell/platform/darwin/ios/framework/Source/FlutterDartProject_Internal.h"
1012
#import "flutter/shell/platform/darwin/ios/framework/Source/FlutterEngine_Test.h"
1113

1214
FLUTTER_ASSERT_ARC
@@ -113,4 +115,23 @@ - (void)testWaitForFirstFrameTimeout {
113115
[self waitForExpectationsWithTimeout:1 handler:nil];
114116
}
115117

118+
- (void)testPlatformViewsControllerRenderingMetalBackend {
119+
FlutterEngine* engine = [[FlutterEngine alloc] init];
120+
[engine run];
121+
flutter::IOSRenderingAPI renderingApi = [engine platformViewsRenderingAPI];
122+
123+
XCTAssertEqual(renderingApi, flutter::IOSRenderingAPI::kMetal);
124+
}
125+
126+
- (void)testPlatformViewsControllerRenderingSoftware {
127+
auto settings = FLTDefaultSettingsForBundle();
128+
settings.enable_software_rendering = true;
129+
FlutterDartProject* project = [[FlutterDartProject alloc] initWithSettings:settings];
130+
FlutterEngine* engine = [[FlutterEngine alloc] initWithName:@"foobar" project:project];
131+
[engine run];
132+
flutter::IOSRenderingAPI renderingApi = [engine platformViewsRenderingAPI];
133+
134+
XCTAssertEqual(renderingApi, flutter::IOSRenderingAPI::kSoftware);
135+
}
136+
116137
@end

shell/platform/darwin/ios/framework/Source/FlutterEngine_Test.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33
// found in the LICENSE file.
44

55
#import "flutter/shell/platform/darwin/ios/framework/Headers/FlutterEngine.h"
6+
#include "shell/platform/darwin/ios/rendering_api_selection.h"
67

78
@class FlutterBinaryMessengerRelay;
89

910
// Category to add test-only visibility.
1011
@interface FlutterEngine (Test) <FlutterBinaryMessenger>
1112
- (void)setBinaryMessenger:(FlutterBinaryMessengerRelay*)binaryMessenger;
1213
- (void)waitForFirstFrame:(NSTimeInterval)timeout callback:(void (^)(BOOL didTimeout))callback;
14+
- (flutter::IOSRenderingAPI)platformViewsRenderingAPI;
1315
@end

shell/platform/darwin/ios/framework/Source/FlutterOverlayView.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,6 @@
3535

3636
- (instancetype)init NS_DESIGNATED_INITIALIZER;
3737
- (instancetype)initWithContentsScale:(CGFloat)contentsScale;
38-
- (std::unique_ptr<flutter::IOSSurface>)createSurface:
39-
(std::shared_ptr<flutter::IOSContext>)ios_context;
4038

4139
@end
4240

shell/platform/darwin/ios/framework/Source/FlutterOverlayView.mm

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,6 @@ + (Class)layerClass {
6262
return [FlutterView layerClass];
6363
}
6464

65-
- (std::unique_ptr<flutter::IOSSurface>)createSurface:
66-
(std::shared_ptr<flutter::IOSContext>)ios_context {
67-
return flutter::IOSSurface::Create(std::move(ios_context), // context
68-
fml::scoped_nsobject<CALayer>{[self.layer retain]}, // layer
69-
nullptr // platform views controller
70-
);
71-
}
72-
7365
// TODO(amirh): implement drawLayer to support snapshotting.
7466

7567
@end

0 commit comments

Comments
 (0)