From 5e7197fe15d0f2b7324f12ed52e70bd3d3fa0847 Mon Sep 17 00:00:00 2001 From: Jim Graham Date: Mon, 15 Aug 2022 17:32:54 -0700 Subject: [PATCH 01/10] add DisplayListBuilderMultiplexer to mimic SkNWayCanvas --- ci/licenses_golden/licenses_flutter | 2 ++ display_list/BUILD.gn | 2 ++ .../display_list_builder_multiplexer.cc | 28 +++++++++++++++ .../display_list_builder_multiplexer.h | 35 +++++++++++++++++++ flow/embedded_views.h | 2 ++ flow/layers/color_filter_layer.cc | 7 ++-- flow/layers/layer.h | 4 +++ flow/layers/layer_tree.cc | 13 ++++++- flow/testing/layer_test.h | 5 +++ flow/testing/mock_embedder.cc | 5 +++ flow/testing/mock_embedder.h | 3 ++ shell/common/rasterizer_unittests.cc | 1 + .../shell_test_external_view_embedder.cc | 6 ++++ .../shell_test_external_view_embedder.h | 3 ++ .../external_view_embedder.cc | 13 +++++++ .../external_view_embedder.h | 3 ++ .../external_view_embedder_unittests.cc | 9 +++++ .../framework/Source/FlutterPlatformViews.mm | 9 +++++ .../darwin/ios/ios_external_view_embedder.h | 3 ++ .../darwin/ios/ios_external_view_embedder.mm | 6 ++++ .../embedder_external_view_embedder.cc | 6 ++++ .../embedder_external_view_embedder.h | 3 ++ .../flatland_external_view_embedder.cc | 4 +++ .../flutter/flatland_external_view_embedder.h | 3 ++ shell/testing/tester_main.cc | 3 ++ 25 files changed, 174 insertions(+), 4 deletions(-) create mode 100644 display_list/display_list_builder_multiplexer.cc create mode 100644 display_list/display_list_builder_multiplexer.h diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index a4657cb0b7e0f..4f52ef84c5caf 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -55,6 +55,8 @@ FILE: ../../../flutter/display_list/display_list_blend_mode.cc FILE: ../../../flutter/display_list/display_list_blend_mode.h FILE: ../../../flutter/display_list/display_list_builder.cc FILE: ../../../flutter/display_list/display_list_builder.h +FILE: ../../../flutter/display_list/display_list_builder_multiplexer.cc +FILE: ../../../flutter/display_list/display_list_builder_multiplexer.h FILE: ../../../flutter/display_list/display_list_builder_benchmarks.cc FILE: ../../../flutter/display_list/display_list_canvas_dispatcher.cc FILE: ../../../flutter/display_list/display_list_canvas_dispatcher.h diff --git a/display_list/BUILD.gn b/display_list/BUILD.gn index 0724e4a997d6b..077209220e69b 100644 --- a/display_list/BUILD.gn +++ b/display_list/BUILD.gn @@ -16,6 +16,8 @@ source_set("display_list") { "display_list_blend_mode.h", "display_list_builder.cc", "display_list_builder.h", + "display_list_builder_multiplexer.cc", + "display_list_builder_multiplexer.h", "display_list_canvas_dispatcher.cc", "display_list_canvas_dispatcher.h", "display_list_canvas_recorder.cc", diff --git a/display_list/display_list_builder_multiplexer.cc b/display_list/display_list_builder_multiplexer.cc new file mode 100644 index 0000000000000..11e583b081d2b --- /dev/null +++ b/display_list/display_list_builder_multiplexer.cc @@ -0,0 +1,28 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "flutter/display_list/display_list_builder_multiplexer.h" + +namespace flutter { + +void DisplayListBuilderMultiplexer::addBuilder(DisplayListBuilder* builder) { + builders_.push_back(builder); +} + +void DisplayListBuilderMultiplexer::saveLayer( + const SkRect* bounds, + const DlPaint* paint, + const DlImageFilter* backdrop_filter) { + for (auto builder : builders_) { + builder->saveLayer(bounds, paint, backdrop_filter); + } +} + +void DisplayListBuilderMultiplexer::restore() { + for (auto builder : builders_) { + builder->restore(); + } +} + +} // namespace flutter diff --git a/display_list/display_list_builder_multiplexer.h b/display_list/display_list_builder_multiplexer.h new file mode 100644 index 0000000000000..5dcbd9fc49c40 --- /dev/null +++ b/display_list/display_list_builder_multiplexer.h @@ -0,0 +1,35 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef FLUTTER_DISPLAY_LIST_DISPLAY_LIST_BUILDER_MULTIPLEXER_H_ +#define FLUTTER_DISPLAY_LIST_DISPLAY_LIST_BUILDER_MULTIPLEXER_H_ + +#include "flutter/display_list/display_list_builder.h" +#include "flutter/display_list/display_list_image_filter.h" +#include "flutter/display_list/display_list_paint.h" +#include "flutter/fml/macros.h" + +namespace flutter { + +/// A class that mutiplexes some of the DisplayListBuilder calls to multiple +/// other builders. For now it only implements saveLayer and restore as those +/// are needed to create a replacement for PaintContext::internal_nodes_canvas. +class DisplayListBuilderMultiplexer { + public: + DisplayListBuilderMultiplexer() = default; + + void addBuilder(DisplayListBuilder* builder); + + void saveLayer(const SkRect* bounds, const DlPaint* paint, + const DlImageFilter* backdrop_filter = nullptr); + + void restore(); + + private: + std::vector builders_; +}; + +} // namespace flutter + +#endif // FLUTTER_DISPLAY_LIST_DISPLAY_LIST_BUILDER_MULTIPLEXER_H_ diff --git a/flow/embedded_views.h b/flow/embedded_views.h index 6a678978f2c85..cc252ae527835 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -7,6 +7,7 @@ #include +#include "flutter/display_list/display_list_builder.h" #include "flutter/flow/rtree.h" #include "flutter/flow/surface_frame.h" #include "flutter/fml/memory/ref_counted.h" @@ -393,6 +394,7 @@ class ExternalViewEmbedder { } virtual std::vector GetCurrentCanvases() = 0; + virtual std::vector GetCurrentBuilders() = 0; // Must be called on the UI thread. virtual EmbedderPaintContext CompositeEmbeddedView(int view_id) = 0; diff --git a/flow/layers/color_filter_layer.cc b/flow/layers/color_filter_layer.cc index 9c22dbfe258bf..02822bf68d612 100644 --- a/flow/layers/color_filter_layer.cc +++ b/flow/layers/color_filter_layer.cc @@ -61,10 +61,11 @@ void ColorFilterLayer::Paint(PaintContext& context) const { AutoCachePaint cache_paint(context); cache_paint.setColorFilter(filter_.get()); if (context.leaf_nodes_builder) { - context.leaf_nodes_builder->saveLayer(&paint_bounds(), - cache_paint.dl_paint()); + FML_DCHECK(context.builder_multiplexer); + context.builder_multiplexer->saveLayer(&paint_bounds(), + cache_paint.dl_paint()); PaintChildren(context); - context.leaf_nodes_builder->restore(); + context.builder_multiplexer->restore(); } else { Layer::AutoSaveLayer save = Layer::AutoSaveLayer::Create( context, paint_bounds(), cache_paint.sk_paint()); diff --git a/flow/layers/layer.h b/flow/layers/layer.h index 5cdd3e7db028c..17d5dc92ac0a3 100644 --- a/flow/layers/layer.h +++ b/flow/layers/layer.h @@ -11,6 +11,7 @@ #include #include "flutter/common/graphics/texture.h" +#include "flutter/display_list/display_list_builder_multiplexer.h" #include "flutter/flow/diff_context.h" #include "flutter/flow/embedded_views.h" #include "flutter/flow/instrumentation.h" @@ -29,7 +30,9 @@ #include "third_party/skia/include/core/SkRRect.h" #include "third_party/skia/include/core/SkRect.h" #include "third_party/skia/include/utils/SkNWayCanvas.h" + namespace flutter { + namespace testing { class MockLayer; } // namespace testing @@ -150,6 +153,7 @@ struct PaintContext { // a |kSrcOver| blend mode. SkScalar inherited_opacity = SK_Scalar1; DisplayListBuilder* leaf_nodes_builder = nullptr; + DisplayListBuilderMultiplexer* builder_multiplexer = nullptr; }; // Represents a single composited layer. Created on the UI thread but then diff --git a/flow/layers/layer_tree.cc b/flow/layers/layer_tree.cc index 0fafe40f62861..dffb24c8a6ae6 100644 --- a/flow/layers/layer_tree.cc +++ b/flow/layers/layer_tree.cc @@ -119,6 +119,16 @@ void LayerTree::Paint(CompositorContext::ScopedFrame& frame, internal_nodes_canvas.addCanvas(overlay_canvases[i]); } } + DisplayListBuilder* builder = frame.display_list_builder(); + DisplayListBuilderMultiplexer builder_multiplexer; + if (builder) { + builder_multiplexer.addBuilder(builder); + if (frame.view_embedder()) { + for (auto view_builder : frame.view_embedder()->GetCurrentBuilders()) { + builder_multiplexer.addBuilder(view_builder); + } + } + } // clear the previous snapshots. LayerSnapshotStore* snapshot_store = nullptr; @@ -146,7 +156,8 @@ void LayerTree::Paint(CompositorContext::ScopedFrame& frame, .layer_snapshot_store = snapshot_store, .enable_leaf_layer_tracing = enable_leaf_layer_tracing_, .inherited_opacity = SK_Scalar1, - .leaf_nodes_builder = frame.display_list_builder(), + .leaf_nodes_builder = builder, + .builder_multiplexer = builder ? &builder_multiplexer : nullptr, // clang-format on }; diff --git a/flow/testing/layer_test.h b/flow/testing/layer_test.h index 317c7109dc8dc..f7a93401e7f35 100644 --- a/flow/testing/layer_test.h +++ b/flow/testing/layer_test.h @@ -12,6 +12,7 @@ #include #include +#include "flutter/display_list/display_list_builder_multiplexer.h" #include "flutter/flow/testing/mock_raster_cache.h" #include "flutter/fml/macros.h" #include "flutter/testing/canvas_test.h" @@ -92,6 +93,7 @@ class LayerTestBase : public CanvasTestBase { .checkerboard_offscreen_layers = false, .frame_device_pixel_ratio = 1.0f, .leaf_nodes_builder = display_list_recorder_.builder().get(), + .builder_multiplexer = &display_list_multiplexer_, // clang-format on }, check_board_context_{ @@ -109,6 +111,8 @@ class LayerTestBase : public CanvasTestBase { // clang-format on } { internal_display_list_canvas_.addCanvas(&display_list_recorder_); + display_list_multiplexer_.addBuilder( + display_list_recorder_.builder().get()); use_null_raster_cache(); } @@ -214,6 +218,7 @@ class LayerTestBase : public CanvasTestBase { PrerollContext preroll_context_; PaintContext paint_context_; DisplayListCanvasRecorder display_list_recorder_; + DisplayListBuilderMultiplexer display_list_multiplexer_; sk_sp display_list_; SkNWayCanvas internal_display_list_canvas_; PaintContext display_list_paint_context_; diff --git a/flow/testing/mock_embedder.cc b/flow/testing/mock_embedder.cc index 6c3c7bf0a59a7..8004308d796c2 100644 --- a/flow/testing/mock_embedder.cc +++ b/flow/testing/mock_embedder.cc @@ -36,6 +36,11 @@ std::vector MockViewEmbedder::GetCurrentCanvases() { return std::vector({}); } +// |ExternalViewEmbedder| +std::vector MockViewEmbedder::GetCurrentBuilders() { + return std::vector({}); +} + // |ExternalViewEmbedder| EmbedderPaintContext MockViewEmbedder::CompositeEmbeddedView(int view_id) { return {nullptr, nullptr}; diff --git a/flow/testing/mock_embedder.h b/flow/testing/mock_embedder.h index ea6a1e09c771d..abc57d3d28530 100644 --- a/flow/testing/mock_embedder.h +++ b/flow/testing/mock_embedder.h @@ -37,6 +37,9 @@ class MockViewEmbedder : public ExternalViewEmbedder { // |ExternalViewEmbedder| std::vector GetCurrentCanvases() override; + // |ExternalViewEmbedder| + std::vector GetCurrentBuilders() override; + // |ExternalViewEmbedder| EmbedderPaintContext CompositeEmbeddedView(int view_id) override; }; diff --git a/shell/common/rasterizer_unittests.cc b/shell/common/rasterizer_unittests.cc index 35693c8de848c..45232840bf2b1 100644 --- a/shell/common/rasterizer_unittests.cc +++ b/shell/common/rasterizer_unittests.cc @@ -66,6 +66,7 @@ class MockExternalViewEmbedder : public ExternalViewEmbedder { PostPrerollResult( fml::RefPtr raster_thread_merger)); MOCK_METHOD0(GetCurrentCanvases, std::vector()); + MOCK_METHOD0(GetCurrentBuilders, std::vector()); MOCK_METHOD1(CompositeEmbeddedView, EmbedderPaintContext(int view_id)); MOCK_METHOD2(SubmitFrame, void(GrDirectContext* context, diff --git a/shell/common/shell_test_external_view_embedder.cc b/shell/common/shell_test_external_view_embedder.cc index 14482ba260c6b..579f682089517 100644 --- a/shell/common/shell_test_external_view_embedder.cc +++ b/shell/common/shell_test_external_view_embedder.cc @@ -72,6 +72,12 @@ std::vector ShellTestExternalViewEmbedder::GetCurrentCanvases() { return {}; } +// |ExternalViewEmbedder| +std::vector +ShellTestExternalViewEmbedder::GetCurrentBuilders() { + return {}; +} + // |ExternalViewEmbedder| void ShellTestExternalViewEmbedder::PushVisitedPlatformView(int64_t view_id) { visited_platform_views_.push_back(view_id); diff --git a/shell/common/shell_test_external_view_embedder.h b/shell/common/shell_test_external_view_embedder.h index 86c051e5c5963..583a09182e5fc 100644 --- a/shell/common/shell_test_external_view_embedder.h +++ b/shell/common/shell_test_external_view_embedder.h @@ -65,6 +65,9 @@ class ShellTestExternalViewEmbedder final : public ExternalViewEmbedder { // |ExternalViewEmbedder| std::vector GetCurrentCanvases() override; + // |ExternalViewEmbedder| + std::vector GetCurrentBuilders() override; + // |ExternalViewEmbedder| EmbedderPaintContext CompositeEmbeddedView(int view_id) override; diff --git a/shell/platform/android/external_view_embedder/external_view_embedder.cc b/shell/platform/android/external_view_embedder/external_view_embedder.cc index 8bbb1682b2ba6..3545cb1453dce 100644 --- a/shell/platform/android/external_view_embedder/external_view_embedder.cc +++ b/shell/platform/android/external_view_embedder/external_view_embedder.cc @@ -69,6 +69,19 @@ std::vector AndroidExternalViewEmbedder::GetCurrentCanvases() { return canvases; } +// |ExternalViewEmbedder| +std::vector +AndroidExternalViewEmbedder::GetCurrentBuilders() { + std::vector builders; + for (size_t i = 0; i < composition_order_.size(); i++) { + int64_t view_id = composition_order_[i]; + if (slices_.count(view_id) == 1) { + builders.push_back(slices_.at(view_id)->builder()); + } + } + return builders; +} + SkRect AndroidExternalViewEmbedder::GetViewRect(int view_id) const { const EmbeddedViewParams& params = view_params_.at(view_id); // TODO(egarciad): The rect should be computed from the mutator stack. diff --git a/shell/platform/android/external_view_embedder/external_view_embedder.h b/shell/platform/android/external_view_embedder/external_view_embedder.h index aa6e0729b22b6..08e6a0d0f5080 100644 --- a/shell/platform/android/external_view_embedder/external_view_embedder.h +++ b/shell/platform/android/external_view_embedder/external_view_embedder.h @@ -47,6 +47,9 @@ class AndroidExternalViewEmbedder final : public ExternalViewEmbedder { // |ExternalViewEmbedder| std::vector GetCurrentCanvases() override; + // |ExternalViewEmbedder| + std::vector GetCurrentBuilders() override; + // |ExternalViewEmbedder| void SubmitFrame(GrDirectContext* context, std::unique_ptr frame) override; diff --git a/shell/platform/android/external_view_embedder/external_view_embedder_unittests.cc b/shell/platform/android/external_view_embedder/external_view_embedder_unittests.cc index df21dae22820b..3005024bb9fe3 100644 --- a/shell/platform/android/external_view_embedder/external_view_embedder_unittests.cc +++ b/shell/platform/android/external_view_embedder/external_view_embedder_unittests.cc @@ -124,6 +124,9 @@ TEST(AndroidExternalViewEmbedder, GetCurrentCanvases) { ASSERT_EQ(2UL, canvases.size()); ASSERT_EQ(SkISize::Make(10, 20), canvases[0]->getBaseLayerSize()); ASSERT_EQ(SkISize::Make(10, 20), canvases[1]->getBaseLayerSize()); + + auto builders = embedder->GetCurrentBuilders(); + ASSERT_EQ(2UL, builders.size()); } TEST(AndroidExternalViewEmbedder, GetCurrentCanvasesCompositeOrder) { @@ -149,6 +152,9 @@ TEST(AndroidExternalViewEmbedder, GetCurrentCanvasesCompositeOrder) { ASSERT_EQ(2UL, canvases.size()); ASSERT_EQ(embedder->CompositeEmbeddedView(0).canvas, canvases[0]); ASSERT_EQ(embedder->CompositeEmbeddedView(1).canvas, canvases[1]); + + auto builders = embedder->GetCurrentBuilders(); + ASSERT_EQ(2UL, builders.size()); } TEST(AndroidExternalViewEmbedder, CompositeEmbeddedView) { @@ -178,6 +184,9 @@ TEST(AndroidExternalViewEmbedder, CancelFrame) { auto canvases = embedder->GetCurrentCanvases(); ASSERT_EQ(0UL, canvases.size()); + + auto builders = embedder->GetCurrentBuilders(); + ASSERT_EQ(0UL, builders.size()); } TEST(AndroidExternalViewEmbedder, RasterizerRunsOnPlatformThread) { diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm index 2406365cc0322..9987fe6dd8265 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm @@ -379,6 +379,15 @@ - (BOOL)flt_hasFirstResponderInViewHierarchySubtree { return canvases; } +std::vector FlutterPlatformViewsController::GetCurrentBuilders() { + std::vector builders; + for (size_t i = 0; i < composition_order_.size(); i++) { + int64_t view_id = composition_order_[i]; + builders.push_back(slices_[view_id]->builder()); + } + return builders; +} + int FlutterPlatformViewsController::CountClips(const MutatorsStack& mutators_stack) { std::vector>::const_reverse_iterator iter = mutators_stack.Bottom(); int clipCount = 0; diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.h b/shell/platform/darwin/ios/ios_external_view_embedder.h index 296930d745f6e..03cec910bae39 100644 --- a/shell/platform/darwin/ios/ios_external_view_embedder.h +++ b/shell/platform/darwin/ios/ios_external_view_embedder.h @@ -49,6 +49,9 @@ class IOSExternalViewEmbedder : public ExternalViewEmbedder { // |ExternalViewEmbedder| std::vector GetCurrentCanvases() override; + // |ExternalViewEmbedder| + std::vector GetCurrentBuilders() override; + // |ExternalViewEmbedder| EmbedderPaintContext CompositeEmbeddedView(int view_id) override; diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.mm b/shell/platform/darwin/ios/ios_external_view_embedder.mm index 392c3ba8d6105..412b440643d7e 100644 --- a/shell/platform/darwin/ios/ios_external_view_embedder.mm +++ b/shell/platform/darwin/ios/ios_external_view_embedder.mm @@ -64,6 +64,12 @@ return platform_views_controller_->GetCurrentCanvases(); } +// |ExternalViewEmbedder| +std::vector IOSExternalViewEmbedder::GetCurrentBuilders() { + FML_CHECK(platform_views_controller_); + return platform_views_controller_->GetCurentBuilders(); +} + // |ExternalViewEmbedder| EmbedderPaintContext IOSExternalViewEmbedder::CompositeEmbeddedView(int view_id) { TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::CompositeEmbeddedView"); diff --git a/shell/platform/embedder/embedder_external_view_embedder.cc b/shell/platform/embedder/embedder_external_view_embedder.cc index 56580e3f5e89d..026d1c5d48dd3 100644 --- a/shell/platform/embedder/embedder_external_view_embedder.cc +++ b/shell/platform/embedder/embedder_external_view_embedder.cc @@ -110,6 +110,12 @@ std::vector EmbedderExternalViewEmbedder::GetCurrentCanvases() { return canvases; } +// |ExternalViewEmbedder| +std::vector +EmbedderExternalViewEmbedder::GetCurrentBuilders() { + return std::vector({}); +} + // |ExternalViewEmbedder| EmbedderPaintContext EmbedderExternalViewEmbedder::CompositeEmbeddedView( int view_id) { diff --git a/shell/platform/embedder/embedder_external_view_embedder.h b/shell/platform/embedder/embedder_external_view_embedder.h index 94bbf6712a46c..7921cb8b78255 100644 --- a/shell/platform/embedder/embedder_external_view_embedder.h +++ b/shell/platform/embedder/embedder_external_view_embedder.h @@ -93,6 +93,9 @@ class EmbedderExternalViewEmbedder final : public ExternalViewEmbedder { // |ExternalViewEmbedder| std::vector GetCurrentCanvases() override; + // |ExternalViewEmbedder| + std::vector GetCurrentBuilders() override; + // |ExternalViewEmbedder| EmbedderPaintContext CompositeEmbeddedView(int view_id) override; diff --git a/shell/platform/fuchsia/flutter/flatland_external_view_embedder.cc b/shell/platform/fuchsia/flutter/flatland_external_view_embedder.cc index 7b9ac92512996..49756e789f176 100644 --- a/shell/platform/fuchsia/flutter/flatland_external_view_embedder.cc +++ b/shell/platform/fuchsia/flutter/flatland_external_view_embedder.cc @@ -56,6 +56,10 @@ std::vector FlatlandExternalViewEmbedder::GetCurrentCanvases() { return canvases; } +std::vector FlatlandExternalViewEmbedder::GetCurrentBuilders() { + return std::vector(); +} + void FlatlandExternalViewEmbedder::PrerollCompositeEmbeddedView( int view_id, std::unique_ptr params) { diff --git a/shell/platform/fuchsia/flutter/flatland_external_view_embedder.h b/shell/platform/fuchsia/flutter/flatland_external_view_embedder.h index 1c07f8393aac6..6b6565c81d433 100644 --- a/shell/platform/fuchsia/flutter/flatland_external_view_embedder.h +++ b/shell/platform/fuchsia/flutter/flatland_external_view_embedder.h @@ -64,6 +64,9 @@ class FlatlandExternalViewEmbedder final // |ExternalViewEmbedder| std::vector GetCurrentCanvases() override; + // |ExternalViewEmbedder| + std::vector GetCurrentBuilders() override; + // |ExternalViewEmbedder| void PrerollCompositeEmbeddedView( int view_id, diff --git a/shell/testing/tester_main.cc b/shell/testing/tester_main.cc index ecab46ac1a7f1..c1eab867f6a1c 100644 --- a/shell/testing/tester_main.cc +++ b/shell/testing/tester_main.cc @@ -59,6 +59,9 @@ class TesterExternalViewEmbedder : public ExternalViewEmbedder { // |ExternalViewEmbedder| std::vector GetCurrentCanvases() override { return {&canvas_}; } + // |ExternalViewEmbedder| + std::vector GetCurrentBuilders() override { return {}; } + // |ExternalViewEmbedder| EmbedderPaintContext CompositeEmbeddedView(int view_id) override { return {&canvas_, nullptr}; From 5f0e88212b13cd34936f10ab7e1859bd9e92aa71 Mon Sep 17 00:00:00 2001 From: Jim Graham Date: Mon, 15 Aug 2022 17:34:12 -0700 Subject: [PATCH 02/10] formatting --- display_list/display_list_builder_multiplexer.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/display_list/display_list_builder_multiplexer.h b/display_list/display_list_builder_multiplexer.h index 5dcbd9fc49c40..498301d136773 100644 --- a/display_list/display_list_builder_multiplexer.h +++ b/display_list/display_list_builder_multiplexer.h @@ -21,7 +21,8 @@ class DisplayListBuilderMultiplexer { void addBuilder(DisplayListBuilder* builder); - void saveLayer(const SkRect* bounds, const DlPaint* paint, + void saveLayer(const SkRect* bounds, + const DlPaint* paint, const DlImageFilter* backdrop_filter = nullptr); void restore(); From 06ef06524dfabd89892c446f257d878d3cc5f5ad Mon Sep 17 00:00:00 2001 From: Jim Graham Date: Mon, 15 Aug 2022 18:46:13 -0700 Subject: [PATCH 03/10] fix test failures --- ci/licenses_golden/licenses_flutter | 2 +- flow/layers/backdrop_filter_layer.cc | 4 ++++ flow/layers/layer_tree.cc | 3 +++ flow/layers/layer_tree_unittests.cc | 1 + flow/testing/layer_test.h | 1 + .../ios/framework/Source/FlutterPlatformViews_Internal.h | 2 ++ shell/platform/darwin/ios/ios_external_view_embedder.mm | 4 ++-- .../fuchsia/flutter/flatland_external_view_embedder.h | 1 + 8 files changed, 15 insertions(+), 3 deletions(-) diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 4f52ef84c5caf..02b295d603272 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -55,9 +55,9 @@ FILE: ../../../flutter/display_list/display_list_blend_mode.cc FILE: ../../../flutter/display_list/display_list_blend_mode.h FILE: ../../../flutter/display_list/display_list_builder.cc FILE: ../../../flutter/display_list/display_list_builder.h +FILE: ../../../flutter/display_list/display_list_builder_benchmarks.cc FILE: ../../../flutter/display_list/display_list_builder_multiplexer.cc FILE: ../../../flutter/display_list/display_list_builder_multiplexer.h -FILE: ../../../flutter/display_list/display_list_builder_benchmarks.cc FILE: ../../../flutter/display_list/display_list_canvas_dispatcher.cc FILE: ../../../flutter/display_list/display_list_canvas_dispatcher.h FILE: ../../../flutter/display_list/display_list_canvas_recorder.cc diff --git a/flow/layers/backdrop_filter_layer.cc b/flow/layers/backdrop_filter_layer.cc index eb85e73b6a199..9f67b746b1c9b 100644 --- a/flow/layers/backdrop_filter_layer.cc +++ b/flow/layers/backdrop_filter_layer.cc @@ -60,6 +60,10 @@ void BackdropFilterLayer::Paint(PaintContext& context) const { AutoCachePaint save_paint(context); save_paint.setBlendMode(blend_mode_); if (context.leaf_nodes_builder) { + // Note that we perform a saveLayer directly on the + // leaf_nodes_builder here similar to how the SkCanvas + // path specifies the kLeafNodesCanvas below. + // See https:://flutter.dev/go/backdrop-filter-with-overlay-canvas context.leaf_nodes_builder->saveLayer(&paint_bounds(), save_paint.dl_paint(), filter_.get()); diff --git a/flow/layers/layer_tree.cc b/flow/layers/layer_tree.cc index dffb24c8a6ae6..9ecc13d6f7398 100644 --- a/flow/layers/layer_tree.cc +++ b/flow/layers/layer_tree.cc @@ -202,6 +202,8 @@ sk_sp LayerTree::Flatten(const SkRect& bounds) { SkISize canvas_size = builder.getBaseLayerSize(); SkNWayCanvas internal_nodes_canvas(canvas_size.width(), canvas_size.height()); internal_nodes_canvas.addCanvas(&builder); + DisplayListBuilderMultiplexer multiplexer; + multiplexer.addBuilder(builder.builder().get()); PaintContext paint_context = { // clang-format off @@ -219,6 +221,7 @@ sk_sp LayerTree::Flatten(const SkRect& bounds) { .layer_snapshot_store = nullptr, .enable_leaf_layer_tracing = false, .leaf_nodes_builder = builder.builder().get(), + .builder_multiplexer = &multiplexer, // clang-format on }; diff --git a/flow/layers/layer_tree_unittests.cc b/flow/layers/layer_tree_unittests.cc index c39867508c002..9eeac5a1f77cd 100644 --- a/flow/layers/layer_tree_unittests.cc +++ b/flow/layers/layer_tree_unittests.cc @@ -256,6 +256,7 @@ TEST_F(LayerTreeTest, PaintContextInitialization) { EXPECT_EQ(context.inherited_opacity, SK_Scalar1); EXPECT_EQ(context.leaf_nodes_builder, nullptr); + EXPECT_EQ(context.builder_multiplexer, nullptr); }; // These 4 initializers are required because they are handled by reference diff --git a/flow/testing/layer_test.h b/flow/testing/layer_test.h index f7a93401e7f35..60b4536056ab6 100644 --- a/flow/testing/layer_test.h +++ b/flow/testing/layer_test.h @@ -187,6 +187,7 @@ class LayerTestBase : public CanvasTestBase { display_list_paint_context_.leaf_nodes_canvas = nullptr; display_list_paint_context_.internal_nodes_canvas = nullptr; display_list_paint_context_.leaf_nodes_builder = nullptr; + display_list_paint_context_.builder_multiplexer = nullptr; } return display_list_; } diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h index 8d41b7629c8dd..c7877dc7601ed 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h @@ -165,6 +165,8 @@ class FlutterPlatformViewsController { std::vector GetCurrentCanvases(); + std::vector GetCurrentBuilders(); + EmbedderPaintContext CompositeEmbeddedView(int view_id); // The rect of the platform view at index view_id. This rect has been translated into the diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.mm b/shell/platform/darwin/ios/ios_external_view_embedder.mm index 412b440643d7e..76995be2c56ad 100644 --- a/shell/platform/darwin/ios/ios_external_view_embedder.mm +++ b/shell/platform/darwin/ios/ios_external_view_embedder.mm @@ -65,9 +65,9 @@ } // |ExternalViewEmbedder| -std::vector IOSExternalViewEmbedder::GetCurrentBuilders() { +std::vector IOSExternalViewEmbedder::GetCurrentBuilders() { FML_CHECK(platform_views_controller_); - return platform_views_controller_->GetCurentBuilders(); + return platform_views_controller_->GetCurrentBuilders(); } // |ExternalViewEmbedder| diff --git a/shell/platform/fuchsia/flutter/flatland_external_view_embedder.h b/shell/platform/fuchsia/flutter/flatland_external_view_embedder.h index 6b6565c81d433..6cc8fcf9367de 100644 --- a/shell/platform/fuchsia/flutter/flatland_external_view_embedder.h +++ b/shell/platform/fuchsia/flutter/flatland_external_view_embedder.h @@ -16,6 +16,7 @@ #include #include +#include "flutter/display_list/display_list_builder_multiplexer.h" #include "flutter/flow/embedded_views.h" #include "flutter/fml/logging.h" #include "flutter/fml/macros.h" From 83bf8205d3f6caacd6b7545dc8b8354a31430043 Mon Sep 17 00:00:00 2001 From: Jim Graham Date: Mon, 15 Aug 2022 18:59:35 -0700 Subject: [PATCH 04/10] fix Fuchsia build problem --- .../platform/fuchsia/flutter/flatland_external_view_embedder.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/shell/platform/fuchsia/flutter/flatland_external_view_embedder.h b/shell/platform/fuchsia/flutter/flatland_external_view_embedder.h index 6cc8fcf9367de..360e068699def 100644 --- a/shell/platform/fuchsia/flutter/flatland_external_view_embedder.h +++ b/shell/platform/fuchsia/flutter/flatland_external_view_embedder.h @@ -16,7 +16,6 @@ #include #include -#include "flutter/display_list/display_list_builder_multiplexer.h" #include "flutter/flow/embedded_views.h" #include "flutter/fml/logging.h" #include "flutter/fml/macros.h" @@ -66,7 +65,7 @@ class FlatlandExternalViewEmbedder final std::vector GetCurrentCanvases() override; // |ExternalViewEmbedder| - std::vector GetCurrentBuilders() override; + std::vector GetCurrentBuilders() override; // |ExternalViewEmbedder| void PrerollCompositeEmbeddedView( From abc3b79ea252b82864ed62681036cd744ef5287d Mon Sep 17 00:00:00 2001 From: Jim Graham Date: Mon, 15 Aug 2022 20:02:26 -0700 Subject: [PATCH 05/10] implement new methods in GfxExternalViewEmbedder --- shell/platform/fuchsia/flutter/gfx_external_view_embedder.cc | 5 +++++ shell/platform/fuchsia/flutter/gfx_external_view_embedder.h | 3 +++ 2 files changed, 8 insertions(+) diff --git a/shell/platform/fuchsia/flutter/gfx_external_view_embedder.cc b/shell/platform/fuchsia/flutter/gfx_external_view_embedder.cc index 1501e8fbd8268..aeac5c766857e 100644 --- a/shell/platform/fuchsia/flutter/gfx_external_view_embedder.cc +++ b/shell/platform/fuchsia/flutter/gfx_external_view_embedder.cc @@ -164,6 +164,11 @@ std::vector GfxExternalViewEmbedder::GetCurrentCanvases() { return canvases; } +std::vector +GfxExternalViewEmbedder::GetCurrentBuilders() { + return std::vector({}); +} + void GfxExternalViewEmbedder::PrerollCompositeEmbeddedView( int view_id, std::unique_ptr params) { diff --git a/shell/platform/fuchsia/flutter/gfx_external_view_embedder.h b/shell/platform/fuchsia/flutter/gfx_external_view_embedder.h index 09be1bf769b21..c2e67e34a2845 100644 --- a/shell/platform/fuchsia/flutter/gfx_external_view_embedder.h +++ b/shell/platform/fuchsia/flutter/gfx_external_view_embedder.h @@ -87,6 +87,9 @@ class GfxExternalViewEmbedder final : public flutter::ExternalViewEmbedder { // |ExternalViewEmbedder| std::vector GetCurrentCanvases() override; + // |ExternalViewEmbedder| + std::vector GetCurrentBuilders() override; + // |ExternalViewEmbedder| void PrerollCompositeEmbeddedView( int view_id, From 7e693fd211f933389ac640879168f69c81654cda Mon Sep 17 00:00:00 2001 From: Jim Graham Date: Mon, 15 Aug 2022 20:06:33 -0700 Subject: [PATCH 06/10] fix return values in Fuchsia code --- .../fuchsia/flutter/flatland_external_view_embedder.cc | 5 +++-- shell/platform/fuchsia/flutter/gfx_external_view_embedder.cc | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/shell/platform/fuchsia/flutter/flatland_external_view_embedder.cc b/shell/platform/fuchsia/flutter/flatland_external_view_embedder.cc index 49756e789f176..54d91c1fe8a8e 100644 --- a/shell/platform/fuchsia/flutter/flatland_external_view_embedder.cc +++ b/shell/platform/fuchsia/flutter/flatland_external_view_embedder.cc @@ -56,8 +56,9 @@ std::vector FlatlandExternalViewEmbedder::GetCurrentCanvases() { return canvases; } -std::vector FlatlandExternalViewEmbedder::GetCurrentBuilders() { - return std::vector(); +std::vector +FlatlandExternalViewEmbedder::GetCurrentBuilders() { + return std::vector(); } void FlatlandExternalViewEmbedder::PrerollCompositeEmbeddedView( diff --git a/shell/platform/fuchsia/flutter/gfx_external_view_embedder.cc b/shell/platform/fuchsia/flutter/gfx_external_view_embedder.cc index aeac5c766857e..1cd292764efa3 100644 --- a/shell/platform/fuchsia/flutter/gfx_external_view_embedder.cc +++ b/shell/platform/fuchsia/flutter/gfx_external_view_embedder.cc @@ -166,7 +166,7 @@ std::vector GfxExternalViewEmbedder::GetCurrentCanvases() { std::vector GfxExternalViewEmbedder::GetCurrentBuilders() { - return std::vector({}); + return std::vector({}); } void GfxExternalViewEmbedder::PrerollCompositeEmbeddedView( From 237f664cb7559823ffe69ea7f93daffa6a8efb2c Mon Sep 17 00:00:00 2001 From: Jim Graham Date: Mon, 15 Aug 2022 20:09:35 -0700 Subject: [PATCH 07/10] switch to auto* declarations and add comment for new method --- display_list/display_list_builder_multiplexer.cc | 4 ++-- .../android/external_view_embedder/external_view_embedder.h | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/display_list/display_list_builder_multiplexer.cc b/display_list/display_list_builder_multiplexer.cc index 11e583b081d2b..0c029c532f89d 100644 --- a/display_list/display_list_builder_multiplexer.cc +++ b/display_list/display_list_builder_multiplexer.cc @@ -14,13 +14,13 @@ void DisplayListBuilderMultiplexer::saveLayer( const SkRect* bounds, const DlPaint* paint, const DlImageFilter* backdrop_filter) { - for (auto builder : builders_) { + for (auto* builder : builders_) { builder->saveLayer(bounds, paint, backdrop_filter); } } void DisplayListBuilderMultiplexer::restore() { - for (auto builder : builders_) { + for (auto* builder : builders_) { builder->restore(); } } diff --git a/shell/platform/android/external_view_embedder/external_view_embedder.h b/shell/platform/android/external_view_embedder/external_view_embedder.h index 08e6a0d0f5080..5bae7a4e1c9e7 100644 --- a/shell/platform/android/external_view_embedder/external_view_embedder.h +++ b/shell/platform/android/external_view_embedder/external_view_embedder.h @@ -48,6 +48,9 @@ class AndroidExternalViewEmbedder final : public ExternalViewEmbedder { std::vector GetCurrentCanvases() override; // |ExternalViewEmbedder| + // Similar call to GetCurrentCanvases but will return the array of + // builders being used by PlatformViews on platforms that provide + // optional DisplayListBuilder objects for rendering. std::vector GetCurrentBuilders() override; // |ExternalViewEmbedder| From 7b0055da04ccf5db380dcb56b1775f536ea4ef74 Mon Sep 17 00:00:00 2001 From: Jim Graham Date: Mon, 15 Aug 2022 20:41:53 -0700 Subject: [PATCH 08/10] auto* instead of auto --- flow/layers/layer_tree.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flow/layers/layer_tree.cc b/flow/layers/layer_tree.cc index 9ecc13d6f7398..de7573ef4ac39 100644 --- a/flow/layers/layer_tree.cc +++ b/flow/layers/layer_tree.cc @@ -124,7 +124,7 @@ void LayerTree::Paint(CompositorContext::ScopedFrame& frame, if (builder) { builder_multiplexer.addBuilder(builder); if (frame.view_embedder()) { - for (auto view_builder : frame.view_embedder()->GetCurrentBuilders()) { + for (auto* view_builder : frame.view_embedder()->GetCurrentBuilders()) { builder_multiplexer.addBuilder(view_builder); } } From b609fa93ae762a4e8e5d84766cac0780b28130cb Mon Sep 17 00:00:00 2001 From: Jim Graham Date: Mon, 15 Aug 2022 21:12:51 -0700 Subject: [PATCH 09/10] fix Fuchsia mock embedder --- shell/platform/fuchsia/flutter/platform_view_unittest.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/shell/platform/fuchsia/flutter/platform_view_unittest.cc b/shell/platform/fuchsia/flutter/platform_view_unittest.cc index 4f6a9cc2149c4..3d7eb7977f5c0 100644 --- a/shell/platform/fuchsia/flutter/platform_view_unittest.cc +++ b/shell/platform/fuchsia/flutter/platform_view_unittest.cc @@ -48,6 +48,9 @@ class MockExternalViewEmbedder : public flutter::ExternalViewEmbedder { std::vector GetCurrentCanvases() override { return std::vector(); } + std::vector GetCurrentBuilders() override { + return std::vector(); + } void CancelFrame() override {} void BeginFrame( From bcf398e73f501c06b9928e27af8133e76e1a8075 Mon Sep 17 00:00:00 2001 From: Jim Graham Date: Mon, 15 Aug 2022 21:41:32 -0700 Subject: [PATCH 10/10] more Mock embedder implementations and test iOS builders --- .../darwin/ios/framework/Source/FlutterPlatformViewsTest.mm | 3 +++ .../fuchsia/flutter/tests/flatland_platform_view_unittest.cc | 3 +++ 2 files changed, 6 insertions(+) diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm index b91880b3a4d09..cc205e91bd3f6 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm @@ -1076,16 +1076,19 @@ - (void)testFlutterPlatformViewControllerBeginFrameShouldResetCompisitionOrder { flutterPlatformViewsController->PrerollCompositeEmbeddedView(0, std::move(embeddedViewParams1)); flutterPlatformViewsController->CompositeEmbeddedView(0); XCTAssertEqual(flutterPlatformViewsController->GetCurrentCanvases().size(), 1UL); + XCTAssertEqual(flutterPlatformViewsController->GetCurrentBuilders().size(), 1UL); // Second frame, |GetCurrentCanvases| should be empty at the start flutterPlatformViewsController->BeginFrame(SkISize::Make(300, 300)); XCTAssertTrue(flutterPlatformViewsController->GetCurrentCanvases().empty()); + XCTAssertTrue(flutterPlatformViewsController->GetCurrentBuilders().empty()); auto embeddedViewParams2 = std::make_unique(finalMatrix, SkSize::Make(300, 300), stack); flutterPlatformViewsController->PrerollCompositeEmbeddedView(0, std::move(embeddedViewParams2)); flutterPlatformViewsController->CompositeEmbeddedView(0); XCTAssertEqual(flutterPlatformViewsController->GetCurrentCanvases().size(), 1UL); + XCTAssertEqual(flutterPlatformViewsController->GetCurrentBuilders().size(), 1UL); } - (void)testThreadMergeAtEndFrame { diff --git a/shell/platform/fuchsia/flutter/tests/flatland_platform_view_unittest.cc b/shell/platform/fuchsia/flutter/tests/flatland_platform_view_unittest.cc index beaf150684a7e..f2565ac69c9c4 100644 --- a/shell/platform/fuchsia/flutter/tests/flatland_platform_view_unittest.cc +++ b/shell/platform/fuchsia/flutter/tests/flatland_platform_view_unittest.cc @@ -47,6 +47,9 @@ class MockExternalViewEmbedder : public flutter::ExternalViewEmbedder { std::vector GetCurrentCanvases() override { return std::vector(); } + std::vector GetCurrentBuilders() override { + return std::vector(); + } void CancelFrame() override {} void BeginFrame(