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

Commit 9b68847

Browse files
committed
ImageFilterLayer Reset cache_children; Fix some comments
1 parent 9e0e52b commit 9b68847

17 files changed

+59
-64
lines changed

flow/layers/cacheable_layer.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,18 @@ AutoCache::AutoCache(RasterCacheItem* raster_cache_item,
1414
: raster_cache_item_(raster_cache_item),
1515
context_(context),
1616
matrix_(matrix) {
17-
if (cacheEnable()) {
17+
if (IsCacheEnabled()) {
1818
raster_cache_item->PrerollSetup(context, matrix);
1919
current_index_ = context_->raster_cached_entries->size();
2020
}
2121
}
2222

23-
bool AutoCache::cacheEnable() {
23+
bool AutoCache::IsCacheEnabled() {
2424
return raster_cache_item_ && context_ && context_->raster_cache;
2525
}
2626

2727
AutoCache::~AutoCache() {
28-
if (cacheEnable()) {
28+
if (IsCacheEnabled()) {
2929
raster_cache_item_->PrerollFinalize(context_, matrix_);
3030
}
3131
}

flow/layers/cacheable_layer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class AutoCache {
2424
~AutoCache();
2525

2626
private:
27-
inline bool cacheEnable();
27+
inline bool IsCacheEnabled();
2828
int current_index_;
2929
RasterCacheItem* raster_cache_item_ = nullptr;
3030
PrerollContext* context_ = nullptr;

flow/layers/clip_path_layer_unittests.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,7 @@ TEST_F(ClipPathLayerTest, LayerCached) {
497497
auto layer =
498498
std::make_shared<ClipPathLayer>(layer_clip, Clip::antiAliasWithSaveLayer);
499499
layer->Add(mock1);
500-
SkPaint paint;
500+
501501
auto initial_transform = SkMatrix::Translate(50.0, 25.5);
502502
SkMatrix cache_ctm = initial_transform;
503503
SkCanvas cache_canvas;
@@ -525,6 +525,7 @@ TEST_F(ClipPathLayerTest, LayerCached) {
525525
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)1);
526526
EXPECT_EQ(clip_cache_item->cache_state(),
527527
RasterCacheItem::CacheState::kCurrent);
528+
SkPaint paint;
528529
EXPECT_TRUE(raster_cache()->Draw(clip_cache_item->GetId().value(),
529530
cache_canvas, &paint));
530531
}

flow/layers/clip_rect_layer_unittests.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,6 @@ TEST_F(ClipRectLayerTest, OpacityInheritanceSaveLayerPainting) {
480480
TEST_F(ClipRectLayerTest, LayerCached) {
481481
auto path1 = SkPath().addRect({10, 10, 30, 30});
482482
auto mock1 = MockLayer::MakeOpacityCompatible(path1);
483-
SkPaint paint;
484483
SkRect clip_rect = SkRect::MakeWH(500, 500);
485484
auto layer =
486485
std::make_shared<ClipRectLayer>(clip_rect, Clip::antiAliasWithSaveLayer);
@@ -511,6 +510,7 @@ TEST_F(ClipRectLayerTest, LayerCached) {
511510
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)1);
512511
EXPECT_EQ(clip_cache_item->cache_state(),
513512
RasterCacheItem::CacheState::kCurrent);
513+
SkPaint paint;
514514
EXPECT_TRUE(raster_cache()->Draw(clip_cache_item->GetId().value(),
515515
cache_canvas, &paint));
516516
}

flow/layers/clip_rrect_layer_unittests.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -526,7 +526,7 @@ TEST_F(ClipRRectLayerTest, LayerCached) {
526526

527527
TEST_F(ClipRRectLayerTest, NoSaveLayerShouldNotCache) {
528528
auto path1 = SkPath().addRect({10, 10, 30, 30});
529-
SkPaint paint = SkPaint();
529+
530530
auto mock1 = MockLayer::MakeOpacityCompatible(path1);
531531
SkRect clip_rect = SkRect::MakeWH(500, 500);
532532
SkRRect clip_r_rect = SkRRect::MakeRectXY(clip_rect, 20, 20);

flow/layers/color_filter_layer_unittests.cc

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -341,17 +341,26 @@ TEST_F(ColorFilterLayerTest, CacheColorFilterLayerSelf) {
341341
layer->Paint(paint_context());
342342
// frame 2.
343343
layer->Preroll(preroll_context(), initial_transform);
344+
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
345+
// ColorFilterLayer default cache children.
346+
EXPECT_EQ(cacheable_color_filter_item->cache_state(),
347+
RasterCacheItem::CacheState::kChildren);
348+
EXPECT_TRUE(raster_cache()->Draw(cacheable_color_filter_item->GetId().value(),
349+
cache_canvas, &paint));
350+
EXPECT_FALSE(raster_cache()->Draw(
351+
cacheable_color_filter_item->GetId().value(), other_canvas, &paint));
344352
layer->Paint(paint_context());
353+
345354
// frame 3.
346355
layer->Preroll(preroll_context(), initial_transform);
347356
layer->Paint(paint_context());
348357

349358
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
350-
// frame1,2 cache the ImageFilter's children layer, frame3 cache the
351-
// ImageFilterLayer
359+
// frame1,2 cache the ColorFilterLayer's children layer, frame3 cache the
360+
// ColorFilterLayer
352361
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)2);
353362

354-
// ImageFilterLayer default cache itself.
363+
// ColorFilterLayer default cache itself.
355364
EXPECT_EQ(cacheable_color_filter_item->cache_state(),
356365
RasterCacheItem::CacheState::kCurrent);
357366
EXPECT_EQ(cacheable_color_filter_item->GetId(),
@@ -382,7 +391,7 @@ TEST_F(ColorFilterLayerTest, OpacityInheritance) {
382391
PrerollContext* context = preroll_context();
383392
context->subtree_can_inherit_opacity = false;
384393
color_filter_layer->Preroll(preroll_context(), initial_transform);
385-
// ImageFilterLayers can always inherit opacity whether or not their
394+
// ColorFilterLayer can always inherit opacity whether or not their
386395
// children are compatible.
387396
EXPECT_TRUE(context->subtree_can_inherit_opacity);
388397

flow/layers/container_layer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class ContainerLayer : public Layer {
2828
virtual void DiffChildren(DiffContext* context,
2929
const ContainerLayer* old_layer);
3030

31-
void PaintChildren(PaintContext& context) const;
31+
void PaintChildren(PaintContext& context) const override;
3232

3333
const ContainerLayer* as_container_layer() const override { return this; }
3434

flow/layers/display_list_raster_cache_item.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,9 @@ bool DisplayListRasterCacheItem::TryToPrepareRasterCache(
170170
};
171171
return context.raster_cache->UpdateCacheEntry(
172172
GetId().value(), r_context,
173-
[=](SkCanvas* canvas) { display_list_->RenderTo(canvas); });
173+
[display_list = display_list_](SkCanvas* canvas) {
174+
display_list->RenderTo(canvas);
175+
});
174176
return false;
175177
}
176178
} // namespace flutter

flow/layers/image_filter_layer.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ void ImageFilterLayer::Preroll(PrerollContext* context,
6868

6969
set_paint_bounds(child_bounds);
7070

71+
// CacheChildren only when the transformed_filter_ doesn't equal null.
72+
// So in here we reset the LayerRasterCacheItem cache state.
73+
layer_raster_cache_item_->MarkNotCacheChildren();
74+
7175
transformed_filter_ = filter_->makeWithLocalMatrix(matrix);
7276
if (transformed_filter_) {
7377
layer_raster_cache_item_->MarkCacheChildren();

flow/layers/layer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,8 @@ class Layer {
302302

303303
virtual void Paint(PaintContext& context) const = 0;
304304

305+
virtual void PaintChildren(PaintContext& context) const { FML_DCHECK(false); }
306+
305307
bool subtree_has_platform_view() const { return subtree_has_platform_view_; }
306308
void set_subtree_has_platform_view(bool value) {
307309
subtree_has_platform_view_ = value;

flow/layers/layer_raster_cache_item.cc

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@ void LayerRasterCacheItem::PrerollSetup(PrerollContext* context,
2525
if (context->raster_cache && context->raster_cached_entries) {
2626
context->raster_cached_entries->push_back(this);
2727
child_items_ = context->raster_cached_entries->size();
28-
auto child_matrix = matrix;
29-
matrix_ = child_matrix;
28+
matrix_ = matrix;
3029
}
3130
}
3231

@@ -114,8 +113,7 @@ bool LayerRasterCacheItem::Rasterize(const PaintContext& paint_context,
114113
layer_->Paint(context);
115114
break;
116115
case CacheState::kChildren:
117-
FML_DCHECK(layer_->as_container_layer());
118-
layer_->as_container_layer()->PaintChildren(context);
116+
layer_->PaintChildren(context);
119117
break;
120118
case CacheState::kNone:
121119
FML_DCHECK(cache_state_ != CacheState::kNone);
@@ -144,7 +142,7 @@ bool LayerRasterCacheItem::TryToPrepareRasterCache(const PaintContext& context,
144142
};
145143
return context.raster_cache->UpdateCacheEntry(
146144
GetId().value(), r_context,
147-
[=](SkCanvas* canvas) { Rasterize(context, canvas); });
145+
[ctx = context, this](SkCanvas* canvas) { Rasterize(ctx, canvas); });
148146
}
149147
return false;
150148
}

flow/layers/layer_raster_cache_item.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ class LayerRasterCacheItem : public RasterCacheItem {
4949

5050
void MarkCacheChildren() { can_cache_children_ = true; }
5151

52+
void MarkNotCacheChildren() { can_cache_children_ = false; }
53+
5254
bool IsCacheChildren() const { return cache_state_ == CacheState::kChildren; }
5355

5456
protected:

flow/raster_cache.cc

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,9 @@ void RasterCacheResult::draw(SkCanvas& canvas, const SkPaint* paint) const {
4343
}
4444

4545
RasterCache::RasterCache(size_t access_threshold,
46-
size_t picture_and_display_list_cache_limit_per_frame)
46+
size_t display_list_cache_limit_per_frame)
4747
: access_threshold_(access_threshold),
48-
picture_and_display_list_cache_limit_per_frame_(
49-
picture_and_display_list_cache_limit_per_frame),
48+
display_list_cache_limit_per_frame_(display_list_cache_limit_per_frame),
5049
checkerboard_images_(false) {}
5150

5251
/// @note Procedure doesn't copy all closures.
@@ -102,10 +101,6 @@ bool RasterCache::UpdateCacheEntry(
102101
display_list_cached_this_frame_++;
103102
break;
104103
}
105-
case RasterCacheKeyType::kPicture: {
106-
picture_cached_this_frame_++;
107-
break;
108-
}
109104
default:
110105
break;
111106
}
@@ -165,7 +160,6 @@ bool RasterCache::Draw(const RasterCacheKeyID& id,
165160
}
166161

167162
void RasterCache::PrepareNewFrame() {
168-
picture_cached_this_frame_ = 0;
169163
display_list_cached_this_frame_ = 0;
170164
}
171165

@@ -182,7 +176,7 @@ void RasterCache::SweepOneCacheAfterFrame(RasterCacheKey::Map<Entry>& cache,
182176
} else if (entry.image) {
183177
RasterCacheKeyKind kind = it->first.kind();
184178
switch (kind) {
185-
case RasterCacheKeyKind::kPictureMetrics:
179+
case RasterCacheKeyKind::kDisplayListMetrics:
186180
picture_metrics.in_use_count++;
187181
picture_metrics.in_use_bytes += entry.image->image_bytes();
188182
break;
@@ -199,7 +193,7 @@ void RasterCache::SweepOneCacheAfterFrame(RasterCacheKey::Map<Entry>& cache,
199193
if (it->second.image) {
200194
RasterCacheKeyKind kind = it->first.kind();
201195
switch (kind) {
202-
case RasterCacheKeyKind::kPictureMetrics:
196+
case RasterCacheKeyKind::kDisplayListMetrics:
203197
picture_metrics.eviction_count++;
204198
picture_metrics.eviction_bytes += it->second.image->image_bytes();
205199
break;
@@ -241,13 +235,13 @@ size_t RasterCache::GetLayerCachedEntriesCount() const {
241235
}
242236

243237
size_t RasterCache::GetPictureCachedEntriesCount() const {
244-
size_t picture_cached_entries_count = 0;
238+
size_t display_list_cached_entries_count = 0;
245239
for (const auto& item : cache_) {
246-
if (item.first.kind() == RasterCacheKeyKind::kPictureMetrics) {
247-
picture_cached_entries_count++;
240+
if (item.first.kind() == RasterCacheKeyKind::kDisplayListMetrics) {
241+
display_list_cached_entries_count++;
248242
}
249243
}
250-
return picture_cached_entries_count;
244+
return display_list_cached_entries_count;
251245
}
252246

253247
void RasterCache::SetCheckboardCacheImages(bool checkerboard) {
@@ -289,7 +283,7 @@ size_t RasterCache::EstimateLayerCacheByteSize() const {
289283
size_t RasterCache::EstimatePictureCacheByteSize() const {
290284
size_t picture_cache_bytes = 0;
291285
for (const auto& item : cache_) {
292-
if (item.first.kind() == RasterCacheKeyKind::kPictureMetrics &&
286+
if (item.first.kind() == RasterCacheKeyKind::kDisplayListMetrics &&
293287
item.second.image) {
294288
picture_cache_bytes += item.second.image->image_bytes();
295289
}

flow/raster_cache.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -186,9 +186,8 @@ class RasterCache {
186186

187187
bool GenerateNewCacheInThisFrame() const {
188188
// Disabling caching when access_threshold is zero is historic behavior.
189-
return access_threshold_ != 0 &&
190-
picture_cached_this_frame_ + display_list_cached_this_frame_ <
191-
picture_and_display_list_cache_limit_per_frame_;
189+
return access_threshold_ != 0 && display_list_cached_this_frame_ <
190+
display_list_cache_limit_per_frame_;
192191
}
193192

194193
/**
@@ -217,8 +216,7 @@ class RasterCache {
217216
RasterCacheMetrics& layer_metrics);
218217

219218
const size_t access_threshold_;
220-
const size_t picture_and_display_list_cache_limit_per_frame_;
221-
mutable size_t picture_cached_this_frame_ = 0;
219+
const size_t display_list_cache_limit_per_frame_;
222220
mutable size_t display_list_cached_this_frame_ = 0;
223221
RasterCacheMetrics layer_metrics_;
224222
RasterCacheMetrics picture_metrics_;

flow/raster_cache_key.h

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,7 @@ namespace flutter {
1818

1919
class Layer;
2020

21-
enum class RasterCacheKeyType {
22-
kLayer,
23-
kPicture,
24-
kDisplayList,
25-
kLayerChildren
26-
};
21+
enum class RasterCacheKeyType { kLayer, kDisplayList, kLayerChildren };
2722

2823
class RasterCacheKeyID {
2924
public:
@@ -60,7 +55,7 @@ class RasterCacheKeyID {
6055
const RasterCacheKeyType type_;
6156
};
6257

63-
enum class RasterCacheKeyKind { kLayerMetrics, kPictureMetrics };
58+
enum class RasterCacheKeyKind { kLayerMetrics, kDisplayListMetrics };
6459

6560
class RasterCacheKey {
6661
public:
@@ -79,9 +74,8 @@ class RasterCacheKey {
7974

8075
RasterCacheKeyKind kind() const {
8176
switch (id_.type()) {
82-
case RasterCacheKeyType::kPicture:
8377
case RasterCacheKeyType::kDisplayList:
84-
return RasterCacheKeyKind::kPictureMetrics;
78+
return RasterCacheKeyKind::kDisplayListMetrics;
8579
case RasterCacheKeyType::kLayer:
8680
case RasterCacheKeyType::kLayerChildren:
8781
return RasterCacheKeyKind::kLayerMetrics;

flow/raster_cache_unittests.cc

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -531,7 +531,6 @@ TEST(RasterCache, RasterCacheKeyHashFunction) {
531531
SkMatrix matrix = SkMatrix::I();
532532
uint64_t id = 5;
533533
RasterCacheKey layer_key(id, RasterCacheKeyType::kLayer, matrix);
534-
RasterCacheKey picture_key(id, RasterCacheKeyType::kPicture, matrix);
535534
RasterCacheKey display_list_key(id, RasterCacheKeyType::kDisplayList, matrix);
536535
RasterCacheKey layer_children_key(id, RasterCacheKeyType::kLayerChildren,
537536
matrix);
@@ -540,11 +539,6 @@ TEST(RasterCache, RasterCacheKeyHashFunction) {
540539
auto layer_hash_code = hash_function(layer_key);
541540
ASSERT_EQ(layer_hash_code, layer_cache_key_id.GetHash());
542541

543-
auto picture_cache_key_id =
544-
RasterCacheKeyID(id, RasterCacheKeyType::kPicture);
545-
auto picture_hash_code = hash_function(picture_key);
546-
ASSERT_EQ(picture_hash_code, picture_cache_key_id.GetHash());
547-
548542
auto display_list_cache_key_id =
549543
RasterCacheKeyID(id, RasterCacheKeyType::kDisplayList);
550544
auto display_list_hash_code = hash_function(display_list_key);
@@ -561,17 +555,14 @@ TEST(RasterCache, RasterCacheKeySameID) {
561555
SkMatrix matrix = SkMatrix::I();
562556
uint64_t id = 5;
563557
RasterCacheKey layer_key(id, RasterCacheKeyType::kLayer, matrix);
564-
RasterCacheKey picture_key(id, RasterCacheKeyType::kPicture, matrix);
565558
RasterCacheKey display_list_key(id, RasterCacheKeyType::kDisplayList, matrix);
566559
RasterCacheKey layer_children_key(id, RasterCacheKeyType::kLayerChildren,
567560
matrix);
568561
map[layer_key] = 100;
569-
map[picture_key] = 200;
570562
map[display_list_key] = 300;
571563
map[layer_children_key] = 400;
572564

573565
ASSERT_EQ(map[layer_key], 100);
574-
ASSERT_EQ(map[picture_key], 200);
575566
ASSERT_EQ(map[display_list_key], 300);
576567
ASSERT_EQ(map[layer_children_key], 400);
577568
}
@@ -591,7 +582,7 @@ TEST(RasterCache, RasterCacheKeySameType) {
591582
ASSERT_EQ(map[layer_second_key], 100);
592583
ASSERT_EQ(map[layer_third_key], 150);
593584

594-
type = RasterCacheKeyType::kPicture;
585+
type = RasterCacheKeyType::kDisplayList;
595586
RasterCacheKey picture_first_key(20, type, matrix);
596587
RasterCacheKey picture_second_key(25, type, matrix);
597588
RasterCacheKey picture_third_key(30, type, matrix);

flow/testing/mock_raster_cache.cc

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,13 @@ void MockRasterCache::AddMockPicture(int width, int height) {
7474
.checkerboard = preroll_context_.checkerboard_offscreen_layers,
7575
// clang-format on
7676
};
77-
UpdateCacheEntry(
78-
RasterCacheKeyID(display_list->unique_id(), RasterCacheKeyType::kPicture),
79-
r_context, [&](SkCanvas* canvas) {
80-
SkRect cache_rect = RasterCacheUtil::GetDeviceBounds(
81-
r_context.logical_rect, r_context.matrix);
82-
return std::make_unique<MockRasterCacheResult>(cache_rect);
83-
});
77+
UpdateCacheEntry(RasterCacheKeyID(display_list->unique_id(),
78+
RasterCacheKeyType::kDisplayList),
79+
r_context, [&](SkCanvas* canvas) {
80+
SkRect cache_rect = RasterCacheUtil::GetDeviceBounds(
81+
r_context.logical_rect, r_context.matrix);
82+
return std::make_unique<MockRasterCacheResult>(cache_rect);
83+
});
8484
}
8585

8686
static std::vector<RasterCacheItem*> raster_cache_items_;

0 commit comments

Comments
 (0)