-
Notifications
You must be signed in to change notification settings - Fork 6k
[Multiwindow] Renderers receive view IDs as argument #36593
Changes from 16 commits
57971ec
067ed3e
ea49a51
ad4d87e
8c577ac
d716feb
fabcba0
5ded32f
42b179a
3de585e
a462ef5
593b0c5
187be45
5259d4d
f17ce1d
52acabf
8e7c29e
6b9ca1b
637c36d
6d87fa6
c4373ec
9272daa
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -406,7 +406,6 @@ - (void)loadAOTData:(NSString*)assetsDir { | |
| - (void)setViewController:(FlutterViewController*)controller { | ||
| if (_viewController != controller) { | ||
| _viewController = controller; | ||
| [_renderer setFlutterView:controller.flutterView]; | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Where is the view registered with the view provider?
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Any other places. The view provider is just a protocol/facade over other classes, and will have other methods to register views, which is not shown as a view provider. |
||
|
|
||
| if (_semanticsEnabled && _bridge) { | ||
| _bridge->UpdateDefaultViewController(_viewController); | ||
|
|
@@ -432,10 +431,14 @@ - (FlutterCompositor*)createFlutterCompositor { | |
| _macOSCompositor = std::make_unique<flutter::FlutterMetalCompositor>( | ||
| _viewProvider, _platformViewController, metalRenderer.device); | ||
| _macOSCompositor->SetPresentCallback([weakSelf](bool has_flutter_content) { | ||
| // TODO(dkwingsmt): The compositor only supports single-view for now. As | ||
| // more classes are gradually converted to multi-view, it should get the | ||
| // view ID from somewhere. | ||
| uint64_t viewId = 0; | ||
dkwingsmt marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| if (has_flutter_content) { | ||
| return [weakSelf.renderer present] == YES; | ||
| return [weakSelf.renderer present:viewId] == YES; | ||
| } else { | ||
| [weakSelf.renderer presentWithoutContent]; | ||
| [weakSelf.renderer presentWithoutContent:viewId]; | ||
| return true; | ||
| } | ||
| }); | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -7,20 +7,30 @@ | |
|
|
||
| #import "flutter/shell/platform/darwin/macos/framework/Source/FlutterEngine_Internal.h" | ||
| #import "flutter/shell/platform/darwin/macos/framework/Source/FlutterExternalTextureMetal.h" | ||
| #import "flutter/shell/platform/darwin/macos/framework/Source/FlutterView.h" | ||
| #import "flutter/shell/platform/darwin/macos/framework/Source/FlutterViewController_Internal.h" | ||
| #import "flutter/shell/platform/darwin/macos/framework/Source/FlutterViewEngineProvider.h" | ||
| #include "flutter/shell/platform/embedder/embedder.h" | ||
|
|
||
| #pragma mark - Static callbacks that require the engine. | ||
|
|
||
| static FlutterMetalTexture OnGetNextDrawable(FlutterEngine* engine, | ||
| const FlutterFrameInfo* frameInfo) { | ||
| static FlutterMetalTexture OnGetNextDrawableForDefaultView(FlutterEngine* engine, | ||
| const FlutterFrameInfo* frameInfo) { | ||
| // TODO(dkwingsmt): This callback only supports single-view, therefore it only | ||
| // operates on the default view. To support multi-view, we need a new callback | ||
| // that also receives a view ID, or pass the ID via FlutterFrameInfo. | ||
| uint64_t viewId = 0; | ||
| CGSize size = CGSizeMake(frameInfo->size.width, frameInfo->size.height); | ||
| FlutterMetalRenderer* metalRenderer = reinterpret_cast<FlutterMetalRenderer*>(engine.renderer); | ||
| return [metalRenderer createTextureForSize:size]; | ||
| return [metalRenderer createTextureForView:viewId size:size]; | ||
| } | ||
|
|
||
| static bool OnPresentDrawable(FlutterEngine* engine, const FlutterMetalTexture* texture) { | ||
| return [engine.renderer present]; | ||
| static bool OnPresentDrawableOfDefaultView(FlutterEngine* engine, | ||
| const FlutterMetalTexture* texture) { | ||
| // TODO(dkwingsmt): This callback only supports single-view, therefore it only | ||
| // operates on the default view. To support multi-view, we need a new callback | ||
| // that also receives a view ID. | ||
| uint64_t viewId = 0; | ||
| return [engine.renderer present:viewId]; | ||
| } | ||
|
|
||
| static bool OnAcquireExternalTexture(FlutterEngine* engine, | ||
|
|
@@ -35,14 +45,14 @@ static bool OnAcquireExternalTexture(FlutterEngine* engine, | |
| #pragma mark - FlutterMetalRenderer implementation | ||
|
|
||
| @implementation FlutterMetalRenderer { | ||
| FlutterView* _flutterView; | ||
|
|
||
| FlutterViewEngineProvider* _viewProvider; | ||
| FlutterDarwinContextMetalSkia* _darwinMetalContext; | ||
| } | ||
|
|
||
| - (instancetype)initWithFlutterEngine:(nonnull FlutterEngine*)flutterEngine { | ||
| self = [super initWithDelegate:self engine:flutterEngine]; | ||
| if (self) { | ||
| _viewProvider = [[FlutterViewEngineProvider alloc] initWithEngine:flutterEngine]; | ||
| _device = MTLCreateSystemDefaultDevice(); | ||
| if (!_device) { | ||
| NSLog(@"Could not acquire Metal device."); | ||
|
|
@@ -61,20 +71,16 @@ - (instancetype)initWithFlutterEngine:(nonnull FlutterEngine*)flutterEngine { | |
| return self; | ||
| } | ||
|
|
||
| - (void)setFlutterView:(FlutterView*)view { | ||
| _flutterView = view; | ||
| } | ||
|
|
||
| - (FlutterRendererConfig)createRendererConfig { | ||
| FlutterRendererConfig config = { | ||
| .type = FlutterRendererType::kMetal, | ||
| .metal.struct_size = sizeof(FlutterMetalRendererConfig), | ||
| .metal.device = (__bridge FlutterMetalDeviceHandle)_device, | ||
| .metal.present_command_queue = (__bridge FlutterMetalCommandQueueHandle)_commandQueue, | ||
| .metal.get_next_drawable_callback = | ||
| reinterpret_cast<FlutterMetalTextureCallback>(OnGetNextDrawable), | ||
| reinterpret_cast<FlutterMetalTextureCallback>(OnGetNextDrawableForDefaultView), | ||
| .metal.present_drawable_callback = | ||
| reinterpret_cast<FlutterMetalPresentCallback>(OnPresentDrawable), | ||
| reinterpret_cast<FlutterMetalPresentCallback>(OnPresentDrawableOfDefaultView), | ||
| .metal.external_texture_frame_callback = | ||
| reinterpret_cast<FlutterMetalTextureFrameCallback>(OnAcquireExternalTexture), | ||
| }; | ||
|
|
@@ -83,9 +89,15 @@ - (FlutterRendererConfig)createRendererConfig { | |
|
|
||
| #pragma mark - Embedder callback implementations. | ||
|
|
||
| - (FlutterMetalTexture)createTextureForSize:(CGSize)size { | ||
| - (FlutterMetalTexture)createTextureForView:(uint64_t)viewId size:(CGSize)size { | ||
| FlutterView* view = [_viewProvider getView:viewId]; | ||
| if (view == nil) { | ||
| FML_LOG(WARNING) << "Can't create texture on a non-existent view."; | ||
|
||
| // FlutterMetalTexture has texture `null`, therefore is discarded. | ||
| return FlutterMetalTexture{}; | ||
| } | ||
| FlutterMetalRenderBackingStore* backingStore = | ||
| (FlutterMetalRenderBackingStore*)[_flutterView backingStoreForSize:size]; | ||
| (FlutterMetalRenderBackingStore*)[view backingStoreForSize:size]; | ||
| id<MTLTexture> texture = backingStore.texture; | ||
| FlutterMetalTexture embedderTexture; | ||
| embedderTexture.struct_size = sizeof(FlutterMetalTexture); | ||
|
|
@@ -94,19 +106,21 @@ - (FlutterMetalTexture)createTextureForSize:(CGSize)size { | |
| return embedderTexture; | ||
| } | ||
|
|
||
| - (BOOL)present { | ||
| if (!_flutterView) { | ||
| - (BOOL)present:(uint64_t)viewId { | ||
| FlutterView* view = [_viewProvider getView:viewId]; | ||
| if (view == nil) { | ||
| return NO; | ||
| } | ||
| [_flutterView present]; | ||
| [view present]; | ||
| return YES; | ||
| } | ||
|
|
||
| - (void)presentWithoutContent { | ||
| if (!_flutterView) { | ||
| - (void)presentWithoutContent:(uint64_t)viewId { | ||
| FlutterView* view = [_viewProvider getView:viewId]; | ||
| if (view == nil) { | ||
| return; | ||
| } | ||
| [_flutterView presentWithoutContent]; | ||
| [view presentWithoutContent]; | ||
| } | ||
|
|
||
| #pragma mark - FlutterTextureRegistrar methods. | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.