667 TRACE_EVENT0(
"flutter",
"FlutterPlatformViewsController::SubmitFrame");
670 FML_DCHECK([[NSThread currentThread] isMainThread]);
671 if (flutter_view_ ==
nullptr) {
672 return frame->Submit();
677 DlCanvas* background_canvas = frame->Canvas();
680 background_canvas->Flush();
684 DlAutoCanvasRestore save(background_canvas,
true);
687 LayersMap platform_view_layers;
689 auto did_submit =
true;
690 auto num_platform_views = composition_order_.size();
692 for (
size_t i = 0; i < num_platform_views; i++) {
693 int64_t platform_view_id = composition_order_[i];
694 EmbedderViewSlice* slice = slices_[platform_view_id].get();
695 slice->end_recording();
699 for (
size_t j = i + 1; j > 0; j--) {
700 int64_t current_platform_view_id = composition_order_[j - 1];
702 std::list<SkRect> intersection_rects =
703 slice->searchNonOverlappingDrawnRects(platform_view_rect);
704 auto allocation_size = intersection_rects.size();
708 auto overlay_id = platform_view_layers[current_platform_view_id].size();
715 if (allocation_size > kMaxLayerAllocations) {
716 SkRect joined_rect = SkRect::MakeEmpty();
717 for (
const SkRect& rect : intersection_rects) {
718 joined_rect.join(rect);
722 intersection_rects.clear();
723 intersection_rects.push_back(joined_rect);
725 for (SkRect& joined_rect : intersection_rects) {
728 joined_rect.intersect(platform_view_rect);
732 joined_rect.setLTRB(std::floor(joined_rect.left()), std::floor(joined_rect.top()),
733 std::ceil(joined_rect.right()), std::ceil(joined_rect.bottom()));
736 background_canvas->ClipRect(joined_rect, DlCanvas::ClipOp::kDifference);
738 std::shared_ptr<FlutterPlatformViewLayer> layer = GetLayer(gr_context,
742 current_platform_view_id,
745 did_submit &= layer->did_submit_last_frame;
746 platform_view_layers[current_platform_view_id].push_back(layer);
750 slice->render_into(background_canvas);
758 RemoveUnusedLayers();
760 BringLayersIntoView(platform_view_layers);
762 layer_pool_->RecycleLayers();
764 did_submit &= frame->Submit();
769 CommitCATransactionIfNeeded();