From afbb37ab5bfe8a0d6373675c86208f9e90e632de Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Wed, 15 Jun 2022 17:12:27 -0700 Subject: [PATCH 01/43] Testing Preroll/Paint --- flow/layers/backdrop_filter_layer.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/flow/layers/backdrop_filter_layer.cc b/flow/layers/backdrop_filter_layer.cc index 8e8ef2628a16b..d026b2b16fbd4 100644 --- a/flow/layers/backdrop_filter_layer.cc +++ b/flow/layers/backdrop_filter_layer.cc @@ -40,6 +40,7 @@ void BackdropFilterLayer::Diff(DiffContext* context, const Layer* old_layer) { void BackdropFilterLayer::Preroll(PrerollContext* context, const SkMatrix& matrix) { + FML_DLOG(ERROR) << "In Preroll"; Layer::AutoPrerollSaveLayerState save = Layer::AutoPrerollSaveLayerState::Create(context, true, bool(filter_)); SkRect child_paint_bounds = SkRect::MakeEmpty(); @@ -51,7 +52,7 @@ void BackdropFilterLayer::Preroll(PrerollContext* context, void BackdropFilterLayer::Paint(PaintContext& context) const { TRACE_EVENT0("flutter", "BackdropFilterLayer::Paint"); FML_DCHECK(needs_painting(context)); - + FML_DLOG(ERROR) << "In Paint"; SkPaint paint; paint.setBlendMode(blend_mode_); Layer::AutoSaveLayer save = Layer::AutoSaveLayer::Create( From 5103d9d5df7df05720015393d8c38d35c613e8f3 Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Fri, 17 Jun 2022 14:57:06 -0700 Subject: [PATCH 02/43] Pushed opacity to platform view stack / Background Filter Proto 1 --- backdrop_filter_diff | 95 +++++++++++++++++++ flow/embedded_views.h | 16 ++++ flow/layers/backdrop_filter_layer.cc | 7 +- flow/layers/platform_view_layer.cc | 1 + .../framework/Source/FlutterPlatformViews.mm | 7 ++ .../Source/FlutterPlatformViews_Internal.h | 4 + .../darwin/ios/ios_external_view_embedder.h | 2 + .../darwin/ios/ios_external_view_embedder.mm | 4 + 8 files changed, 134 insertions(+), 2 deletions(-) create mode 100644 backdrop_filter_diff diff --git a/backdrop_filter_diff b/backdrop_filter_diff new file mode 100644 index 0000000000000..d152b3560ef63 --- /dev/null +++ b/backdrop_filter_diff @@ -0,0 +1,95 @@ +diff --git a/flow/embedded_views.h b/flow/embedded_views.h +index 7a5a34f330..76b002befd 100644 +--- a/flow/embedded_views.h ++++ b/flow/embedded_views.h +@@ -345,6 +345,8 @@ class ExternalViewEmbedder { + // 'EndFrame', otherwise returns false. + bool GetUsedThisFrame() const { return used_this_frame_; } + ++ void PushMutator() {} ++ + private: + bool used_this_frame_ = false; + +diff --git a/flow/layers/backdrop_filter_layer.cc b/flow/layers/backdrop_filter_layer.cc +index 8e8ef2628a..b059e427c3 100644 +--- a/flow/layers/backdrop_filter_layer.cc ++++ b/flow/layers/backdrop_filter_layer.cc +@@ -43,6 +43,10 @@ void BackdropFilterLayer::Preroll(PrerollContext* context, + Layer::AutoPrerollSaveLayerState save = + Layer::AutoPrerollSaveLayerState::Create(context, true, bool(filter_)); + SkRect child_paint_bounds = SkRect::MakeEmpty(); ++ auto visited_platform_views = context->view_embedder->GetVisitedPlatformViews(); ++ for (id in visited_platform_views) { ++ context->view_embedder->ApplyMutator(id, alpha); ++ } + PrerollChildren(context, matrix, &child_paint_bounds); + child_paint_bounds.join(context->cull_rect); + set_paint_bounds(child_paint_bounds); +diff --git a/flow/layers/platform_view_layer.cc b/flow/layers/platform_view_layer.cc +index 285db390cc..63b7827cf9 100644 +--- a/flow/layers/platform_view_layer.cc ++++ b/flow/layers/platform_view_layer.cc +@@ -28,6 +28,7 @@ void PlatformViewLayer::Preroll(PrerollContext* context, + context->mutators_stack); + context->view_embedder->PrerollCompositeEmbeddedView(view_id_, + std::move(params)); ++ context->view_embedder->PushVisitedPlatformView(view_id_); + } + + void PlatformViewLayer::Paint(PaintContext& context) const { +diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +index e5325aee85..a6992cca3f 100644 +--- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm ++++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +@@ -319,6 +319,11 @@ void FlutterPlatformViewsController::EndFrame( + } + } + ++void FlutterPlatformViewsController::PushMutator(flutter::Mutator mutator, int64_t platform_view_id) { ++ EmbeddedViewParams params = current_composition_params_[platform_view_id]; ++ params.mutatorsStack().PushOpacity(20); ++} ++ + void FlutterPlatformViewsController::PrerollCompositeEmbeddedView( + int view_id, + std::unique_ptr params) { +diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h +index fde21d23e2..522b847ef4 100644 +--- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h ++++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h +@@ -184,6 +184,8 @@ class FlutterPlatformViewsController { + // responder. Returns -1 if no such platform view is found. + long FindFirstResponderPlatformViewId(); + ++ void PushMutator(flutter::Mutator mutator, int64_t platform_view_id); ++ + private: + static const size_t kMaxLayerAllocations = 2; + +diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.h b/shell/platform/darwin/ios/ios_external_view_embedder.h +index 6c023d1b79..da160dd023 100644 +--- a/shell/platform/darwin/ios/ios_external_view_embedder.h ++++ b/shell/platform/darwin/ios/ios_external_view_embedder.h +@@ -64,6 +64,8 @@ class IOSExternalViewEmbedder : public ExternalViewEmbedder { + // |ExternalViewEmbedder| + bool SupportsDynamicThreadMerging() override; + ++ void PushMutator() override; ++ + FML_DISALLOW_COPY_AND_ASSIGN(IOSExternalViewEmbedder); + }; + +diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.mm b/shell/platform/darwin/ios/ios_external_view_embedder.mm +index 1323fa4c2f..edd4a3adcd 100644 +--- a/shell/platform/darwin/ios/ios_external_view_embedder.mm ++++ b/shell/platform/darwin/ios/ios_external_view_embedder.mm +@@ -92,4 +92,8 @@ bool IOSExternalViewEmbedder::SupportsDynamicThreadMerging() { + return true; + } + ++void PushMutator(int alpha, int view_id) { ++ platform_views_controller_->PushMutator(alpha, view_id); ++} ++ + } // namespace flutter diff --git a/flow/embedded_views.h b/flow/embedded_views.h index 7a5a34f33069b..11926f1ed20ad 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -224,6 +224,10 @@ class EmbeddedViewParams { // Clippings are ignored. const SkRect& finalBoundingRect() const { return final_bounding_rect_; } + void PushFilter(int opacity) { + mutators_stack_.PushOpacity(opacity); + } + bool operator==(const EmbeddedViewParams& other) const { return size_points_ == other.size_points_ && mutators_stack_ == other.mutators_stack_ && @@ -345,9 +349,21 @@ class ExternalViewEmbedder { // 'EndFrame', otherwise returns false. bool GetUsedThisFrame() const { return used_this_frame_; } + std::vector GetVisitedPlatformViews() { + return visited_platform_views_; + } + + void PushVisitedPlatformView(int64_t view_id) { + visited_platform_views_.push_back(view_id); + } + + virtual void PushMutator(int64_t view_id) {} //int alpha + private: bool used_this_frame_ = false; + std::vector visited_platform_views_; + FML_DISALLOW_COPY_AND_ASSIGN(ExternalViewEmbedder); }; // ExternalViewEmbedder diff --git a/flow/layers/backdrop_filter_layer.cc b/flow/layers/backdrop_filter_layer.cc index d026b2b16fbd4..9003248d2d25d 100644 --- a/flow/layers/backdrop_filter_layer.cc +++ b/flow/layers/backdrop_filter_layer.cc @@ -40,10 +40,14 @@ void BackdropFilterLayer::Diff(DiffContext* context, const Layer* old_layer) { void BackdropFilterLayer::Preroll(PrerollContext* context, const SkMatrix& matrix) { - FML_DLOG(ERROR) << "In Preroll"; Layer::AutoPrerollSaveLayerState save = Layer::AutoPrerollSaveLayerState::Create(context, true, bool(filter_)); SkRect child_paint_bounds = SkRect::MakeEmpty(); + auto visited_platform_views = context->view_embedder->GetVisitedPlatformViews(); + for (int64_t id : visited_platform_views) { + context->view_embedder->PushMutator(id); + } + PrerollChildren(context, matrix, &child_paint_bounds); child_paint_bounds.join(context->cull_rect); set_paint_bounds(child_paint_bounds); @@ -52,7 +56,6 @@ void BackdropFilterLayer::Preroll(PrerollContext* context, void BackdropFilterLayer::Paint(PaintContext& context) const { TRACE_EVENT0("flutter", "BackdropFilterLayer::Paint"); FML_DCHECK(needs_painting(context)); - FML_DLOG(ERROR) << "In Paint"; SkPaint paint; paint.setBlendMode(blend_mode_); Layer::AutoSaveLayer save = Layer::AutoSaveLayer::Create( diff --git a/flow/layers/platform_view_layer.cc b/flow/layers/platform_view_layer.cc index 285db390cc91d..63b7827cf9d52 100644 --- a/flow/layers/platform_view_layer.cc +++ b/flow/layers/platform_view_layer.cc @@ -28,6 +28,7 @@ void PlatformViewLayer::Preroll(PrerollContext* context, context->mutators_stack); context->view_embedder->PrerollCompositeEmbeddedView(view_id_, std::move(params)); + context->view_embedder->PushVisitedPlatformView(view_id_); } void PlatformViewLayer::Paint(PaintContext& context) const { diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm index e5325aee855b6..a424afac0e560 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm @@ -319,6 +319,13 @@ - (BOOL)flt_hasFirstResponderInViewHierarchySubtree { } } +void FlutterPlatformViewsController::PushMutator(int64_t platform_view_id) { //flutter::Mutator mutator, + EmbeddedViewParams params = current_composition_params_[platform_view_id]; + params.PushFilter(10); + EmbeddedViewParams newParams = EmbeddedViewParams(params.transformMatrix(), params.sizePoints(), params.mutatorsStack()); + current_composition_params_[platform_view_id] = newParams; +} + void FlutterPlatformViewsController::PrerollCompositeEmbeddedView( int view_id, std::unique_ptr params) { diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h index fde21d23e2e20..333d9ca1e5057 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h @@ -184,6 +184,8 @@ class FlutterPlatformViewsController { // responder. Returns -1 if no such platform view is found. long FindFirstResponderPlatformViewId(); + void PushMutator(int64_t platform_view_id); //flutter::Mutator mutator, + private: static const size_t kMaxLayerAllocations = 2; @@ -298,6 +300,8 @@ class FlutterPlatformViewsController { // The latest composition order that was presented in Present(). std::vector active_composition_order_; + + // Only compoiste platform views in this set. std::unordered_set views_to_recomposite_; diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.h b/shell/platform/darwin/ios/ios_external_view_embedder.h index 6c023d1b793e1..872745b662841 100644 --- a/shell/platform/darwin/ios/ios_external_view_embedder.h +++ b/shell/platform/darwin/ios/ios_external_view_embedder.h @@ -64,6 +64,8 @@ class IOSExternalViewEmbedder : public ExternalViewEmbedder { // |ExternalViewEmbedder| bool SupportsDynamicThreadMerging() override; + void PushMutator(int64_t view_id) override; + FML_DISALLOW_COPY_AND_ASSIGN(IOSExternalViewEmbedder); }; diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.mm b/shell/platform/darwin/ios/ios_external_view_embedder.mm index 1323fa4c2f487..57e73ed672c04 100644 --- a/shell/platform/darwin/ios/ios_external_view_embedder.mm +++ b/shell/platform/darwin/ios/ios_external_view_embedder.mm @@ -92,4 +92,8 @@ return true; } +void IOSExternalViewEmbedder::PushMutator(int64_t view_id) { //int alpha, + platform_views_controller_->PushMutator(view_id); +} + } // namespace flutter From 825fbc8d547235881ac04d4680e5ba95694e9b33 Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Thu, 23 Jun 2022 15:21:20 -0700 Subject: [PATCH 03/43] Create Backdrop Filter Mutator --- backdrop_filter_diff | 95 +++++++++++++++++++ flow/embedded_views.cc | 5 + flow/embedded_views.h | 27 +++++- flow/layers/backdrop_filter_layer.cc | 6 +- flow/layers/platform_view_layer.cc | 1 + .../framework/Source/FlutterPlatformViews.mm | 10 ++ .../Source/FlutterPlatformViews_Internal.h | 2 + .../darwin/ios/ios_external_view_embedder.h | 2 + .../darwin/ios/ios_external_view_embedder.mm | 4 + shell/platform/embedder/embedder_layers.cc | 6 +- 10 files changed, 154 insertions(+), 4 deletions(-) create mode 100644 backdrop_filter_diff diff --git a/backdrop_filter_diff b/backdrop_filter_diff new file mode 100644 index 0000000000000..d152b3560ef63 --- /dev/null +++ b/backdrop_filter_diff @@ -0,0 +1,95 @@ +diff --git a/flow/embedded_views.h b/flow/embedded_views.h +index 7a5a34f330..76b002befd 100644 +--- a/flow/embedded_views.h ++++ b/flow/embedded_views.h +@@ -345,6 +345,8 @@ class ExternalViewEmbedder { + // 'EndFrame', otherwise returns false. + bool GetUsedThisFrame() const { return used_this_frame_; } + ++ void PushMutator() {} ++ + private: + bool used_this_frame_ = false; + +diff --git a/flow/layers/backdrop_filter_layer.cc b/flow/layers/backdrop_filter_layer.cc +index 8e8ef2628a..b059e427c3 100644 +--- a/flow/layers/backdrop_filter_layer.cc ++++ b/flow/layers/backdrop_filter_layer.cc +@@ -43,6 +43,10 @@ void BackdropFilterLayer::Preroll(PrerollContext* context, + Layer::AutoPrerollSaveLayerState save = + Layer::AutoPrerollSaveLayerState::Create(context, true, bool(filter_)); + SkRect child_paint_bounds = SkRect::MakeEmpty(); ++ auto visited_platform_views = context->view_embedder->GetVisitedPlatformViews(); ++ for (id in visited_platform_views) { ++ context->view_embedder->ApplyMutator(id, alpha); ++ } + PrerollChildren(context, matrix, &child_paint_bounds); + child_paint_bounds.join(context->cull_rect); + set_paint_bounds(child_paint_bounds); +diff --git a/flow/layers/platform_view_layer.cc b/flow/layers/platform_view_layer.cc +index 285db390cc..63b7827cf9 100644 +--- a/flow/layers/platform_view_layer.cc ++++ b/flow/layers/platform_view_layer.cc +@@ -28,6 +28,7 @@ void PlatformViewLayer::Preroll(PrerollContext* context, + context->mutators_stack); + context->view_embedder->PrerollCompositeEmbeddedView(view_id_, + std::move(params)); ++ context->view_embedder->PushVisitedPlatformView(view_id_); + } + + void PlatformViewLayer::Paint(PaintContext& context) const { +diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +index e5325aee85..a6992cca3f 100644 +--- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm ++++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +@@ -319,6 +319,11 @@ void FlutterPlatformViewsController::EndFrame( + } + } + ++void FlutterPlatformViewsController::PushMutator(flutter::Mutator mutator, int64_t platform_view_id) { ++ EmbeddedViewParams params = current_composition_params_[platform_view_id]; ++ params.mutatorsStack().PushOpacity(20); ++} ++ + void FlutterPlatformViewsController::PrerollCompositeEmbeddedView( + int view_id, + std::unique_ptr params) { +diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h +index fde21d23e2..522b847ef4 100644 +--- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h ++++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h +@@ -184,6 +184,8 @@ class FlutterPlatformViewsController { + // responder. Returns -1 if no such platform view is found. + long FindFirstResponderPlatformViewId(); + ++ void PushMutator(flutter::Mutator mutator, int64_t platform_view_id); ++ + private: + static const size_t kMaxLayerAllocations = 2; + +diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.h b/shell/platform/darwin/ios/ios_external_view_embedder.h +index 6c023d1b79..da160dd023 100644 +--- a/shell/platform/darwin/ios/ios_external_view_embedder.h ++++ b/shell/platform/darwin/ios/ios_external_view_embedder.h +@@ -64,6 +64,8 @@ class IOSExternalViewEmbedder : public ExternalViewEmbedder { + // |ExternalViewEmbedder| + bool SupportsDynamicThreadMerging() override; + ++ void PushMutator() override; ++ + FML_DISALLOW_COPY_AND_ASSIGN(IOSExternalViewEmbedder); + }; + +diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.mm b/shell/platform/darwin/ios/ios_external_view_embedder.mm +index 1323fa4c2f..edd4a3adcd 100644 +--- a/shell/platform/darwin/ios/ios_external_view_embedder.mm ++++ b/shell/platform/darwin/ios/ios_external_view_embedder.mm +@@ -92,4 +92,8 @@ bool IOSExternalViewEmbedder::SupportsDynamicThreadMerging() { + return true; + } + ++void PushMutator(int alpha, int view_id) { ++ platform_views_controller_->PushMutator(alpha, view_id); ++} ++ + } // namespace flutter diff --git a/flow/embedded_views.cc b/flow/embedded_views.cc index c85ad66f8dc75..c7b4811e8e07e 100644 --- a/flow/embedded_views.cc +++ b/flow/embedded_views.cc @@ -36,6 +36,11 @@ void MutatorsStack::PushOpacity(const int& alpha) { vector_.push_back(element); }; +void MutatorsStack::PushBackdropFilter(const sk_sp& filter) { + std::shared_ptr element = std::make_shared(filter); + vector_.push_back(element); +}; + void MutatorsStack::Pop() { vector_.pop_back(); }; diff --git a/flow/embedded_views.h b/flow/embedded_views.h index 7a5a34f33069b..45810908f35da 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -21,7 +21,7 @@ namespace flutter { // TODO(chinmaygarde): Make these enum names match the style guide. -enum MutatorType { clip_rect, clip_rrect, clip_path, transform, opacity }; +enum MutatorType { clip_rect, clip_rrect, clip_path, transform, opacity, backdrop_filter }; // Stores mutation information like clipping or transform. // @@ -49,6 +49,9 @@ class Mutator { case opacity: alpha_ = other.alpha_; break; + case backdrop_filter: + filter_ = other.filter_; + break; default: break; } @@ -61,12 +64,14 @@ class Mutator { explicit Mutator(const SkMatrix& matrix) : type_(transform), matrix_(matrix) {} explicit Mutator(const int& alpha) : type_(opacity), alpha_(alpha) {} + explicit Mutator(const sk_sp& filter) : type_(backdrop_filter), filter_(filter) {} const MutatorType& GetType() const { return type_; } const SkRect& GetRect() const { return rect_; } const SkRRect& GetRRect() const { return rrect_; } const SkPath& GetPath() const { return *path_; } const SkMatrix& GetMatrix() const { return matrix_; } + const sk_sp& GetFilter() const {return filter_; } const int& GetAlpha() const { return alpha_; } float GetAlphaFloat() const { return (alpha_ / 255.0); } @@ -85,6 +90,8 @@ class Mutator { return matrix_ == other.matrix_; case opacity: return alpha_ == other.alpha_; + case backdrop_filter: + return filter_ == other.filter_; } return false; @@ -111,6 +118,7 @@ class Mutator { SkMatrix matrix_; SkPath* path_; int alpha_; + sk_sp filter_; }; }; // Mutator @@ -133,6 +141,7 @@ class MutatorsStack { void PushClipPath(const SkPath& path); void PushTransform(const SkMatrix& matrix); void PushOpacity(const int& alpha); + void PushBackdropFilter(const sk_sp& filter); // Removes the `Mutator` on the top of the stack // and destroys it. @@ -224,6 +233,10 @@ class EmbeddedViewParams { // Clippings are ignored. const SkRect& finalBoundingRect() const { return final_bounding_rect_; } + void PushFilter(sk_sp filter) { + mutators_stack_.PushBackdropFilter(filter); + } + bool operator==(const EmbeddedViewParams& other) const { return size_points_ == other.size_points_ && mutators_stack_ == other.mutators_stack_ && @@ -345,9 +358,21 @@ class ExternalViewEmbedder { // 'EndFrame', otherwise returns false. bool GetUsedThisFrame() const { return used_this_frame_; } + std::vector GetVisitedPlatformViews() { + return visited_platform_views_; + } + + void PushVisitedPlatformView(int64_t view_id) { + visited_platform_views_.push_back(view_id); + } + + virtual void FilterPlatformViews(int64_t view_id, sk_sp filter) {} + private: bool used_this_frame_ = false; + std::vector visited_platform_views_; + FML_DISALLOW_COPY_AND_ASSIGN(ExternalViewEmbedder); }; // ExternalViewEmbedder diff --git a/flow/layers/backdrop_filter_layer.cc b/flow/layers/backdrop_filter_layer.cc index 8e8ef2628a16b..e4da4f7f98616 100644 --- a/flow/layers/backdrop_filter_layer.cc +++ b/flow/layers/backdrop_filter_layer.cc @@ -43,6 +43,11 @@ void BackdropFilterLayer::Preroll(PrerollContext* context, Layer::AutoPrerollSaveLayerState save = Layer::AutoPrerollSaveLayerState::Create(context, true, bool(filter_)); SkRect child_paint_bounds = SkRect::MakeEmpty(); + auto visited_platform_views = context->view_embedder->GetVisitedPlatformViews(); + for (int64_t id : visited_platform_views) { + context->view_embedder->FilterPlatformViews(id, filter_); + } + PrerollChildren(context, matrix, &child_paint_bounds); child_paint_bounds.join(context->cull_rect); set_paint_bounds(child_paint_bounds); @@ -51,7 +56,6 @@ void BackdropFilterLayer::Preroll(PrerollContext* context, void BackdropFilterLayer::Paint(PaintContext& context) const { TRACE_EVENT0("flutter", "BackdropFilterLayer::Paint"); FML_DCHECK(needs_painting(context)); - SkPaint paint; paint.setBlendMode(blend_mode_); Layer::AutoSaveLayer save = Layer::AutoSaveLayer::Create( diff --git a/flow/layers/platform_view_layer.cc b/flow/layers/platform_view_layer.cc index 285db390cc91d..63b7827cf9d52 100644 --- a/flow/layers/platform_view_layer.cc +++ b/flow/layers/platform_view_layer.cc @@ -28,6 +28,7 @@ void PlatformViewLayer::Preroll(PrerollContext* context, context->mutators_stack); context->view_embedder->PrerollCompositeEmbeddedView(view_id_, std::move(params)); + context->view_embedder->PushVisitedPlatformView(view_id_); } void PlatformViewLayer::Paint(PaintContext& context) const { diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm index e5325aee855b6..66b6004c8ba07 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm @@ -319,6 +319,13 @@ - (BOOL)flt_hasFirstResponderInViewHierarchySubtree { } } +void FlutterPlatformViewsController::FilterPlatformViews(int64_t platform_view_id, sk_sp filter) { + FML_DLOG(ERROR) << "FilterPlatformViews"; + EmbeddedViewParams params = current_composition_params_[platform_view_id]; + params.PushFilter(filter); + current_composition_params_[platform_view_id] = params; +} + void FlutterPlatformViewsController::PrerollCompositeEmbeddedView( int view_id, std::unique_ptr params) { @@ -422,6 +429,9 @@ - (BOOL)flt_hasFirstResponderInViewHierarchySubtree { case opacity: embedded_view.alpha = (*iter)->GetAlphaFloat() * embedded_view.alpha; break; + case backdrop_filter: + FML_DLOG(ERROR) << "SWITCH TEST"; + break; } ++iter; } diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h index fde21d23e2e20..1d815217776b5 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h @@ -184,6 +184,8 @@ class FlutterPlatformViewsController { // responder. Returns -1 if no such platform view is found. long FindFirstResponderPlatformViewId(); + void FilterPlatformViews(int64_t platform_view_id, sk_sp filter);//, flutter::Mutator mutator + private: static const size_t kMaxLayerAllocations = 2; diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.h b/shell/platform/darwin/ios/ios_external_view_embedder.h index 6c023d1b793e1..2705ac45a4ca5 100644 --- a/shell/platform/darwin/ios/ios_external_view_embedder.h +++ b/shell/platform/darwin/ios/ios_external_view_embedder.h @@ -64,6 +64,8 @@ class IOSExternalViewEmbedder : public ExternalViewEmbedder { // |ExternalViewEmbedder| bool SupportsDynamicThreadMerging() override; + void FilterPlatformViews(int64_t view_id, sk_sp filter) override;//, flutter::Mutator mutator + FML_DISALLOW_COPY_AND_ASSIGN(IOSExternalViewEmbedder); }; diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.mm b/shell/platform/darwin/ios/ios_external_view_embedder.mm index 1323fa4c2f487..0f1ee308c8211 100644 --- a/shell/platform/darwin/ios/ios_external_view_embedder.mm +++ b/shell/platform/darwin/ios/ios_external_view_embedder.mm @@ -92,4 +92,8 @@ return true; } +void IOSExternalViewEmbedder::FilterPlatformViews(int64_t view_id, sk_sp filter) { //, flutter::Mutator mutator + platform_views_controller_->FilterPlatformViews(view_id, filter);//, mutator +} + } // namespace flutter diff --git a/shell/platform/embedder/embedder_layers.cc b/shell/platform/embedder/embedder_layers.cc index 4716ea15683dd..99071955c0414 100644 --- a/shell/platform/embedder/embedder_layers.cc +++ b/shell/platform/embedder/embedder_layers.cc @@ -147,6 +147,8 @@ void EmbedderLayers::PushPlatformViewLayer( .get()); } } break; + case MutatorType::backdrop_filter: { + } break; } } @@ -159,8 +161,8 @@ void EmbedderLayers::PushPlatformViewLayer( .emplace_back(ConvertMutation(root_surface_transformation_)) .get()); } - - auto mutations = + + auto mutations = std::make_unique>( mutations_array.rbegin(), mutations_array.rend()); mutations_arrays_referenced_.emplace_back(std::move(mutations)); From 24c077f84a3c770569832d7951a038173863fe89 Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Thu, 23 Jun 2022 16:11:55 -0700 Subject: [PATCH 04/43] Removed Logs --- .../darwin/ios/framework/Source/FlutterPlatformViews.mm | 2 -- 1 file changed, 2 deletions(-) diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm index 66b6004c8ba07..65e6e32e5c173 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm @@ -320,7 +320,6 @@ - (BOOL)flt_hasFirstResponderInViewHierarchySubtree { } void FlutterPlatformViewsController::FilterPlatformViews(int64_t platform_view_id, sk_sp filter) { - FML_DLOG(ERROR) << "FilterPlatformViews"; EmbeddedViewParams params = current_composition_params_[platform_view_id]; params.PushFilter(filter); current_composition_params_[platform_view_id] = params; @@ -430,7 +429,6 @@ - (BOOL)flt_hasFirstResponderInViewHierarchySubtree { embedded_view.alpha = (*iter)->GetAlphaFloat() * embedded_view.alpha; break; case backdrop_filter: - FML_DLOG(ERROR) << "SWITCH TEST"; break; } ++iter; From e1a817d8157b3f671a4d5d3354bbcac007587865 Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Mon, 27 Jun 2022 15:24:51 -0700 Subject: [PATCH 05/43] Tests for PushFilter --- flow/mutators_stack_unittests.cc | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/flow/mutators_stack_unittests.cc b/flow/mutators_stack_unittests.cc index b165f68efc221..a74506b35f156 100644 --- a/flow/mutators_stack_unittests.cc +++ b/flow/mutators_stack_unittests.cc @@ -52,6 +52,17 @@ TEST(MutatorsStack, PushClipRect) { ASSERT_TRUE(iter->get()->GetRect() == rect); } +TEST(MutatorsStack, PushBackdropFilter) { + MutatorsStack stack; + sk_sp filter; + filter->filterBounds(SkIRect::MakeWH(10, 10), SkMatrix::I(), + SkImageFilter::kForward_MapDirection); + stack.PushBackdropFilter(filter); + auto iter = stack.Bottom(); + ASSERT_TRUE(iter->get()->GetType() == MutatorType::backdrop_filter); + ASSERT_TRUE(iter->get()->GetFilter() == filter); +} + TEST(MutatorsStack, PushClipRRect) { MutatorsStack stack; auto rrect = SkRRect::MakeEmpty(); From d06155cee469ec290387e44ea0e8bd3ffb9f83e9 Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Mon, 27 Jun 2022 15:26:46 -0700 Subject: [PATCH 06/43] Backdrop Filter Mutator --- backdrop_filter_diff | 95 +++++++++++++++++++ flow/embedded_views.cc | 5 + flow/embedded_views.h | 27 +++++- flow/layers/backdrop_filter_layer.cc | 6 +- flow/layers/platform_view_layer.cc | 1 + .../framework/Source/FlutterPlatformViews.mm | 8 ++ .../Source/FlutterPlatformViews_Internal.h | 2 + .../darwin/ios/ios_external_view_embedder.h | 2 + .../darwin/ios/ios_external_view_embedder.mm | 4 + shell/platform/embedder/embedder_layers.cc | 6 +- 10 files changed, 152 insertions(+), 4 deletions(-) create mode 100644 backdrop_filter_diff diff --git a/backdrop_filter_diff b/backdrop_filter_diff new file mode 100644 index 0000000000000..d152b3560ef63 --- /dev/null +++ b/backdrop_filter_diff @@ -0,0 +1,95 @@ +diff --git a/flow/embedded_views.h b/flow/embedded_views.h +index 7a5a34f330..76b002befd 100644 +--- a/flow/embedded_views.h ++++ b/flow/embedded_views.h +@@ -345,6 +345,8 @@ class ExternalViewEmbedder { + // 'EndFrame', otherwise returns false. + bool GetUsedThisFrame() const { return used_this_frame_; } + ++ void PushMutator() {} ++ + private: + bool used_this_frame_ = false; + +diff --git a/flow/layers/backdrop_filter_layer.cc b/flow/layers/backdrop_filter_layer.cc +index 8e8ef2628a..b059e427c3 100644 +--- a/flow/layers/backdrop_filter_layer.cc ++++ b/flow/layers/backdrop_filter_layer.cc +@@ -43,6 +43,10 @@ void BackdropFilterLayer::Preroll(PrerollContext* context, + Layer::AutoPrerollSaveLayerState save = + Layer::AutoPrerollSaveLayerState::Create(context, true, bool(filter_)); + SkRect child_paint_bounds = SkRect::MakeEmpty(); ++ auto visited_platform_views = context->view_embedder->GetVisitedPlatformViews(); ++ for (id in visited_platform_views) { ++ context->view_embedder->ApplyMutator(id, alpha); ++ } + PrerollChildren(context, matrix, &child_paint_bounds); + child_paint_bounds.join(context->cull_rect); + set_paint_bounds(child_paint_bounds); +diff --git a/flow/layers/platform_view_layer.cc b/flow/layers/platform_view_layer.cc +index 285db390cc..63b7827cf9 100644 +--- a/flow/layers/platform_view_layer.cc ++++ b/flow/layers/platform_view_layer.cc +@@ -28,6 +28,7 @@ void PlatformViewLayer::Preroll(PrerollContext* context, + context->mutators_stack); + context->view_embedder->PrerollCompositeEmbeddedView(view_id_, + std::move(params)); ++ context->view_embedder->PushVisitedPlatformView(view_id_); + } + + void PlatformViewLayer::Paint(PaintContext& context) const { +diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +index e5325aee85..a6992cca3f 100644 +--- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm ++++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +@@ -319,6 +319,11 @@ void FlutterPlatformViewsController::EndFrame( + } + } + ++void FlutterPlatformViewsController::PushMutator(flutter::Mutator mutator, int64_t platform_view_id) { ++ EmbeddedViewParams params = current_composition_params_[platform_view_id]; ++ params.mutatorsStack().PushOpacity(20); ++} ++ + void FlutterPlatformViewsController::PrerollCompositeEmbeddedView( + int view_id, + std::unique_ptr params) { +diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h +index fde21d23e2..522b847ef4 100644 +--- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h ++++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h +@@ -184,6 +184,8 @@ class FlutterPlatformViewsController { + // responder. Returns -1 if no such platform view is found. + long FindFirstResponderPlatformViewId(); + ++ void PushMutator(flutter::Mutator mutator, int64_t platform_view_id); ++ + private: + static const size_t kMaxLayerAllocations = 2; + +diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.h b/shell/platform/darwin/ios/ios_external_view_embedder.h +index 6c023d1b79..da160dd023 100644 +--- a/shell/platform/darwin/ios/ios_external_view_embedder.h ++++ b/shell/platform/darwin/ios/ios_external_view_embedder.h +@@ -64,6 +64,8 @@ class IOSExternalViewEmbedder : public ExternalViewEmbedder { + // |ExternalViewEmbedder| + bool SupportsDynamicThreadMerging() override; + ++ void PushMutator() override; ++ + FML_DISALLOW_COPY_AND_ASSIGN(IOSExternalViewEmbedder); + }; + +diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.mm b/shell/platform/darwin/ios/ios_external_view_embedder.mm +index 1323fa4c2f..edd4a3adcd 100644 +--- a/shell/platform/darwin/ios/ios_external_view_embedder.mm ++++ b/shell/platform/darwin/ios/ios_external_view_embedder.mm +@@ -92,4 +92,8 @@ bool IOSExternalViewEmbedder::SupportsDynamicThreadMerging() { + return true; + } + ++void PushMutator(int alpha, int view_id) { ++ platform_views_controller_->PushMutator(alpha, view_id); ++} ++ + } // namespace flutter diff --git a/flow/embedded_views.cc b/flow/embedded_views.cc index c85ad66f8dc75..c7b4811e8e07e 100644 --- a/flow/embedded_views.cc +++ b/flow/embedded_views.cc @@ -36,6 +36,11 @@ void MutatorsStack::PushOpacity(const int& alpha) { vector_.push_back(element); }; +void MutatorsStack::PushBackdropFilter(const sk_sp& filter) { + std::shared_ptr element = std::make_shared(filter); + vector_.push_back(element); +}; + void MutatorsStack::Pop() { vector_.pop_back(); }; diff --git a/flow/embedded_views.h b/flow/embedded_views.h index 7a5a34f33069b..45810908f35da 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -21,7 +21,7 @@ namespace flutter { // TODO(chinmaygarde): Make these enum names match the style guide. -enum MutatorType { clip_rect, clip_rrect, clip_path, transform, opacity }; +enum MutatorType { clip_rect, clip_rrect, clip_path, transform, opacity, backdrop_filter }; // Stores mutation information like clipping or transform. // @@ -49,6 +49,9 @@ class Mutator { case opacity: alpha_ = other.alpha_; break; + case backdrop_filter: + filter_ = other.filter_; + break; default: break; } @@ -61,12 +64,14 @@ class Mutator { explicit Mutator(const SkMatrix& matrix) : type_(transform), matrix_(matrix) {} explicit Mutator(const int& alpha) : type_(opacity), alpha_(alpha) {} + explicit Mutator(const sk_sp& filter) : type_(backdrop_filter), filter_(filter) {} const MutatorType& GetType() const { return type_; } const SkRect& GetRect() const { return rect_; } const SkRRect& GetRRect() const { return rrect_; } const SkPath& GetPath() const { return *path_; } const SkMatrix& GetMatrix() const { return matrix_; } + const sk_sp& GetFilter() const {return filter_; } const int& GetAlpha() const { return alpha_; } float GetAlphaFloat() const { return (alpha_ / 255.0); } @@ -85,6 +90,8 @@ class Mutator { return matrix_ == other.matrix_; case opacity: return alpha_ == other.alpha_; + case backdrop_filter: + return filter_ == other.filter_; } return false; @@ -111,6 +118,7 @@ class Mutator { SkMatrix matrix_; SkPath* path_; int alpha_; + sk_sp filter_; }; }; // Mutator @@ -133,6 +141,7 @@ class MutatorsStack { void PushClipPath(const SkPath& path); void PushTransform(const SkMatrix& matrix); void PushOpacity(const int& alpha); + void PushBackdropFilter(const sk_sp& filter); // Removes the `Mutator` on the top of the stack // and destroys it. @@ -224,6 +233,10 @@ class EmbeddedViewParams { // Clippings are ignored. const SkRect& finalBoundingRect() const { return final_bounding_rect_; } + void PushFilter(sk_sp filter) { + mutators_stack_.PushBackdropFilter(filter); + } + bool operator==(const EmbeddedViewParams& other) const { return size_points_ == other.size_points_ && mutators_stack_ == other.mutators_stack_ && @@ -345,9 +358,21 @@ class ExternalViewEmbedder { // 'EndFrame', otherwise returns false. bool GetUsedThisFrame() const { return used_this_frame_; } + std::vector GetVisitedPlatformViews() { + return visited_platform_views_; + } + + void PushVisitedPlatformView(int64_t view_id) { + visited_platform_views_.push_back(view_id); + } + + virtual void FilterPlatformViews(int64_t view_id, sk_sp filter) {} + private: bool used_this_frame_ = false; + std::vector visited_platform_views_; + FML_DISALLOW_COPY_AND_ASSIGN(ExternalViewEmbedder); }; // ExternalViewEmbedder diff --git a/flow/layers/backdrop_filter_layer.cc b/flow/layers/backdrop_filter_layer.cc index 8e8ef2628a16b..e4da4f7f98616 100644 --- a/flow/layers/backdrop_filter_layer.cc +++ b/flow/layers/backdrop_filter_layer.cc @@ -43,6 +43,11 @@ void BackdropFilterLayer::Preroll(PrerollContext* context, Layer::AutoPrerollSaveLayerState save = Layer::AutoPrerollSaveLayerState::Create(context, true, bool(filter_)); SkRect child_paint_bounds = SkRect::MakeEmpty(); + auto visited_platform_views = context->view_embedder->GetVisitedPlatformViews(); + for (int64_t id : visited_platform_views) { + context->view_embedder->FilterPlatformViews(id, filter_); + } + PrerollChildren(context, matrix, &child_paint_bounds); child_paint_bounds.join(context->cull_rect); set_paint_bounds(child_paint_bounds); @@ -51,7 +56,6 @@ void BackdropFilterLayer::Preroll(PrerollContext* context, void BackdropFilterLayer::Paint(PaintContext& context) const { TRACE_EVENT0("flutter", "BackdropFilterLayer::Paint"); FML_DCHECK(needs_painting(context)); - SkPaint paint; paint.setBlendMode(blend_mode_); Layer::AutoSaveLayer save = Layer::AutoSaveLayer::Create( diff --git a/flow/layers/platform_view_layer.cc b/flow/layers/platform_view_layer.cc index 285db390cc91d..63b7827cf9d52 100644 --- a/flow/layers/platform_view_layer.cc +++ b/flow/layers/platform_view_layer.cc @@ -28,6 +28,7 @@ void PlatformViewLayer::Preroll(PrerollContext* context, context->mutators_stack); context->view_embedder->PrerollCompositeEmbeddedView(view_id_, std::move(params)); + context->view_embedder->PushVisitedPlatformView(view_id_); } void PlatformViewLayer::Paint(PaintContext& context) const { diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm index e5325aee855b6..65e6e32e5c173 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm @@ -319,6 +319,12 @@ - (BOOL)flt_hasFirstResponderInViewHierarchySubtree { } } +void FlutterPlatformViewsController::FilterPlatformViews(int64_t platform_view_id, sk_sp filter) { + EmbeddedViewParams params = current_composition_params_[platform_view_id]; + params.PushFilter(filter); + current_composition_params_[platform_view_id] = params; +} + void FlutterPlatformViewsController::PrerollCompositeEmbeddedView( int view_id, std::unique_ptr params) { @@ -422,6 +428,8 @@ - (BOOL)flt_hasFirstResponderInViewHierarchySubtree { case opacity: embedded_view.alpha = (*iter)->GetAlphaFloat() * embedded_view.alpha; break; + case backdrop_filter: + break; } ++iter; } diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h index fde21d23e2e20..c0bc7fd1150da 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h @@ -184,6 +184,8 @@ class FlutterPlatformViewsController { // responder. Returns -1 if no such platform view is found. long FindFirstResponderPlatformViewId(); + void FilterPlatformViews(int64_t platform_view_id, sk_sp filter); + private: static const size_t kMaxLayerAllocations = 2; diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.h b/shell/platform/darwin/ios/ios_external_view_embedder.h index 6c023d1b793e1..e557b64d06401 100644 --- a/shell/platform/darwin/ios/ios_external_view_embedder.h +++ b/shell/platform/darwin/ios/ios_external_view_embedder.h @@ -64,6 +64,8 @@ class IOSExternalViewEmbedder : public ExternalViewEmbedder { // |ExternalViewEmbedder| bool SupportsDynamicThreadMerging() override; + void FilterPlatformViews(int64_t view_id, sk_sp filter) override; + FML_DISALLOW_COPY_AND_ASSIGN(IOSExternalViewEmbedder); }; diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.mm b/shell/platform/darwin/ios/ios_external_view_embedder.mm index 1323fa4c2f487..2076e969aeace 100644 --- a/shell/platform/darwin/ios/ios_external_view_embedder.mm +++ b/shell/platform/darwin/ios/ios_external_view_embedder.mm @@ -92,4 +92,8 @@ return true; } +void IOSExternalViewEmbedder::FilterPlatformViews(int64_t view_id, sk_sp filter) { + platform_views_controller_->FilterPlatformViews(view_id, filter); +} + } // namespace flutter diff --git a/shell/platform/embedder/embedder_layers.cc b/shell/platform/embedder/embedder_layers.cc index 4716ea15683dd..99071955c0414 100644 --- a/shell/platform/embedder/embedder_layers.cc +++ b/shell/platform/embedder/embedder_layers.cc @@ -147,6 +147,8 @@ void EmbedderLayers::PushPlatformViewLayer( .get()); } } break; + case MutatorType::backdrop_filter: { + } break; } } @@ -159,8 +161,8 @@ void EmbedderLayers::PushPlatformViewLayer( .emplace_back(ConvertMutation(root_surface_transformation_)) .get()); } - - auto mutations = + + auto mutations = std::make_unique>( mutations_array.rbegin(), mutations_array.rend()); mutations_arrays_referenced_.emplace_back(std::move(mutations)); From 6b74e7dd47a70374705f1d1affa62c7ad07d594e Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Mon, 27 Jun 2022 15:50:48 -0700 Subject: [PATCH 07/43] Formatting --- flow/layers/backdrop_filter_layer.cc | 5 +++-- .../ios/framework/Source/FlutterPlatformViews_Internal.h | 5 ++--- shell/platform/darwin/ios/ios_external_view_embedder.h | 5 +++-- shell/platform/embedder/embedder_layers.cc | 4 ++-- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/flow/layers/backdrop_filter_layer.cc b/flow/layers/backdrop_filter_layer.cc index e4da4f7f98616..ae70a69c12922 100644 --- a/flow/layers/backdrop_filter_layer.cc +++ b/flow/layers/backdrop_filter_layer.cc @@ -43,11 +43,12 @@ void BackdropFilterLayer::Preroll(PrerollContext* context, Layer::AutoPrerollSaveLayerState save = Layer::AutoPrerollSaveLayerState::Create(context, true, bool(filter_)); SkRect child_paint_bounds = SkRect::MakeEmpty(); - auto visited_platform_views = context->view_embedder->GetVisitedPlatformViews(); + auto visited_platform_views = + context->view_embedder->GetVisitedPlatformViews(); for (int64_t id : visited_platform_views) { context->view_embedder->FilterPlatformViews(id, filter_); } - + PrerollChildren(context, matrix, &child_paint_bounds); child_paint_bounds.join(context->cull_rect); set_paint_bounds(child_paint_bounds); diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h index 0c6844e7ace61..259202bc89947 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h @@ -184,7 +184,8 @@ class FlutterPlatformViewsController { // responder. Returns -1 if no such platform view is found. long FindFirstResponderPlatformViewId(); - void FilterPlatformViews(int64_t platform_view_id, sk_sp filter);//, flutter::Mutator mutator + void FilterPlatformViews(int64_t platform_view_id, + sk_sp filter); //, flutter::Mutator mutator private: static const size_t kMaxLayerAllocations = 2; @@ -300,8 +301,6 @@ class FlutterPlatformViewsController { // The latest composition order that was presented in Present(). std::vector active_composition_order_; - - // Only compoiste platform views in this set. std::unordered_set views_to_recomposite_; diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.h b/shell/platform/darwin/ios/ios_external_view_embedder.h index 2705ac45a4ca5..cb52338c3f316 100644 --- a/shell/platform/darwin/ios/ios_external_view_embedder.h +++ b/shell/platform/darwin/ios/ios_external_view_embedder.h @@ -64,8 +64,9 @@ class IOSExternalViewEmbedder : public ExternalViewEmbedder { // |ExternalViewEmbedder| bool SupportsDynamicThreadMerging() override; - void FilterPlatformViews(int64_t view_id, sk_sp filter) override;//, flutter::Mutator mutator - + void FilterPlatformViews(int64_t view_id, sk_sp filter) + override; //, flutter::Mutator mutator + FML_DISALLOW_COPY_AND_ASSIGN(IOSExternalViewEmbedder); }; diff --git a/shell/platform/embedder/embedder_layers.cc b/shell/platform/embedder/embedder_layers.cc index 99071955c0414..2c8c37d2359ff 100644 --- a/shell/platform/embedder/embedder_layers.cc +++ b/shell/platform/embedder/embedder_layers.cc @@ -161,8 +161,8 @@ void EmbedderLayers::PushPlatformViewLayer( .emplace_back(ConvertMutation(root_surface_transformation_)) .get()); } - - auto mutations = + + auto mutations = std::make_unique>( mutations_array.rbegin(), mutations_array.rend()); mutations_arrays_referenced_.emplace_back(std::move(mutations)); From bc1d19b19a07cd0cb7d58b3b407fe483e572eafe Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Tue, 28 Jun 2022 10:04:13 -0700 Subject: [PATCH 08/43] Format files --- flow/embedded_views.h | 17 +++++++++++++---- .../framework/Source/FlutterPlatformViews.mm | 3 ++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/flow/embedded_views.h b/flow/embedded_views.h index 45810908f35da..7f01817a59eae 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -21,7 +21,14 @@ namespace flutter { // TODO(chinmaygarde): Make these enum names match the style guide. -enum MutatorType { clip_rect, clip_rrect, clip_path, transform, opacity, backdrop_filter }; +enum MutatorType { + clip_rect, + clip_rrect, + clip_path, + transform, + opacity, + backdrop_filter +}; // Stores mutation information like clipping or transform. // @@ -64,14 +71,15 @@ class Mutator { explicit Mutator(const SkMatrix& matrix) : type_(transform), matrix_(matrix) {} explicit Mutator(const int& alpha) : type_(opacity), alpha_(alpha) {} - explicit Mutator(const sk_sp& filter) : type_(backdrop_filter), filter_(filter) {} + explicit Mutator(const sk_sp& filter) + : type_(backdrop_filter), filter_(filter) {} const MutatorType& GetType() const { return type_; } const SkRect& GetRect() const { return rect_; } const SkRRect& GetRRect() const { return rrect_; } const SkPath& GetPath() const { return *path_; } const SkMatrix& GetMatrix() const { return matrix_; } - const sk_sp& GetFilter() const {return filter_; } + const sk_sp& GetFilter() const { return filter_; } const int& GetAlpha() const { return alpha_; } float GetAlphaFloat() const { return (alpha_ / 255.0); } @@ -366,7 +374,8 @@ class ExternalViewEmbedder { visited_platform_views_.push_back(view_id); } - virtual void FilterPlatformViews(int64_t view_id, sk_sp filter) {} + virtual void FilterPlatformViews(int64_t view_id, + sk_sp filter) {} private: bool used_this_frame_ = false; diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm index 65e6e32e5c173..91a9bbb0d98b1 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm @@ -319,7 +319,8 @@ - (BOOL)flt_hasFirstResponderInViewHierarchySubtree { } } -void FlutterPlatformViewsController::FilterPlatformViews(int64_t platform_view_id, sk_sp filter) { +void FlutterPlatformViewsController::FilterPlatformViews(int64_t platform_view_id, + sk_sp filter) { EmbeddedViewParams params = current_composition_params_[platform_view_id]; params.PushFilter(filter); current_composition_params_[platform_view_id] = params; From 55d328cedacad9da6688743b80190af97e0e8316 Mon Sep 17 00:00:00 2001 From: Javon Thomas <89162381+JTKryptic@users.noreply.github.com> Date: Tue, 28 Jun 2022 14:17:32 -0700 Subject: [PATCH 09/43] Delete backdrop_filter_diff --- backdrop_filter_diff | 95 -------------------------------------------- 1 file changed, 95 deletions(-) delete mode 100644 backdrop_filter_diff diff --git a/backdrop_filter_diff b/backdrop_filter_diff deleted file mode 100644 index d152b3560ef63..0000000000000 --- a/backdrop_filter_diff +++ /dev/null @@ -1,95 +0,0 @@ -diff --git a/flow/embedded_views.h b/flow/embedded_views.h -index 7a5a34f330..76b002befd 100644 ---- a/flow/embedded_views.h -+++ b/flow/embedded_views.h -@@ -345,6 +345,8 @@ class ExternalViewEmbedder { - // 'EndFrame', otherwise returns false. - bool GetUsedThisFrame() const { return used_this_frame_; } - -+ void PushMutator() {} -+ - private: - bool used_this_frame_ = false; - -diff --git a/flow/layers/backdrop_filter_layer.cc b/flow/layers/backdrop_filter_layer.cc -index 8e8ef2628a..b059e427c3 100644 ---- a/flow/layers/backdrop_filter_layer.cc -+++ b/flow/layers/backdrop_filter_layer.cc -@@ -43,6 +43,10 @@ void BackdropFilterLayer::Preroll(PrerollContext* context, - Layer::AutoPrerollSaveLayerState save = - Layer::AutoPrerollSaveLayerState::Create(context, true, bool(filter_)); - SkRect child_paint_bounds = SkRect::MakeEmpty(); -+ auto visited_platform_views = context->view_embedder->GetVisitedPlatformViews(); -+ for (id in visited_platform_views) { -+ context->view_embedder->ApplyMutator(id, alpha); -+ } - PrerollChildren(context, matrix, &child_paint_bounds); - child_paint_bounds.join(context->cull_rect); - set_paint_bounds(child_paint_bounds); -diff --git a/flow/layers/platform_view_layer.cc b/flow/layers/platform_view_layer.cc -index 285db390cc..63b7827cf9 100644 ---- a/flow/layers/platform_view_layer.cc -+++ b/flow/layers/platform_view_layer.cc -@@ -28,6 +28,7 @@ void PlatformViewLayer::Preroll(PrerollContext* context, - context->mutators_stack); - context->view_embedder->PrerollCompositeEmbeddedView(view_id_, - std::move(params)); -+ context->view_embedder->PushVisitedPlatformView(view_id_); - } - - void PlatformViewLayer::Paint(PaintContext& context) const { -diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm -index e5325aee85..a6992cca3f 100644 ---- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm -+++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm -@@ -319,6 +319,11 @@ void FlutterPlatformViewsController::EndFrame( - } - } - -+void FlutterPlatformViewsController::PushMutator(flutter::Mutator mutator, int64_t platform_view_id) { -+ EmbeddedViewParams params = current_composition_params_[platform_view_id]; -+ params.mutatorsStack().PushOpacity(20); -+} -+ - void FlutterPlatformViewsController::PrerollCompositeEmbeddedView( - int view_id, - std::unique_ptr params) { -diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h -index fde21d23e2..522b847ef4 100644 ---- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h -+++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h -@@ -184,6 +184,8 @@ class FlutterPlatformViewsController { - // responder. Returns -1 if no such platform view is found. - long FindFirstResponderPlatformViewId(); - -+ void PushMutator(flutter::Mutator mutator, int64_t platform_view_id); -+ - private: - static const size_t kMaxLayerAllocations = 2; - -diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.h b/shell/platform/darwin/ios/ios_external_view_embedder.h -index 6c023d1b79..da160dd023 100644 ---- a/shell/platform/darwin/ios/ios_external_view_embedder.h -+++ b/shell/platform/darwin/ios/ios_external_view_embedder.h -@@ -64,6 +64,8 @@ class IOSExternalViewEmbedder : public ExternalViewEmbedder { - // |ExternalViewEmbedder| - bool SupportsDynamicThreadMerging() override; - -+ void PushMutator() override; -+ - FML_DISALLOW_COPY_AND_ASSIGN(IOSExternalViewEmbedder); - }; - -diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.mm b/shell/platform/darwin/ios/ios_external_view_embedder.mm -index 1323fa4c2f..edd4a3adcd 100644 ---- a/shell/platform/darwin/ios/ios_external_view_embedder.mm -+++ b/shell/platform/darwin/ios/ios_external_view_embedder.mm -@@ -92,4 +92,8 @@ bool IOSExternalViewEmbedder::SupportsDynamicThreadMerging() { - return true; - } - -+void PushMutator(int alpha, int view_id) { -+ platform_views_controller_->PushMutator(alpha, view_id); -+} -+ - } // namespace flutter From d080e8ed1e9ad3300b3d1e60a6e9e0eafee2e5e2 Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Wed, 29 Jun 2022 16:25:35 -0700 Subject: [PATCH 10/43] Code cleanup --- flow/embedded_views.h | 37 ++++++++++++++----------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/flow/embedded_views.h b/flow/embedded_views.h index 7f01817a59eae..55c469ccbd8de 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -71,7 +71,7 @@ class Mutator { explicit Mutator(const SkMatrix& matrix) : type_(transform), matrix_(matrix) {} explicit Mutator(const int& alpha) : type_(opacity), alpha_(alpha) {} - explicit Mutator(const sk_sp& filter) + explicit Mutator(const std::shared_ptr& filter) : type_(backdrop_filter), filter_(filter) {} const MutatorType& GetType() const { return type_; } @@ -79,7 +79,7 @@ class Mutator { const SkRRect& GetRRect() const { return rrect_; } const SkPath& GetPath() const { return *path_; } const SkMatrix& GetMatrix() const { return matrix_; } - const sk_sp& GetFilter() const { return filter_; } + const std::shared_ptr& GetFilter() const { return filter_; } const int& GetAlpha() const { return alpha_; } float GetAlphaFloat() const { return (alpha_ / 255.0); } @@ -120,14 +120,14 @@ class Mutator { private: MutatorType type_; - union { - SkRect rect_; - SkRRect rrect_; - SkMatrix matrix_; - SkPath* path_; - int alpha_; - sk_sp filter_; - }; + + + + + + + + }; // Mutator @@ -149,7 +149,7 @@ class MutatorsStack { void PushClipPath(const SkPath& path); void PushTransform(const SkMatrix& matrix); void PushOpacity(const int& alpha); - void PushBackdropFilter(const sk_sp& filter); + void PushBackdropFilter(const std::shared_ptr filter); // Removes the `Mutator` on the top of the stack // and destroys it. @@ -241,7 +241,7 @@ class EmbeddedViewParams { // Clippings are ignored. const SkRect& finalBoundingRect() const { return final_bounding_rect_; } - void PushFilter(sk_sp filter) { + void PushFilter(std::shared_ptr filter) { mutators_stack_.PushBackdropFilter(filter); } @@ -366,22 +366,13 @@ class ExternalViewEmbedder { // 'EndFrame', otherwise returns false. bool GetUsedThisFrame() const { return used_this_frame_; } - std::vector GetVisitedPlatformViews() { - return visited_platform_views_; - } + virtual void PushVisitedPlatformView(int64_t view_id) {} - void PushVisitedPlatformView(int64_t view_id) { - visited_platform_views_.push_back(view_id); - } - - virtual void FilterPlatformViews(int64_t view_id, - sk_sp filter) {} + virtual void PushFilterToVisitedPlatformViews(std::shared_ptr filter) {} private: bool used_this_frame_ = false; - std::vector visited_platform_views_; - FML_DISALLOW_COPY_AND_ASSIGN(ExternalViewEmbedder); }; // ExternalViewEmbedder From 93accab19673ae92b9052b233483cfb329b6284a Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Wed, 29 Jun 2022 16:28:10 -0700 Subject: [PATCH 11/43] Updating to DlImageFilter and code cleanup --- flow/embedded_views.cc | 2 +- flow/layers/backdrop_filter_layer.cc | 6 +----- flow/mutators_stack_unittests.cc | 7 ++++--- .../ios/framework/Source/FlutterPlatformViews.mm | 11 ++++++----- .../framework/Source/FlutterPlatformViews_Internal.h | 9 ++++++++- .../platform/darwin/ios/ios_external_view_embedder.h | 5 +++-- .../platform/darwin/ios/ios_external_view_embedder.mm | 8 ++++++-- shell/platform/embedder/embedder_layers.cc | 4 ++-- 8 files changed, 31 insertions(+), 21 deletions(-) diff --git a/flow/embedded_views.cc b/flow/embedded_views.cc index c7b4811e8e07e..e4966cc71b14f 100644 --- a/flow/embedded_views.cc +++ b/flow/embedded_views.cc @@ -36,7 +36,7 @@ void MutatorsStack::PushOpacity(const int& alpha) { vector_.push_back(element); }; -void MutatorsStack::PushBackdropFilter(const sk_sp& filter) { +void MutatorsStack::PushBackdropFilter(const std::shared_ptr filter) { std::shared_ptr element = std::make_shared(filter); vector_.push_back(element); }; diff --git a/flow/layers/backdrop_filter_layer.cc b/flow/layers/backdrop_filter_layer.cc index 1a0bbc660b0f3..d2c396146b28b 100644 --- a/flow/layers/backdrop_filter_layer.cc +++ b/flow/layers/backdrop_filter_layer.cc @@ -44,11 +44,7 @@ void BackdropFilterLayer::Preroll(PrerollContext* context, Layer::AutoPrerollSaveLayerState save = Layer::AutoPrerollSaveLayerState::Create(context, true, bool(filter_)); SkRect child_paint_bounds = SkRect::MakeEmpty(); - auto visited_platform_views = - context->view_embedder->GetVisitedPlatformViews(); - for (int64_t id : visited_platform_views) { - context->view_embedder->FilterPlatformViews(id, filter_); - } + context->view_embedder->PushFilterToVisitedPlatformViews(filter_); PrerollChildren(context, matrix, &child_paint_bounds); child_paint_bounds.join(context->cull_rect); diff --git a/flow/mutators_stack_unittests.cc b/flow/mutators_stack_unittests.cc index 8bf57dfd84455..0115ab34d4fe0 100644 --- a/flow/mutators_stack_unittests.cc +++ b/flow/mutators_stack_unittests.cc @@ -54,9 +54,10 @@ TEST(MutatorsStack, PushClipRect) { TEST(MutatorsStack, PushBackdropFilter) { MutatorsStack stack; - sk_sp filter; - filter->filterBounds(SkIRect::MakeWH(10, 10), SkMatrix::I(), - SkImageFilter::kForward_MapDirection); + SkIRect rect; + std::shared_ptr filter; + filter->get_input_device_bounds(SkIRect::MakeWH(10, 10), + SkMatrix::I(), rect); stack.PushBackdropFilter(filter); auto iter = stack.Bottom(); ASSERT_TRUE(iter->get()->GetType() == MutatorType::backdrop_filter); diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm index 91a9bbb0d98b1..7c216948f5bca 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm @@ -319,11 +319,12 @@ - (BOOL)flt_hasFirstResponderInViewHierarchySubtree { } } -void FlutterPlatformViewsController::FilterPlatformViews(int64_t platform_view_id, - sk_sp filter) { - EmbeddedViewParams params = current_composition_params_[platform_view_id]; - params.PushFilter(filter); - current_composition_params_[platform_view_id] = params; +void FlutterPlatformViewsController::PushFilterToVisitedPlatformViews(std::shared_ptr filter) { + for (int64_t id : visited_platform_views_) { + EmbeddedViewParams params = current_composition_params_[id]; + params.PushFilter(filter); + current_composition_params_[id] = params; + } } void FlutterPlatformViewsController::PrerollCompositeEmbeddedView( diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h index c0bc7fd1150da..a20e887d52223 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h @@ -184,7 +184,11 @@ class FlutterPlatformViewsController { // responder. Returns -1 if no such platform view is found. long FindFirstResponderPlatformViewId(); - void FilterPlatformViews(int64_t platform_view_id, sk_sp filter); + // Pushes backdrop filter mutation to the mutator stack of each visited platform view + void PushFilterToVisitedPlatformViews(std::shared_ptr filter); + + // Pushes the + void PushVisitedPlatformView(int64_t view_id) { visited_platform_views_.push_back(view_id); } private: static const size_t kMaxLayerAllocations = 2; @@ -297,6 +301,9 @@ class FlutterPlatformViewsController { // The last ID in this vector belond to the that is composited on top of all others. std::vector composition_order_; + // A vector of visited platform view IDs + std::vector visited_platform_views_; + // The latest composition order that was presented in Present(). std::vector active_composition_order_; diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.h b/shell/platform/darwin/ios/ios_external_view_embedder.h index 276d823a325f1..92bfc7b508335 100644 --- a/shell/platform/darwin/ios/ios_external_view_embedder.h +++ b/shell/platform/darwin/ios/ios_external_view_embedder.h @@ -64,8 +64,9 @@ class IOSExternalViewEmbedder : public ExternalViewEmbedder { // |ExternalViewEmbedder| bool SupportsDynamicThreadMerging() override; - void FilterPlatformViews(int64_t view_id, - sk_sp filter) override; + void PushFilterToVisitedPlatformViews(std::shared_ptr filter) override; + + void PushVisitedPlatformView(int64_t view_id) override; FML_DISALLOW_COPY_AND_ASSIGN(IOSExternalViewEmbedder); }; diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.mm b/shell/platform/darwin/ios/ios_external_view_embedder.mm index 2076e969aeace..8f14dbd6aad11 100644 --- a/shell/platform/darwin/ios/ios_external_view_embedder.mm +++ b/shell/platform/darwin/ios/ios_external_view_embedder.mm @@ -92,8 +92,12 @@ return true; } -void IOSExternalViewEmbedder::FilterPlatformViews(int64_t view_id, sk_sp filter) { - platform_views_controller_->FilterPlatformViews(view_id, filter); +void IOSExternalViewEmbedder::PushFilterToVisitedPlatformViews(std::shared_ptr filter) { + platform_views_controller_->PushFilterToVisitedPlatformViews(filter); +} + +void IOSExternalViewEmbedder::PushVisitedPlatformView(int64_t view_id) { + platform_views_controller_->PushVisitedPlatformView(view_id); } } // namespace flutter diff --git a/shell/platform/embedder/embedder_layers.cc b/shell/platform/embedder/embedder_layers.cc index 2c8c37d2359ff..2c04cb41aa57c 100644 --- a/shell/platform/embedder/embedder_layers.cc +++ b/shell/platform/embedder/embedder_layers.cc @@ -147,8 +147,8 @@ void EmbedderLayers::PushPlatformViewLayer( .get()); } } break; - case MutatorType::backdrop_filter: { - } break; + case MutatorType::backdrop_filter: + break; } } From a9cd10179505821ee70aeae9c424cb8f30b95809 Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Wed, 29 Jun 2022 16:29:08 -0700 Subject: [PATCH 12/43] Formatting --- flow/embedded_views.cc | 3 ++- flow/embedded_views.h | 16 +++++----------- flow/mutators_stack_unittests.cc | 3 +-- .../ios/framework/Source/FlutterPlatformViews.mm | 3 ++- .../Source/FlutterPlatformViews_Internal.h | 2 +- .../darwin/ios/ios_external_view_embedder.h | 3 ++- .../darwin/ios/ios_external_view_embedder.mm | 3 ++- 7 files changed, 15 insertions(+), 18 deletions(-) diff --git a/flow/embedded_views.cc b/flow/embedded_views.cc index e4966cc71b14f..6ac0a7746ba28 100644 --- a/flow/embedded_views.cc +++ b/flow/embedded_views.cc @@ -36,7 +36,8 @@ void MutatorsStack::PushOpacity(const int& alpha) { vector_.push_back(element); }; -void MutatorsStack::PushBackdropFilter(const std::shared_ptr filter) { +void MutatorsStack::PushBackdropFilter( + const std::shared_ptr filter) { std::shared_ptr element = std::make_shared(filter); vector_.push_back(element); }; diff --git a/flow/embedded_views.h b/flow/embedded_views.h index 55c469ccbd8de..9f999180deca3 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -79,7 +79,9 @@ class Mutator { const SkRRect& GetRRect() const { return rrect_; } const SkPath& GetPath() const { return *path_; } const SkMatrix& GetMatrix() const { return matrix_; } - const std::shared_ptr& GetFilter() const { return filter_; } + const std::shared_ptr& GetFilter() const { + return filter_; + } const int& GetAlpha() const { return alpha_; } float GetAlphaFloat() const { return (alpha_ / 255.0); } @@ -120,15 +122,6 @@ class Mutator { private: MutatorType type_; - - - - - - - - - }; // Mutator // A stack of mutators that can be applied to an embedded platform view. @@ -368,7 +361,8 @@ class ExternalViewEmbedder { virtual void PushVisitedPlatformView(int64_t view_id) {} - virtual void PushFilterToVisitedPlatformViews(std::shared_ptr filter) {} + virtual void PushFilterToVisitedPlatformViews( + std::shared_ptr filter) {} private: bool used_this_frame_ = false; diff --git a/flow/mutators_stack_unittests.cc b/flow/mutators_stack_unittests.cc index 0115ab34d4fe0..90285965aa372 100644 --- a/flow/mutators_stack_unittests.cc +++ b/flow/mutators_stack_unittests.cc @@ -56,8 +56,7 @@ TEST(MutatorsStack, PushBackdropFilter) { MutatorsStack stack; SkIRect rect; std::shared_ptr filter; - filter->get_input_device_bounds(SkIRect::MakeWH(10, 10), - SkMatrix::I(), rect); + filter->get_input_device_bounds(SkIRect::MakeWH(10, 10), SkMatrix::I(), rect); stack.PushBackdropFilter(filter); auto iter = stack.Bottom(); ASSERT_TRUE(iter->get()->GetType() == MutatorType::backdrop_filter); diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm index 7c216948f5bca..ac98b0d706f72 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm @@ -319,7 +319,8 @@ - (BOOL)flt_hasFirstResponderInViewHierarchySubtree { } } -void FlutterPlatformViewsController::PushFilterToVisitedPlatformViews(std::shared_ptr filter) { +void FlutterPlatformViewsController::PushFilterToVisitedPlatformViews( + std::shared_ptr filter) { for (int64_t id : visited_platform_views_) { EmbeddedViewParams params = current_composition_params_[id]; params.PushFilter(filter); diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h index a20e887d52223..73d45531cbbd4 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h @@ -187,7 +187,7 @@ class FlutterPlatformViewsController { // Pushes backdrop filter mutation to the mutator stack of each visited platform view void PushFilterToVisitedPlatformViews(std::shared_ptr filter); - // Pushes the + // Pushes the void PushVisitedPlatformView(int64_t view_id) { visited_platform_views_.push_back(view_id); } private: diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.h b/shell/platform/darwin/ios/ios_external_view_embedder.h index 92bfc7b508335..518f1d33de7e7 100644 --- a/shell/platform/darwin/ios/ios_external_view_embedder.h +++ b/shell/platform/darwin/ios/ios_external_view_embedder.h @@ -64,7 +64,8 @@ class IOSExternalViewEmbedder : public ExternalViewEmbedder { // |ExternalViewEmbedder| bool SupportsDynamicThreadMerging() override; - void PushFilterToVisitedPlatformViews(std::shared_ptr filter) override; + void PushFilterToVisitedPlatformViews( + std::shared_ptr filter) override; void PushVisitedPlatformView(int64_t 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 8f14dbd6aad11..0ecfbf4e97b1f 100644 --- a/shell/platform/darwin/ios/ios_external_view_embedder.mm +++ b/shell/platform/darwin/ios/ios_external_view_embedder.mm @@ -92,7 +92,8 @@ return true; } -void IOSExternalViewEmbedder::PushFilterToVisitedPlatformViews(std::shared_ptr filter) { +void IOSExternalViewEmbedder::PushFilterToVisitedPlatformViews( + std::shared_ptr filter) { platform_views_controller_->PushFilterToVisitedPlatformViews(filter); } From abc3a0e4a27a3340a48c3a58b8e5330f5f5f330f Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Wed, 29 Jun 2022 16:43:19 -0700 Subject: [PATCH 13/43] bug fix --- flow/embedded_views.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/flow/embedded_views.h b/flow/embedded_views.h index 9f999180deca3..2a9b0af116c47 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -122,6 +122,15 @@ class Mutator { private: MutatorType type_; + union { + SkRect rect_; + SkRRect rrect_; + SkMatrix matrix_; + SkPath* path_; + int alpha_; + std::shared_ptr filter_; + }; + }; // Mutator // A stack of mutators that can be applied to an embedded platform view. From 86a5913218e96d90a6a4b35aa91840e6105af04f Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Thu, 7 Jul 2022 13:59:03 -0500 Subject: [PATCH 14/43] Fix --- shell/platform/android/platform_view_android_jni_impl.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/shell/platform/android/platform_view_android_jni_impl.cc b/shell/platform/android/platform_view_android_jni_impl.cc index 79bea738b6a68..edd6e97ddf837 100644 --- a/shell/platform/android/platform_view_android_jni_impl.cc +++ b/shell/platform/android/platform_view_android_jni_impl.cc @@ -1457,6 +1457,7 @@ void PlatformViewAndroidJNIImpl::FlutterViewOnDisplayPlatformView( // https://github.com/flutter/flutter/issues/58426 case clip_path: case opacity: + case backdrop_filter: break; } ++iter; From d60a016a81251c1403950688dd4c7681f499d4ef Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Wed, 13 Jul 2022 01:28:17 -0500 Subject: [PATCH 15/43] Enum style guide fix --- flow/mutators_stack_unittests.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flow/mutators_stack_unittests.cc b/flow/mutators_stack_unittests.cc index f11bbf0182a22..93acfce6fb85f 100644 --- a/flow/mutators_stack_unittests.cc +++ b/flow/mutators_stack_unittests.cc @@ -59,7 +59,7 @@ TEST(MutatorsStack, PushBackdropFilter) { filter->get_input_device_bounds(SkIRect::MakeWH(10, 10), SkMatrix::I(), rect); stack.PushBackdropFilter(filter); auto iter = stack.Bottom(); - ASSERT_TRUE(iter->get()->GetType() == MutatorType::backdrop_filter); + ASSERT_TRUE(iter->get()->GetType() == MutatorType::kBackdropFilter); ASSERT_TRUE(iter->get()->GetFilter() == filter); } From 484957d7ded34e710b1a893eb3559478446ff053 Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Thu, 21 Jul 2022 13:28:45 -0700 Subject: [PATCH 16/43] Cleanup --- flow/embedded_views.h | 4 ++-- flow/mutators_stack_unittests.cc | 15 ++------------- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/flow/embedded_views.h b/flow/embedded_views.h index 1eebc689824b2..f5529148aef44 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -78,7 +78,7 @@ class Mutator { const SkRRect& GetRRect() const { return rrect_; } const SkPath& GetPath() const { return *path_; } const SkMatrix& GetMatrix() const { return matrix_; } - const std::shared_ptr& GetFilter() const { + const std::shared_ptr GetFilter() const { return filter_; } const int& GetAlpha() const { return alpha_; } @@ -150,7 +150,7 @@ class MutatorsStack { void PushClipPath(const SkPath& path); void PushTransform(const SkMatrix& matrix); void PushOpacity(const int& alpha); - void PushBackdropFilter(const DlImageFilter& filter); + void PushBackdropFilter(const std::shared_ptr filter); // Removes the `Mutator` on the top of the stack // and destroys it. diff --git a/flow/mutators_stack_unittests.cc b/flow/mutators_stack_unittests.cc index 93acfce6fb85f..a5cd0d09f6d66 100644 --- a/flow/mutators_stack_unittests.cc +++ b/flow/mutators_stack_unittests.cc @@ -52,17 +52,6 @@ TEST(MutatorsStack, PushClipRect) { ASSERT_TRUE(iter->get()->GetRect() == rect); } -TEST(MutatorsStack, PushBackdropFilter) { - MutatorsStack stack; - SkIRect rect; - std::shared_ptr filter; - filter->get_input_device_bounds(SkIRect::MakeWH(10, 10), SkMatrix::I(), rect); - stack.PushBackdropFilter(filter); - auto iter = stack.Bottom(); - ASSERT_TRUE(iter->get()->GetType() == MutatorType::kBackdropFilter); - ASSERT_TRUE(iter->get()->GetFilter() == filter); -} - TEST(MutatorsStack, PushClipRRect) { MutatorsStack stack; auto rrect = SkRRect::MakeEmpty(); @@ -102,8 +91,8 @@ TEST(MutatorsStack, PushOpacity) { TEST(MutatorsStack, PushBackdropFilter) { MutatorsStack stack; - auto filter = DlBlurImageFilter(5, 5, DlTileMode::kClamp); - stack.PushBackdropFilter(filter); + std::shared_ptr filter; + stack.PushBackdropFilter(filter); auto iter = stack.Bottom(); ASSERT_TRUE(iter->get()->GetType() == MutatorType::kBackdropFilter); ASSERT_TRUE(iter->get()->GetFilter() == filter); From 929be622e586367c1a682d8b47ededacc8c8d6e0 Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Fri, 22 Jul 2022 13:38:06 -0700 Subject: [PATCH 17/43] Cleanup and Tests --- flow/embedded_views.h | 10 +++++++++- flow/layers/backdrop_filter_layer.cc | 6 ++++-- flow/layers/platform_view_layer.cc | 2 ++ flow/mutators_stack_unittests.cc | 16 +++++++++++++++- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/flow/embedded_views.h b/flow/embedded_views.h index f5529148aef44..6d577e376c6c2 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -100,7 +100,7 @@ class Mutator { case kOpacity: return alpha_ == other.alpha_; case kBackdropFilter: - return filter_ == other.filter_; + return *filter_ == *other.filter_; } return false; @@ -367,12 +367,20 @@ class ExternalViewEmbedder { // 'EndFrame', otherwise returns false. bool GetUsedThisFrame() const { return used_this_frame_; } + void SetFoundPlatformViews(bool found_platform_views) { + found_platform_views_ = found_platform_views; + } + + bool GetFoundPlatformViews() const { return found_platform_views_; } + virtual void PushVisitedPlatformView(int64_t view_id) {} virtual void PushFilterToVisitedPlatformViews( std::shared_ptr filter) {} private: + + bool found_platform_views_ = false; bool used_this_frame_ = false; FML_DISALLOW_COPY_AND_ASSIGN(ExternalViewEmbedder); diff --git a/flow/layers/backdrop_filter_layer.cc b/flow/layers/backdrop_filter_layer.cc index 0d4c743662d86..1037c69207370 100644 --- a/flow/layers/backdrop_filter_layer.cc +++ b/flow/layers/backdrop_filter_layer.cc @@ -43,9 +43,11 @@ void BackdropFilterLayer::Preroll(PrerollContext* context, const SkMatrix& matrix) { Layer::AutoPrerollSaveLayerState save = Layer::AutoPrerollSaveLayerState::Create(context, true, bool(filter_)); + if (context->view_embedder != nullptr) { + if(context->view_embedder->GetFoundPlatformViews()) + context->view_embedder->PushFilterToVisitedPlatformViews(filter_); + } SkRect child_paint_bounds = SkRect::MakeEmpty(); - context->view_embedder->PushFilterToVisitedPlatformViews(filter_); - PrerollChildren(context, matrix, &child_paint_bounds); child_paint_bounds.join(context->cull_rect); set_paint_bounds(child_paint_bounds); diff --git a/flow/layers/platform_view_layer.cc b/flow/layers/platform_view_layer.cc index 63b7827cf9d52..be3f57c3b855c 100644 --- a/flow/layers/platform_view_layer.cc +++ b/flow/layers/platform_view_layer.cc @@ -29,6 +29,8 @@ void PlatformViewLayer::Preroll(PrerollContext* context, context->view_embedder->PrerollCompositeEmbeddedView(view_id_, std::move(params)); context->view_embedder->PushVisitedPlatformView(view_id_); + context->view_embedder->SetFoundPlatformViews(true); + } void PlatformViewLayer::Paint(PaintContext& context) const { diff --git a/flow/mutators_stack_unittests.cc b/flow/mutators_stack_unittests.cc index a5cd0d09f6d66..35e648b6370fc 100644 --- a/flow/mutators_stack_unittests.cc +++ b/flow/mutators_stack_unittests.cc @@ -91,7 +91,7 @@ TEST(MutatorsStack, PushOpacity) { TEST(MutatorsStack, PushBackdropFilter) { MutatorsStack stack; - std::shared_ptr filter; + std::shared_ptr filter = std::make_shared(5, 5, DlTileMode::kClamp); stack.PushBackdropFilter(filter); auto iter = stack.Bottom(); ASSERT_TRUE(iter->get()->GetType() == MutatorType::kBackdropFilter); @@ -153,6 +153,8 @@ TEST(MutatorsStack, Equality) { stack.PushClipPath(path); int alpha = 240; stack.PushOpacity(alpha); + std::shared_ptr filter = std::make_shared(5, 5, DlTileMode::kClamp); + stack.PushBackdropFilter(filter); MutatorsStack stackOther; SkMatrix matrixOther = SkMatrix::Scale(1, 1); @@ -165,6 +167,8 @@ TEST(MutatorsStack, Equality) { stackOther.PushClipPath(otherPath); int otherAlpha = 240; stackOther.PushOpacity(otherAlpha); + std::shared_ptr otherFilter = std::make_shared(5, 5, DlTileMode::kClamp); + stackOther.PushBackdropFilter(otherFilter); ASSERT_TRUE(stack == stackOther); } @@ -194,6 +198,11 @@ TEST(Mutator, Initialization) { int alpha = 240; Mutator mutator5 = Mutator(alpha); ASSERT_TRUE(mutator5.GetType() == MutatorType::kOpacity); + + std::shared_ptr filter = std::make_shared(5, 5, DlTileMode::kClamp); + Mutator mutator6 = Mutator(filter); + ASSERT_TRUE(mutator6.GetType() == MutatorType::kBackdropFilter); + ASSERT_TRUE(mutator6.GetFilter() == filter); } TEST(Mutator, CopyConstructor) { @@ -250,6 +259,11 @@ TEST(Mutator, Equality) { Mutator mutator5 = Mutator(alpha); Mutator otherMutator5 = Mutator(alpha); ASSERT_TRUE(mutator5 == otherMutator5); + + std::shared_ptr filter = std::make_shared(5, 5, DlTileMode::kClamp); + Mutator mutator6 = Mutator(filter); + Mutator otherMutator6 = Mutator(filter); + ASSERT_TRUE(mutator6 == otherMutator6); } TEST(Mutator, UnEquality) { From b2802661714aef973256b80a3d2efa7ffb364cfd Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Fri, 22 Jul 2022 13:51:10 -0700 Subject: [PATCH 18/43] format --- flow/embedded_views.h | 1 - flow/mutators_stack_unittests.cc | 17 +++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/flow/embedded_views.h b/flow/embedded_views.h index 6d577e376c6c2..ee8ffb8d79f38 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -379,7 +379,6 @@ class ExternalViewEmbedder { std::shared_ptr filter) {} private: - bool found_platform_views_ = false; bool used_this_frame_ = false; diff --git a/flow/mutators_stack_unittests.cc b/flow/mutators_stack_unittests.cc index 35e648b6370fc..664ce118aca86 100644 --- a/flow/mutators_stack_unittests.cc +++ b/flow/mutators_stack_unittests.cc @@ -91,8 +91,9 @@ TEST(MutatorsStack, PushOpacity) { TEST(MutatorsStack, PushBackdropFilter) { MutatorsStack stack; - std::shared_ptr filter = std::make_shared(5, 5, DlTileMode::kClamp); - stack.PushBackdropFilter(filter); + std::shared_ptr filter = + std::make_shared(5, 5, DlTileMode::kClamp); + stack.PushBackdropFilter(filter); auto iter = stack.Bottom(); ASSERT_TRUE(iter->get()->GetType() == MutatorType::kBackdropFilter); ASSERT_TRUE(iter->get()->GetFilter() == filter); @@ -153,7 +154,8 @@ TEST(MutatorsStack, Equality) { stack.PushClipPath(path); int alpha = 240; stack.PushOpacity(alpha); - std::shared_ptr filter = std::make_shared(5, 5, DlTileMode::kClamp); + std::shared_ptr filter = + std::make_shared(5, 5, DlTileMode::kClamp); stack.PushBackdropFilter(filter); MutatorsStack stackOther; @@ -167,7 +169,8 @@ TEST(MutatorsStack, Equality) { stackOther.PushClipPath(otherPath); int otherAlpha = 240; stackOther.PushOpacity(otherAlpha); - std::shared_ptr otherFilter = std::make_shared(5, 5, DlTileMode::kClamp); + std::shared_ptr otherFilter = + std::make_shared(5, 5, DlTileMode::kClamp); stackOther.PushBackdropFilter(otherFilter); ASSERT_TRUE(stack == stackOther); @@ -199,7 +202,8 @@ TEST(Mutator, Initialization) { Mutator mutator5 = Mutator(alpha); ASSERT_TRUE(mutator5.GetType() == MutatorType::kOpacity); - std::shared_ptr filter = std::make_shared(5, 5, DlTileMode::kClamp); + std::shared_ptr filter = + std::make_shared(5, 5, DlTileMode::kClamp); Mutator mutator6 = Mutator(filter); ASSERT_TRUE(mutator6.GetType() == MutatorType::kBackdropFilter); ASSERT_TRUE(mutator6.GetFilter() == filter); @@ -260,7 +264,8 @@ TEST(Mutator, Equality) { Mutator otherMutator5 = Mutator(alpha); ASSERT_TRUE(mutator5 == otherMutator5); - std::shared_ptr filter = std::make_shared(5, 5, DlTileMode::kClamp); + std::shared_ptr filter = + std::make_shared(5, 5, DlTileMode::kClamp); Mutator mutator6 = Mutator(filter); Mutator otherMutator6 = Mutator(filter); ASSERT_TRUE(mutator6 == otherMutator6); From 153df5dd93b80485a0cf8d6f85e6db676bd19a16 Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Fri, 22 Jul 2022 13:58:18 -0700 Subject: [PATCH 19/43] format --- flow/layers/backdrop_filter_layer.cc | 2 +- flow/layers/platform_view_layer.cc | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/flow/layers/backdrop_filter_layer.cc b/flow/layers/backdrop_filter_layer.cc index 1037c69207370..c29f6d7d4671e 100644 --- a/flow/layers/backdrop_filter_layer.cc +++ b/flow/layers/backdrop_filter_layer.cc @@ -44,7 +44,7 @@ void BackdropFilterLayer::Preroll(PrerollContext* context, Layer::AutoPrerollSaveLayerState save = Layer::AutoPrerollSaveLayerState::Create(context, true, bool(filter_)); if (context->view_embedder != nullptr) { - if(context->view_embedder->GetFoundPlatformViews()) + if (context->view_embedder->GetFoundPlatformViews()) context->view_embedder->PushFilterToVisitedPlatformViews(filter_); } SkRect child_paint_bounds = SkRect::MakeEmpty(); diff --git a/flow/layers/platform_view_layer.cc b/flow/layers/platform_view_layer.cc index be3f57c3b855c..87c844c678e91 100644 --- a/flow/layers/platform_view_layer.cc +++ b/flow/layers/platform_view_layer.cc @@ -30,7 +30,6 @@ void PlatformViewLayer::Preroll(PrerollContext* context, std::move(params)); context->view_embedder->PushVisitedPlatformView(view_id_); context->view_embedder->SetFoundPlatformViews(true); - } void PlatformViewLayer::Paint(PaintContext& context) const { From 70049ada19766b4ca7c65b19a48c52534c02ac95 Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Mon, 25 Jul 2022 09:51:48 -0700 Subject: [PATCH 20/43] Memory leak failure fix --- flow/embedded_views.cc | 2 +- flow/embedded_views.h | 14 ++++++-------- flow/mutators_stack_unittests.cc | 26 ++++++++++++++++---------- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/flow/embedded_views.cc b/flow/embedded_views.cc index 6ac0a7746ba28..4e21d1643b845 100644 --- a/flow/embedded_views.cc +++ b/flow/embedded_views.cc @@ -37,7 +37,7 @@ void MutatorsStack::PushOpacity(const int& alpha) { }; void MutatorsStack::PushBackdropFilter( - const std::shared_ptr filter) { + const DlImageFilter& filter) { std::shared_ptr element = std::make_shared(filter); vector_.push_back(element); }; diff --git a/flow/embedded_views.h b/flow/embedded_views.h index ee8ffb8d79f38..e89b5796247bd 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -70,17 +70,15 @@ class Mutator { explicit Mutator(const SkMatrix& matrix) : type_(kTransform), matrix_(matrix) {} explicit Mutator(const int& alpha) : type_(kOpacity), alpha_(alpha) {} - explicit Mutator(const std::shared_ptr filter) - : type_(kBackdropFilter), filter_(filter) {} + explicit Mutator(const DlImageFilter& filter) + : type_(kBackdropFilter), filter_(&filter) {} const MutatorType& GetType() const { return type_; } const SkRect& GetRect() const { return rect_; } const SkRRect& GetRRect() const { return rrect_; } const SkPath& GetPath() const { return *path_; } const SkMatrix& GetMatrix() const { return matrix_; } - const std::shared_ptr GetFilter() const { - return filter_; - } + const DlImageFilter& GetFilter() const { return *filter_; } const int& GetAlpha() const { return alpha_; } float GetAlphaFloat() const { return (alpha_ / 255.0); } @@ -127,7 +125,7 @@ class Mutator { SkMatrix matrix_; SkPath* path_; int alpha_; - std::shared_ptr filter_; + const DlImageFilter* filter_; }; }; // Mutator @@ -150,7 +148,7 @@ class MutatorsStack { void PushClipPath(const SkPath& path); void PushTransform(const SkMatrix& matrix); void PushOpacity(const int& alpha); - void PushBackdropFilter(const std::shared_ptr filter); + void PushBackdropFilter(const DlImageFilter& filter); // Removes the `Mutator` on the top of the stack // and destroys it. @@ -243,7 +241,7 @@ class EmbeddedViewParams { const SkRect& finalBoundingRect() const { return final_bounding_rect_; } void PushFilter(std::shared_ptr filter) { - mutators_stack_.PushBackdropFilter(filter); + mutators_stack_.PushBackdropFilter(*filter); } bool operator==(const EmbeddedViewParams& other) const { diff --git a/flow/mutators_stack_unittests.cc b/flow/mutators_stack_unittests.cc index 664ce118aca86..cb942673113ed 100644 --- a/flow/mutators_stack_unittests.cc +++ b/flow/mutators_stack_unittests.cc @@ -91,8 +91,7 @@ TEST(MutatorsStack, PushOpacity) { TEST(MutatorsStack, PushBackdropFilter) { MutatorsStack stack; - std::shared_ptr filter = - std::make_shared(5, 5, DlTileMode::kClamp); + auto filter = DlBlurImageFilter(5, 5, DlTileMode::kClamp); stack.PushBackdropFilter(filter); auto iter = stack.Bottom(); ASSERT_TRUE(iter->get()->GetType() == MutatorType::kBackdropFilter); @@ -154,8 +153,7 @@ TEST(MutatorsStack, Equality) { stack.PushClipPath(path); int alpha = 240; stack.PushOpacity(alpha); - std::shared_ptr filter = - std::make_shared(5, 5, DlTileMode::kClamp); + auto filter = DlBlurImageFilter(5, 5, DlTileMode::kClamp); stack.PushBackdropFilter(filter); MutatorsStack stackOther; @@ -169,8 +167,7 @@ TEST(MutatorsStack, Equality) { stackOther.PushClipPath(otherPath); int otherAlpha = 240; stackOther.PushOpacity(otherAlpha); - std::shared_ptr otherFilter = - std::make_shared(5, 5, DlTileMode::kClamp); + auto otherFilter = DlBlurImageFilter(5, 5, DlTileMode::kClamp); stackOther.PushBackdropFilter(otherFilter); ASSERT_TRUE(stack == stackOther); @@ -202,8 +199,7 @@ TEST(Mutator, Initialization) { Mutator mutator5 = Mutator(alpha); ASSERT_TRUE(mutator5.GetType() == MutatorType::kOpacity); - std::shared_ptr filter = - std::make_shared(5, 5, DlTileMode::kClamp); + auto filter = DlBlurImageFilter(5, 5, DlTileMode::kClamp); Mutator mutator6 = Mutator(filter); ASSERT_TRUE(mutator6.GetType() == MutatorType::kBackdropFilter); ASSERT_TRUE(mutator6.GetFilter() == filter); @@ -235,6 +231,11 @@ TEST(Mutator, CopyConstructor) { Mutator mutator5 = Mutator(alpha); Mutator copy5 = Mutator(mutator5); ASSERT_TRUE(mutator5 == copy5); + + auto filter = DlBlurImageFilter(5, 5, DlTileMode::kClamp); + Mutator mutator6 = Mutator(filter); + Mutator copy6 = Mutator(mutator6); + ASSERT_TRUE(mutator6 == copy6); } TEST(Mutator, Equality) { @@ -264,8 +265,7 @@ TEST(Mutator, Equality) { Mutator otherMutator5 = Mutator(alpha); ASSERT_TRUE(mutator5 == otherMutator5); - std::shared_ptr filter = - std::make_shared(5, 5, DlTileMode::kClamp); + auto filter = DlBlurImageFilter(5, 5, DlTileMode::kClamp); Mutator mutator6 = Mutator(filter); Mutator otherMutator6 = Mutator(filter); ASSERT_TRUE(mutator6 == otherMutator6); @@ -284,6 +284,12 @@ TEST(Mutator, UnEquality) { Mutator mutator2 = Mutator(alpha); Mutator otherMutator2 = Mutator(alpha2); ASSERT_TRUE(mutator2 != otherMutator2); + + auto filter = DlBlurImageFilter(5, 5, DlTileMode::kClamp); + auto filter2 = DlBlurImageFilter(10, 10, DlTileMode::kClamp); + Mutator mutator3 = Mutator(filter); + Mutator otherMutator3 = Mutator(filter2); + ASSERT_TRUE(mutator3 != otherMutator3); } } // namespace testing From 3a98c7d14b7621c2f5705ae5b8db1dd4c28e2263 Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Mon, 25 Jul 2022 09:53:10 -0700 Subject: [PATCH 21/43] format --- flow/embedded_views.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/flow/embedded_views.cc b/flow/embedded_views.cc index 4e21d1643b845..32acb94fc2296 100644 --- a/flow/embedded_views.cc +++ b/flow/embedded_views.cc @@ -36,8 +36,7 @@ void MutatorsStack::PushOpacity(const int& alpha) { vector_.push_back(element); }; -void MutatorsStack::PushBackdropFilter( - const DlImageFilter& filter) { +void MutatorsStack::PushBackdropFilter(const DlImageFilter& filter) { std::shared_ptr element = std::make_shared(filter); vector_.push_back(element); }; From 5e94dee645aae929a3fe1b982c50ae970cc85177 Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Tue, 26 Jul 2022 10:12:49 -0700 Subject: [PATCH 22/43] Remove platform view flag --- flow/embedded_views.h | 12 +++++------- flow/layers/backdrop_filter_layer.cc | 3 +-- flow/layers/platform_view_layer.cc | 1 - 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/flow/embedded_views.h b/flow/embedded_views.h index e89b5796247bd..4693301aa8a37 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -240,6 +240,7 @@ class EmbeddedViewParams { // Clippings are ignored. const SkRect& finalBoundingRect() const { return final_bounding_rect_; } + // This method pushes the stored DlImageFilter object to the mutators stack. void PushFilter(std::shared_ptr filter) { mutators_stack_.PushBackdropFilter(*filter); } @@ -365,19 +366,16 @@ class ExternalViewEmbedder { // 'EndFrame', otherwise returns false. bool GetUsedThisFrame() const { return used_this_frame_; } - void SetFoundPlatformViews(bool found_platform_views) { - found_platform_views_ = found_platform_views; - } - - bool GetFoundPlatformViews() const { return found_platform_views_; } - + // This method pushes the platform view id of a visited platform view to a + // list of visited platform views virtual void PushVisitedPlatformView(int64_t view_id) {} + // This method pushes a DlImageFilter object to each platform view within a + // list of visited platform views virtual void PushFilterToVisitedPlatformViews( std::shared_ptr filter) {} private: - bool found_platform_views_ = false; bool used_this_frame_ = false; FML_DISALLOW_COPY_AND_ASSIGN(ExternalViewEmbedder); diff --git a/flow/layers/backdrop_filter_layer.cc b/flow/layers/backdrop_filter_layer.cc index c29f6d7d4671e..eb85e73b6a199 100644 --- a/flow/layers/backdrop_filter_layer.cc +++ b/flow/layers/backdrop_filter_layer.cc @@ -44,8 +44,7 @@ void BackdropFilterLayer::Preroll(PrerollContext* context, Layer::AutoPrerollSaveLayerState save = Layer::AutoPrerollSaveLayerState::Create(context, true, bool(filter_)); if (context->view_embedder != nullptr) { - if (context->view_embedder->GetFoundPlatformViews()) - context->view_embedder->PushFilterToVisitedPlatformViews(filter_); + context->view_embedder->PushFilterToVisitedPlatformViews(filter_); } SkRect child_paint_bounds = SkRect::MakeEmpty(); PrerollChildren(context, matrix, &child_paint_bounds); diff --git a/flow/layers/platform_view_layer.cc b/flow/layers/platform_view_layer.cc index 87c844c678e91..63b7827cf9d52 100644 --- a/flow/layers/platform_view_layer.cc +++ b/flow/layers/platform_view_layer.cc @@ -29,7 +29,6 @@ void PlatformViewLayer::Preroll(PrerollContext* context, context->view_embedder->PrerollCompositeEmbeddedView(view_id_, std::move(params)); context->view_embedder->PushVisitedPlatformView(view_id_); - context->view_embedder->SetFoundPlatformViews(true); } void PlatformViewLayer::Paint(PaintContext& context) const { From af6674899abd51b6af85091583f970dfb1d37a62 Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Tue, 26 Jul 2022 10:14:37 -0700 Subject: [PATCH 23/43] format --- flow/embedded_views.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flow/embedded_views.h b/flow/embedded_views.h index 4693301aa8a37..62b0f115becdc 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -370,7 +370,7 @@ class ExternalViewEmbedder { // list of visited platform views virtual void PushVisitedPlatformView(int64_t view_id) {} - // This method pushes a DlImageFilter object to each platform view within a + // This method pushes a DlImageFilter object to each platform view within a // list of visited platform views virtual void PushFilterToVisitedPlatformViews( std::shared_ptr filter) {} From 89cfd8b49126169eed5009a083f21c322ceac3da Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Wed, 27 Jul 2022 16:19:19 -0700 Subject: [PATCH 24/43] nit --- flow/embedded_views.h | 6 +++--- .../darwin/ios/framework/Source/FlutterPlatformViews.mm | 2 +- .../ios/framework/Source/FlutterPlatformViews_Internal.h | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/flow/embedded_views.h b/flow/embedded_views.h index 62b0f115becdc..933c3d977a78c 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -241,7 +241,7 @@ class EmbeddedViewParams { const SkRect& finalBoundingRect() const { return final_bounding_rect_; } // This method pushes the stored DlImageFilter object to the mutators stack. - void PushFilter(std::shared_ptr filter) { + void PushImageFilter(std::shared_ptr filter) { mutators_stack_.PushBackdropFilter(*filter); } @@ -367,11 +367,11 @@ class ExternalViewEmbedder { bool GetUsedThisFrame() const { return used_this_frame_; } // This method pushes the platform view id of a visited platform view to a - // list of visited platform views + // list of visited platform views. virtual void PushVisitedPlatformView(int64_t view_id) {} // This method pushes a DlImageFilter object to each platform view within a - // list of visited platform views + // list of visited platform views. virtual void PushFilterToVisitedPlatformViews( std::shared_ptr filter) {} diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm index d4edf0d6f138c..a67296a93af30 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm @@ -323,7 +323,7 @@ - (BOOL)flt_hasFirstResponderInViewHierarchySubtree { std::shared_ptr filter) { for (int64_t id : visited_platform_views_) { EmbeddedViewParams params = current_composition_params_[id]; - params.PushFilter(filter); + params.PushImageFilter(filter); current_composition_params_[id] = params; } } diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h index 73d45531cbbd4..94c1cd3de683c 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h @@ -184,10 +184,10 @@ class FlutterPlatformViewsController { // responder. Returns -1 if no such platform view is found. long FindFirstResponderPlatformViewId(); - // Pushes backdrop filter mutation to the mutator stack of each visited platform view + // Pushes backdrop filter mutation to the mutator stack of each visited platform view. void PushFilterToVisitedPlatformViews(std::shared_ptr filter); - // Pushes the + // Pushes the view id of a visted platform view to the list of visied platform views. void PushVisitedPlatformView(int64_t view_id) { visited_platform_views_.push_back(view_id); } private: @@ -301,7 +301,7 @@ class FlutterPlatformViewsController { // The last ID in this vector belond to the that is composited on top of all others. std::vector composition_order_; - // A vector of visited platform view IDs + // A vector of visited platform view IDs. std::vector visited_platform_views_; // The latest composition order that was presented in Present(). From f9dd08b74c587ea2f5a594d56f2f53a5c468bceb Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Thu, 28 Jul 2022 11:50:10 -0700 Subject: [PATCH 25/43] test fix --- flow/embedded_views.h | 2 +- flow/mutators_stack_unittests.cc | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/flow/embedded_views.h b/flow/embedded_views.h index 4cca90e77169f..e3db1c3157748 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -245,7 +245,7 @@ class EmbeddedViewParams { // This method pushes the stored DlImageFilter object to the mutators stack. void PushImageFilter(std::shared_ptr filter) { - mutators_stack_.PushBackdropFilter(*filter); + mutators_stack_.PushBackdropFilter(filter); } bool operator==(const EmbeddedViewParams& other) const { diff --git a/flow/mutators_stack_unittests.cc b/flow/mutators_stack_unittests.cc index 9810beb6a282c..8f16720c4d3fa 100644 --- a/flow/mutators_stack_unittests.cc +++ b/flow/mutators_stack_unittests.cc @@ -163,7 +163,7 @@ TEST(MutatorsStack, Equality) { stack.PushClipPath(path); int alpha = 240; stack.PushOpacity(alpha); - auto filter = DlBlurImageFilter(5, 5, DlTileMode::kClamp); + auto filter = std::make_shared(5, 5, DlTileMode::kClamp); stack.PushBackdropFilter(filter); MutatorsStack stackOther; @@ -177,7 +177,7 @@ TEST(MutatorsStack, Equality) { stackOther.PushClipPath(otherPath); int otherAlpha = 240; stackOther.PushOpacity(otherAlpha); - auto otherFilter = DlBlurImageFilter(5, 5, DlTileMode::kClamp); + auto otherFilter = std::make_shared(5, 5, DlTileMode::kClamp); stackOther.PushBackdropFilter(otherFilter); ASSERT_TRUE(stack == stackOther); @@ -209,10 +209,10 @@ TEST(Mutator, Initialization) { Mutator mutator5 = Mutator(alpha); ASSERT_TRUE(mutator5.GetType() == MutatorType::kOpacity); - auto filter = DlBlurImageFilter(5, 5, DlTileMode::kClamp); + auto filter = std::make_shared(5, 5, DlTileMode::kClamp); Mutator mutator6 = Mutator(filter); ASSERT_TRUE(mutator6.GetType() == MutatorType::kBackdropFilter); - ASSERT_TRUE(mutator6.GetFilter() == filter); + ASSERT_TRUE(mutator6.GetFilter() == *filter); } TEST(Mutator, CopyConstructor) { @@ -242,7 +242,7 @@ TEST(Mutator, CopyConstructor) { Mutator copy5 = Mutator(mutator5); ASSERT_TRUE(mutator5 == copy5); - auto filter = DlBlurImageFilter(5, 5, DlTileMode::kClamp); + auto filter = std::make_shared(5, 5, DlTileMode::kClamp); Mutator mutator6 = Mutator(filter); Mutator copy6 = Mutator(mutator6); ASSERT_TRUE(mutator6 == copy6); @@ -275,7 +275,7 @@ TEST(Mutator, Equality) { Mutator otherMutator5 = Mutator(alpha); ASSERT_TRUE(mutator5 == otherMutator5); - auto filter = DlBlurImageFilter(5, 5, DlTileMode::kClamp); + auto filter = std::make_shared(5, 5, DlTileMode::kClamp); Mutator mutator6 = Mutator(filter); Mutator otherMutator6 = Mutator(filter); ASSERT_TRUE(mutator6 == otherMutator6); @@ -295,8 +295,8 @@ TEST(Mutator, UnEquality) { Mutator otherMutator2 = Mutator(alpha2); ASSERT_TRUE(mutator2 != otherMutator2); - auto filter = DlBlurImageFilter(5, 5, DlTileMode::kClamp); - auto filter2 = DlBlurImageFilter(10, 10, DlTileMode::kClamp); + auto filter = std::make_shared(5, 5, DlTileMode::kClamp); + auto filter2 = std::make_shared(10, 10, DlTileMode::kClamp); Mutator mutator3 = Mutator(filter); Mutator otherMutator3 = Mutator(filter2); ASSERT_TRUE(mutator3 != otherMutator3); From 9d00f75bba828a3413ecb2b9effa080827799f3a Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Thu, 28 Jul 2022 11:51:12 -0700 Subject: [PATCH 26/43] format --- flow/mutators_stack_unittests.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/flow/mutators_stack_unittests.cc b/flow/mutators_stack_unittests.cc index 8f16720c4d3fa..c93838cfa68bf 100644 --- a/flow/mutators_stack_unittests.cc +++ b/flow/mutators_stack_unittests.cc @@ -177,7 +177,8 @@ TEST(MutatorsStack, Equality) { stackOther.PushClipPath(otherPath); int otherAlpha = 240; stackOther.PushOpacity(otherAlpha); - auto otherFilter = std::make_shared(5, 5, DlTileMode::kClamp); + auto otherFilter = + std::make_shared(5, 5, DlTileMode::kClamp); stackOther.PushBackdropFilter(otherFilter); ASSERT_TRUE(stack == stackOther); @@ -296,7 +297,8 @@ TEST(Mutator, UnEquality) { ASSERT_TRUE(mutator2 != otherMutator2); auto filter = std::make_shared(5, 5, DlTileMode::kClamp); - auto filter2 = std::make_shared(10, 10, DlTileMode::kClamp); + auto filter2 = + std::make_shared(10, 10, DlTileMode::kClamp); Mutator mutator3 = Mutator(filter); Mutator otherMutator3 = Mutator(filter2); ASSERT_TRUE(mutator3 != otherMutator3); From f30e262ddc9cf7bffd93aa6a7777d8962738096b Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Tue, 2 Aug 2022 15:51:08 -0700 Subject: [PATCH 27/43] backdrop filter unit tests --- flow/embedded_views.h | 2 +- .../shell_test_external_view_embedder.cc | 31 +++++++++- .../shell_test_external_view_embedder.h | 21 ++++++- shell/common/shell_unittests.cc | 59 ++++++++++++++++++- 4 files changed, 107 insertions(+), 6 deletions(-) diff --git a/flow/embedded_views.h b/flow/embedded_views.h index e3db1c3157748..415d26c87b82e 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -243,7 +243,7 @@ class EmbeddedViewParams { // Clippings are ignored. const SkRect& finalBoundingRect() const { return final_bounding_rect_; } - // This method pushes the stored DlImageFilter object to the mutators stack. + // Pushes the stored DlImageFilter object to the mutators stack. void PushImageFilter(std::shared_ptr filter) { mutators_stack_.PushBackdropFilter(filter); } diff --git a/shell/common/shell_test_external_view_embedder.cc b/shell/common/shell_test_external_view_embedder.cc index 015709d96f686..e783c57985089 100644 --- a/shell/common/shell_test_external_view_embedder.cc +++ b/shell/common/shell_test_external_view_embedder.cc @@ -28,6 +28,14 @@ SkISize ShellTestExternalViewEmbedder::GetLastSubmittedFrameSize() { return last_submitted_frame_size_; } +std::vector ShellTestExternalViewEmbedder::GetVisitedPlatformViews() { + return visited_platform_views_; +} + +MutatorsStack ShellTestExternalViewEmbedder::GetStack(int64_t view_id) { + return mutators_stacks_[view_id]; +} + // |ExternalViewEmbedder| void ShellTestExternalViewEmbedder::CancelFrame() {} @@ -41,7 +49,10 @@ void ShellTestExternalViewEmbedder::BeginFrame( // |ExternalViewEmbedder| void ShellTestExternalViewEmbedder::PrerollCompositeEmbeddedView( int view_id, - std::unique_ptr params) {} + std::unique_ptr params) { + picture_recorders_[view_id] = std::make_unique(); + picture_recorders_[view_id]->beginRecording(SkRect::MakeEmpty()); +} // |ExternalViewEmbedder| PostPrerollResult ShellTestExternalViewEmbedder::PostPrerollAction( @@ -57,7 +68,23 @@ std::vector ShellTestExternalViewEmbedder::GetCurrentCanvases() { // |ExternalViewEmbedder| SkCanvas* ShellTestExternalViewEmbedder::CompositeEmbeddedView(int view_id) { - return nullptr; + return picture_recorders_[view_id]->getRecordingCanvas(); +} + +// |ExternalViewEmbedder| +void ShellTestExternalViewEmbedder::PushVisitedPlatformView(int64_t view_id) { + visited_platform_views_.push_back(view_id); +} + +// |ExternalViewEmbedder| +void ShellTestExternalViewEmbedder::PushFilterToVisitedPlatformViews( + std::shared_ptr filter) { + for (int64_t id : visited_platform_views_) { + EmbeddedViewParams params = current_composition_params_[id]; + params.PushImageFilter(filter); + current_composition_params_[id] = params; + mutators_stacks_[id] = params.mutatorsStack(); + } } // |ExternalViewEmbedder| diff --git a/shell/common/shell_test_external_view_embedder.h b/shell/common/shell_test_external_view_embedder.h index 72c101ed1f4bc..8601db8c4641c 100644 --- a/shell/common/shell_test_external_view_embedder.h +++ b/shell/common/shell_test_external_view_embedder.h @@ -7,6 +7,7 @@ #include "flutter/flow/embedded_views.h" #include "flutter/fml/raster_thread_merger.h" +#include "third_party/skia/include/core/SkPictureRecorder.h" namespace flutter { @@ -32,9 +33,15 @@ class ShellTestExternalViewEmbedder final : public ExternalViewEmbedder { // the external view embedder. int GetSubmittedFrameCount(); - // Returns the size of last submitted frame surface + // Returns the size of last submitted frame surface. SkISize GetLastSubmittedFrameSize(); + // Returns the mutators stack for the given platform view. + MutatorsStack GetStack(int64_t); + + // Returns the list of visited platform views. + std::vector GetVisitedPlatformViews(); + private: // |ExternalViewEmbedder| void CancelFrame() override; @@ -61,6 +68,13 @@ class ShellTestExternalViewEmbedder final : public ExternalViewEmbedder { // |ExternalViewEmbedder| SkCanvas* CompositeEmbeddedView(int view_id) override; + // |ExternalViewEmbedder| + void PushVisitedPlatformView(int64_t view_id) override; + + // |ExternalViewEmbedder| + void PushFilterToVisitedPlatformViews( + std::shared_ptr filter) override; + // |ExternalViewEmbedder| void SubmitFrame(GrDirectContext* context, std::unique_ptr frame) override; @@ -81,7 +95,10 @@ class ShellTestExternalViewEmbedder final : public ExternalViewEmbedder { PostPrerollResult post_preroll_result_; bool support_thread_merging_; - + std::map> picture_recorders_; + std::map mutators_stacks_; + std::map current_composition_params_; + std::vector visited_platform_views_; std::atomic submitted_frame_count_; std::atomic last_submitted_frame_size_; diff --git a/shell/common/shell_unittests.cc b/shell/common/shell_unittests.cc index e4a86b5775a34..8987cb36779b7 100644 --- a/shell/common/shell_unittests.cc +++ b/shell/common/shell_unittests.cc @@ -13,8 +13,10 @@ #include "assets/directory_asset_bundle.h" #include "common/graphics/persistent_cache.h" +#include "flutter/flow/layers/backdrop_filter_layer.h" #include "flutter/flow/layers/display_list_layer.h" #include "flutter/flow/layers/layer_raster_cache_item.h" +#include "flutter/flow/layers/platform_view_layer.h" #include "flutter/flow/layers/transform_layer.h" #include "flutter/fml/command_line.h" #include "flutter/fml/dart/dart_converter.h" @@ -765,12 +767,67 @@ TEST_F(ShellTest, ExternalEmbedderNoThreadMerger) { PumpOneFrame(shell.get(), 100, 100, builder); end_frame_latch.Wait(); - ASSERT_TRUE(end_frame_called); DestroyShell(std::move(shell)); } +TEST_F(ShellTest, PushBackdropFilterToVisitedPlatformViews) { + auto settings = CreateSettingsForFixture(); + fml::AutoResetWaitableEvent end_frame_latch; + bool end_frame_called = false; + auto end_frame_callback = + [&](bool should_resubmit_frame, + fml::RefPtr raster_thread_merger) { + ASSERT_TRUE(raster_thread_merger.get() == nullptr); + ASSERT_FALSE(should_resubmit_frame); + end_frame_called = true; + end_frame_latch.Signal(); + }; + auto external_view_embedder = std::make_shared( + end_frame_callback, PostPrerollResult::kResubmitFrame, false); + auto shell = CreateShell(std::move(settings), GetTaskRunnersForFixture(), + false, external_view_embedder); + + // Create the surface needed by rasterizer + PlatformViewNotifyCreated(shell.get()); + + auto configuration = RunConfiguration::InferFromSettings(settings); + configuration.SetEntrypoint("emptyMain"); + + RunEngine(shell.get(), std::move(configuration)); + + LayerTreeBuilder builder = [&](std::shared_ptr root) { + fml::RefPtr queue = fml::MakeRefCounted( + this->GetCurrentTaskRunner(), fml::TimeDelta::Zero()); + auto platform_view_layer = std::make_shared( + SkPoint::Make(10, 10), SkSize::Make(10, 10), 50); + root->Add(platform_view_layer); + auto filter = std::make_shared(5, 5, DlTileMode::kClamp); + auto backdrop_filter_layer = + std::make_shared(filter, DlBlendMode::kSrcOver); + root->Add(backdrop_filter_layer); + auto platform_view_layer2 = std::make_shared( + SkPoint::Make(10, 10), SkSize::Make(10, 10), 75); + backdrop_filter_layer->Add(platform_view_layer2); + }; + + PumpOneFrame(shell.get(), 100, 100, builder); + end_frame_latch.Wait(); + ASSERT_EQ(external_view_embedder->GetVisitedPlatformViews().size(), + (const unsigned long)2); + ASSERT_EQ(external_view_embedder->GetVisitedPlatformViews()[0], 50); + ASSERT_EQ(external_view_embedder->GetVisitedPlatformViews()[1], 75); + + auto filter = DlBlurImageFilter(5, 5, DlTileMode::kClamp); + auto mutator = *external_view_embedder->GetStack(50).Begin(); + ASSERT_EQ(mutator->GetType(), MutatorType::kBackdropFilter); + ASSERT_EQ(mutator->GetFilter(), filter); + ASSERT_TRUE(external_view_embedder->GetStack(75).is_empty()); + + DestroyShell(std::move(shell)); +} + // TODO(https://github.com/flutter/flutter/issues/59816): Enable on fuchsia. TEST_F(ShellTest, #if defined(OS_FUCHSIA) From 8b3277fe274d78fa040a4810a095e2ac7bf4e0e4 Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Tue, 2 Aug 2022 15:59:16 -0700 Subject: [PATCH 28/43] shell cleaning --- shell/common/shell_unittests.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/shell/common/shell_unittests.cc b/shell/common/shell_unittests.cc index 8987cb36779b7..aac29538e73cb 100644 --- a/shell/common/shell_unittests.cc +++ b/shell/common/shell_unittests.cc @@ -818,12 +818,13 @@ TEST_F(ShellTest, PushBackdropFilterToVisitedPlatformViews) { (const unsigned long)2); ASSERT_EQ(external_view_embedder->GetVisitedPlatformViews()[0], 50); ASSERT_EQ(external_view_embedder->GetVisitedPlatformViews()[1], 75); - + ASSERT_TRUE(external_view_embedder->GetStack(75).is_empty()); + ASSERT_FALSE(external_view_embedder->GetStack(50).is_empty()); + auto filter = DlBlurImageFilter(5, 5, DlTileMode::kClamp); auto mutator = *external_view_embedder->GetStack(50).Begin(); ASSERT_EQ(mutator->GetType(), MutatorType::kBackdropFilter); ASSERT_EQ(mutator->GetFilter(), filter); - ASSERT_TRUE(external_view_embedder->GetStack(75).is_empty()); DestroyShell(std::move(shell)); } From 5891b2efdc93473e751ab2f5ca57f24a1e597fba Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Tue, 2 Aug 2022 16:06:02 -0700 Subject: [PATCH 29/43] formatting --- shell/common/shell_unittests.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/common/shell_unittests.cc b/shell/common/shell_unittests.cc index aac29538e73cb..d5d7b84f10617 100644 --- a/shell/common/shell_unittests.cc +++ b/shell/common/shell_unittests.cc @@ -820,7 +820,7 @@ TEST_F(ShellTest, PushBackdropFilterToVisitedPlatformViews) { ASSERT_EQ(external_view_embedder->GetVisitedPlatformViews()[1], 75); ASSERT_TRUE(external_view_embedder->GetStack(75).is_empty()); ASSERT_FALSE(external_view_embedder->GetStack(50).is_empty()); - + auto filter = DlBlurImageFilter(5, 5, DlTileMode::kClamp); auto mutator = *external_view_embedder->GetStack(50).Begin(); ASSERT_EQ(mutator->GetType(), MutatorType::kBackdropFilter); From 7c05b746ac6b6d4bcc667ac56c246c17121e0780 Mon Sep 17 00:00:00 2001 From: Javon Thomas <89162381+JTKryptic@users.noreply.github.com> Date: Tue, 2 Aug 2022 16:17:36 -0700 Subject: [PATCH 30/43] Update ios_external_view_embedder.h --- shell/platform/darwin/ios/ios_external_view_embedder.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.h b/shell/platform/darwin/ios/ios_external_view_embedder.h index 518f1d33de7e7..f49e16e8a4841 100644 --- a/shell/platform/darwin/ios/ios_external_view_embedder.h +++ b/shell/platform/darwin/ios/ios_external_view_embedder.h @@ -60,13 +60,15 @@ class IOSExternalViewEmbedder : public ExternalViewEmbedder { void EndFrame( bool should_resubmit_frame, fml::RefPtr raster_thread_merger) override; - + // |ExternalViewEmbedder| bool SupportsDynamicThreadMerging() override; - + + // |ExternalViewEmbedder| void PushFilterToVisitedPlatformViews( std::shared_ptr filter) override; - + + // |ExternalViewEmbedder| void PushVisitedPlatformView(int64_t view_id) override; FML_DISALLOW_COPY_AND_ASSIGN(IOSExternalViewEmbedder); From ca719f35b13cca9bb5fb27b10a70578e594296ed Mon Sep 17 00:00:00 2001 From: Javon Thomas <89162381+JTKryptic@users.noreply.github.com> Date: Tue, 2 Aug 2022 16:20:22 -0700 Subject: [PATCH 31/43] Update ios_external_view_embedder.mm --- shell/platform/darwin/ios/ios_external_view_embedder.mm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.mm b/shell/platform/darwin/ios/ios_external_view_embedder.mm index 0ecfbf4e97b1f..067c96aab7648 100644 --- a/shell/platform/darwin/ios/ios_external_view_embedder.mm +++ b/shell/platform/darwin/ios/ios_external_view_embedder.mm @@ -92,11 +92,13 @@ return true; } +// |ExternalViewEmbedder| void IOSExternalViewEmbedder::PushFilterToVisitedPlatformViews( std::shared_ptr filter) { platform_views_controller_->PushFilterToVisitedPlatformViews(filter); } +// |ExternalViewEmbedder| void IOSExternalViewEmbedder::PushVisitedPlatformView(int64_t view_id) { platform_views_controller_->PushVisitedPlatformView(view_id); } From 8d24f6487efd9716351e554ca8cddcfe349007ff Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Tue, 2 Aug 2022 16:36:52 -0700 Subject: [PATCH 32/43] format --- shell/platform/darwin/ios/ios_external_view_embedder.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.h b/shell/platform/darwin/ios/ios_external_view_embedder.h index f49e16e8a4841..543d4ac11be24 100644 --- a/shell/platform/darwin/ios/ios_external_view_embedder.h +++ b/shell/platform/darwin/ios/ios_external_view_embedder.h @@ -60,14 +60,14 @@ class IOSExternalViewEmbedder : public ExternalViewEmbedder { void EndFrame( bool should_resubmit_frame, fml::RefPtr raster_thread_merger) override; - + // |ExternalViewEmbedder| bool SupportsDynamicThreadMerging() override; - + // |ExternalViewEmbedder| void PushFilterToVisitedPlatformViews( std::shared_ptr filter) override; - + // |ExternalViewEmbedder| void PushVisitedPlatformView(int64_t view_id) override; From 58b3ce399bf18cf3cdb0e89d139757096f2094a1 Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Wed, 3 Aug 2022 09:59:08 -0700 Subject: [PATCH 33/43] PR comment changes --- flow/embedded_views.h | 2 ++ shell/common/shell_unittests.cc | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/flow/embedded_views.h b/flow/embedded_views.h index 415d26c87b82e..a61ab7f1c1627 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -375,6 +375,8 @@ class ExternalViewEmbedder { // This method pushes a DlImageFilter object to each platform view within a // list of visited platform views. + // See also: |PushVisitedPlatformView| for pushing platform view ids to the + // visited platform views list. virtual void PushFilterToVisitedPlatformViews( std::shared_ptr filter) {} diff --git a/shell/common/shell_unittests.cc b/shell/common/shell_unittests.cc index d5d7b84f10617..1319e87360b56 100644 --- a/shell/common/shell_unittests.cc +++ b/shell/common/shell_unittests.cc @@ -798,8 +798,6 @@ TEST_F(ShellTest, PushBackdropFilterToVisitedPlatformViews) { RunEngine(shell.get(), std::move(configuration)); LayerTreeBuilder builder = [&](std::shared_ptr root) { - fml::RefPtr queue = fml::MakeRefCounted( - this->GetCurrentTaskRunner(), fml::TimeDelta::Zero()); auto platform_view_layer = std::make_shared( SkPoint::Make(10, 10), SkSize::Make(10, 10), 50); root->Add(platform_view_layer); From 7b558e23464dd8a6535b761616d0b26f06925525 Mon Sep 17 00:00:00 2001 From: Javon Thomas <89162381+JTKryptic@users.noreply.github.com> Date: Wed, 3 Aug 2022 10:13:26 -0700 Subject: [PATCH 34/43] Update embedded_views.h --- flow/embedded_views.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/flow/embedded_views.h b/flow/embedded_views.h index a61ab7f1c1627..54b1a155db726 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -369,12 +369,13 @@ class ExternalViewEmbedder { // 'EndFrame', otherwise returns false. bool GetUsedThisFrame() const { return used_this_frame_; } - // This method pushes the platform view id of a visited platform view to a - // list of visited platform views. + // Pushes the platform view id of a visited platform view to a list of + // visited platform views. virtual void PushVisitedPlatformView(int64_t view_id) {} - // This method pushes a DlImageFilter object to each platform view within a - // list of visited platform views. + // Pushes a DlImageFilter object to each platform view within a list of + // visited platform views. + // // See also: |PushVisitedPlatformView| for pushing platform view ids to the // visited platform views list. virtual void PushFilterToVisitedPlatformViews( From 1d0bb6d4f6a894bb953fcf36a9942b4881663f40 Mon Sep 17 00:00:00 2001 From: Javon Thomas <89162381+JTKryptic@users.noreply.github.com> Date: Wed, 10 Aug 2022 11:10:27 -0700 Subject: [PATCH 35/43] Update embedded_views.h --- flow/embedded_views.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/flow/embedded_views.h b/flow/embedded_views.h index 16f1a17685d74..1339c5fc0b6ab 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -250,7 +250,8 @@ class EmbeddedViewParams { // Pushes the stored DlImageFilter object to the mutators stack. void PushImageFilter(std::shared_ptr filter) { mutators_stack_.PushBackdropFilter(filter); - + } + // Whether the embedder should construct DisplayList objects to hold the // rendering commands for each between-view slice of the layer tree. bool display_list_enabled() const { return display_list_enabled_; } From b2a262547821561d4355ab2f4c96043ccd170112 Mon Sep 17 00:00:00 2001 From: Javon Thomas <89162381+JTKryptic@users.noreply.github.com> Date: Wed, 10 Aug 2022 11:18:13 -0700 Subject: [PATCH 36/43] Update shell_test_external_view_embedder.cc --- shell/common/shell_test_external_view_embedder.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/shell/common/shell_test_external_view_embedder.cc b/shell/common/shell_test_external_view_embedder.cc index 11b66938a0416..6c3ab6b937caa 100644 --- a/shell/common/shell_test_external_view_embedder.cc +++ b/shell/common/shell_test_external_view_embedder.cc @@ -70,6 +70,7 @@ std::vector ShellTestExternalViewEmbedder::GetCurrentCanvases() { EmbedderPaintContext ShellTestExternalViewEmbedder::CompositeEmbeddedView( int view_id) { return {nullptr, nullptr}; +} // |ExternalViewEmbedder| void ShellTestExternalViewEmbedder::PushVisitedPlatformView(int64_t view_id) { From aef123c17c0ae5f83f42c365ac8d6c7a882d360d Mon Sep 17 00:00:00 2001 From: Javon Thomas <89162381+JTKryptic@users.noreply.github.com> Date: Wed, 10 Aug 2022 11:26:21 -0700 Subject: [PATCH 37/43] Update shell_test_external_view_embedder.cc --- shell/common/shell_test_external_view_embedder.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/shell/common/shell_test_external_view_embedder.cc b/shell/common/shell_test_external_view_embedder.cc index 6c3ab6b937caa..dfe3b6f255ecb 100644 --- a/shell/common/shell_test_external_view_embedder.cc +++ b/shell/common/shell_test_external_view_embedder.cc @@ -86,6 +86,7 @@ void ShellTestExternalViewEmbedder::PushFilterToVisitedPlatformViews( current_composition_params_[id] = params; mutators_stacks_[id] = params.mutatorsStack(); } +} // |ExternalViewEmbedder| void ShellTestExternalViewEmbedder::SubmitFrame( From 85e0b4c779c8504ae93eb8835e050ea87a57cddb Mon Sep 17 00:00:00 2001 From: Javon Thomas <89162381+JTKryptic@users.noreply.github.com> Date: Wed, 10 Aug 2022 11:31:58 -0700 Subject: [PATCH 38/43] Update shell_test_external_view_embedder.cc --- shell/common/shell_test_external_view_embedder.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/shell/common/shell_test_external_view_embedder.cc b/shell/common/shell_test_external_view_embedder.cc index dfe3b6f255ecb..18f8b652a2d82 100644 --- a/shell/common/shell_test_external_view_embedder.cc +++ b/shell/common/shell_test_external_view_embedder.cc @@ -66,6 +66,11 @@ std::vector ShellTestExternalViewEmbedder::GetCurrentCanvases() { return {}; } +// |ExternalViewEmbedder| +SkCanvas* ShellTestExternalViewEmbedder::CompositeEmbeddedView(int view_id) { + return picture_recorders_[view_id]->getRecordingCanvas(); +} + // |ExternalViewEmbedder| EmbedderPaintContext ShellTestExternalViewEmbedder::CompositeEmbeddedView( int view_id) { From 235a853300b4565ad887569aedf05e4954d8150b Mon Sep 17 00:00:00 2001 From: Javon Thomas <89162381+JTKryptic@users.noreply.github.com> Date: Wed, 10 Aug 2022 11:39:50 -0700 Subject: [PATCH 39/43] Update shell_test_external_view_embedder.h --- shell/common/shell_test_external_view_embedder.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/shell/common/shell_test_external_view_embedder.h b/shell/common/shell_test_external_view_embedder.h index 17500a0de5ddc..200c66ce1429a 100644 --- a/shell/common/shell_test_external_view_embedder.h +++ b/shell/common/shell_test_external_view_embedder.h @@ -67,6 +67,9 @@ class ShellTestExternalViewEmbedder final : public ExternalViewEmbedder { // |ExternalViewEmbedder| EmbedderPaintContext CompositeEmbeddedView(int view_id) override; + + // |ExternalViewEmbedder| + SkCanvas* CompositeEmbeddedView(int view_id) override; // |ExternalViewEmbedder| void PushVisitedPlatformView(int64_t view_id) override; From e9d7cb1b63f58fe3b8549fb5d8505aefd2be4756 Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Wed, 10 Aug 2022 11:39:04 -0700 Subject: [PATCH 40/43] test fix --- shell/common/shell_test_external_view_embedder.cc | 5 ----- shell/common/shell_test_external_view_embedder.h | 3 +++ 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/shell/common/shell_test_external_view_embedder.cc b/shell/common/shell_test_external_view_embedder.cc index 18f8b652a2d82..dfe3b6f255ecb 100644 --- a/shell/common/shell_test_external_view_embedder.cc +++ b/shell/common/shell_test_external_view_embedder.cc @@ -66,11 +66,6 @@ std::vector ShellTestExternalViewEmbedder::GetCurrentCanvases() { return {}; } -// |ExternalViewEmbedder| -SkCanvas* ShellTestExternalViewEmbedder::CompositeEmbeddedView(int view_id) { - return picture_recorders_[view_id]->getRecordingCanvas(); -} - // |ExternalViewEmbedder| EmbedderPaintContext ShellTestExternalViewEmbedder::CompositeEmbeddedView( int view_id) { diff --git a/shell/common/shell_test_external_view_embedder.h b/shell/common/shell_test_external_view_embedder.h index 200c66ce1429a..df29ec36d14eb 100644 --- a/shell/common/shell_test_external_view_embedder.h +++ b/shell/common/shell_test_external_view_embedder.h @@ -71,6 +71,9 @@ class ShellTestExternalViewEmbedder final : public ExternalViewEmbedder { // |ExternalViewEmbedder| SkCanvas* CompositeEmbeddedView(int view_id) override; + // |ExternalViewEmbedder| + SkCanvas* CompositeEmbeddedView(int view_id) override; + // |ExternalViewEmbedder| void PushVisitedPlatformView(int64_t view_id) override; From a33caa4f693875b5253ce49cd4e50bd86bb95544 Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Wed, 10 Aug 2022 11:50:52 -0700 Subject: [PATCH 41/43] fixes --- flow/embedded_views.h | 4 ++ .../shell_test_external_view_embedder.cc | 65 +++++++++---------- 2 files changed, 35 insertions(+), 34 deletions(-) diff --git a/flow/embedded_views.h b/flow/embedded_views.h index 1339c5fc0b6ab..c691b808d20b6 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -256,6 +256,10 @@ class EmbeddedViewParams { // rendering commands for each between-view slice of the layer tree. bool display_list_enabled() const { return display_list_enabled_; } + // Whether the embedder should construct DisplayList objects to hold the + // rendering commands for each between-view slice of the layer tree. + bool display_list_enabled() const { return display_list_enabled_; } + bool operator==(const EmbeddedViewParams& other) const { return size_points_ == other.size_points_ && mutators_stack_ == other.mutators_stack_ && diff --git a/shell/common/shell_test_external_view_embedder.cc b/shell/common/shell_test_external_view_embedder.cc index dfe3b6f255ecb..b3508cac0adeb 100644 --- a/shell/common/shell_test_external_view_embedder.cc +++ b/shell/common/shell_test_external_view_embedder.cc @@ -66,12 +66,6 @@ std::vector ShellTestExternalViewEmbedder::GetCurrentCanvases() { return {}; } -// |ExternalViewEmbedder| -EmbedderPaintContext ShellTestExternalViewEmbedder::CompositeEmbeddedView( - int view_id) { - return {nullptr, nullptr}; -} - // |ExternalViewEmbedder| void ShellTestExternalViewEmbedder::PushVisitedPlatformView(int64_t view_id) { visited_platform_views_.push_back(view_id); @@ -86,39 +80,42 @@ void ShellTestExternalViewEmbedder::PushFilterToVisitedPlatformViews( current_composition_params_[id] = params; mutators_stacks_[id] = params.mutatorsStack(); } -} -// |ExternalViewEmbedder| -void ShellTestExternalViewEmbedder::SubmitFrame( - GrDirectContext* context, - std::unique_ptr frame) { - if (!frame) { - return; + EmbedderPaintContext ShellTestExternalViewEmbedder::CompositeEmbeddedView( + int view_id) { + return {nullptr, nullptr}; } - frame->Submit(); - if (frame->SkiaSurface()) { - last_submitted_frame_size_ = SkISize::Make(frame->SkiaSurface()->width(), - frame->SkiaSurface()->height()); - } else { - last_submitted_frame_size_ = SkISize::MakeEmpty(); + + // |ExternalViewEmbedder| + void ShellTestExternalViewEmbedder::SubmitFrame( + GrDirectContext * context, std::unique_ptr frame) { + if (!frame) { + return; + } + frame->Submit(); + if (frame->SkiaSurface()) { + last_submitted_frame_size_ = SkISize::Make( + frame->SkiaSurface()->width(), frame->SkiaSurface()->height()); + } else { + last_submitted_frame_size_ = SkISize::MakeEmpty(); + } + submitted_frame_count_++; } - submitted_frame_count_++; -} -// |ExternalViewEmbedder| -void ShellTestExternalViewEmbedder::EndFrame( - bool should_resubmit_frame, - fml::RefPtr raster_thread_merger) { - end_frame_call_back_(should_resubmit_frame, raster_thread_merger); -} + // |ExternalViewEmbedder| + void ShellTestExternalViewEmbedder::EndFrame( + bool should_resubmit_frame, + fml::RefPtr raster_thread_merger) { + end_frame_call_back_(should_resubmit_frame, raster_thread_merger); + } -// |ExternalViewEmbedder| -SkCanvas* ShellTestExternalViewEmbedder::GetRootCanvas() { - return nullptr; -} + // |ExternalViewEmbedder| + SkCanvas* ShellTestExternalViewEmbedder::GetRootCanvas() { + return nullptr; + } -bool ShellTestExternalViewEmbedder::SupportsDynamicThreadMerging() { - return support_thread_merging_; -} + bool ShellTestExternalViewEmbedder::SupportsDynamicThreadMerging() { + return support_thread_merging_; + } } // namespace flutter From 3be1bf3dd366878fdd7dc1b23e8c9fb229a668f4 Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Wed, 10 Aug 2022 13:30:06 -0700 Subject: [PATCH 42/43] test fix --- .../shell_test_external_view_embedder.cc | 74 ++++++++++--------- .../shell_test_external_view_embedder.h | 6 +- 2 files changed, 43 insertions(+), 37 deletions(-) diff --git a/shell/common/shell_test_external_view_embedder.cc b/shell/common/shell_test_external_view_embedder.cc index b3508cac0adeb..14482ba260c6b 100644 --- a/shell/common/shell_test_external_view_embedder.cc +++ b/shell/common/shell_test_external_view_embedder.cc @@ -50,8 +50,14 @@ void ShellTestExternalViewEmbedder::BeginFrame( void ShellTestExternalViewEmbedder::PrerollCompositeEmbeddedView( int view_id, std::unique_ptr params) { - picture_recorders_[view_id] = std::make_unique(); - picture_recorders_[view_id]->beginRecording(SkRect::MakeEmpty()); + SkRect view_bounds = SkRect::Make(frame_size_); + std::unique_ptr view; + if (params->display_list_enabled()) { + view = std::make_unique(view_bounds); + } else { + view = std::make_unique(view_bounds); + } + slices_.insert_or_assign(view_id, std::move(view)); } // |ExternalViewEmbedder| @@ -80,42 +86,44 @@ void ShellTestExternalViewEmbedder::PushFilterToVisitedPlatformViews( current_composition_params_[id] = params; mutators_stacks_[id] = params.mutatorsStack(); } +} - EmbedderPaintContext ShellTestExternalViewEmbedder::CompositeEmbeddedView( - int view_id) { - return {nullptr, nullptr}; - } +EmbedderPaintContext ShellTestExternalViewEmbedder::CompositeEmbeddedView( + int view_id) { + return {slices_[view_id]->canvas(), slices_[view_id]->builder()}; +} - // |ExternalViewEmbedder| - void ShellTestExternalViewEmbedder::SubmitFrame( - GrDirectContext * context, std::unique_ptr frame) { - if (!frame) { - return; - } - frame->Submit(); - if (frame->SkiaSurface()) { - last_submitted_frame_size_ = SkISize::Make( - frame->SkiaSurface()->width(), frame->SkiaSurface()->height()); - } else { - last_submitted_frame_size_ = SkISize::MakeEmpty(); - } - submitted_frame_count_++; +// |ExternalViewEmbedder| +void ShellTestExternalViewEmbedder::SubmitFrame( + GrDirectContext* context, + std::unique_ptr frame) { + if (!frame) { + return; } - - // |ExternalViewEmbedder| - void ShellTestExternalViewEmbedder::EndFrame( - bool should_resubmit_frame, - fml::RefPtr raster_thread_merger) { - end_frame_call_back_(should_resubmit_frame, raster_thread_merger); + frame->Submit(); + if (frame->SkiaSurface()) { + last_submitted_frame_size_ = SkISize::Make(frame->SkiaSurface()->width(), + frame->SkiaSurface()->height()); + } else { + last_submitted_frame_size_ = SkISize::MakeEmpty(); } + submitted_frame_count_++; +} - // |ExternalViewEmbedder| - SkCanvas* ShellTestExternalViewEmbedder::GetRootCanvas() { - return nullptr; - } +// |ExternalViewEmbedder| +void ShellTestExternalViewEmbedder::EndFrame( + bool should_resubmit_frame, + fml::RefPtr raster_thread_merger) { + end_frame_call_back_(should_resubmit_frame, raster_thread_merger); +} - bool ShellTestExternalViewEmbedder::SupportsDynamicThreadMerging() { - return support_thread_merging_; - } +// |ExternalViewEmbedder| +SkCanvas* ShellTestExternalViewEmbedder::GetRootCanvas() { + return nullptr; +} + +bool ShellTestExternalViewEmbedder::SupportsDynamicThreadMerging() { + return support_thread_merging_; +} } // namespace flutter diff --git a/shell/common/shell_test_external_view_embedder.h b/shell/common/shell_test_external_view_embedder.h index df29ec36d14eb..2546177e3ea95 100644 --- a/shell/common/shell_test_external_view_embedder.h +++ b/shell/common/shell_test_external_view_embedder.h @@ -71,9 +71,6 @@ class ShellTestExternalViewEmbedder final : public ExternalViewEmbedder { // |ExternalViewEmbedder| SkCanvas* CompositeEmbeddedView(int view_id) override; - // |ExternalViewEmbedder| - SkCanvas* CompositeEmbeddedView(int view_id) override; - // |ExternalViewEmbedder| void PushVisitedPlatformView(int64_t view_id) override; @@ -101,7 +98,8 @@ class ShellTestExternalViewEmbedder final : public ExternalViewEmbedder { PostPrerollResult post_preroll_result_; bool support_thread_merging_; - std::map> picture_recorders_; + SkISize frame_size_; + std::map> slices_; std::map mutators_stacks_; std::map current_composition_params_; std::vector visited_platform_views_; From 357ec82486dacdb512412de9e59e26587e607180 Mon Sep 17 00:00:00 2001 From: Javon Thomas Date: Wed, 10 Aug 2022 13:46:49 -0700 Subject: [PATCH 43/43] test fix 3 --- flow/embedded_views.h | 4 ---- shell/common/shell_test_external_view_embedder.h | 3 --- 2 files changed, 7 deletions(-) diff --git a/flow/embedded_views.h b/flow/embedded_views.h index c691b808d20b6..6a678978f2c85 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -251,10 +251,6 @@ class EmbeddedViewParams { void PushImageFilter(std::shared_ptr filter) { mutators_stack_.PushBackdropFilter(filter); } - - // Whether the embedder should construct DisplayList objects to hold the - // rendering commands for each between-view slice of the layer tree. - bool display_list_enabled() const { return display_list_enabled_; } // Whether the embedder should construct DisplayList objects to hold the // rendering commands for each between-view slice of the layer tree. diff --git a/shell/common/shell_test_external_view_embedder.h b/shell/common/shell_test_external_view_embedder.h index 2546177e3ea95..86c051e5c5963 100644 --- a/shell/common/shell_test_external_view_embedder.h +++ b/shell/common/shell_test_external_view_embedder.h @@ -67,9 +67,6 @@ class ShellTestExternalViewEmbedder final : public ExternalViewEmbedder { // |ExternalViewEmbedder| EmbedderPaintContext CompositeEmbeddedView(int view_id) override; - - // |ExternalViewEmbedder| - SkCanvas* CompositeEmbeddedView(int view_id) override; // |ExternalViewEmbedder| void PushVisitedPlatformView(int64_t view_id) override;