Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 14194cb

Browse files
Correct the frame timing in 'Rasterizer::Draw' when pipeline is more available (#32283)
1 parent 25601c9 commit 14194cb

File tree

9 files changed

+193
-89
lines changed

9 files changed

+193
-89
lines changed

shell/common/animator.cc

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -163,26 +163,25 @@ void Animator::Render(std::unique_ptr<flutter::LayerTree> layer_tree) {
163163
delegate_.OnAnimatorUpdateLatestFrameTargetTime(
164164
frame_timings_recorder_->GetVsyncTargetTime());
165165

166+
auto layer_tree_item = std::make_unique<LayerTreeItem>(
167+
std::move(layer_tree), std::move(frame_timings_recorder_));
166168
// Commit the pending continuation.
167169
PipelineProduceResult result =
168-
producer_continuation_.Complete(std::move(layer_tree));
170+
producer_continuation_.Complete(std::move(layer_tree_item));
169171

170172
if (!result.success) {
171-
frame_timings_recorder_.reset();
172173
FML_DLOG(INFO) << "No pending continuation to commit";
173174
return;
174175
}
175176

176177
if (!result.is_first_item) {
177-
frame_timings_recorder_.reset();
178178
// It has been successfully pushed to the pipeline but not as the first
179179
// item. Eventually the 'Rasterizer' will consume it, so we don't need to
180180
// notify the delegate.
181181
return;
182182
}
183183

184-
delegate_.OnAnimatorDraw(layer_tree_pipeline_,
185-
std::move(frame_timings_recorder_));
184+
delegate_.OnAnimatorDraw(layer_tree_pipeline_);
186185
}
187186

188187
const std::weak_ptr<VsyncWaiter> Animator::GetVsyncWaiter() const {

shell/common/animator.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,7 @@ class Animator final {
4040
fml::TimePoint frame_target_time) = 0;
4141

4242
virtual void OnAnimatorDraw(
43-
std::shared_ptr<Pipeline<flutter::LayerTree>> pipeline,
44-
std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder) = 0;
43+
std::shared_ptr<LayerTreePipeline> pipeline) = 0;
4544

4645
virtual void OnAnimatorDrawLastLayerTree(
4746
std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder) = 0;
@@ -83,8 +82,6 @@ class Animator final {
8382
void EnqueueTraceFlowId(uint64_t trace_flow_id);
8483

8584
private:
86-
using LayerTreePipeline = Pipeline<flutter::LayerTree>;
87-
8885
void BeginFrame(std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder);
8986

9087
bool CanReuseLastLayerTree();

shell/common/animator_unittests.cc

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,8 @@ class FakeAnimatorDelegate : public Animator::Delegate {
3535
MOCK_METHOD1(OnAnimatorUpdateLatestFrameTargetTime,
3636
void(fml::TimePoint frame_target_time));
3737

38-
MOCK_METHOD2(
39-
OnAnimatorDraw,
40-
void(std::shared_ptr<Pipeline<flutter::LayerTree>> pipeline,
41-
std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder));
38+
MOCK_METHOD1(OnAnimatorDraw,
39+
void(std::shared_ptr<LayerTreePipeline> pipeline));
4240

4341
void OnAnimatorDrawLastLayerTree(
4442
std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder) override {}

shell/common/pipeline.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
#include <memory>
1010
#include <mutex>
1111

12+
#include "flutter/flow/frame_timings.h"
13+
#include "flutter/flow/layers/layer_tree.h"
1214
#include "flutter/fml/macros.h"
1315
#include "flutter/fml/memory/ref_counted.h"
1416
#include "flutter/fml/synchronization/semaphore.h"
@@ -219,6 +221,17 @@ class Pipeline {
219221
FML_DISALLOW_COPY_AND_ASSIGN(Pipeline);
220222
};
221223

224+
struct LayerTreeItem {
225+
LayerTreeItem(std::unique_ptr<LayerTree> layer_tree,
226+
std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder)
227+
: layer_tree(std::move(layer_tree)),
228+
frame_timings_recorder(std::move(frame_timings_recorder)) {}
229+
std::unique_ptr<LayerTree> layer_tree;
230+
std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder;
231+
};
232+
233+
using LayerTreePipeline = Pipeline<LayerTreeItem>;
234+
222235
} // namespace flutter
223236

224237
#endif // FLUTTER_SHELL_COMMON_PIPELINE_H_

shell/common/rasterizer.cc

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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 {
395391
RasterStatus 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;

shell/common/rasterizer.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -241,10 +241,8 @@ class Rasterizer final : public SnapshotDelegate,
241241
/// @param[in] discard_callback if specified and returns true, the layer tree
242242
/// is discarded instead of being rendered
243243
///
244-
RasterStatus Draw(
245-
std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder,
246-
std::shared_ptr<Pipeline<flutter::LayerTree>> pipeline,
247-
LayerTreeDiscardCallback discard_callback = NoDiscard);
244+
RasterStatus Draw(std::shared_ptr<LayerTreePipeline> pipeline,
245+
LayerTreeDiscardCallback discard_callback = NoDiscard);
248246

249247
//----------------------------------------------------------------------------
250248
/// @brief The type of the screenshot to obtain of the previously
@@ -509,6 +507,7 @@ class Rasterizer final : public SnapshotDelegate,
509507
// has not successfully rasterized. This can happen due to the change in the
510508
// thread configuration. This will be inserted to the front of the pipeline.
511509
std::unique_ptr<flutter::LayerTree> resubmitted_layer_tree_;
510+
std::unique_ptr<FrameTimingsRecorder> resubmitted_recorder_;
512511
fml::closure next_frame_callback_;
513512
bool user_override_resource_cache_bytes_;
514513
std::optional<size_t> max_cache_bytes_;

0 commit comments

Comments
 (0)