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

Commit 0b8fe08

Browse files
author
Kaushik Iska
committed
rename and add docs
1 parent 6105750 commit 0b8fe08

5 files changed

Lines changed: 41 additions & 17 deletions

File tree

shell/common/animator.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ void Animator::Render(std::unique_ptr<flutter::LayerTree> layer_tree) {
154154
last_frame_target_time_);
155155
}
156156

157-
layer_tree_holder_->ReplaceIfNewer(std::move(layer_tree));
157+
layer_tree_holder_->PushIfNewer(std::move(layer_tree));
158158
delegate_.OnAnimatorDraw(layer_tree_holder_, last_frame_target_time_);
159159
}
160160

shell/common/layer_tree_holder.cc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,16 @@
66

77
namespace flutter {
88

9-
std::unique_ptr<LayerTree> LayerTreeHolder::Get() {
9+
LayerTreeHolder::LayerTreeHolder() = default;
10+
11+
LayerTreeHolder::~LayerTreeHolder() = default;
12+
13+
std::unique_ptr<LayerTree> LayerTreeHolder::Pop() {
1014
std::scoped_lock lock(layer_tree_mutex);
1115
return std::move(layer_tree_);
1216
}
1317

14-
void LayerTreeHolder::ReplaceIfNewer(
18+
void LayerTreeHolder::PushIfNewer(
1519
std::unique_ptr<LayerTree> proposed_layer_tree) {
1620
std::scoped_lock lock(layer_tree_mutex);
1721
if (!layer_tree_ ||

shell/common/layer_tree_holder.h

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,37 @@
1111

1212
namespace flutter {
1313

14+
/**
15+
* @brief Holds the next `flutter::LayerTree` that needs to be rasterized. The
16+
* accesses to `LayerTreeHolder` are thread safe. This is important as this
17+
* component is accessed from both the UI and the Raster threads.
18+
*
19+
* A typical flow of events through this component would be:
20+
* 1. `flutter::Animator` pushed a layer tree to be rendered during each
21+
* `Animator::Render` call.
22+
* 2. `flutter::Rasterizer::Draw` consumes the pushed layer tree via `Pop`.
23+
*
24+
* It is important to note that if a layer tree held by this class is yet to be
25+
* consumed, it can be overriden by a newer layer tree produced by the
26+
* `Animator`. The newness of the layer tree is determined by the target time.
27+
*/
1428
class LayerTreeHolder {
1529
public:
16-
LayerTreeHolder() = default;
30+
LayerTreeHolder();
1731

18-
~LayerTreeHolder() = default;
32+
~LayerTreeHolder();
1933

34+
/**
35+
* @brief Checks if a layer tree is currently held.
36+
*
37+
* @return true is no layer tree is held.
38+
* @return false if there is a layer tree waiting to be consumed.
39+
*/
2040
bool IsEmpty() const;
2141

22-
std::unique_ptr<LayerTree> Get();
42+
[[nodiscard]] std::unique_ptr<LayerTree> Pop();
2343

24-
void ReplaceIfNewer(std::unique_ptr<LayerTree> proposed_layer_tree);
44+
void PushIfNewer(std::unique_ptr<LayerTree> proposed_layer_tree);
2545

2646
private:
2747
mutable std::mutex layer_tree_mutex;

shell/common/layer_tree_holder_unittests.cc

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ TEST(LayerTreeHolder, PutOneAndGet) {
2323
LayerTreeHolder layer_tree_holder;
2424
const auto frame_size = SkISize::Make(64, 64);
2525
auto layer_tree = std::make_unique<LayerTree>(frame_size, 100.0f, 1.0f);
26-
layer_tree_holder.ReplaceIfNewer(std::move(layer_tree));
26+
layer_tree_holder.PushIfNewer(std::move(layer_tree));
2727
ASSERT_FALSE(layer_tree_holder.IsEmpty());
28-
const auto stored = layer_tree_holder.Get();
28+
const auto stored = layer_tree_holder.Pop();
2929
ASSERT_EQ(stored->frame_size(), frame_size);
3030
ASSERT_TRUE(layer_tree_holder.IsEmpty());
3131
}
@@ -39,14 +39,14 @@ TEST(LayerTreeHolder, PutMultiGetsLatest) {
3939
const auto frame_size_1 = SkISize::Make(64, 64);
4040
auto layer_tree_1 = std::make_unique<LayerTree>(frame_size_1, 100.0f, 1.0f);
4141
layer_tree_1->RecordBuildTime(build_begin, target_time_1);
42-
layer_tree_holder.ReplaceIfNewer(std::move(layer_tree_1));
42+
layer_tree_holder.PushIfNewer(std::move(layer_tree_1));
4343

4444
const auto frame_size_2 = SkISize::Make(128, 128);
4545
auto layer_tree_2 = std::make_unique<LayerTree>(frame_size_2, 100.0f, 1.0f);
4646
layer_tree_2->RecordBuildTime(build_begin, target_time_2);
47-
layer_tree_holder.ReplaceIfNewer(std::move(layer_tree_2));
47+
layer_tree_holder.PushIfNewer(std::move(layer_tree_2));
4848

49-
const auto stored = layer_tree_holder.Get();
49+
const auto stored = layer_tree_holder.Pop();
5050
ASSERT_EQ(stored->frame_size(), frame_size_2);
5151
ASSERT_TRUE(layer_tree_holder.IsEmpty());
5252
}
@@ -60,14 +60,14 @@ TEST(LayerTreeHolder, RetainsOlderIfNewerFrameHasEarlierTargetTime) {
6060
const auto frame_size_1 = SkISize::Make(64, 64);
6161
auto layer_tree_1 = std::make_unique<LayerTree>(frame_size_1, 100.0f, 1.0f);
6262
layer_tree_1->RecordBuildTime(build_begin, target_time_1);
63-
layer_tree_holder.ReplaceIfNewer(std::move(layer_tree_1));
63+
layer_tree_holder.PushIfNewer(std::move(layer_tree_1));
6464

6565
const auto frame_size_2 = SkISize::Make(128, 128);
6666
auto layer_tree_2 = std::make_unique<LayerTree>(frame_size_2, 100.0f, 1.0f);
6767
layer_tree_2->RecordBuildTime(build_begin, target_time_2);
68-
layer_tree_holder.ReplaceIfNewer(std::move(layer_tree_2));
68+
layer_tree_holder.PushIfNewer(std::move(layer_tree_2));
6969

70-
const auto stored = layer_tree_holder.Get();
70+
const auto stored = layer_tree_holder.Pop();
7171
ASSERT_EQ(stored->frame_size(), frame_size_1);
7272
ASSERT_TRUE(layer_tree_holder.IsEmpty());
7373
}

shell/common/rasterizer.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,14 +119,14 @@ void Rasterizer::Draw(std::shared_ptr<LayerTreeHolder> layer_tree_holder) {
119119
}
120120
FML_DCHECK(task_runners_.GetRasterTaskRunner()->RunsTasksOnCurrentThread());
121121

122-
std::unique_ptr<LayerTree> layer_tree = layer_tree_holder->Get();
122+
std::unique_ptr<LayerTree> layer_tree = layer_tree_holder->Pop();
123123
RasterStatus raster_status =
124124
layer_tree ? DoDraw(std::move(layer_tree)) : RasterStatus::kFailed;
125125

126126
// Merging the thread as we know the next `Draw` should be run on the platform
127127
// thread.
128128
if (raster_status == RasterStatus::kResubmit) {
129-
layer_tree_holder->ReplaceIfNewer(std::move(resubmitted_layer_tree_));
129+
layer_tree_holder->PushIfNewer(std::move(resubmitted_layer_tree_));
130130
auto* external_view_embedder = surface_->GetExternalViewEmbedder();
131131
FML_DCHECK(external_view_embedder != nullptr)
132132
<< "kResubmit is an invalid raster status without external view "

0 commit comments

Comments
 (0)