Flutter Engine
 
Loading...
Searching...
No Matches
flutter::LayerTree Class Reference

#include <layer_tree.h>

Public Member Functions

 LayerTree (const std::shared_ptr< Layer > &root_layer, const DlISize &frame_size)
 
bool Preroll (CompositorContext::ScopedFrame &frame, bool ignore_raster_cache=false, DlRect cull_rect=kGiantRect)
 
void Paint (CompositorContext::ScopedFrame &frame, bool ignore_raster_cache=false) const
 
sk_sp< DisplayListFlatten (const DlRect &bounds, const std::shared_ptr< TextureRegistry > &texture_registry=nullptr, GrDirectContext *gr_context=nullptr)
 
Layerroot_layer () const
 
const DlISizeframe_size () const
 
const PaintRegionMappaint_region_map () const
 
PaintRegionMappaint_region_map ()
 

Static Public Member Functions

static void TryToRasterCache (const std::vector< RasterCacheItem * > &raster_cached_entries, const PaintContext *paint_context, bool ignore_raster_cache=false)
 

Detailed Description

Definition at line 22 of file layer_tree.h.

Constructor & Destructor Documentation

◆ LayerTree()

flutter::LayerTree::LayerTree ( const std::shared_ptr< Layer > &  root_layer,
const DlISize frame_size 
)

Definition at line 20 of file layer_tree.cc.

22 : root_layer_(root_layer), frame_size_(frame_size) {}
Layer * root_layer() const
Definition layer_tree.h:53
const DlISize & frame_size() const
Definition layer_tree.h:54

Member Function Documentation

◆ Flatten()

sk_sp< DisplayList > flutter::LayerTree::Flatten ( const DlRect bounds,
const std::shared_ptr< TextureRegistry > &  texture_registry = nullptr,
GrDirectContext *  gr_context = nullptr 
)

Definition at line 147 of file layer_tree.cc.

150 {
151 TRACE_EVENT0("flutter", "LayerTree::Flatten");
152
153 DisplayListBuilder builder(bounds);
154
155 const FixedRefreshRateStopwatch unused_stopwatch;
156
157 LayerStateStack preroll_state_stack;
158 // No root surface transformation. So assume identity.
159 preroll_state_stack.set_preroll_delegate(bounds);
160 PrerollContext preroll_context{
161 // clang-format off
162#if !SLIMPELLER
163 .raster_cache = nullptr,
164#endif // !SLIMPELLER
165 .gr_context = gr_context,
166 .view_embedder = nullptr,
167 .state_stack = preroll_state_stack,
168 .dst_color_space = nullptr,
169 .surface_needs_readback = false,
170 .raster_time = unused_stopwatch,
171 .ui_time = unused_stopwatch,
172 .texture_registry = texture_registry,
173 // clang-format on
174 };
175
176 LayerStateStack paint_state_stack;
177 paint_state_stack.set_delegate(&builder);
178 PaintContext paint_context = {
179 // clang-format off
180 .state_stack = paint_state_stack,
181 .canvas = &builder,
182 .gr_context = gr_context,
183 .dst_color_space = nullptr,
184 .view_embedder = nullptr,
185 .raster_time = unused_stopwatch,
186 .ui_time = unused_stopwatch,
187 .texture_registry = texture_registry,
188#if !SLIMPELLER
189 .raster_cache = nullptr,
190#endif // !SLIMPELLER
191 // clang-format on
192 };
193
194 // Even if we don't have a root layer, we still need to create an empty
195 // picture.
196 if (root_layer_) {
197 root_layer_->Preroll(&preroll_context);
198
199 // The needs painting flag may be set after the preroll. So check it after.
200 if (root_layer_->needs_painting(paint_context)) {
201 root_layer_->Paint(paint_context);
202 }
203 }
204
205 return builder.Build();
206}
#define TRACE_EVENT0(category_group, name)

References flutter::DisplayListBuilder::Build(), flutter::PrerollContext::gr_context, flutter::LayerStateStack::set_delegate(), flutter::LayerStateStack::set_preroll_delegate(), flutter::PaintContext::state_stack, and TRACE_EVENT0.

◆ frame_size()

const DlISize & flutter::LayerTree::frame_size ( ) const
inline

◆ Paint()

void flutter::LayerTree::Paint ( CompositorContext::ScopedFrame frame,
bool  ignore_raster_cache = false 
) const

Definition at line 96 of file layer_tree.cc.

97 {
98 TRACE_EVENT0("flutter", "LayerTree::Paint");
99
100 if (!root_layer_) {
101 FML_LOG(ERROR) << "The scene did not specify any layers to paint.";
102 return;
103 }
104
105 LayerStateStack state_stack;
106
107 DlCanvas* canvas = frame.canvas();
108 state_stack.set_delegate(canvas);
109
110 SkColorSpace* color_space = GetColorSpace(frame.canvas());
111
112#if !SLIMPELLER
113 RasterCache* cache =
114 ignore_raster_cache ? nullptr : &frame.context().raster_cache();
115#endif // !SLIMPELLER
116
117 PaintContext context = {
118 // clang-format off
119 .state_stack = state_stack,
120 .canvas = canvas,
121 .gr_context = frame.gr_context(),
122 .dst_color_space = sk_ref_sp(color_space),
123 .view_embedder = frame.view_embedder(),
124 .raster_time = frame.context().raster_time(),
125 .ui_time = frame.context().ui_time(),
126 .texture_registry = frame.context().texture_registry(),
127#if !SLIMPELLER
128 .raster_cache = cache,
129#endif // !SLIMPELLER
130 .impeller_enabled = !!frame.aiks_context(),
131 .aiks_context = frame.aiks_context(),
132 // clang-format on
133 };
134
135#if !SLIMPELLER
136 if (cache) {
137 cache->EvictUnusedCacheEntries();
138 TryToRasterCache(raster_cache_items_, &context, ignore_raster_cache);
139 }
140#endif // !SLIMPELLER
141
142 if (root_layer_->needs_painting(context)) {
143 root_layer_->Paint(context);
144 }
145}
static void TryToRasterCache(const std::vector< RasterCacheItem * > &raster_cached_entries, const PaintContext *paint_context, bool ignore_raster_cache=false)
Definition layer_tree.cc:67
#define FML_LOG(severity)
Definition logging.h:101
SkColorSpace * GetColorSpace(DlCanvas *canvas)
Definition layer_tree.cc:24
flutter::DlCanvas DlCanvas

References flutter::CompositorContext::ScopedFrame::aiks_context(), flutter::CompositorContext::ScopedFrame::canvas(), flutter::CompositorContext::ScopedFrame::context(), flutter::RasterCache::EvictUnusedCacheEntries(), FML_LOG, flutter::GetColorSpace(), flutter::CompositorContext::ScopedFrame::gr_context(), flutter::CompositorContext::raster_cache(), flutter::CompositorContext::raster_time(), flutter::LayerStateStack::set_delegate(), flutter::PaintContext::state_stack, flutter::CompositorContext::texture_registry(), TRACE_EVENT0, TryToRasterCache(), flutter::CompositorContext::ui_time(), and flutter::CompositorContext::ScopedFrame::view_embedder().

◆ paint_region_map() [1/2]

PaintRegionMap & flutter::LayerTree::paint_region_map ( )
inline

Definition at line 57 of file layer_tree.h.

57{ return paint_region_map_; }

◆ paint_region_map() [2/2]

const PaintRegionMap & flutter::LayerTree::paint_region_map ( ) const
inline

Definition at line 56 of file layer_tree.h.

56{ return paint_region_map_; }

Referenced by flutter::FrameDamage::ComputeClipRect().

◆ Preroll()

bool flutter::LayerTree::Preroll ( CompositorContext::ScopedFrame frame,
bool  ignore_raster_cache = false,
DlRect  cull_rect = kGiantRect 
)

Definition at line 28 of file layer_tree.cc.

30 {
31 TRACE_EVENT0("flutter", "LayerTree::Preroll");
32
33 if (!root_layer_) {
34 FML_LOG(ERROR) << "The scene did not specify any layers.";
35 return false;
36 }
37
38 SkColorSpace* color_space = GetColorSpace(frame.canvas());
39 LayerStateStack state_stack;
40 state_stack.set_preroll_delegate(cull_rect,
41 frame.root_surface_transformation());
42
43 raster_cache_items_.clear();
44
45 PrerollContext context = {
46#if !SLIMPELLER
47 .raster_cache =
48 ignore_raster_cache ? nullptr : &frame.context().raster_cache(),
49#endif // !SLIMPELLER
50 .gr_context = frame.gr_context(),
51 .view_embedder = frame.view_embedder(),
52 .state_stack = state_stack,
53 .dst_color_space = sk_ref_sp<SkColorSpace>(color_space),
54 .surface_needs_readback = false,
55 .raster_time = frame.context().raster_time(),
56 .ui_time = frame.context().ui_time(),
57 .texture_registry = frame.context().texture_registry(),
58 .raster_cached_entries = &raster_cache_items_,
59 };
60
61 root_layer_->Preroll(&context);
62
63 return context.surface_needs_readback;
64}

References flutter::CompositorContext::ScopedFrame::canvas(), flutter::CompositorContext::ScopedFrame::context(), FML_LOG, flutter::GetColorSpace(), flutter::CompositorContext::ScopedFrame::gr_context(), flutter::CompositorContext::raster_cache(), flutter::CompositorContext::raster_time(), flutter::CompositorContext::ScopedFrame::root_surface_transformation(), flutter::LayerStateStack::set_preroll_delegate(), flutter::PrerollContext::surface_needs_readback, flutter::CompositorContext::texture_registry(), TRACE_EVENT0, flutter::CompositorContext::ui_time(), and flutter::CompositorContext::ScopedFrame::view_embedder().

Referenced by flutter::CompositorContext::ScopedFrame::Raster().

◆ root_layer()

Layer * flutter::LayerTree::root_layer ( ) const
inline

Definition at line 53 of file layer_tree.h.

53{ return root_layer_.get(); }

Referenced by flutter::FrameDamage::ComputeClipRect().

◆ TryToRasterCache()

void flutter::LayerTree::TryToRasterCache ( const std::vector< RasterCacheItem * > &  raster_cached_entries,
const PaintContext paint_context,
bool  ignore_raster_cache = false 
)
static

Definition at line 67 of file layer_tree.cc.

70 {
71 unsigned i = 0;
72 const auto item_size = raster_cached_items.size();
73 while (i < item_size) {
74 auto* item = raster_cached_items[i];
75 if (item->need_caching()) {
76 // try to cache current layer
77 // If parent failed to cache, just proceed to the next entry
78 // cache current entry, this entry's parent must not cache
79 if (item->TryToPrepareRasterCache(*paint_context, false)) {
80 // if parent cached, then foreach child layer to touch them.
81 for (unsigned j = 0; j < item->child_items(); j++) {
82 auto* child_item = raster_cached_items[i + j + 1];
83 if (child_item->need_caching()) {
84 child_item->TryToPrepareRasterCache(*paint_context, true);
85 }
86 }
87 i += item->child_items() + 1;
88 continue;
89 }
90 }
91 i++;
92 }
93}

References i.

Referenced by Paint(), flutter::testing::TEST(), flutter::testing::TEST_F(), flutter::testing::TEST_F(), flutter::testing::TEST_F(), flutter::testing::TEST_F(), flutter::testing::TEST_F(), flutter::testing::TEST_F(), flutter::testing::TEST_F(), flutter::testing::TEST_F(), flutter::testing::TEST_F(), flutter::testing::TEST_F(), and flutter::testing::TEST_F().


The documentation for this class was generated from the following files: