From 57971ec9c273cb3e2512b0fb7d80211fcabbb44c Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 4 Oct 2022 10:10:47 -0700 Subject: [PATCH 01/15] Impl --- .../macos/framework/Source/FlutterEngine.mm | 6 +-- .../framework/Source/FlutterMetalRenderer.h | 4 +- .../framework/Source/FlutterMetalRenderer.mm | 36 +++++++--------- .../Source/FlutterMetalRendererTest.mm | 6 +-- .../framework/Source/FlutterOpenGLRenderer.h | 2 +- .../framework/Source/FlutterOpenGLRenderer.mm | 43 ++++++++++--------- .../Source/FlutterOpenGLRendererTest.mm | 6 +-- .../macos/framework/Source/FlutterRenderer.h | 11 ++--- 8 files changed, 52 insertions(+), 62 deletions(-) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm b/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm index 9c15b52f7d8ff..519b5b867ffdc 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm @@ -411,7 +411,6 @@ - (void)loadAOTData:(NSString*)assetsDir { - (void)setViewController:(FlutterViewController*)controller { if (_viewController != controller) { _viewController = controller; - [_renderer setFlutterView:controller.flutterView]; if (_semanticsEnabled && _bridge) { _bridge->UpdateDelegate( @@ -445,10 +444,11 @@ - (FlutterCompositor*)createFlutterCompositor { openGLRenderer.openGLContext); } _macOSCompositor->SetPresentCallback([weakSelf](bool has_flutter_content) { + FlutterView* view = weakSelf.viewController.flutterView; if (has_flutter_content) { - return [weakSelf.renderer present] == YES; + return [weakSelf.renderer present:view] == YES; } else { - [weakSelf.renderer presentWithoutContent]; + [weakSelf.renderer presentWithoutContent:view]; return true; } }); diff --git a/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.h b/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.h index 7d44311ed491b..44a3d132ca363 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.h +++ b/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.h @@ -25,9 +25,9 @@ @property(nonatomic, readonly, nonnull) id commandQueue; /** - * Creates a Metal texture for the given size. + * Creates a Metal texture for the given view with the given size. */ -- (FlutterMetalTexture)createTextureForSize:(CGSize)size; +- (FlutterMetalTexture)createTextureForView:(nonnull FlutterView*)view size:(CGSize)size; /** * Populates the texture registry with the provided metalTexture. diff --git a/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm b/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm index b7e0d0d65f281..8ab7a33fea3c6 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm @@ -14,13 +14,21 @@ static FlutterMetalTexture OnGetNextDrawable(FlutterEngine* engine, const FlutterFrameInfo* frameInfo) { + FlutterViewController* viewController = engine.viewController; + if (viewController == nil) { + return FlutterMetalTexture{}; // TODO + } CGSize size = CGSizeMake(frameInfo->size.width, frameInfo->size.height); FlutterMetalRenderer* metalRenderer = reinterpret_cast(engine.renderer); - return [metalRenderer createTextureForSize:size]; + return [metalRenderer createTextureForView:viewController.flutterView size:size]; } static bool OnPresentDrawable(FlutterEngine* engine, const FlutterMetalTexture* texture) { - return [engine.renderer present]; + FlutterViewController* viewController = engine.viewController; + if (viewController == nil) { + return false; + } + return [engine.renderer present:viewController.flutterView]; } static bool OnAcquireExternalTexture(FlutterEngine* engine, @@ -35,8 +43,6 @@ static bool OnAcquireExternalTexture(FlutterEngine* engine, #pragma mark - FlutterMetalRenderer implementation @implementation FlutterMetalRenderer { - FlutterView* _flutterView; - FlutterDarwinContextMetal* _darwinMetalContext; } @@ -61,10 +67,6 @@ - (instancetype)initWithFlutterEngine:(nonnull FlutterEngine*)flutterEngine { return self; } -- (void)setFlutterView:(FlutterView*)view { - _flutterView = view; -} - - (FlutterRendererConfig)createRendererConfig { FlutterRendererConfig config = { .type = FlutterRendererType::kMetal, @@ -83,9 +85,9 @@ - (FlutterRendererConfig)createRendererConfig { #pragma mark - Embedder callback implementations. -- (FlutterMetalTexture)createTextureForSize:(CGSize)size { +- (FlutterMetalTexture)createTextureForView:(FlutterView*)view size:(CGSize)size { FlutterMetalRenderBackingStore* backingStore = - (FlutterMetalRenderBackingStore*)[_flutterView backingStoreForSize:size]; + (FlutterMetalRenderBackingStore*)[view backingStoreForSize:size]; id texture = backingStore.texture; FlutterMetalTexture embedderTexture; embedderTexture.struct_size = sizeof(FlutterMetalTexture); @@ -94,19 +96,13 @@ - (FlutterMetalTexture)createTextureForSize:(CGSize)size { return embedderTexture; } -- (BOOL)present { - if (!_flutterView) { - return NO; - } - [_flutterView present]; +- (BOOL)present:(FlutterView*)view { + [view present]; return YES; } -- (void)presentWithoutContent { - if (!_flutterView) { - return; - } - [_flutterView presentWithoutContent]; +- (void)presentWithoutContent:(FlutterView*)view { + [view presentWithoutContent]; } #pragma mark - FlutterTextureRegistrar methods. diff --git a/shell/platform/darwin/macos/framework/Source/FlutterMetalRendererTest.mm b/shell/platform/darwin/macos/framework/Source/FlutterMetalRendererTest.mm index e045bf09c0d71..b1b84295a4992 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterMetalRendererTest.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterMetalRendererTest.mm @@ -31,8 +31,7 @@ FlutterMetalRenderer* renderer = [[FlutterMetalRenderer alloc] initWithFlutterEngine:engine]; id mockFlutterView = OCMClassMock([FlutterView class]); [(FlutterView*)[mockFlutterView expect] present]; - [renderer setFlutterView:mockFlutterView]; - [renderer present]; + [renderer present:mockFlutterView]; } TEST(FlutterMetalRenderer, TextureReturnedByFlutterView) { @@ -47,8 +46,7 @@ frameInfo.size = dimensions; CGSize size = CGSizeMake(dimensions.width, dimensions.height); [[mockFlutterView expect] backingStoreForSize:size]; - [renderer setFlutterView:mockFlutterView]; - [renderer createTextureForSize:size]; + [renderer createTextureForView:mockFlutterView size:size]; } } // namespace flutter::testing diff --git a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.h b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.h index 2d8bf08d90c08..95999adc41f25 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.h +++ b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.h @@ -37,7 +37,7 @@ /** * Called by the engine when framebuffer object ID is requested. */ -- (uint32_t)fboForFrameInfo:(nonnull const FlutterFrameInfo*)info; +- (uint32_t)fboForView:(nonnull FlutterView*)view frameInfo:(nonnull const FlutterFrameInfo*)info; /** * Makes the resource context the current context. diff --git a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm index 9c694480d8421..1c695e813eb90 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm @@ -20,12 +20,20 @@ static bool OnClearCurrent(FlutterEngine* engine) { } static bool OnPresent(FlutterEngine* engine) { - return [engine.renderer present]; + FlutterViewController* viewController = engine.viewController; + if (viewController == nil) { + return false; + } + return [engine.renderer present:viewController.flutterView]; } static uint32_t OnFBO(FlutterEngine* engine, const FlutterFrameInfo* info) { + FlutterViewController* viewController = engine.viewController; + if (viewController == nil) { + return -1; // TODO + } FlutterOpenGLRenderer* openGLRenderer = reinterpret_cast(engine.renderer); - return [openGLRenderer fboForFrameInfo:info]; + return [openGLRenderer fboForView:viewController.flutterView frameInfo:info]; } static bool OnMakeResourceCurrent(FlutterEngine* engine) { @@ -46,8 +54,6 @@ static bool OnAcquireExternalTexture(FlutterEngine* engine, #pragma mark - FlutterOpenGLRenderer implementation. @implementation FlutterOpenGLRenderer { - FlutterView* _flutterView; - // The context provided to the Flutter engine for rendering to the FlutterView. This is lazily // created during initialization of the FlutterView. This is used to render content into the // FlutterView. @@ -62,12 +68,12 @@ - (instancetype)initWithFlutterEngine:(FlutterEngine*)flutterEngine { return self; } -- (void)setFlutterView:(FlutterView*)view { - _flutterView = view; - if (!view) { - _resourceContext = nil; - } -} +// - (void)setFlutterView:(FlutterView*)view { +// _flutterView = view; +// if (!view) { +// _resourceContext = nil; +// } +// } - (BOOL)makeCurrent { if (!_openGLContext) { @@ -82,25 +88,22 @@ - (BOOL)clearCurrent { return true; } -- (BOOL)present { - if (!_openGLContext || !_flutterView) { +- (BOOL)present:(FlutterView*)view { + if (!_openGLContext) { return NO; } - [_flutterView present]; + [view present]; return YES; } -- (void)presentWithoutContent { - if (!_flutterView) { - return; - } - [_flutterView presentWithoutContent]; +- (void)presentWithoutContent:(FlutterView*)view { + [view presentWithoutContent]; } -- (uint32_t)fboForFrameInfo:(const FlutterFrameInfo*)info { +- (uint32_t)fboForView:(FlutterView*)view frameInfo:(const FlutterFrameInfo*)info { CGSize size = CGSizeMake(info->size.width, info->size.height); FlutterOpenGLRenderBackingStore* backingStore = - reinterpret_cast([_flutterView backingStoreForSize:size]); + reinterpret_cast([view backingStoreForSize:size]); return backingStore.frameBufferID; } diff --git a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRendererTest.mm b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRendererTest.mm index 808e32686dd6c..ee33b524d1cdb 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRendererTest.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRendererTest.mm @@ -114,9 +114,8 @@ - (nullable instancetype)initWithGLRenderer { FlutterOpenGLRenderer* renderer = [[FlutterOpenGLRenderer alloc] initWithFlutterEngine:engine]; id mockFlutterView = OCMClassMock([FlutterView class]); [(FlutterView*)[mockFlutterView expect] present]; - [renderer setFlutterView:mockFlutterView]; [renderer openGLContext]; - [renderer present]; + [renderer present:mockFlutterView]; } TEST(FlutterOpenGLRenderer, FBOReturnedByFlutterView) { @@ -131,9 +130,8 @@ - (nullable instancetype)initWithGLRenderer { frameInfo.size = dimensions; CGSize size = CGSizeMake(dimensions.width, dimensions.height); [[mockFlutterView expect] backingStoreForSize:size]; - [renderer setFlutterView:mockFlutterView]; [renderer openGLContext]; - [renderer fboForFrameInfo:&frameInfo]; + [renderer fboForView:mockFlutterView frameInfo:&frameInfo]; } } // namespace flutter::testing diff --git a/shell/platform/darwin/macos/framework/Source/FlutterRenderer.h b/shell/platform/darwin/macos/framework/Source/FlutterRenderer.h index 8f88964b38c60..8cf45aa2f24fb 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterRenderer.h +++ b/shell/platform/darwin/macos/framework/Source/FlutterRenderer.h @@ -19,24 +19,19 @@ */ - (nullable instancetype)initWithFlutterEngine:(nonnull FlutterEngine*)flutterEngine; -/** - * Sets the FlutterView to render to. - */ -- (void)setFlutterView:(nullable FlutterView*)view; - /** * Creates a FlutterRendererConfig that renders using the appropriate backend. */ - (FlutterRendererConfig)createRendererConfig; /** - * Called by the engine when the context's buffers should be swapped. + * Called by the engine when the given view's buffers should be swapped. */ -- (BOOL)present; +- (BOOL)present:(nonnull FlutterView*)view; /** * Tells the renderer that there is no Flutter content available for this frame. */ -- (void)presentWithoutContent; +- (void)presentWithoutContent:(nonnull FlutterView*)view; @end From 067ed3e99f0a221a8846bd3dd801f5b7ae0596b7 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 4 Oct 2022 10:11:09 -0700 Subject: [PATCH 02/15] Format --- .../darwin/macos/framework/Source/FlutterMetalRenderer.mm | 2 +- .../darwin/macos/framework/Source/FlutterOpenGLRenderer.mm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm b/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm index 8ab7a33fea3c6..8308783a4ebb0 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm @@ -16,7 +16,7 @@ static FlutterMetalTexture OnGetNextDrawable(FlutterEngine* engine, const FlutterFrameInfo* frameInfo) { FlutterViewController* viewController = engine.viewController; if (viewController == nil) { - return FlutterMetalTexture{}; // TODO + return FlutterMetalTexture{}; // TODO } CGSize size = CGSizeMake(frameInfo->size.width, frameInfo->size.height); FlutterMetalRenderer* metalRenderer = reinterpret_cast(engine.renderer); diff --git a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm index 1c695e813eb90..bb019b112a71a 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm @@ -30,7 +30,7 @@ static bool OnPresent(FlutterEngine* engine) { static uint32_t OnFBO(FlutterEngine* engine, const FlutterFrameInfo* info) { FlutterViewController* viewController = engine.viewController; if (viewController == nil) { - return -1; // TODO + return -1; // TODO } FlutterOpenGLRenderer* openGLRenderer = reinterpret_cast(engine.renderer); return [openGLRenderer fboForView:viewController.flutterView frameInfo:info]; From 8c577ac213590c0331900d3cf8605f3f60dfffda Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Thu, 3 Nov 2022 17:23:42 -0700 Subject: [PATCH 03/15] TODO comments --- .../darwin/macos/framework/Source/FlutterEngine.mm | 3 +++ .../macos/framework/Source/FlutterMetalRenderer.mm | 6 ++++++ .../macos/framework/Source/FlutterOpenGLRenderer.mm | 13 ++++++------- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm b/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm index 70a5f33667181..e931ac31f5d5d 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm @@ -448,6 +448,9 @@ - (FlutterCompositor*)createFlutterCompositor { std::make_unique(_viewProvider, openGLRenderer.openGLContext); } _macOSCompositor->SetPresentCallback([weakSelf](bool has_flutter_content) { + // TODO(dkwingsmt): The renderer and the engine only support single-view for + // now. As more classes are gradually converted to multi-view, it should get + // the view ID from somewhere, and accordingly pick the correct view. FlutterView* view = weakSelf.viewController.flutterView; if (has_flutter_content) { return [weakSelf.renderer present:view] == YES; diff --git a/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm b/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm index c74ffa734c215..430a1ad8a32d8 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm @@ -14,6 +14,9 @@ static FlutterMetalTexture OnGetNextDrawable(FlutterEngine* engine, const FlutterFrameInfo* frameInfo) { + // TODO(dkwingsmt): The renderer only supports single-view for now. As more + // classes are gradually converted to multi-view, it should get the view ID + // from somewhere, and accordingly pick the correct view from the engine. FlutterViewController* viewController = engine.viewController; if (viewController == nil) { return FlutterMetalTexture{}; // TODO @@ -24,6 +27,9 @@ static FlutterMetalTexture OnGetNextDrawable(FlutterEngine* engine, } static bool OnPresentDrawable(FlutterEngine* engine, const FlutterMetalTexture* texture) { + // TODO(dkwingsmt): The renderer only supports single-view for now. As more + // classes are gradually converted to multi-view, it should get the view ID + // from somewhere, and accordingly pick the correct view from the engine. FlutterViewController* viewController = engine.viewController; if (viewController == nil) { return false; diff --git a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm index bb019b112a71a..5add88ca062e2 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm @@ -20,6 +20,9 @@ static bool OnClearCurrent(FlutterEngine* engine) { } static bool OnPresent(FlutterEngine* engine) { + // TODO(dkwingsmt): The renderer only supports single-view for now. As more + // classes are gradually converted to multi-view, it should get the view ID + // from somewhere, and accordingly pick the correct view from the engine. FlutterViewController* viewController = engine.viewController; if (viewController == nil) { return false; @@ -28,6 +31,9 @@ static bool OnPresent(FlutterEngine* engine) { } static uint32_t OnFBO(FlutterEngine* engine, const FlutterFrameInfo* info) { + // TODO(dkwingsmt): The renderer only supports single-view for now. As more + // classes are gradually converted to multi-view, it should get the view ID + // from somewhere, and accordingly pick the correct view from the engine. FlutterViewController* viewController = engine.viewController; if (viewController == nil) { return -1; // TODO @@ -68,13 +74,6 @@ - (instancetype)initWithFlutterEngine:(FlutterEngine*)flutterEngine { return self; } -// - (void)setFlutterView:(FlutterView*)view { -// _flutterView = view; -// if (!view) { -// _resourceContext = nil; -// } -// } - - (BOOL)makeCurrent { if (!_openGLContext) { return false; From fabcba0aef18adc0868e1db580a3deadd6dd8463 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 7 Nov 2022 11:57:47 -0800 Subject: [PATCH 04/15] Fix compile --- .../darwin/macos/framework/Source/FlutterMetalRenderer.mm | 4 ++-- .../darwin/macos/framework/Source/FlutterOpenGLRenderer.mm | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm b/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm index 430a1ad8a32d8..e081dcdaf7919 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm @@ -7,7 +7,7 @@ #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" #include "flutter/shell/platform/embedder/embedder.h" #pragma mark - Static callbacks that require the engine. @@ -49,7 +49,7 @@ static bool OnAcquireExternalTexture(FlutterEngine* engine, #pragma mark - FlutterMetalRenderer implementation @implementation FlutterMetalRenderer { - FlutterDarwinContextMetal* _darwinMetalContext; + FlutterDarwinContextMetalSkia* _darwinMetalContext; } - (instancetype)initWithFlutterEngine:(nonnull FlutterEngine*)flutterEngine { diff --git a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm index 5add88ca062e2..5c018893c4f9b 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm @@ -6,6 +6,7 @@ #import "flutter/shell/platform/darwin/macos/framework/Source/FlutterEngine_Internal.h" #import "flutter/shell/platform/darwin/macos/framework/Source/FlutterExternalTextureGL.h" +#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterViewController_Internal.h" #pragma mark - Static methods for openGL callbacks that require the engine. From 5ded32fc5f257f293da6411238944542fc853a87 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 7 Nov 2022 13:31:45 -0800 Subject: [PATCH 05/15] Better empty indication --- shell/gpu/gpu_surface_gl_delegate.h | 2 ++ shell/gpu/gpu_surface_gl_skia.cc | 4 ++++ .../darwin/macos/framework/Source/FlutterMetalRenderer.mm | 4 +++- .../darwin/macos/framework/Source/FlutterOpenGLRenderer.mm | 4 +++- shell/platform/embedder/embedder.h | 2 ++ 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/shell/gpu/gpu_surface_gl_delegate.h b/shell/gpu/gpu_surface_gl_delegate.h index f097cba2d0266..168270646c87f 100644 --- a/shell/gpu/gpu_surface_gl_delegate.h +++ b/shell/gpu/gpu_surface_gl_delegate.h @@ -26,6 +26,8 @@ struct GLFrameInfo { // the rendering backend after requesting a frame buffer object. struct GLFBOInfo { // The frame buffer's ID. + // + // This ID must not be 0, or this frame buffer is considered invalid. uint32_t fbo_id; // This boolean flags whether the returned FBO supports partial repaint. const bool partial_repaint_enabled; diff --git a/shell/gpu/gpu_surface_gl_skia.cc b/shell/gpu/gpu_surface_gl_skia.cc index 01be975ee831a..fd84f538f4c5e 100644 --- a/shell/gpu/gpu_surface_gl_skia.cc +++ b/shell/gpu/gpu_surface_gl_skia.cc @@ -182,6 +182,10 @@ bool GPUSurfaceGLSkia::CreateOrUpdateSurfaces(const SkISize& size) { GLFrameInfo frame_info = {static_cast(size.width()), static_cast(size.height())}; const GLFBOInfo fbo_info = delegate_->GLContextFBO(frame_info); + if (fbo_info.fbo_id == 0) { + FML_LOG(ERROR) << "Invalid FBO returned."; + return false; + } onscreen_surface = WrapOnscreenSurface(context_.get(), // GL context size, // root surface size fbo_info.fbo_id // window FBO ID diff --git a/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm b/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm index e081dcdaf7919..96739d2a2851a 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm @@ -19,7 +19,9 @@ static FlutterMetalTexture OnGetNextDrawable(FlutterEngine* engine, // from somewhere, and accordingly pick the correct view from the engine. FlutterViewController* viewController = engine.viewController; if (viewController == nil) { - return FlutterMetalTexture{}; // TODO + FML_LOG(WARNING) << "Can't create drawables on a null view controller."; + // FlutterMetalTexture has texture `null`, therefore is discarded. + return FlutterMetalTexture{}; } CGSize size = CGSizeMake(frameInfo->size.width, frameInfo->size.height); FlutterMetalRenderer* metalRenderer = reinterpret_cast(engine.renderer); diff --git a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm index 5c018893c4f9b..9241b0bdf8cdf 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm @@ -37,7 +37,9 @@ static uint32_t OnFBO(FlutterEngine* engine, const FlutterFrameInfo* info) { // from somewhere, and accordingly pick the correct view from the engine. FlutterViewController* viewController = engine.viewController; if (viewController == nil) { - return -1; // TODO + FML_LOG(WARNING) << "Can't create frame buffers on a null view controller."; + // The FBO has ID 0, therefore is discarded. + return 0; } FlutterOpenGLRenderer* openGLRenderer = reinterpret_cast(engine.renderer); return [openGLRenderer fboForView:viewController.flutterView frameInfo:info]; diff --git a/shell/platform/embedder/embedder.h b/shell/platform/embedder/embedder.h index c9e7bc27bb5a5..588a3e61ed35b 100644 --- a/shell/platform/embedder/embedder.h +++ b/shell/platform/embedder/embedder.h @@ -633,6 +633,8 @@ typedef struct { int64_t texture_id; /// Handle to the MTLTexture that is owned by the embedder. Engine will render /// the frame into this texture. + /// + /// The `texture` must not be null, or this texture is considered invalid. FlutterMetalTextureHandle texture; /// A baton that is not interpreted by the engine in any way. It will be given /// back to the embedder in the destruction callback below. Embedder resources From 42b179a638301421b00efbad040ac023bacae2ee Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 7 Nov 2022 14:52:24 -0800 Subject: [PATCH 06/15] Change invalid ID to -1 --- shell/gpu/gpu_surface_gl_skia.cc | 6 +++++- .../darwin/macos/framework/Source/FlutterOpenGLRenderer.mm | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/shell/gpu/gpu_surface_gl_skia.cc b/shell/gpu/gpu_surface_gl_skia.cc index fd84f538f4c5e..eaea2035e46b2 100644 --- a/shell/gpu/gpu_surface_gl_skia.cc +++ b/shell/gpu/gpu_surface_gl_skia.cc @@ -182,7 +182,7 @@ bool GPUSurfaceGLSkia::CreateOrUpdateSurfaces(const SkISize& size) { GLFrameInfo frame_info = {static_cast(size.width()), static_cast(size.height())}; const GLFBOInfo fbo_info = delegate_->GLContextFBO(frame_info); - if (fbo_info.fbo_id == 0) { + if (fbo_info.fbo_id == -1) { FML_LOG(ERROR) << "Invalid FBO returned."; return false; } @@ -295,6 +295,10 @@ bool GPUSurfaceGLSkia::PresentSurface(const SurfaceFrame& frame, // The FBO has changed, ask the delegate for the new FBO and do a surface // re-wrap. const GLFBOInfo fbo_info = delegate_->GLContextFBO(frame_info); + if (fbo_info.fbo_id == -1) { + FML_LOG(ERROR) << "Invalid FBO returned."; + return false; + } auto new_onscreen_surface = WrapOnscreenSurface(context_.get(), // GL context current_size, // root surface size diff --git a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm index 9241b0bdf8cdf..805f20bdc93e4 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm @@ -38,8 +38,8 @@ static uint32_t OnFBO(FlutterEngine* engine, const FlutterFrameInfo* info) { FlutterViewController* viewController = engine.viewController; if (viewController == nil) { FML_LOG(WARNING) << "Can't create frame buffers on a null view controller."; - // The FBO has ID 0, therefore is discarded. - return 0; + // The FBO has ID -1, therefore is discarded. + return -1; } FlutterOpenGLRenderer* openGLRenderer = reinterpret_cast(engine.renderer); return [openGLRenderer fboForView:viewController.flutterView frameInfo:info]; From 3de585e730990e45e114b7f148cc1e93b86def58 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 7 Nov 2022 14:56:01 -0800 Subject: [PATCH 07/15] fix doc --- shell/gpu/gpu_surface_gl_delegate.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/gpu/gpu_surface_gl_delegate.h b/shell/gpu/gpu_surface_gl_delegate.h index 168270646c87f..de88619065e85 100644 --- a/shell/gpu/gpu_surface_gl_delegate.h +++ b/shell/gpu/gpu_surface_gl_delegate.h @@ -27,7 +27,7 @@ struct GLFrameInfo { struct GLFBOInfo { // The frame buffer's ID. // - // This ID must not be 0, or this frame buffer is considered invalid. + // This ID must not be -1, or this frame buffer is considered invalid. uint32_t fbo_id; // This boolean flags whether the returned FBO supports partial repaint. const bool partial_repaint_enabled; From a462ef5111cfe08e6e5fa9e57436caf30368a1e7 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 7 Nov 2022 18:09:25 -0800 Subject: [PATCH 08/15] Change to default view --- shell/gpu/gpu_surface_gl_skia.cc | 8 ---- .../framework/Source/FlutterMetalRenderer.h | 5 +++ .../framework/Source/FlutterMetalRenderer.mm | 37 ++++++++-------- .../framework/Source/FlutterOpenGLRenderer.h | 5 +++ .../framework/Source/FlutterOpenGLRenderer.mm | 43 ++++++++++--------- .../macos/framework/Source/FlutterRenderer.h | 5 --- 6 files changed, 51 insertions(+), 52 deletions(-) diff --git a/shell/gpu/gpu_surface_gl_skia.cc b/shell/gpu/gpu_surface_gl_skia.cc index eaea2035e46b2..01be975ee831a 100644 --- a/shell/gpu/gpu_surface_gl_skia.cc +++ b/shell/gpu/gpu_surface_gl_skia.cc @@ -182,10 +182,6 @@ bool GPUSurfaceGLSkia::CreateOrUpdateSurfaces(const SkISize& size) { GLFrameInfo frame_info = {static_cast(size.width()), static_cast(size.height())}; const GLFBOInfo fbo_info = delegate_->GLContextFBO(frame_info); - if (fbo_info.fbo_id == -1) { - FML_LOG(ERROR) << "Invalid FBO returned."; - return false; - } onscreen_surface = WrapOnscreenSurface(context_.get(), // GL context size, // root surface size fbo_info.fbo_id // window FBO ID @@ -295,10 +291,6 @@ bool GPUSurfaceGLSkia::PresentSurface(const SurfaceFrame& frame, // The FBO has changed, ask the delegate for the new FBO and do a surface // re-wrap. const GLFBOInfo fbo_info = delegate_->GLContextFBO(frame_info); - if (fbo_info.fbo_id == -1) { - FML_LOG(ERROR) << "Invalid FBO returned."; - return false; - } auto new_onscreen_surface = WrapOnscreenSurface(context_.get(), // GL context current_size, // root surface size diff --git a/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.h b/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.h index 44a3d132ca363..66c44ae0f1dc9 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.h +++ b/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.h @@ -14,6 +14,11 @@ */ @interface FlutterMetalRenderer : FlutterTextureRegistrar +/** + * Intializes the renderer with the given FlutterEngine. + */ +- (nullable instancetype)initWithFlutterEngine:(nonnull FlutterEngine*)flutterEngine; + /** * Interface to the system GPU. Used to issue all the rendering commands. */ diff --git a/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm b/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm index 96739d2a2851a..e6991822a91ba 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm @@ -12,31 +12,32 @@ #pragma mark - Static callbacks that require the engine. -static FlutterMetalTexture OnGetNextDrawable(FlutterEngine* engine, - const FlutterFrameInfo* frameInfo) { - // TODO(dkwingsmt): The renderer only supports single-view for now. As more - // classes are gradually converted to multi-view, it should get the view ID - // from somewhere, and accordingly pick the correct view from the engine. - FlutterViewController* viewController = engine.viewController; - if (viewController == nil) { - FML_LOG(WARNING) << "Can't create drawables on a null view controller."; +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. + FlutterView* view = engine.viewController.flutterView; + if (view == nil) { + FML_LOG(WARNING) << "Can't create drawables on a non-existent view."; // FlutterMetalTexture has texture `null`, therefore is discarded. return FlutterMetalTexture{}; } CGSize size = CGSizeMake(frameInfo->size.width, frameInfo->size.height); FlutterMetalRenderer* metalRenderer = reinterpret_cast(engine.renderer); - return [metalRenderer createTextureForView:viewController.flutterView size:size]; + return [metalRenderer createTextureForView:view size:size]; } -static bool OnPresentDrawable(FlutterEngine* engine, const FlutterMetalTexture* texture) { - // TODO(dkwingsmt): The renderer only supports single-view for now. As more - // classes are gradually converted to multi-view, it should get the view ID - // from somewhere, and accordingly pick the correct view from the engine. - FlutterViewController* viewController = engine.viewController; - if (viewController == nil) { +static bool OnPresentDrawableToDefaultView(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. + FlutterView* view = engine.viewController.flutterView; + if (view == nil) { return false; } - return [engine.renderer present:viewController.flutterView]; + return [engine.renderer present:view]; } static bool OnAcquireExternalTexture(FlutterEngine* engine, @@ -82,9 +83,9 @@ - (FlutterRendererConfig)createRendererConfig { .metal.device = (__bridge FlutterMetalDeviceHandle)_device, .metal.present_command_queue = (__bridge FlutterMetalCommandQueueHandle)_commandQueue, .metal.get_next_drawable_callback = - reinterpret_cast(OnGetNextDrawable), + reinterpret_cast(OnGetNextDrawableForDefaultView), .metal.present_drawable_callback = - reinterpret_cast(OnPresentDrawable), + reinterpret_cast(OnPresentDrawableToDefaultView), .metal.external_texture_frame_callback = reinterpret_cast(OnAcquireExternalTexture), }; diff --git a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.h b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.h index 95999adc41f25..aef26cfbca076 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.h +++ b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.h @@ -13,6 +13,11 @@ */ @interface FlutterOpenGLRenderer : FlutterTextureRegistrar +/** + * Intializes the renderer with the given FlutterEngine. + */ +- (nullable instancetype)initWithFlutterEngine:(nonnull FlutterEngine*)flutterEngine; + /** * The resource context used by the engine for texture uploads. FlutterViews associated with this * engine should be created to share with this context. diff --git a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm index 805f20bdc93e4..5c4bbb7e37f58 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm @@ -20,29 +20,29 @@ static bool OnClearCurrent(FlutterEngine* engine) { return [openGLRenderer clearCurrent]; } -static bool OnPresent(FlutterEngine* engine) { - // TODO(dkwingsmt): The renderer only supports single-view for now. As more - // classes are gradually converted to multi-view, it should get the view ID - // from somewhere, and accordingly pick the correct view from the engine. - FlutterViewController* viewController = engine.viewController; - if (viewController == nil) { +static bool OnPresentToDefaultView(FlutterEngine* engine) { + // 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. + FlutterView* view = engine.viewController.flutterView; + if (view == nil) { return false; } - return [engine.renderer present:viewController.flutterView]; -} - -static uint32_t OnFBO(FlutterEngine* engine, const FlutterFrameInfo* info) { - // TODO(dkwingsmt): The renderer only supports single-view for now. As more - // classes are gradually converted to multi-view, it should get the view ID - // from somewhere, and accordingly pick the correct view from the engine. - FlutterViewController* viewController = engine.viewController; - if (viewController == nil) { - FML_LOG(WARNING) << "Can't create frame buffers on a null view controller."; - // The FBO has ID -1, therefore is discarded. - return -1; + return [engine.renderer present:view]; +} + +static uint32_t OnFBOForDefaultView(FlutterEngine* engine, const FlutterFrameInfo* info) { + // 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. + FlutterView* view = engine.viewController.flutterView; + if (view == nil) { + // This callback does not have a proper way to report error, since we + // haven't defined an "invalid" FBO ID. + FML_LOG(WARNING) << "Can't create frame buffers on a non-existent view."; } FlutterOpenGLRenderer* openGLRenderer = reinterpret_cast(engine.renderer); - return [openGLRenderer fboForView:viewController.flutterView frameInfo:info]; + return [openGLRenderer fboForView:view frameInfo:info]; } static bool OnMakeResourceCurrent(FlutterEngine* engine) { @@ -153,8 +153,9 @@ - (FlutterRendererConfig)createRendererConfig { .open_gl.struct_size = sizeof(FlutterOpenGLRendererConfig), .open_gl.make_current = reinterpret_cast(OnMakeCurrent), .open_gl.clear_current = reinterpret_cast(OnClearCurrent), - .open_gl.present = reinterpret_cast(OnPresent), - .open_gl.fbo_with_frame_info_callback = reinterpret_cast(OnFBO), + .open_gl.present = reinterpret_cast(OnPresentToDefaultView), + .open_gl.fbo_with_frame_info_callback = + reinterpret_cast(OnFBOForDefaultView), .open_gl.fbo_reset_after_present = true, .open_gl.make_resource_current = reinterpret_cast(OnMakeResourceCurrent), .open_gl.gl_external_texture_frame_callback = diff --git a/shell/platform/darwin/macos/framework/Source/FlutterRenderer.h b/shell/platform/darwin/macos/framework/Source/FlutterRenderer.h index 8cf45aa2f24fb..32e84da2f4d9d 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterRenderer.h +++ b/shell/platform/darwin/macos/framework/Source/FlutterRenderer.h @@ -14,11 +14,6 @@ */ @protocol FlutterRenderer -/** - * Intializes the renderer with the given FlutterEngine. - */ -- (nullable instancetype)initWithFlutterEngine:(nonnull FlutterEngine*)flutterEngine; - /** * Creates a FlutterRendererConfig that renders using the appropriate backend. */ From 593b0c5f6efeaf63ddab7447fea5c8bd2bcf2c8f Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 7 Nov 2022 18:34:57 -0800 Subject: [PATCH 09/15] Better doc --- shell/gpu/gpu_surface_gl_delegate.h | 2 -- .../platform/darwin/macos/framework/Headers/FlutterEngine.h | 5 ++++- .../darwin/macos/framework/Source/FlutterMetalRenderer.h | 5 ----- .../darwin/macos/framework/Source/FlutterOpenGLRenderer.h | 5 ----- .../darwin/macos/framework/Source/FlutterOpenGLRenderer.mm | 4 ++-- .../platform/darwin/macos/framework/Source/FlutterRenderer.h | 5 +++++ 6 files changed, 11 insertions(+), 15 deletions(-) diff --git a/shell/gpu/gpu_surface_gl_delegate.h b/shell/gpu/gpu_surface_gl_delegate.h index de88619065e85..f097cba2d0266 100644 --- a/shell/gpu/gpu_surface_gl_delegate.h +++ b/shell/gpu/gpu_surface_gl_delegate.h @@ -26,8 +26,6 @@ struct GLFrameInfo { // the rendering backend after requesting a frame buffer object. struct GLFBOInfo { // The frame buffer's ID. - // - // This ID must not be -1, or this frame buffer is considered invalid. uint32_t fbo_id; // This boolean flags whether the returned FBO supports partial repaint. const bool partial_repaint_enabled; diff --git a/shell/platform/darwin/macos/framework/Headers/FlutterEngine.h b/shell/platform/darwin/macos/framework/Headers/FlutterEngine.h index 12ead38f104f4..20ec48be51e19 100644 --- a/shell/platform/darwin/macos/framework/Headers/FlutterEngine.h +++ b/shell/platform/darwin/macos/framework/Headers/FlutterEngine.h @@ -63,7 +63,10 @@ FLUTTER_DARWIN_EXPORT - (BOOL)runWithEntrypoint:(nullable NSString*)entrypoint; /** - * The `FlutterViewController` associated with this engine, if any. + * The default `FlutterViewController` associated with this engine, if any. + * + * The default view always has ID 0, and is the view operated by the APIs that + * do not have a view ID specified. */ @property(nonatomic, nullable, weak) FlutterViewController* viewController; diff --git a/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.h b/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.h index 66c44ae0f1dc9..44a3d132ca363 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.h +++ b/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.h @@ -14,11 +14,6 @@ */ @interface FlutterMetalRenderer : FlutterTextureRegistrar -/** - * Intializes the renderer with the given FlutterEngine. - */ -- (nullable instancetype)initWithFlutterEngine:(nonnull FlutterEngine*)flutterEngine; - /** * Interface to the system GPU. Used to issue all the rendering commands. */ diff --git a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.h b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.h index aef26cfbca076..95999adc41f25 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.h +++ b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.h @@ -13,11 +13,6 @@ */ @interface FlutterOpenGLRenderer : FlutterTextureRegistrar -/** - * Intializes the renderer with the given FlutterEngine. - */ -- (nullable instancetype)initWithFlutterEngine:(nonnull FlutterEngine*)flutterEngine; - /** * The resource context used by the engine for texture uploads. FlutterViews associated with this * engine should be created to share with this context. diff --git a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm index 5c4bbb7e37f58..a6f9a0cacc18d 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm @@ -37,8 +37,8 @@ static uint32_t OnFBOForDefaultView(FlutterEngine* engine, const FlutterFrameInf // that also receives a view ID, or pass the ID via FlutterFrameInfo. FlutterView* view = engine.viewController.flutterView; if (view == nil) { - // This callback does not have a proper way to report error, since we - // haven't defined an "invalid" FBO ID. + // This callback does not have a proper way to report error, since there's + // no way to label the returned integer as invalid. FML_LOG(WARNING) << "Can't create frame buffers on a non-existent view."; } FlutterOpenGLRenderer* openGLRenderer = reinterpret_cast(engine.renderer); diff --git a/shell/platform/darwin/macos/framework/Source/FlutterRenderer.h b/shell/platform/darwin/macos/framework/Source/FlutterRenderer.h index 32e84da2f4d9d..8cf45aa2f24fb 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterRenderer.h +++ b/shell/platform/darwin/macos/framework/Source/FlutterRenderer.h @@ -14,6 +14,11 @@ */ @protocol FlutterRenderer +/** + * Intializes the renderer with the given FlutterEngine. + */ +- (nullable instancetype)initWithFlutterEngine:(nonnull FlutterEngine*)flutterEngine; + /** * Creates a FlutterRendererConfig that renders using the appropriate backend. */ From 187be453cd2bb456dbde33d266bf3a760ce5ea19 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 8 Nov 2022 10:03:26 -0800 Subject: [PATCH 10/15] Update doc of FlutterFrameInfo --- shell/platform/embedder/embedder.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/shell/platform/embedder/embedder.h b/shell/platform/embedder/embedder.h index 588a3e61ed35b..a5e032c7f2ed6 100644 --- a/shell/platform/embedder/embedder.h +++ b/shell/platform/embedder/embedder.h @@ -448,7 +448,9 @@ typedef struct { /// This information is passed to the embedder when requesting a frame buffer /// object. /// -/// See: \ref FlutterOpenGLRendererConfig.fbo_with_frame_info_callback. +/// See: \ref FlutterOpenGLRendererConfig.fbo_with_frame_info_callback, +/// \ref FlutterMetalRendererConfig.get_next_drawable_callback, +/// and \ref FlutterVulkanRendererConfig.get_next_image_callback. typedef struct { /// The size of this struct. Must be sizeof(FlutterFrameInfo). size_t struct_size; From f17ce1dffeee4fa4d287fa0d045675d13735c54e Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 8 Nov 2022 12:33:19 -0800 Subject: [PATCH 11/15] Change to ID --- .../macos/framework/Source/FlutterEngine.mm | 12 +++--- .../framework/Source/FlutterMetalRenderer.h | 2 +- .../framework/Source/FlutterMetalRenderer.mm | 43 +++++++++++-------- .../Source/FlutterMetalRendererTest.mm | 14 +++++- .../framework/Source/FlutterOpenGLRenderer.h | 2 +- .../framework/Source/FlutterOpenGLRenderer.mm | 41 +++++++++++------- .../Source/FlutterOpenGLRendererTest.mm | 17 +++++++- .../macos/framework/Source/FlutterRenderer.h | 4 +- 8 files changed, 88 insertions(+), 47 deletions(-) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm b/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm index 160d6484428c0..5758f38a1eefa 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm @@ -446,14 +446,14 @@ - (FlutterCompositor*)createFlutterCompositor { std::make_unique(_viewProvider, openGLRenderer.openGLContext); } _macOSCompositor->SetPresentCallback([weakSelf](bool has_flutter_content) { - // TODO(dkwingsmt): The renderer and the engine only support single-view for - // now. As more classes are gradually converted to multi-view, it should get - // the view ID from somewhere, and accordingly pick the correct view. - FlutterView* view = weakSelf.viewController.flutterView; + // 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; if (has_flutter_content) { - return [weakSelf.renderer present:view] == YES; + return [weakSelf.renderer present:viewId] == YES; } else { - [weakSelf.renderer presentWithoutContent:view]; + [weakSelf.renderer presentWithoutContent:viewId]; return true; } }); diff --git a/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.h b/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.h index 44a3d132ca363..1768ba7cce8f5 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.h +++ b/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.h @@ -27,7 +27,7 @@ /** * Creates a Metal texture for the given view with the given size. */ -- (FlutterMetalTexture)createTextureForView:(nonnull FlutterView*)view size:(CGSize)size; +- (FlutterMetalTexture)createTextureForView:(uint64_t)viewId size:(CGSize)size; /** * Populates the texture registry with the provided metalTexture. diff --git a/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm b/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm index e6991822a91ba..42ddb24822c32 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm @@ -8,6 +8,7 @@ #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/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. @@ -17,27 +18,19 @@ static FlutterMetalTexture OnGetNextDrawableForDefaultView(FlutterEngine* engine // 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. - FlutterView* view = engine.viewController.flutterView; - if (view == nil) { - FML_LOG(WARNING) << "Can't create drawables on a non-existent view."; - // FlutterMetalTexture has texture `null`, therefore is discarded. - return FlutterMetalTexture{}; - } + uint64_t viewId = 0; CGSize size = CGSizeMake(frameInfo->size.width, frameInfo->size.height); FlutterMetalRenderer* metalRenderer = reinterpret_cast(engine.renderer); - return [metalRenderer createTextureForView:view size:size]; + return [metalRenderer createTextureForView:viewId size:size]; } -static bool OnPresentDrawableToDefaultView(FlutterEngine* engine, +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. - FlutterView* view = engine.viewController.flutterView; - if (view == nil) { - return false; - } - return [engine.renderer present:view]; + uint64_t viewId = 0; + return [engine.renderer present:viewId]; } static bool OnAcquireExternalTexture(FlutterEngine* engine, @@ -52,12 +45,14 @@ static bool OnAcquireExternalTexture(FlutterEngine* engine, #pragma mark - FlutterMetalRenderer implementation @implementation FlutterMetalRenderer { + 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."); @@ -85,7 +80,7 @@ - (FlutterRendererConfig)createRendererConfig { .metal.get_next_drawable_callback = reinterpret_cast(OnGetNextDrawableForDefaultView), .metal.present_drawable_callback = - reinterpret_cast(OnPresentDrawableToDefaultView), + reinterpret_cast(OnPresentDrawableOfDefaultView), .metal.external_texture_frame_callback = reinterpret_cast(OnAcquireExternalTexture), }; @@ -94,7 +89,13 @@ - (FlutterRendererConfig)createRendererConfig { #pragma mark - Embedder callback implementations. -- (FlutterMetalTexture)createTextureForView:(FlutterView*)view size:(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*)[view backingStoreForSize:size]; id texture = backingStore.texture; @@ -105,12 +106,20 @@ - (FlutterMetalTexture)createTextureForView:(FlutterView*)view size:(CGSize)size return embedderTexture; } -- (BOOL)present:(FlutterView*)view { +- (BOOL)present:(uint64_t)viewId { + FlutterView* view = [_viewProvider getView:viewId]; + if (view == nil) { + return NO; + } [view present]; return YES; } -- (void)presentWithoutContent:(FlutterView*)view { +- (void)presentWithoutContent:(uint64_t)viewId { + FlutterView* view = [_viewProvider getView:viewId]; + if (view == nil) { + return; + } [view presentWithoutContent]; } diff --git a/shell/platform/darwin/macos/framework/Source/FlutterMetalRendererTest.mm b/shell/platform/darwin/macos/framework/Source/FlutterMetalRendererTest.mm index b1b84295a4992..ece1339a5c22e 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterMetalRendererTest.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterMetalRendererTest.mm @@ -9,6 +9,7 @@ #import "flutter/shell/platform/darwin/macos/framework/Source/FlutterEngine_Internal.h" #import "flutter/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.h" #import "flutter/shell/platform/darwin/macos/framework/Source/FlutterView.h" +#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterViewController_Internal.h" #include "flutter/shell/platform/embedder/embedder.h" #include "flutter/shell/platform/embedder/test_utils/proc_table_replacement.h" #include "flutter/testing/testing.h" @@ -24,20 +25,29 @@ ICUDataPath:[fixtures stringByAppendingString:@"/icudtl.dat"]]; return [[FlutterEngine alloc] initWithName:@"test" project:project allowHeadlessExecution:true]; } + +void SetEngineDefaultView(FlutterEngine* engine, id flutterView) { + id mockFlutterViewController = OCMClassMock([FlutterViewController class]); + OCMStub([mockFlutterViewController flutterView]).andReturn(flutterView); + [engine setViewController:mockFlutterViewController]; +} + } // namespace TEST(FlutterMetalRenderer, PresentDelegatesToFlutterView) { FlutterEngine* engine = CreateTestEngine(); FlutterMetalRenderer* renderer = [[FlutterMetalRenderer alloc] initWithFlutterEngine:engine]; id mockFlutterView = OCMClassMock([FlutterView class]); + SetEngineDefaultView(engine, mockFlutterView); [(FlutterView*)[mockFlutterView expect] present]; - [renderer present:mockFlutterView]; + [renderer present:0]; } TEST(FlutterMetalRenderer, TextureReturnedByFlutterView) { FlutterEngine* engine = CreateTestEngine(); FlutterMetalRenderer* renderer = [[FlutterMetalRenderer alloc] initWithFlutterEngine:engine]; id mockFlutterView = OCMClassMock([FlutterView class]); + SetEngineDefaultView(engine, mockFlutterView); FlutterFrameInfo frameInfo; frameInfo.struct_size = sizeof(FlutterFrameInfo); FlutterUIntSize dimensions; @@ -46,7 +56,7 @@ frameInfo.size = dimensions; CGSize size = CGSizeMake(dimensions.width, dimensions.height); [[mockFlutterView expect] backingStoreForSize:size]; - [renderer createTextureForView:mockFlutterView size:size]; + [renderer createTextureForView:0 size:size]; } } // namespace flutter::testing diff --git a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.h b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.h index 95999adc41f25..d2817134d01ba 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.h +++ b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.h @@ -37,7 +37,7 @@ /** * Called by the engine when framebuffer object ID is requested. */ -- (uint32_t)fboForView:(nonnull FlutterView*)view frameInfo:(nonnull const FlutterFrameInfo*)info; +- (uint32_t)fboForView:(uint64_t)viewId frameInfo:(nonnull const FlutterFrameInfo*)info; /** * Makes the resource context the current context. diff --git a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm index a6f9a0cacc18d..c05784a51bbc2 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm @@ -7,6 +7,7 @@ #import "flutter/shell/platform/darwin/macos/framework/Source/FlutterEngine_Internal.h" #import "flutter/shell/platform/darwin/macos/framework/Source/FlutterExternalTextureGL.h" #import "flutter/shell/platform/darwin/macos/framework/Source/FlutterViewController_Internal.h" +#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterViewEngineProvider.h" #pragma mark - Static methods for openGL callbacks that require the engine. @@ -24,25 +25,17 @@ static bool OnPresentToDefaultView(FlutterEngine* engine) { // 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. - FlutterView* view = engine.viewController.flutterView; - if (view == nil) { - return false; - } - return [engine.renderer present:view]; + uint64_t viewId = 0; + return [engine.renderer present:viewId]; } static uint32_t OnFBOForDefaultView(FlutterEngine* engine, const FlutterFrameInfo* info) { // 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. - FlutterView* view = engine.viewController.flutterView; - if (view == nil) { - // This callback does not have a proper way to report error, since there's - // no way to label the returned integer as invalid. - FML_LOG(WARNING) << "Can't create frame buffers on a non-existent view."; - } + uint64_t viewId = 0; FlutterOpenGLRenderer* openGLRenderer = reinterpret_cast(engine.renderer); - return [openGLRenderer fboForView:view frameInfo:info]; + return [openGLRenderer fboForView:viewId frameInfo:info]; } static bool OnMakeResourceCurrent(FlutterEngine* engine) { @@ -63,6 +56,8 @@ static bool OnAcquireExternalTexture(FlutterEngine* engine, #pragma mark - FlutterOpenGLRenderer implementation. @implementation FlutterOpenGLRenderer { + FlutterViewEngineProvider* _viewProvider; + // The context provided to the Flutter engine for rendering to the FlutterView. This is lazily // created during initialization of the FlutterView. This is used to render content into the // FlutterView. @@ -74,6 +69,9 @@ @implementation FlutterOpenGLRenderer { - (instancetype)initWithFlutterEngine:(FlutterEngine*)flutterEngine { self = [super initWithDelegate:self engine:flutterEngine]; + if (self) { + _viewProvider = [[FlutterViewEngineProvider alloc] initWithEngine:flutterEngine]; + } return self; } @@ -90,19 +88,30 @@ - (BOOL)clearCurrent { return true; } -- (BOOL)present:(FlutterView*)view { - if (!_openGLContext) { +- (BOOL)present:(uint64_t)viewId { + FlutterView* view = [_viewProvider getView:viewId]; + if (!_openGLContext || view == nil) { return NO; } [view present]; return YES; } -- (void)presentWithoutContent:(FlutterView*)view { +- (void)presentWithoutContent:(uint64_t)viewId { + FlutterView* view = [_viewProvider getView:viewId]; + if (view == nil) { + return; + } [view presentWithoutContent]; } -- (uint32_t)fboForView:(FlutterView*)view frameInfo:(const FlutterFrameInfo*)info { +- (uint32_t)fboForView:(uint64_t)viewId frameInfo:(const FlutterFrameInfo*)info { + FlutterView* view = [_viewProvider getView:viewId]; + if (view == nil) { + // This method can't properly report errors, since there's no way to label + // the returned integer as invalid. + FML_LOG(ERROR) << "Can't create frame buffers on a non-existent view."; + } CGSize size = CGSizeMake(info->size.width, info->size.height); FlutterOpenGLRenderBackingStore* backingStore = reinterpret_cast([view backingStoreForSize:size]); diff --git a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRendererTest.mm b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRendererTest.mm index ee33b524d1cdb..cbbd63dfd949c 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRendererTest.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRendererTest.mm @@ -9,6 +9,7 @@ #import "flutter/shell/platform/darwin/macos/framework/Source/FlutterEngine_Internal.h" #import "flutter/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.h" #import "flutter/shell/platform/darwin/macos/framework/Source/FlutterView.h" +#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterViewController_Internal.h" #include "flutter/shell/platform/embedder/embedder.h" #include "flutter/shell/platform/embedder/test_utils/proc_table_replacement.h" #include "flutter/testing/testing.h" @@ -44,6 +45,16 @@ - (nullable instancetype)initWithGLRenderer { namespace flutter::testing { +namespace { + +void SetEngineDefaultView(FlutterEngine* engine, id flutterView) { + id mockFlutterViewController = OCMClassMock([FlutterViewController class]); + OCMStub([mockFlutterViewController flutterView]).andReturn(flutterView); + [engine setViewController:mockFlutterViewController]; +} + +} // namespace + TEST(FlutterOpenGLRenderer, RegisterExternalTexture) { FlutterEngine* engine = [[TestOpenGLEngine alloc] initWithGLRenderer]; EXPECT_TRUE([engine runWithEntrypoint:@"main"]); @@ -113,15 +124,17 @@ - (nullable instancetype)initWithGLRenderer { FlutterEngine* engine = [[TestOpenGLEngine alloc] initWithGLRenderer]; FlutterOpenGLRenderer* renderer = [[FlutterOpenGLRenderer alloc] initWithFlutterEngine:engine]; id mockFlutterView = OCMClassMock([FlutterView class]); + SetEngineDefaultView(engine, mockFlutterView); [(FlutterView*)[mockFlutterView expect] present]; [renderer openGLContext]; - [renderer present:mockFlutterView]; + [renderer present:0]; } TEST(FlutterOpenGLRenderer, FBOReturnedByFlutterView) { FlutterEngine* engine = [[TestOpenGLEngine alloc] initWithGLRenderer]; FlutterOpenGLRenderer* renderer = [[FlutterOpenGLRenderer alloc] initWithFlutterEngine:engine]; id mockFlutterView = OCMClassMock([FlutterView class]); + SetEngineDefaultView(engine, mockFlutterView); FlutterFrameInfo frameInfo; frameInfo.struct_size = sizeof(FlutterFrameInfo); FlutterUIntSize dimensions; @@ -131,7 +144,7 @@ - (nullable instancetype)initWithGLRenderer { CGSize size = CGSizeMake(dimensions.width, dimensions.height); [[mockFlutterView expect] backingStoreForSize:size]; [renderer openGLContext]; - [renderer fboForView:mockFlutterView frameInfo:&frameInfo]; + [renderer fboForView:0 frameInfo:&frameInfo]; } } // namespace flutter::testing diff --git a/shell/platform/darwin/macos/framework/Source/FlutterRenderer.h b/shell/platform/darwin/macos/framework/Source/FlutterRenderer.h index 8cf45aa2f24fb..f977344a58baf 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterRenderer.h +++ b/shell/platform/darwin/macos/framework/Source/FlutterRenderer.h @@ -27,11 +27,11 @@ /** * Called by the engine when the given view's buffers should be swapped. */ -- (BOOL)present:(nonnull FlutterView*)view; +- (BOOL)present:(uint64_t)viewId; /** * Tells the renderer that there is no Flutter content available for this frame. */ -- (void)presentWithoutContent:(nonnull FlutterView*)view; +- (void)presentWithoutContent:(uint64_t)viewId; @end From 8e7c29ecec5065aa0e509c26b7cc17b2991a50fe Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 14 Nov 2022 11:35:24 -0800 Subject: [PATCH 12/15] Address comment --- shell/platform/darwin/macos/framework/Headers/FlutterEngine.h | 4 ++-- shell/platform/darwin/macos/framework/Source/FlutterEngine.mm | 2 +- .../darwin/macos/framework/Source/FlutterMetalRenderer.mm | 4 ++-- .../darwin/macos/framework/Source/FlutterMetalRendererTest.mm | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/shell/platform/darwin/macos/framework/Headers/FlutterEngine.h b/shell/platform/darwin/macos/framework/Headers/FlutterEngine.h index 20ec48be51e19..49032f87d3a91 100644 --- a/shell/platform/darwin/macos/framework/Headers/FlutterEngine.h +++ b/shell/platform/darwin/macos/framework/Headers/FlutterEngine.h @@ -65,8 +65,8 @@ FLUTTER_DARWIN_EXPORT /** * The default `FlutterViewController` associated with this engine, if any. * - * The default view always has ID 0, and is the view operated by the APIs that - * do not have a view ID specified. + * The default view always has ID kFlutterDefaultViewId, and is the view + * operated by the APIs that do not have a view ID specified. */ @property(nonatomic, nullable, weak) FlutterViewController* viewController; diff --git a/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm b/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm index 0fcc6494b9009..2051c268f2084 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm @@ -434,7 +434,7 @@ - (FlutterCompositor*)createFlutterCompositor { // 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; + uint64_t viewId = kFlutterDefaultViewId; if (has_flutter_content) { return [weakSelf.renderer present:viewId] == YES; } else { diff --git a/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm b/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm index 42ddb24822c32..87d3baad94758 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.mm @@ -18,7 +18,7 @@ static FlutterMetalTexture OnGetNextDrawableForDefaultView(FlutterEngine* engine // 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; + uint64_t viewId = kFlutterDefaultViewId; CGSize size = CGSizeMake(frameInfo->size.width, frameInfo->size.height); FlutterMetalRenderer* metalRenderer = reinterpret_cast(engine.renderer); return [metalRenderer createTextureForView:viewId size:size]; @@ -29,7 +29,7 @@ static bool OnPresentDrawableOfDefaultView(FlutterEngine* engine, // 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; + uint64_t viewId = kFlutterDefaultViewId; return [engine.renderer present:viewId]; } diff --git a/shell/platform/darwin/macos/framework/Source/FlutterMetalRendererTest.mm b/shell/platform/darwin/macos/framework/Source/FlutterMetalRendererTest.mm index ece1339a5c22e..9f4ca341fe60f 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterMetalRendererTest.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterMetalRendererTest.mm @@ -40,7 +40,7 @@ void SetEngineDefaultView(FlutterEngine* engine, id flutterView) { id mockFlutterView = OCMClassMock([FlutterView class]); SetEngineDefaultView(engine, mockFlutterView); [(FlutterView*)[mockFlutterView expect] present]; - [renderer present:0]; + [renderer present:kFlutterDefaultViewId]; } TEST(FlutterMetalRenderer, TextureReturnedByFlutterView) { @@ -56,7 +56,7 @@ void SetEngineDefaultView(FlutterEngine* engine, id flutterView) { frameInfo.size = dimensions; CGSize size = CGSizeMake(dimensions.width, dimensions.height); [[mockFlutterView expect] backingStoreForSize:size]; - [renderer createTextureForView:0 size:size]; + [renderer createTextureForView:kFlutterDefaultViewId size:size]; } } // namespace flutter::testing From 6b9ca1bba47e8a30cf1dbcae235a72dce07e8f5d Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 14 Nov 2022 11:40:32 -0800 Subject: [PATCH 13/15] Fix comment --- shell/platform/embedder/embedder.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/platform/embedder/embedder.h b/shell/platform/embedder/embedder.h index 23dda3a281ff3..e4fd8cc217490 100644 --- a/shell/platform/embedder/embedder.h +++ b/shell/platform/embedder/embedder.h @@ -636,7 +636,7 @@ typedef struct { /// Handle to the MTLTexture that is owned by the embedder. Engine will render /// the frame into this texture. /// - /// The `texture` must not be null, or this texture is considered invalid. + /// A NULL texture is considered invalid. FlutterMetalTextureHandle texture; /// A baton that is not interpreted by the engine in any way. It will be given /// back to the embedder in the destruction callback below. Embedder resources From c4373ece6e5b51f0448dc2691da8cd9230371e65 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Thu, 17 Nov 2022 11:02:09 -0800 Subject: [PATCH 14/15] To assertion --- shell/platform/darwin/macos/framework/Source/FlutterRenderer.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterRenderer.mm b/shell/platform/darwin/macos/framework/Source/FlutterRenderer.mm index 33de0ffaef0c2..44e2b05236cff 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterRenderer.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterRenderer.mm @@ -90,8 +90,8 @@ - (FlutterRendererConfig)createRendererConfig { - (FlutterMetalTexture)createTextureForView:(uint64_t)viewId size:(CGSize)size { FlutterView* view = [_viewProvider getView:viewId]; + NSAssert(view != nil, "Can't create texture on a non-existent view 0x%x.", 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{}; } From 9272daadc4b70062ba25241947488ef73864cf18 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Thu, 17 Nov 2022 11:32:42 -0800 Subject: [PATCH 15/15] Fix compile --- shell/platform/darwin/macos/framework/Source/FlutterRenderer.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterRenderer.mm b/shell/platform/darwin/macos/framework/Source/FlutterRenderer.mm index 44e2b05236cff..d02de6c5c8eab 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterRenderer.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterRenderer.mm @@ -90,7 +90,7 @@ - (FlutterRendererConfig)createRendererConfig { - (FlutterMetalTexture)createTextureForView:(uint64_t)viewId size:(CGSize)size { FlutterView* view = [_viewProvider getView:viewId]; - NSAssert(view != nil, "Can't create texture on a non-existent view 0x%x.", viewId); + NSAssert(view != nil, @"Can't create texture on a non-existent view 0x%llx.", viewId); if (view == nil) { // FlutterMetalTexture has texture `null`, therefore is discarded. return FlutterMetalTexture{};