Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 56 commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
e084a92
Split FrameStatus of CompositorContext
dkwingsmt Aug 15, 2023
f25f09a
Extract DrawSurfaceStatus
dkwingsmt Aug 15, 2023
3977e16
Simplify DrawStatus
dkwingsmt Aug 15, 2023
0b9483d
DoDrawStatus, and rename back to RasterStatus
dkwingsmt Aug 15, 2023
1138ada
Combine retry
dkwingsmt Aug 17, 2023
cbaa530
Merge remote-tracking branch 'origin/main' into raster-status-rescope
dkwingsmt Aug 17, 2023
6826818
Split status, found one
dkwingsmt Aug 17, 2023
6d64314
Add doc
dkwingsmt Aug 17, 2023
07dfb2f
Split gpu unavailable
dkwingsmt Aug 17, 2023
4375281
Remove DrawSurfaceStatus discarded
dkwingsmt Aug 17, 2023
c5d40d0
Merge remote-tracking branch 'origin/main' into raster-status-rescope
dkwingsmt Aug 17, 2023
990a9da
Merge remote-tracking branch 'origin/main' into raster-status-rescope
dkwingsmt Aug 17, 2023
1b980ad
Move the discard callback to surface
dkwingsmt Aug 17, 2023
ac9ee88
Merge remote-tracking branch 'origin/main' into raster-status-rescope
dkwingsmt Aug 23, 2023
4618ad7
Move up discarding
dkwingsmt Aug 23, 2023
7d1706a
Better success handling
dkwingsmt Aug 23, 2023
17f269e
Merge remote-tracking branch 'origin/main' into raster-status-rescope
dkwingsmt Aug 23, 2023
209ebee
Revert the discard movement
dkwingsmt Aug 23, 2023
fda0e7d
Merge remote-tracking branch 'origin/main' into raster-status-rescope
dkwingsmt Sep 4, 2023
7b0f468
Merge remote-tracking branch 'dkwingsmt/raster-status-rescope' into r…
dkwingsmt Sep 4, 2023
9b3c12f
Revert some changes
dkwingsmt Sep 4, 2023
69ea367
Revert more changes
dkwingsmt Sep 4, 2023
f2cd6e3
Rename to status
dkwingsmt Sep 4, 2023
d0d66ef
lint
dkwingsmt Sep 4, 2023
94aac45
Merge remote-tracking branch 'origin/main' into mv-raster-real
dkwingsmt Sep 5, 2023
3d94b8e
Convert to LayerTreeTask
dkwingsmt Sep 5, 2023
791bc60
Merge remote-tracking branch 'origin/main' into raster-status-rescope
dkwingsmt Sep 5, 2023
9445595
Fix retry conversion
dkwingsmt Sep 5, 2023
06c284d
Merge branch 'raster-status-rescope' into mv-raster-real
dkwingsmt Sep 6, 2023
174f6d7
Multiview DoDraw and DrawToSurface
dkwingsmt Sep 7, 2023
c267f08
Replace successful tasks
dkwingsmt Sep 8, 2023
c30257e
Fix enqueuepipeline
dkwingsmt Sep 8, 2023
21fdea9
DrawToSurfaces and DrawToSurfacesUnsafe
dkwingsmt Sep 8, 2023
9bdb841
Fix test
dkwingsmt Sep 8, 2023
cf82d5f
Move frame timing recorder out of surface
dkwingsmt Sep 8, 2023
6a31db2
Merge remote-tracking branch 'origin/main' into mv-raster-real
dkwingsmt Sep 10, 2023
21530fb
Move status out
dkwingsmt Sep 10, 2023
65ec5bd
Rename to kDone, kNotSetup, and doc
dkwingsmt Sep 11, 2023
2fd9846
Move EVE::BeginFrame to outside
dkwingsmt Sep 11, 2023
555c962
Merge remote-tracking branch 'dkwingsmt/mv-raster-real' into mv-raste…
dkwingsmt Sep 11, 2023
1a53977
Fix EVE::beginframe error
dkwingsmt Sep 12, 2023
ef78cfd
repeated rasters recorders
dkwingsmt Sep 14, 2023
0a210b8
Fix tests
dkwingsmt Sep 14, 2023
bae59ec
Make a loop
dkwingsmt Sep 14, 2023
0f0a628
Fix timing test
dkwingsmt Sep 14, 2023
9b74f4f
Fix timing test
dkwingsmt Sep 14, 2023
0f539e1
Filter discarded trees beforehand
dkwingsmt Sep 14, 2023
a5d895a
Multiview last draw status
dkwingsmt Sep 14, 2023
a19f56b
Check task empty in DoDraw
dkwingsmt Sep 14, 2023
e3be81c
frame_timings_recorder.AssertInState
dkwingsmt Sep 14, 2023
6d62c32
Move pipeline def to rasterizer.h
dkwingsmt Sep 20, 2023
8cc0657
Format
dkwingsmt Sep 20, 2023
526f233
Fix doc
dkwingsmt Sep 20, 2023
f209751
Merge remote-tracking branch 'origin/main' into mv-raster-real
dkwingsmt Sep 20, 2023
15c1af0
Move LayerTreeTask back
dkwingsmt Sep 20, 2023
a3e7529
Merge branch 'main' into mv-raster-real
dkwingsmt Sep 25, 2023
797a88c
Change to vector unique_ptr
dkwingsmt Sep 26, 2023
9a837be
Merge remote-tracking branch 'dkwingsmt/mv-raster-real' into mv-raste…
dkwingsmt Sep 26, 2023
f752d0a
Doc fix
dkwingsmt Sep 26, 2023
44b24c5
Merge remote-tracking branch 'origin/main' into mv-raster-real
dkwingsmt Sep 26, 2023
69550b3
Merge to ViewRecord
dkwingsmt Sep 26, 2023
0eb5694
Add issue links
dkwingsmt Sep 26, 2023
9b8c4cf
Merge remote-tracking branch 'origin/main' into mv-raster-real
dkwingsmt Sep 26, 2023
0540cad
Fix comment
dkwingsmt Sep 29, 2023
af7ae28
Merge remote-tracking branch 'origin/main' into mv-raster-real
dkwingsmt Sep 29, 2023
6b9c423
Remove unnecessary include
dkwingsmt Sep 29, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 4 additions & 15 deletions flow/compositor_context.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,19 @@ namespace flutter {

class LayerTree;

// The result status of CompositorContext::ScopedFrame::Raster.
enum class RasterStatus {
// Frame has been successfully rasterized.
kSuccess,
// Frame is submitted twice. This is only used on Android when
// switching the background surface to FlutterImageView.
// Frame has been submited, but should be submitted again. This is only used
Comment thread
dkwingsmt marked this conversation as resolved.
Outdated
// on Android when switching the background surface to FlutterImageView.
//
// On Android, the first frame doesn't make the image available
// to the ImageReader right away. The second frame does.
//
// TODO(egarciad): https://github.com/flutter/flutter/issues/65652
kResubmit,
// Frame is dropped and a new frame with the same layer tree is
// Frame should be dropped and a new frame with the same layer tree should be
// attempted.
//
// This is currently used to wait for the thread merger to merge
Expand All @@ -44,18 +45,6 @@ enum class RasterStatus {
// with separate threads for rasterization and platform tasks,
// potentially leading to different performance characteristics.
kSkipAndRetry,
// Frame has been successfully rasterized, but there are additional items in
// the pipeline waiting to be consumed. This is currently
// only used when thread configuration change occurs.
kEnqueuePipeline,
// Failed to rasterize the frame.
kFailed,
// Layer tree was discarded due to LayerTreeDiscardCallback or inability to
// access the GPU.
kDiscarded,
// Drawing was yielded to allow the correct thread to draw as a result of the
// RasterThreadMerger.
kYielded,
};

class FrameDamage {
Expand Down
4 changes: 4 additions & 0 deletions flow/frame_timings.cc
Original file line number Diff line number Diff line change
Expand Up @@ -254,4 +254,8 @@ const char* FrameTimingsRecorder::GetFrameNumberTraceArg() const {
return frame_number_trace_arg_val_.c_str();
}

void FrameTimingsRecorder::AssertInState(State state) const {
FML_DCHECK(state_ == state);
}

} // namespace flutter
6 changes: 6 additions & 0 deletions flow/frame_timings.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,12 @@ class FrameTimingsRecorder {
/// Returns the recorded time from when `RecordRasterEnd` is called.
FrameTiming GetRecordedTime() const;

/// Asserts in debug mode that the recorder is current at the specified state.
Comment thread
dkwingsmt marked this conversation as resolved.
Outdated
///
/// A `GetState` method is not preferred to avoid other logic relying on this
/// state.
void AssertInState(State state) const;

private:
FML_FRIEND_TEST(FrameTimingsRecorderTest, ThrowWhenRecordBuildBeforeVsync);
FML_FRIEND_TEST(FrameTimingsRecorderTest,
Expand Down
16 changes: 16 additions & 0 deletions flow/layers/layer_tree.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,22 @@ class LayerTree {
FML_DISALLOW_COPY_AND_ASSIGN(LayerTree);
};

// The information to draw a layer tree to a specified view.
struct LayerTreeTask {
LayerTreeTask(int64_t view_id,
std::unique_ptr<LayerTree> layer_tree,
float device_pixel_ratio)
: view_id(view_id),
layer_tree(std::move(layer_tree)),
device_pixel_ratio(device_pixel_ratio) {}
/// The target view to drawn to.
Comment thread
dkwingsmt marked this conversation as resolved.
Outdated
int64_t view_id;
/// The target layer tree to be drawn.
std::unique_ptr<LayerTree> layer_tree;
/// The pixel ratio of the target view.
float device_pixel_ratio;
};
Comment thread
dkwingsmt marked this conversation as resolved.

} // namespace flutter

#endif // FLUTTER_FLOW_LAYERS_LAYER_TREE_H_
17 changes: 10 additions & 7 deletions shell/common/animator.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

#include "flutter/shell/common/animator.h"

#include "flutter/common/constants.h"
#include "flutter/flow/frame_timings.h"
#include "flutter/fml/time/time_point.h"
#include "flutter/fml/trace_event.h"
Expand All @@ -28,12 +29,12 @@ Animator::Animator(Delegate& delegate,
task_runners_(task_runners),
waiter_(std::move(waiter)),
#if SHELL_ENABLE_METAL
layer_tree_pipeline_(std::make_shared<LayerTreePipeline>(2)),
layer_tree_pipeline_(std::make_shared<FramePipeline>(2)),
#else // SHELL_ENABLE_METAL
// TODO(dnfield): We should remove this logic and set the pipeline depth
// back to 2 in this case. See
// https://github.com/flutter/engine/pull/9132 for discussion.
layer_tree_pipeline_(std::make_shared<LayerTreePipeline>(
layer_tree_pipeline_(std::make_shared<FramePipeline>(
task_runners.GetPlatformTaskRunner() ==
task_runners.GetRasterTaskRunner()
? 1
Expand Down Expand Up @@ -143,7 +144,6 @@ void Animator::BeginFrame(
void Animator::Render(std::unique_ptr<flutter::LayerTree> layer_tree,
float device_pixel_ratio) {
has_rendered_ = true;
last_layer_tree_size_ = layer_tree->frame_size();

if (!frame_timings_recorder_) {
// Framework can directly call render with a built scene.
Expand All @@ -161,12 +161,15 @@ void Animator::Render(std::unique_ptr<flutter::LayerTree> layer_tree,
delegate_.OnAnimatorUpdateLatestFrameTargetTime(
frame_timings_recorder_->GetVsyncTargetTime());

auto layer_tree_item = std::make_unique<LayerTreeItem>(
std::move(layer_tree), std::move(frame_timings_recorder_),
device_pixel_ratio);
// TODO(dkwingsmt): Currently only supports a single window.
int64_t view_id = kFlutterImplicitViewId;
Comment thread
dkwingsmt marked this conversation as resolved.
std::list<LayerTreeTask> layer_trees_tasks;
layer_trees_tasks.emplace_back(view_id, std::move(layer_tree),
device_pixel_ratio);
// Commit the pending continuation.
PipelineProduceResult result =
producer_continuation_.Complete(std::move(layer_tree_item));
producer_continuation_.Complete(std::make_unique<FrameItem>(
std::move(layer_trees_tasks), std::move(frame_timings_recorder_)));

if (!result.success) {
FML_DLOG(INFO) << "No pending continuation to commit";
Expand Down
8 changes: 3 additions & 5 deletions shell/common/animator.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,7 @@ class Animator final {
virtual void OnAnimatorUpdateLatestFrameTargetTime(
fml::TimePoint frame_target_time) = 0;

virtual void OnAnimatorDraw(
std::shared_ptr<LayerTreePipeline> pipeline) = 0;
virtual void OnAnimatorDraw(std::shared_ptr<FramePipeline> pipeline) = 0;

virtual void OnAnimatorDrawLastLayerTree(
std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder) = 0;
Expand Down Expand Up @@ -102,12 +101,11 @@ class Animator final {
std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder_;
uint64_t frame_request_number_ = 1;
fml::TimeDelta dart_frame_deadline_;
std::shared_ptr<LayerTreePipeline> layer_tree_pipeline_;
std::shared_ptr<FramePipeline> layer_tree_pipeline_;
fml::Semaphore pending_frame_semaphore_;
LayerTreePipeline::ProducerContinuation producer_continuation_;
FramePipeline::ProducerContinuation producer_continuation_;
bool regenerate_layer_tree_ = false;
bool frame_scheduled_ = false;
SkISize last_layer_tree_size_ = {0, 0};
std::deque<uint64_t> trace_flow_ids_;
bool has_rendered_ = false;

Expand Down
2 changes: 1 addition & 1 deletion shell/common/animator_unittests.cc
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ class FakeAnimatorDelegate : public Animator::Delegate {

MOCK_METHOD(void,
OnAnimatorDraw,
(std::shared_ptr<LayerTreePipeline> pipeline),
(std::shared_ptr<FramePipeline> pipeline),
(override));

void OnAnimatorDrawLastLayerTree(
Expand Down
14 changes: 0 additions & 14 deletions shell/common/pipeline.h
Original file line number Diff line number Diff line change
Expand Up @@ -253,20 +253,6 @@ class Pipeline {
FML_DISALLOW_COPY_AND_ASSIGN(Pipeline);
};

struct LayerTreeItem {
LayerTreeItem(std::unique_ptr<LayerTree> layer_tree,
std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder,
float device_pixel_ratio)
: layer_tree(std::move(layer_tree)),
frame_timings_recorder(std::move(frame_timings_recorder)),
device_pixel_ratio(device_pixel_ratio) {}
std::unique_ptr<LayerTree> layer_tree;
std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder;
float device_pixel_ratio;
};

using LayerTreePipeline = Pipeline<LayerTreeItem>;

} // namespace flutter

#endif // FLUTTER_SHELL_COMMON_PIPELINE_H_
Loading