@@ -160,12 +160,9 @@ void Rasterizer::DrawLastLayerTree(
160160 }
161161}
162162
163- RasterStatus Rasterizer::Draw (
164- std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder,
165- std::shared_ptr<Pipeline<flutter::LayerTree>> pipeline,
166- LayerTreeDiscardCallback discard_callback) {
167- TRACE_EVENT_WITH_FRAME_NUMBER (frame_timings_recorder, " flutter" ,
168- " GPURasterizer::Draw" );
163+ RasterStatus Rasterizer::Draw (std::shared_ptr<LayerTreePipeline> pipeline,
164+ LayerTreeDiscardCallback discard_callback) {
165+ TRACE_EVENT0 (" flutter" , " GPURasterizer::Draw" );
169166 if (raster_thread_merger_ &&
170167 !raster_thread_merger_->IsOnRasterizingThread ()) {
171168 // we yield and let this frame be serviced on the right thread.
@@ -175,13 +172,12 @@ RasterStatus Rasterizer::Draw(
175172 .GetRasterTaskRunner ()
176173 ->RunsTasksOnCurrentThread ());
177174
178- std::unique_ptr<FrameTimingsRecorder> resubmit_recorder =
179- frame_timings_recorder->CloneUntil (
180- FrameTimingsRecorder::State::kBuildEnd );
181-
182175 RasterStatus raster_status = RasterStatus::kFailed ;
183- Pipeline<flutter::LayerTree>::Consumer consumer =
184- [&](std::unique_ptr<LayerTree> layer_tree) {
176+ LayerTreePipeline::Consumer consumer =
177+ [&](std::unique_ptr<LayerTreeItem> item) {
178+ std::unique_ptr<LayerTree> layer_tree = std::move (item->layer_tree );
179+ std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder =
180+ std::move (item->frame_timings_recorder );
185181 if (discard_callback (*layer_tree.get ())) {
186182 raster_status = RasterStatus::kDiscarded ;
187183 } else {
@@ -199,9 +195,11 @@ RasterStatus Rasterizer::Draw(
199195
200196 bool should_resubmit_frame = ShouldResubmitFrame (raster_status);
201197 if (should_resubmit_frame) {
198+ auto resubmitted_layer_tree_item = std::make_unique<LayerTreeItem>(
199+ std::move (resubmitted_layer_tree_), std::move (resubmitted_recorder_));
202200 auto front_continuation = pipeline->ProduceIfEmpty ();
203201 PipelineProduceResult result =
204- front_continuation.Complete (std::move (resubmitted_layer_tree_ ));
202+ front_continuation.Complete (std::move (resubmitted_layer_tree_item ));
205203 if (result.success ) {
206204 consume_result = PipelineConsumeResult::MoreAvailable;
207205 }
@@ -224,11 +222,9 @@ RasterStatus Rasterizer::Draw(
224222 delegate_.GetTaskRunners ().GetRasterTaskRunner ()->PostTask (
225223 fml::MakeCopyable (
226224 [weak_this = weak_factory_.GetWeakPtr (), pipeline,
227- resubmit_recorder = std::move (resubmit_recorder),
228225 discard_callback = std::move (discard_callback)]() mutable {
229226 if (weak_this) {
230- weak_this->Draw (std::move (resubmit_recorder), pipeline,
231- std::move (discard_callback));
227+ weak_this->Draw (pipeline, std::move (discard_callback));
232228 }
233229 }));
234230 break ;
@@ -395,6 +391,8 @@ fml::Milliseconds Rasterizer::GetFrameBudget() const {
395391RasterStatus Rasterizer::DoDraw (
396392 std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder,
397393 std::unique_ptr<flutter::LayerTree> layer_tree) {
394+ TRACE_EVENT_WITH_FRAME_NUMBER (frame_timings_recorder, " flutter" ,
395+ " Rasterizer::DoDraw" );
398396 FML_DCHECK (delegate_.GetTaskRunners ()
399397 .GetRasterTaskRunner ()
400398 ->RunsTasksOnCurrentThread ());
@@ -412,6 +410,8 @@ RasterStatus Rasterizer::DoDraw(
412410 last_layer_tree_ = std::move (layer_tree);
413411 } else if (ShouldResubmitFrame (raster_status)) {
414412 resubmitted_layer_tree_ = std::move (layer_tree);
413+ resubmitted_recorder_ = frame_timings_recorder->CloneUntil (
414+ FrameTimingsRecorder::State::kBuildEnd );
415415 return raster_status;
416416 } else if (raster_status == RasterStatus::kDiscarded ) {
417417 return raster_status;
0 commit comments