diff --git a/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm b/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm index ed1874c529a93..d9ebd55f0d7ec 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm @@ -322,7 +322,6 @@ - (BOOL)runWithEntrypoint:(NSString*)entrypoint { [self sendUserLocales]; [self updateWindowMetrics]; [self updateDisplayConfig]; - self.viewController.flutterView.synchronousResizing = YES; return YES; } @@ -359,9 +358,6 @@ - (void)setViewController:(FlutterViewController*)controller { [self shutDownEngine]; _resourceContext = nil; } - if (_engine) { - self.viewController.flutterView.synchronousResizing = YES; - } } - (id)binaryMessenger { diff --git a/shell/platform/darwin/macos/framework/Source/FlutterResizeSynchronizer.mm b/shell/platform/darwin/macos/framework/Source/FlutterResizeSynchronizer.mm index 8f2eaac98cc40..84d560f4ea11e 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterResizeSynchronizer.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterResizeSynchronizer.mm @@ -17,6 +17,10 @@ @interface FlutterResizeSynchronizer () { // Used to block [requestCommit]. std::condition_variable _condBlockRequestCommit; + // Whether a frame was received; We don't block platform thread during resize + // until we know that framework is running and producing frames + BOOL _receivedFirstFrame; + // If NO, requestCommit calls are ignored until shouldEnsureSurfaceForSize is called with // proper size. BOOL _acceptingCommit; @@ -50,6 +54,12 @@ - (void)beginResize:(CGSize)size notify:(dispatch_block_t)notify { return; } + if (!_receivedFirstFrame) { + // No blocking until framework produces at least one frame + notify(); + return; + } + ++_cookie; // from now on, ignore all incoming commits until the block below gets @@ -79,6 +89,11 @@ - (void)beginResize:(CGSize)size notify:(dispatch_block_t)notify { - (BOOL)shouldEnsureSurfaceForSize:(CGSize)size { std::unique_lock lock(_mutex); + + if (!_receivedFirstFrame) { + return YES; + } + if (!_acceptingCommit) { if (CGSizeEqualToSize(_newSize, size)) { _acceptingCommit = YES; @@ -93,6 +108,8 @@ - (void)requestCommit { return; } + _receivedFirstFrame = YES; + _pendingCommit = YES; if (_waiting) { // BeginResize is in progress, interrupt it and schedule commit call _condBlockRequestCommit.notify_all(); diff --git a/shell/platform/darwin/macos/framework/Source/FlutterView.h b/shell/platform/darwin/macos/framework/Source/FlutterView.h index 4d5cd3780f10e..cd96f58a2291c 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterView.h +++ b/shell/platform/darwin/macos/framework/Source/FlutterView.h @@ -25,13 +25,6 @@ */ @property(readwrite, nonatomic, nonnull) NSOpenGLContext* openGLContext; -/** - * Controls whether view resizing synchronously updates contents. This can only be enabled - * after the engine is running and producing frames, because during synchronous view resizing the - * platform thread is blocked until engine produces frame with requested size. - */ -@property(readwrite, nonatomic) BOOL synchronousResizing; - - (nullable instancetype)initWithFrame:(NSRect)frame shareContext:(nonnull NSOpenGLContext*)shareContext reshapeListener:(nonnull id)reshapeListener diff --git a/shell/platform/darwin/macos/framework/Source/FlutterView.mm b/shell/platform/darwin/macos/framework/Source/FlutterView.mm index 4dcfcf0bd13b3..d6ce889f54e81 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterView.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterView.mm @@ -71,15 +71,11 @@ - (void)present { } - (void)reshaped { - if (self.synchronousResizing) { - CGSize scaledSize = [self convertSizeToBacking:self.bounds.size]; - [_resizeSynchronizer beginResize:scaledSize - notify:^{ - [_reshapeListener viewDidReshape:self]; - }]; - } else { - [_reshapeListener viewDidReshape:self]; - } + CGSize scaledSize = [self convertSizeToBacking:self.bounds.size]; + [_resizeSynchronizer beginResize:scaledSize + notify:^{ + [_reshapeListener viewDidReshape:self]; + }]; } #pragma mark - NSView overrides