Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
layer_raster_cache_item.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "flutter/flow/layers/layer_raster_cache_item.h"
6#include "flutter/flow/layers/container_layer.h"
7#include "flutter/flow/raster_cache_item.h"
8#include "flutter/flow/raster_cache_util.h"
10
11namespace flutter {
12
14 int layer_cached_threshold,
15 bool can_cache_children)
18 // The layer raster_cache_item's cache state default value is none.
20 layer_(layer),
21 layer_cached_threshold_(layer_cached_threshold),
22 can_cache_children_(can_cache_children) {}
23
25 const SkMatrix& matrix) {
26 cache_state_ = CacheState::kNone;
27 if (context->raster_cache && context->raster_cached_entries) {
28 context->raster_cached_entries->push_back(this);
29 child_items_ = context->raster_cached_entries->size();
30 matrix_ = matrix;
31 }
32}
33
34std::unique_ptr<LayerRasterCacheItem> LayerRasterCacheItem::Make(
35 Layer* layer,
36 int layer_cache_threshold,
37 bool can_cache_children) {
38 return std::make_unique<LayerRasterCacheItem>(layer, layer_cache_threshold,
39 can_cache_children);
40}
41
43 const SkMatrix& matrix) {
44 if (!context->raster_cache || !context->raster_cached_entries) {
45 return;
46 }
47 // We've marked the cache entry that we would like to cache so it stays
48 // alive, but if the following conditions apply then we need to set our
49 // state back to kDoNotCache so that we don't populate the entry later.
50 if (context->has_platform_view || context->has_texture_layer ||
51 context->state_stack.content_culled(layer_->paint_bounds())) {
52 return;
53 }
54 child_items_ = context->raster_cached_entries->size() - child_items_;
55 if (num_cache_attempts_ >= layer_cached_threshold_) {
56 // the layer can be cached
57 cache_state_ = CacheState::kCurrent;
58 context->raster_cache->MarkSeen(key_id_, matrix_, true);
59 } else {
60 num_cache_attempts_++;
61 // access current layer
62 if (can_cache_children_) {
63 if (!layer_children_id_.has_value()) {
64 auto ids = RasterCacheKeyID::LayerChildrenIds(layer_);
65 if (!ids.has_value()) {
66 return;
67 }
68 layer_children_id_.emplace(std::move(ids.value()),
70 }
71 cache_state_ = CacheState::kChildren;
72 context->raster_cache->MarkSeen(layer_children_id_.value(), matrix_,
73 true);
74 }
75 }
76}
77
78std::optional<RasterCacheKeyID> LayerRasterCacheItem::GetId() const {
79 switch (cache_state_) {
80 case kCurrent:
81 return key_id_;
82 case kChildren:
83 return layer_children_id_;
84 default:
85 return {};
86 }
87}
88
90 switch (cache_state_) {
91 case CacheState::kCurrent:
92 return &(layer_->paint_bounds());
93 case CacheState::kChildren:
94 FML_DCHECK(layer_->as_container_layer());
95 return &(layer_->as_container_layer()->child_paint_bounds());
96 default:
97 FML_DCHECK(cache_state_ != CacheState::kNone);
98 return nullptr;
99 }
100}
101
103 Layer* layer,
104 const PaintContext& paint_context,
105 DlCanvas* canvas) {
107 LayerStateStack state_stack;
108 state_stack.set_delegate(canvas);
109 state_stack.set_checkerboard_func(
110 paint_context.state_stack.checkerboard_func());
111 PaintContext context = {
112 // clang-format off
113 .state_stack = state_stack,
114 .canvas = canvas,
115 .gr_context = paint_context.gr_context,
116 .dst_color_space = paint_context.dst_color_space,
117 .view_embedder = paint_context.view_embedder,
118 .raster_time = paint_context.raster_time,
119 .ui_time = paint_context.ui_time,
120 .texture_registry = paint_context.texture_registry,
121 .raster_cache = paint_context.raster_cache,
122 // clang-format on
123 };
124
125 switch (cache_state) {
127 FML_DCHECK(layer->needs_painting(context));
128 layer->Paint(context);
129 break;
131 layer->PaintChildren(context);
132 break;
135 return false;
136 }
137 return true;
138}
139
140static const auto* flow_type = "RasterCacheFlow::Layer";
141
143 bool parent_cached) const {
144 auto maybe_id = GetId();
145 if (!maybe_id.has_value() || !context.raster_cache || parent_cached) {
146 return false;
147 }
148 if (cache_state_ != kNone) {
149 if (const SkRect* paint_bounds = GetPaintBoundsFromLayer()) {
150 RasterCache::Context r_context = {
151 // clang-format off
152 .gr_context = context.gr_context,
153 .dst_color_space = context.dst_color_space,
154 .matrix = matrix_,
155 .logical_rect = *paint_bounds,
156 .flow_type = flow_type,
157 // clang-format on
158 };
159 auto id = maybe_id.value();
160 return context.raster_cache->UpdateCacheEntry(
161 id, r_context,
162 [ctx = context, cache_state = cache_state_,
163 layer = layer_](DlCanvas* canvas) {
164 Rasterize(cache_state, layer, ctx, canvas);
165 });
166 }
167 }
168 return false;
169}
170
172 const DlPaint* paint) const {
173 return Draw(context, context.canvas, paint);
174}
175
177 DlCanvas* canvas,
178 const DlPaint* paint) const {
179 if (!context.raster_cache || !canvas) {
180 return false;
181 }
182 switch (cache_state_) {
184 return false;
186 return context.raster_cache->Draw(key_id_, *canvas, paint,
188 }
190 if (!layer_children_id_.has_value()) {
191 return false;
192 }
193 return context.raster_cache->Draw(layer_children_id_.value(), *canvas,
194 paint,
196 }
197 }
198}
199
200} // namespace flutter
Developer-facing API for rendering anything within the engine.
Definition dl_canvas.h:37
static std::unique_ptr< LayerRasterCacheItem > Make(Layer *, int layer_cache_threshold, bool can_cache_children=false)
Create a LayerRasterCacheItem, connect a layer and manage the Layer's raster cache.
std::optional< RasterCacheKeyID > GetId() const override
void PrerollSetup(PrerollContext *context, const SkMatrix &matrix) override
LayerRasterCacheItem(Layer *layer, int layer_cached_threshold=1, bool can_cache_children=false)
bool Draw(const PaintContext &context, const DlPaint *paint) const override
bool TryToPrepareRasterCache(const PaintContext &context, bool parent_cached=false) const override
const SkRect * GetPaintBoundsFromLayer() const
void PrerollFinalize(PrerollContext *context, const SkMatrix &matrix) override
CheckerboardFunc checkerboard_func() const
void set_checkerboard_func(CheckerboardFunc checkerboard_func)
void set_delegate(DlCanvas *canvas)
bool content_culled(const SkRect &content_bounds) const
virtual void PaintChildren(PaintContext &context) const
Definition layer.h:198
bool needs_painting(PaintContext &context) const
Definition layer.h:231
virtual void Paint(PaintContext &context) const =0
static std::optional< std::vector< RasterCacheKeyID > > LayerChildrenIds(const Layer *layer)
bool Draw(const RasterCacheKeyID &id, DlCanvas &canvas, const DlPaint *paint, bool preserve_rtree=false) const
CacheInfo MarkSeen(const RasterCacheKeyID &id, const SkMatrix &matrix, bool visible) const
The entry whose RasterCacheKey is generated by RasterCacheKeyID and matrix is marked as encountered b...
bool UpdateCacheEntry(const RasterCacheKeyID &id, const Context &raster_cache_context, const std::function< void(DlCanvas *)> &render_function, sk_sp< const DlRTree > rtree=nullptr) const
static void Draw(SkCanvas *canvas, const SkRect &rect)
const Paint & paint
#define FML_DCHECK(condition)
Definition logging.h:103
@ kNone
Definition layer.h:52
static const auto * flow_type
bool Rasterize(RasterCacheItem::CacheState cache_state, Layer *layer, const PaintContext &paint_context, DlCanvas *canvas)
ExternalViewEmbedder * view_embedder
Definition layer.h:110
bool rendering_above_platform_view
Definition layer.h:106
sk_sp< SkColorSpace > dst_color_space
Definition layer.h:109
const Stopwatch & raster_time
Definition layer.h:111
const Stopwatch & ui_time
Definition layer.h:112
std::shared_ptr< TextureRegistry > texture_registry
Definition layer.h:113
DlCanvas * canvas
Definition layer.h:101
GrDirectContext * gr_context
Definition layer.h:108
LayerStateStack & state_stack
Definition layer.h:100
const RasterCache * raster_cache
Definition layer.h:114
std::vector< RasterCacheItem * > * raster_cached_entries
Definition layer.h:84
RasterCache * raster_cache
Definition layer.h:55
LayerStateStack & state_stack
Definition layer.h:58