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 all 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 must be submitted again. This is only used
// 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 has be dropped and a new frame with the same layer tree must 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
7 changes: 7 additions & 0 deletions flow/frame_timings.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,13 @@ class FrameTimingsRecorder {
/// Returns the recorded time from when `RecordRasterEnd` is called.
FrameTiming GetRecordedTime() const;

/// Asserts in unopt builds that the recorder is current at the specified
/// state.
///
/// Instead of adding a `GetState` method and asserting on the result, this
/// method prevents other logic from relying on the state.
void AssertInState(State state) const;

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

// The information to draw a layer tree to a specified view.
struct LayerTreeTask {
public:
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 draw to.
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;

private:
FML_DISALLOW_COPY_AND_ASSIGN(LayerTreeTask);
};

} // namespace flutter

#endif // FLUTTER_FLOW_LAYERS_LAYER_TREE_H_
2 changes: 1 addition & 1 deletion runtime/runtime_delegate.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class RuntimeDelegate {
public:
virtual std::string DefaultRouteName() = 0;

virtual void ScheduleFrame(bool regenerate_layer_tree = true) = 0;
virtual void ScheduleFrame(bool regenerate_layer_trees = true) = 0;

virtual void Render(std::unique_ptr<flutter::LayerTree> layer_tree,
float device_pixel_ratio) = 0;
Expand Down
42 changes: 23 additions & 19 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 @@ -84,7 +85,7 @@ void Animator::BeginFrame(
}

frame_scheduled_ = false;
regenerate_layer_tree_ = false;
regenerate_layer_trees_ = false;
pending_frame_semaphore_.Signal();

if (!producer_continuation_) {
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,16 @@ 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.
// See https://github.com/flutter/flutter/issues/135530, item 2.
int64_t view_id = kFlutterImplicitViewId;
std::vector<std::unique_ptr<LayerTreeTask>> layer_trees_tasks;
layer_trees_tasks.push_back(std::make_unique<LayerTreeTask>(
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 All @@ -188,15 +192,15 @@ const std::weak_ptr<VsyncWaiter> Animator::GetVsyncWaiter() const {
return weak;
}

bool Animator::CanReuseLastLayerTree() {
return !regenerate_layer_tree_;
bool Animator::CanReuseLastLayerTrees() {
return !regenerate_layer_trees_;
}

void Animator::DrawLastLayerTree(
void Animator::DrawLastLayerTrees(
std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder) {
// This method is very cheap, but this makes it explicitly clear in trace
// files.
TRACE_EVENT0("flutter", "Animator::DrawLastLayerTree");
TRACE_EVENT0("flutter", "Animator::DrawLastLayerTrees");

pending_frame_semaphore_.Signal();
// In this case BeginFrame doesn't get called, we need to
Expand All @@ -206,18 +210,18 @@ void Animator::DrawLastLayerTree(
const auto now = fml::TimePoint::Now();
frame_timings_recorder->RecordBuildStart(now);
frame_timings_recorder->RecordBuildEnd(now);
delegate_.OnAnimatorDrawLastLayerTree(std::move(frame_timings_recorder));
delegate_.OnAnimatorDrawLastLayerTrees(std::move(frame_timings_recorder));
}

void Animator::RequestFrame(bool regenerate_layer_tree) {
if (regenerate_layer_tree) {
void Animator::RequestFrame(bool regenerate_layer_trees) {
if (regenerate_layer_trees) {
// This event will be closed by BeginFrame. BeginFrame will only be called
// if regenerating the layer tree. If a frame has been requested to update
// if regenerating the layer trees. If a frame has been requested to update
// an external texture, this will be false and no BeginFrame call will
// happen.
TRACE_EVENT_ASYNC_BEGIN0("flutter", "Frame Request Pending",
frame_request_number_);
regenerate_layer_tree_ = true;
regenerate_layer_trees_ = true;
}

if (!pending_frame_semaphore_.TryWait()) {
Expand Down Expand Up @@ -248,8 +252,8 @@ void Animator::AwaitVSync() {
[self = weak_factory_.GetWeakPtr()](
std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder) {
if (self) {
if (self->CanReuseLastLayerTree()) {
self->DrawLastLayerTree(std::move(frame_timings_recorder));
if (self->CanReuseLastLayerTrees()) {
self->DrawLastLayerTrees(std::move(frame_timings_recorder));
} else {
self->BeginFrame(std::move(frame_timings_recorder));
}
Expand Down
18 changes: 8 additions & 10 deletions shell/common/animator.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,9 @@ 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(
virtual void OnAnimatorDrawLastLayerTrees(
std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder) = 0;
};

Expand All @@ -52,7 +51,7 @@ class Animator final {

~Animator();

void RequestFrame(bool regenerate_layer_tree = true);
void RequestFrame(bool regenerate_layer_trees = true);

void Render(std::unique_ptr<flutter::LayerTree> layer_tree,
float device_pixel_ratio);
Expand Down Expand Up @@ -85,9 +84,9 @@ class Animator final {
private:
void BeginFrame(std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder);

bool CanReuseLastLayerTree();
bool CanReuseLastLayerTrees();

void DrawLastLayerTree(
void DrawLastLayerTrees(
std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder);

void AwaitVSync();
Expand All @@ -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_;
bool regenerate_layer_tree_ = false;
FramePipeline::ProducerContinuation producer_continuation_;
bool regenerate_layer_trees_ = 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
4 changes: 2 additions & 2 deletions shell/common/animator_unittests.cc
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,10 @@ class FakeAnimatorDelegate : public Animator::Delegate {

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

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

bool notify_idle_called_ = false;
Expand Down
4 changes: 2 additions & 2 deletions shell/common/engine.cc
Original file line number Diff line number Diff line change
Expand Up @@ -455,8 +455,8 @@ std::string Engine::DefaultRouteName() {
return "/";
}

void Engine::ScheduleFrame(bool regenerate_layer_tree) {
animator_->RequestFrame(regenerate_layer_tree);
void Engine::ScheduleFrame(bool regenerate_layer_trees) {
animator_->RequestFrame(regenerate_layer_trees);
}

void Engine::Render(std::unique_ptr<flutter::LayerTree> layer_tree,
Expand Down
3 changes: 1 addition & 2 deletions shell/common/engine.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
#include "flutter/shell/common/display_manager.h"
#include "flutter/shell/common/platform_view.h"
#include "flutter/shell/common/pointer_data_dispatcher.h"
#include "flutter/shell/common/rasterizer.h"
#include "flutter/shell/common/run_configuration.h"
#include "flutter/shell/common/shell_io_manager.h"

Expand Down Expand Up @@ -828,7 +827,7 @@ class Engine final : public RuntimeDelegate, PointerDataDispatcher::Delegate {
void SetAccessibilityFeatures(int32_t flags);

// |RuntimeDelegate|
void ScheduleFrame(bool regenerate_layer_tree) override;
void ScheduleFrame(bool regenerate_layer_trees) override;

/// Schedule a frame with the default parameter of regenerating the layer
/// tree.
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