Skip to content

Commit 557655b

Browse files
authored
Defer decisions about RasterCache actions until after Preroll is complete (flutter#31892)
1 parent 870bc60 commit 557655b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+2379
-1038
lines changed

ci/licenses_golden/licenses_flutter

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,8 @@ FILE: ../../../flutter/flow/layer_snapshot_store.h
135135
FILE: ../../../flutter/flow/layers/backdrop_filter_layer.cc
136136
FILE: ../../../flutter/flow/layers/backdrop_filter_layer.h
137137
FILE: ../../../flutter/flow/layers/backdrop_filter_layer_unittests.cc
138+
FILE: ../../../flutter/flow/layers/cacheable_layer.cc
139+
FILE: ../../../flutter/flow/layers/cacheable_layer.h
138140
FILE: ../../../flutter/flow/layers/checkerboard_layertree_unittests.cc
139141
FILE: ../../../flutter/flow/layers/clip_path_layer.cc
140142
FILE: ../../../flutter/flow/layers/clip_path_layer.h
@@ -155,11 +157,15 @@ FILE: ../../../flutter/flow/layers/container_layer_unittests.cc
155157
FILE: ../../../flutter/flow/layers/display_list_layer.cc
156158
FILE: ../../../flutter/flow/layers/display_list_layer.h
157159
FILE: ../../../flutter/flow/layers/display_list_layer_unittests.cc
160+
FILE: ../../../flutter/flow/layers/display_list_raster_cache_item.cc
161+
FILE: ../../../flutter/flow/layers/display_list_raster_cache_item.h
158162
FILE: ../../../flutter/flow/layers/image_filter_layer.cc
159163
FILE: ../../../flutter/flow/layers/image_filter_layer.h
160164
FILE: ../../../flutter/flow/layers/image_filter_layer_unittests.cc
161165
FILE: ../../../flutter/flow/layers/layer.cc
162166
FILE: ../../../flutter/flow/layers/layer.h
167+
FILE: ../../../flutter/flow/layers/layer_raster_cache_item.cc
168+
FILE: ../../../flutter/flow/layers/layer_raster_cache_item.h
163169
FILE: ../../../flutter/flow/layers/layer_tree.cc
164170
FILE: ../../../flutter/flow/layers/layer_tree.h
165171
FILE: ../../../flutter/flow/layers/layer_tree_unittests.cc
@@ -194,9 +200,12 @@ FILE: ../../../flutter/flow/paint_utils.cc
194200
FILE: ../../../flutter/flow/paint_utils.h
195201
FILE: ../../../flutter/flow/raster_cache.cc
196202
FILE: ../../../flutter/flow/raster_cache.h
203+
FILE: ../../../flutter/flow/raster_cache_item.h
197204
FILE: ../../../flutter/flow/raster_cache_key.cc
198205
FILE: ../../../flutter/flow/raster_cache_key.h
199206
FILE: ../../../flutter/flow/raster_cache_unittests.cc
207+
FILE: ../../../flutter/flow/raster_cache_util.cc
208+
FILE: ../../../flutter/flow/raster_cache_util.h
200209
FILE: ../../../flutter/flow/rtree.cc
201210
FILE: ../../../flutter/flow/rtree.h
202211
FILE: ../../../flutter/flow/rtree_unittests.cc

flow/BUILD.gn

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ source_set("flow") {
2222
"layer_snapshot_store.h",
2323
"layers/backdrop_filter_layer.cc",
2424
"layers/backdrop_filter_layer.h",
25+
"layers/cacheable_layer.cc",
26+
"layers/cacheable_layer.h",
2527
"layers/clip_path_layer.cc",
2628
"layers/clip_path_layer.h",
2729
"layers/clip_rect_layer.cc",
@@ -35,10 +37,14 @@ source_set("flow") {
3537
"layers/container_layer.h",
3638
"layers/display_list_layer.cc",
3739
"layers/display_list_layer.h",
40+
"layers/display_list_raster_cache_item.cc",
41+
"layers/display_list_raster_cache_item.h",
3842
"layers/image_filter_layer.cc",
3943
"layers/image_filter_layer.h",
4044
"layers/layer.cc",
4145
"layers/layer.h",
46+
"layers/layer_raster_cache_item.cc",
47+
"layers/layer_raster_cache_item.h",
4248
"layers/layer_tree.cc",
4349
"layers/layer_tree.h",
4450
"layers/offscreen_surface.cc",
@@ -63,8 +69,11 @@ source_set("flow") {
6369
"paint_utils.h",
6470
"raster_cache.cc",
6571
"raster_cache.h",
72+
"raster_cache_item.h",
6673
"raster_cache_key.cc",
6774
"raster_cache_key.h",
75+
"raster_cache_util.cc",
76+
"raster_cache_util.h",
6877
"rtree.cc",
6978
"rtree.h",
7079
"skia_gpu_object.h",

flow/layers/cacheable_layer.cc

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
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/cacheable_layer.h"
6+
#include "flutter/flow/raster_cache.h"
7+
#include "flutter/flow/raster_cache_item.h"
8+
9+
namespace flutter {
10+
11+
AutoCache::AutoCache(RasterCacheItem* raster_cache_item,
12+
PrerollContext* context,
13+
const SkMatrix& matrix)
14+
: raster_cache_item_(raster_cache_item),
15+
context_(context),
16+
matrix_(matrix) {
17+
if (IsCacheEnabled()) {
18+
raster_cache_item->PrerollSetup(context, matrix);
19+
}
20+
}
21+
22+
bool AutoCache::IsCacheEnabled() {
23+
return raster_cache_item_ && context_ && context_->raster_cache;
24+
}
25+
26+
AutoCache::~AutoCache() {
27+
if (IsCacheEnabled()) {
28+
raster_cache_item_->PrerollFinalize(context_, matrix_);
29+
}
30+
}
31+
32+
CacheableContainerLayer::CacheableContainerLayer(int layer_cached_threshold,
33+
bool can_cache_children) {
34+
layer_raster_cache_item_ = LayerRasterCacheItem::Make(
35+
this, layer_cached_threshold, can_cache_children);
36+
}
37+
38+
} // namespace flutter

flow/layers/cacheable_layer.h

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
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+
#ifndef FLUTTER_FLOW_LAYERS_CACHEABLE_LAYER_H_
6+
#define FLUTTER_FLOW_LAYERS_CACHEABLE_LAYER_H_
7+
8+
#include <memory>
9+
10+
#include "flutter/flow/layers/container_layer.h"
11+
#include "flutter/flow/layers/display_list_raster_cache_item.h"
12+
#include "flutter/flow/layers/layer_raster_cache_item.h"
13+
14+
namespace flutter {
15+
16+
class AutoCache {
17+
public:
18+
AutoCache(RasterCacheItem* raster_cache_item,
19+
PrerollContext* context,
20+
const SkMatrix& matrix);
21+
22+
void ShouldNotBeCached() { raster_cache_item_ = nullptr; }
23+
24+
~AutoCache();
25+
26+
private:
27+
inline bool IsCacheEnabled();
28+
RasterCacheItem* raster_cache_item_ = nullptr;
29+
PrerollContext* context_ = nullptr;
30+
const SkMatrix& matrix_;
31+
};
32+
33+
class CacheableContainerLayer : public ContainerLayer {
34+
public:
35+
explicit CacheableContainerLayer(
36+
int layer_cached_threshold =
37+
RasterCacheUtil::kMinimumRendersBeforeCachingFilterLayer,
38+
bool can_cache_children = false);
39+
40+
const LayerRasterCacheItem* raster_cache_item() const {
41+
return layer_raster_cache_item_.get();
42+
}
43+
44+
protected:
45+
std::unique_ptr<LayerRasterCacheItem> layer_raster_cache_item_;
46+
};
47+
48+
} // namespace flutter
49+
50+
#endif // FLUTTER_FLOW_LAYERS_CACHEABLE_LAYER_H_

flow/layers/clip_path_layer_unittests.cc

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,15 @@
44

55
#include "flutter/flow/layers/clip_path_layer.h"
66

7+
#include "flutter/flow/layers/layer_tree.h"
78
#include "flutter/flow/layers/opacity_layer.h"
9+
#include "flutter/flow/raster_cache_item.h"
810
#include "flutter/flow/testing/layer_test.h"
911
#include "flutter/flow/testing/mock_layer.h"
1012
#include "flutter/fml/macros.h"
1113
#include "flutter/testing/mock_canvas.h"
14+
#include "gtest/gtest.h"
15+
#include "include/core/SkPaint.h"
1216

1317
namespace flutter {
1418
namespace testing {
@@ -501,24 +505,29 @@ TEST_F(ClipPathLayerTest, LayerCached) {
501505

502506
use_mock_raster_cache();
503507

508+
const auto* clip_cache_item = layer->raster_cache_item();
509+
504510
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
505-
EXPECT_FALSE(raster_cache()->Draw(layer.get(), cache_canvas,
506-
RasterCacheLayerStrategy::kLayer));
507511

508512
layer->Preroll(preroll_context(), initial_transform);
513+
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
514+
509515
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
510-
EXPECT_FALSE(raster_cache()->Draw(layer.get(), cache_canvas,
511-
RasterCacheLayerStrategy::kLayer));
516+
EXPECT_EQ(clip_cache_item->cache_state(), RasterCacheItem::CacheState::kNone);
512517

513518
layer->Preroll(preroll_context(), initial_transform);
519+
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
514520
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
515-
EXPECT_FALSE(raster_cache()->Draw(layer.get(), cache_canvas,
516-
RasterCacheLayerStrategy::kLayer));
521+
EXPECT_EQ(clip_cache_item->cache_state(), RasterCacheItem::CacheState::kNone);
517522

518523
layer->Preroll(preroll_context(), initial_transform);
524+
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
519525
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)1);
520-
EXPECT_TRUE(raster_cache()->Draw(layer.get(), cache_canvas,
521-
RasterCacheLayerStrategy::kLayer));
526+
EXPECT_EQ(clip_cache_item->cache_state(),
527+
RasterCacheItem::CacheState::kCurrent);
528+
SkPaint paint;
529+
EXPECT_TRUE(raster_cache()->Draw(clip_cache_item->GetId().value(),
530+
cache_canvas, &paint));
522531
}
523532

524533
} // namespace testing

flow/layers/clip_rect_layer_unittests.cc

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#include "flutter/flow/layers/clip_rect_layer.h"
66

7+
#include "flutter/flow/layers/layer_tree.h"
78
#include "flutter/flow/layers/opacity_layer.h"
89
#include "flutter/flow/testing/layer_test.h"
910
#include "flutter/flow/testing/mock_layer.h"
@@ -491,24 +492,27 @@ TEST_F(ClipRectLayerTest, LayerCached) {
491492

492493
use_mock_raster_cache();
493494

494-
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
495-
EXPECT_FALSE(raster_cache()->Draw(layer.get(), cache_canvas,
496-
RasterCacheLayerStrategy::kLayer));
495+
const auto* clip_cache_item = layer->raster_cache_item();
497496

498497
layer->Preroll(preroll_context(), initial_transform);
498+
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
499+
499500
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
500-
EXPECT_FALSE(raster_cache()->Draw(layer.get(), cache_canvas,
501-
RasterCacheLayerStrategy::kLayer));
501+
EXPECT_EQ(clip_cache_item->cache_state(), RasterCacheItem::CacheState::kNone);
502502

503503
layer->Preroll(preroll_context(), initial_transform);
504+
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
504505
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
505-
EXPECT_FALSE(raster_cache()->Draw(layer.get(), cache_canvas,
506-
RasterCacheLayerStrategy::kLayer));
506+
EXPECT_EQ(clip_cache_item->cache_state(), RasterCacheItem::CacheState::kNone);
507507

508508
layer->Preroll(preroll_context(), initial_transform);
509+
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
509510
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)1);
510-
EXPECT_TRUE(raster_cache()->Draw(layer.get(), cache_canvas,
511-
RasterCacheLayerStrategy::kLayer));
511+
EXPECT_EQ(clip_cache_item->cache_state(),
512+
RasterCacheItem::CacheState::kCurrent);
513+
SkPaint paint;
514+
EXPECT_TRUE(raster_cache()->Draw(clip_cache_item->GetId().value(),
515+
cache_canvas, &paint));
512516
}
513517

514518
} // namespace testing

flow/layers/clip_rrect_layer_unittests.cc

Lines changed: 48 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#include "flutter/flow/layers/clip_rrect_layer.h"
66

7+
#include "flutter/flow/layers/layer_tree.h"
78
#include "flutter/flow/layers/opacity_layer.h"
89
#include "flutter/flow/testing/layer_test.h"
910
#include "flutter/flow/testing/mock_layer.h"
@@ -486,6 +487,7 @@ TEST_F(ClipRRectLayerTest, OpacityInheritanceSaveLayerPainting) {
486487

487488
TEST_F(ClipRRectLayerTest, LayerCached) {
488489
auto path1 = SkPath().addRect({10, 10, 30, 30});
490+
SkPaint paint = SkPaint();
489491
auto mock1 = MockLayer::MakeOpacityCompatible(path1);
490492
SkRect clip_rect = SkRect::MakeWH(500, 500);
491493
SkRRect clip_r_rect = SkRRect::MakeRectXY(clip_rect, 20, 20);
@@ -500,24 +502,61 @@ TEST_F(ClipRRectLayerTest, LayerCached) {
500502

501503
use_mock_raster_cache();
502504

503-
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
504-
EXPECT_FALSE(raster_cache()->Draw(layer.get(), cache_canvas,
505-
RasterCacheLayerStrategy::kLayer));
505+
const auto* clip_cache_item = layer->raster_cache_item();
506506

507507
layer->Preroll(preroll_context(), initial_transform);
508+
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
509+
508510
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
509-
EXPECT_FALSE(raster_cache()->Draw(layer.get(), cache_canvas,
510-
RasterCacheLayerStrategy::kLayer));
511+
EXPECT_EQ(clip_cache_item->cache_state(), RasterCacheItem::CacheState::kNone);
511512

512513
layer->Preroll(preroll_context(), initial_transform);
514+
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
513515
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
514-
EXPECT_FALSE(raster_cache()->Draw(layer.get(), cache_canvas,
515-
RasterCacheLayerStrategy::kLayer));
516+
EXPECT_EQ(clip_cache_item->cache_state(), RasterCacheItem::CacheState::kNone);
516517

517518
layer->Preroll(preroll_context(), initial_transform);
519+
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
518520
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)1);
519-
EXPECT_TRUE(raster_cache()->Draw(layer.get(), cache_canvas,
520-
RasterCacheLayerStrategy::kLayer));
521+
EXPECT_EQ(clip_cache_item->cache_state(),
522+
RasterCacheItem::CacheState::kCurrent);
523+
EXPECT_TRUE(raster_cache()->Draw(clip_cache_item->GetId().value(),
524+
cache_canvas, &paint));
525+
}
526+
527+
TEST_F(ClipRRectLayerTest, NoSaveLayerShouldNotCache) {
528+
auto path1 = SkPath().addRect({10, 10, 30, 30});
529+
530+
auto mock1 = MockLayer::MakeOpacityCompatible(path1);
531+
SkRect clip_rect = SkRect::MakeWH(500, 500);
532+
SkRRect clip_r_rect = SkRRect::MakeRectXY(clip_rect, 20, 20);
533+
auto layer = std::make_shared<ClipRRectLayer>(clip_r_rect, Clip::antiAlias);
534+
layer->Add(mock1);
535+
536+
auto initial_transform = SkMatrix::Translate(50.0, 25.5);
537+
SkMatrix cache_ctm = initial_transform;
538+
SkCanvas cache_canvas;
539+
cache_canvas.setMatrix(cache_ctm);
540+
541+
use_mock_raster_cache();
542+
543+
const auto* clip_cache_item = layer->raster_cache_item();
544+
545+
layer->Preroll(preroll_context(), initial_transform);
546+
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
547+
548+
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
549+
EXPECT_EQ(clip_cache_item->cache_state(), RasterCacheItem::CacheState::kNone);
550+
551+
layer->Preroll(preroll_context(), initial_transform);
552+
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
553+
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
554+
EXPECT_EQ(clip_cache_item->cache_state(), RasterCacheItem::CacheState::kNone);
555+
556+
layer->Preroll(preroll_context(), initial_transform);
557+
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
558+
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
559+
EXPECT_EQ(clip_cache_item->cache_state(), RasterCacheItem::CacheState::kNone);
521560
}
522561

523562
} // namespace testing

0 commit comments

Comments
 (0)