[cp] Revert "Lazily allocate RasterCacheItems only when caching is enabled… (#45756)
…… (#45747)
…" (#45734)
Reverts flutter/engine#45211
b/298583505
preemptively cp the revert to the next roll i am looking at. I do see
the recipe branch show up on
https://flutter-review.googlesource.com/admin/repos/recipes,branches/q/filter:flutter-3.15
, I will assume the recipe branch is created for now. We will see the
post submit results. If it doesn't work I will create the recipe branch
manually.
Co-authored-by: Zachary Anderson <zanderso@users.noreply.github.com>
diff --git a/flow/layers/cacheable_layer.cc b/flow/layers/cacheable_layer.cc
index 7ce3980..7cdfacf 100644
--- a/flow/layers/cacheable_layer.cc
+++ b/flow/layers/cacheable_layer.cc
@@ -6,39 +6,31 @@
namespace flutter {
-AutoCache::AutoCache(CacheableLayer& cacheable_layer,
+AutoCache::AutoCache(RasterCacheItem* raster_cache_item,
PrerollContext* context,
- bool caching_enabled) {
- if (context->raster_cache && caching_enabled) {
- raster_cache_item_ = cacheable_layer.realize_raster_cache_item();
- if (raster_cache_item_) {
- context_ = context;
- matrix_ = context->state_stack.transform_3x3();
- raster_cache_item_->PrerollSetup(context_, matrix_);
- }
- } else {
- cacheable_layer.disable_raster_cache_item();
+ const SkMatrix& matrix)
+ : raster_cache_item_(raster_cache_item),
+ context_(context),
+ matrix_(matrix) {
+ if (IsCacheEnabled()) {
+ raster_cache_item->PrerollSetup(context, matrix);
}
}
+bool AutoCache::IsCacheEnabled() {
+ return raster_cache_item_ && context_ && context_->raster_cache;
+}
+
AutoCache::~AutoCache() {
- if (raster_cache_item_) {
+ if (IsCacheEnabled()) {
raster_cache_item_->PrerollFinalize(context_, matrix_);
}
}
-RasterCacheItem* CacheableContainerLayer::realize_raster_cache_item() {
- if (!layer_raster_cache_item_) {
- layer_raster_cache_item_ = LayerRasterCacheItem::Make(
- this, layer_cache_threshold_, can_cache_children_);
- }
- return layer_raster_cache_item_.get();
-}
-
-void CacheableContainerLayer::disable_raster_cache_item() {
- if (layer_raster_cache_item_) {
- layer_raster_cache_item_->reset_cache_state();
- }
+CacheableContainerLayer::CacheableContainerLayer(int layer_cached_threshold,
+ bool can_cache_children) {
+ layer_raster_cache_item_ = LayerRasterCacheItem::Make(
+ this, layer_cached_threshold, can_cache_children);
}
} // namespace flutter
diff --git a/flow/layers/cacheable_layer.h b/flow/layers/cacheable_layer.h
index 46c502d..856ce47 100644
--- a/flow/layers/cacheable_layer.h
+++ b/flow/layers/cacheable_layer.h
@@ -9,62 +9,39 @@
#include "flutter/flow/layers/container_layer.h"
#include "flutter/flow/layers/layer_raster_cache_item.h"
-#include "flutter/flow/raster_cache_util.h"
namespace flutter {
-class CacheableLayer {
- protected:
- virtual RasterCacheItem* realize_raster_cache_item() = 0;
- virtual void disable_raster_cache_item() = 0;
-
- friend class AutoCache;
-};
-
class AutoCache {
public:
- AutoCache(CacheableLayer& item_provider,
+ AutoCache(RasterCacheItem* raster_cache_item,
PrerollContext* context,
- bool caching_enabled = true);
+ const SkMatrix& matrix);
void ShouldNotBeCached() { raster_cache_item_ = nullptr; }
~AutoCache();
private:
+ inline bool IsCacheEnabled();
RasterCacheItem* raster_cache_item_ = nullptr;
PrerollContext* context_ = nullptr;
- SkMatrix matrix_;
-
- FML_DISALLOW_COPY_ASSIGN_AND_MOVE(AutoCache);
+ const SkMatrix matrix_;
};
-class CacheableContainerLayer : public ContainerLayer, public CacheableLayer {
+class CacheableContainerLayer : public ContainerLayer {
public:
explicit CacheableContainerLayer(
int layer_cached_threshold =
RasterCacheUtil::kMinimumRendersBeforeCachingFilterLayer,
- bool can_cache_children = false)
- : layer_cache_threshold_(layer_cached_threshold),
- can_cache_children_(can_cache_children) {}
+ bool can_cache_children = false);
const LayerRasterCacheItem* raster_cache_item() const {
return layer_raster_cache_item_.get();
}
- void MarkCanCacheChildren(bool can_cache_children) {
- if (layer_raster_cache_item_) {
- layer_raster_cache_item_->MarkCanCacheChildren(can_cache_children);
- }
- }
-
protected:
- RasterCacheItem* realize_raster_cache_item() override;
- virtual void disable_raster_cache_item() override;
std::unique_ptr<LayerRasterCacheItem> layer_raster_cache_item_;
-
- int layer_cache_threshold_;
- bool can_cache_children_;
};
} // namespace flutter
diff --git a/flow/layers/clip_path_layer_unittests.cc b/flow/layers/clip_path_layer_unittests.cc
index 922c712..582ae97 100644
--- a/flow/layers/clip_path_layer_unittests.cc
+++ b/flow/layers/clip_path_layer_unittests.cc
@@ -519,74 +519,31 @@
use_mock_raster_cache();
preroll_context()->state_stack.set_preroll_delegate(initial_transform);
+ const auto* clip_cache_item = layer->raster_cache_item();
+
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
- EXPECT_EQ(layer->raster_cache_item(), nullptr);
layer->Preroll(preroll_context());
- EXPECT_NE(layer->raster_cache_item(), nullptr);
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
- EXPECT_EQ(layer->raster_cache_item()->cache_state(),
- RasterCacheItem::CacheState::kNone);
+ EXPECT_EQ(clip_cache_item->cache_state(), RasterCacheItem::CacheState::kNone);
layer->Preroll(preroll_context());
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
- EXPECT_EQ(layer->raster_cache_item()->cache_state(),
- RasterCacheItem::CacheState::kNone);
+ EXPECT_EQ(clip_cache_item->cache_state(), RasterCacheItem::CacheState::kNone);
layer->Preroll(preroll_context());
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)1);
- EXPECT_EQ(layer->raster_cache_item()->cache_state(),
+ EXPECT_EQ(clip_cache_item->cache_state(),
RasterCacheItem::CacheState::kCurrent);
DlPaint paint;
- EXPECT_TRUE(raster_cache()->Draw(layer->raster_cache_item()->GetId().value(),
+ EXPECT_TRUE(raster_cache()->Draw(clip_cache_item->GetId().value(),
cache_canvas, &paint));
}
-TEST_F(ClipPathLayerTest, NullRasterCacheResetsRasterCacheItem) {
- auto path1 = SkPath().addRect({10, 10, 30, 30});
- auto mock1 = MockLayer::MakeOpacityCompatible(path1);
- auto layer_clip = SkPath()
- .addRect(SkRect::MakeLTRB(5, 5, 25, 25))
- .addOval(SkRect::MakeLTRB(20, 20, 40, 50));
- auto layer =
- std::make_shared<ClipPathLayer>(layer_clip, Clip::antiAliasWithSaveLayer);
- layer->Add(mock1);
-
- ASSERT_EQ(layer->raster_cache_item(), nullptr);
-
- layer->Preroll(preroll_context());
- ASSERT_EQ(layer->raster_cache_item(), nullptr);
-
- use_mock_raster_cache();
-
- int limit = RasterCacheUtil::kMinimumRendersBeforeCachingFilterLayer;
- for (int i = 1; i < limit; i++) {
- layer->Preroll(preroll_context());
- ASSERT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(),
- RasterCacheItem::kNone);
- ASSERT_FALSE(
- layer->raster_cache_item()->TryToPrepareRasterCache(paint_context()));
- }
-
- layer->Preroll(preroll_context());
- ASSERT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(),
- RasterCacheItem::kCurrent);
- ASSERT_TRUE(
- layer->raster_cache_item()->TryToPrepareRasterCache(paint_context()));
-
- use_null_raster_cache();
-
- layer->Preroll(preroll_context());
- ASSERT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(), RasterCacheItem::kNone);
-}
-
TEST_F(ClipPathLayerTest, EmptyClipDoesNotCullPlatformView) {
const SkPoint view_offset = SkPoint::Make(0.0f, 0.0f);
const SkSize view_size = SkSize::Make(8.0f, 8.0f);
diff --git a/flow/layers/clip_rect_layer_unittests.cc b/flow/layers/clip_rect_layer_unittests.cc
index 2614dde..55359b3 100644
--- a/flow/layers/clip_rect_layer_unittests.cc
+++ b/flow/layers/clip_rect_layer_unittests.cc
@@ -499,71 +499,30 @@
use_mock_raster_cache();
preroll_context()->state_stack.set_preroll_delegate(initial_transform);
- EXPECT_EQ(layer->raster_cache_item(), nullptr);
+
+ const auto* clip_cache_item = layer->raster_cache_item();
layer->Preroll(preroll_context());
- EXPECT_NE(layer->raster_cache_item(), nullptr);
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
- EXPECT_EQ(layer->raster_cache_item()->cache_state(),
- RasterCacheItem::CacheState::kNone);
+ EXPECT_EQ(clip_cache_item->cache_state(), RasterCacheItem::CacheState::kNone);
layer->Preroll(preroll_context());
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
- EXPECT_EQ(layer->raster_cache_item()->cache_state(),
- RasterCacheItem::CacheState::kNone);
+ EXPECT_EQ(clip_cache_item->cache_state(), RasterCacheItem::CacheState::kNone);
layer->Preroll(preroll_context());
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)1);
- EXPECT_EQ(layer->raster_cache_item()->cache_state(),
+ EXPECT_EQ(clip_cache_item->cache_state(),
RasterCacheItem::CacheState::kCurrent);
DlPaint paint;
- EXPECT_TRUE(raster_cache()->Draw(layer->raster_cache_item()->GetId().value(),
+ EXPECT_TRUE(raster_cache()->Draw(clip_cache_item->GetId().value(),
cache_canvas, &paint));
}
-TEST_F(ClipRectLayerTest, NullRasterCacheResetsRasterCacheItem) {
- auto path1 = SkPath().addRect({10, 10, 30, 30});
- auto mock1 = MockLayer::MakeOpacityCompatible(path1);
- SkRect clip_rect = SkRect::MakeWH(500, 500);
- auto layer =
- std::make_shared<ClipRectLayer>(clip_rect, Clip::antiAliasWithSaveLayer);
- layer->Add(mock1);
-
- ASSERT_EQ(layer->raster_cache_item(), nullptr);
-
- layer->Preroll(preroll_context());
- ASSERT_EQ(layer->raster_cache_item(), nullptr);
-
- use_mock_raster_cache();
-
- int limit = RasterCacheUtil::kMinimumRendersBeforeCachingFilterLayer;
- for (int i = 1; i < limit; i++) {
- layer->Preroll(preroll_context());
- ASSERT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(),
- RasterCacheItem::kNone);
- ASSERT_FALSE(
- layer->raster_cache_item()->TryToPrepareRasterCache(paint_context()));
- }
-
- layer->Preroll(preroll_context());
- ASSERT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(),
- RasterCacheItem::kCurrent);
- ASSERT_TRUE(
- layer->raster_cache_item()->TryToPrepareRasterCache(paint_context()));
-
- use_null_raster_cache();
-
- layer->Preroll(preroll_context());
- ASSERT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(), RasterCacheItem::kNone);
-}
-
TEST_F(ClipRectLayerTest, EmptyClipDoesNotCullPlatformView) {
const SkPoint view_offset = SkPoint::Make(0.0f, 0.0f);
const SkSize view_size = SkSize::Make(8.0f, 8.0f);
diff --git a/flow/layers/clip_rrect_layer_unittests.cc b/flow/layers/clip_rrect_layer_unittests.cc
index f0f4395..98d6493 100644
--- a/flow/layers/clip_rrect_layer_unittests.cc
+++ b/flow/layers/clip_rrect_layer_unittests.cc
@@ -512,72 +512,29 @@
use_mock_raster_cache();
preroll_context()->state_stack.set_preroll_delegate(initial_transform);
- EXPECT_EQ(layer->raster_cache_item(), nullptr);
+
+ const auto* clip_cache_item = layer->raster_cache_item();
layer->Preroll(preroll_context());
- EXPECT_NE(layer->raster_cache_item(), nullptr);
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
- EXPECT_EQ(layer->raster_cache_item()->cache_state(),
- RasterCacheItem::CacheState::kNone);
+ EXPECT_EQ(clip_cache_item->cache_state(), RasterCacheItem::CacheState::kNone);
layer->Preroll(preroll_context());
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
- EXPECT_EQ(layer->raster_cache_item()->cache_state(),
- RasterCacheItem::CacheState::kNone);
+ EXPECT_EQ(clip_cache_item->cache_state(), RasterCacheItem::CacheState::kNone);
layer->Preroll(preroll_context());
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)1);
- EXPECT_EQ(layer->raster_cache_item()->cache_state(),
+ EXPECT_EQ(clip_cache_item->cache_state(),
RasterCacheItem::CacheState::kCurrent);
- EXPECT_TRUE(raster_cache()->Draw(layer->raster_cache_item()->GetId().value(),
+ EXPECT_TRUE(raster_cache()->Draw(clip_cache_item->GetId().value(),
cache_canvas, &paint));
}
-TEST_F(ClipRRectLayerTest, NullRasterCacheResetsRasterCacheItem) {
- auto path1 = SkPath().addRect({10, 10, 30, 30});
- DlPaint paint = DlPaint();
- auto mock1 = MockLayer::MakeOpacityCompatible(path1);
- SkRect clip_rect = SkRect::MakeWH(500, 500);
- SkRRect clip_rrect = SkRRect::MakeRectXY(clip_rect, 20, 20);
- auto layer = std::make_shared<ClipRRectLayer>(clip_rrect,
- Clip::antiAliasWithSaveLayer);
- layer->Add(mock1);
-
- ASSERT_EQ(layer->raster_cache_item(), nullptr);
-
- layer->Preroll(preroll_context());
- ASSERT_EQ(layer->raster_cache_item(), nullptr);
-
- use_mock_raster_cache();
-
- int limit = RasterCacheUtil::kMinimumRendersBeforeCachingFilterLayer;
- for (int i = 1; i < limit; i++) {
- layer->Preroll(preroll_context());
- ASSERT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(),
- RasterCacheItem::kNone);
- ASSERT_FALSE(
- layer->raster_cache_item()->TryToPrepareRasterCache(paint_context()));
- }
-
- layer->Preroll(preroll_context());
- ASSERT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(),
- RasterCacheItem::kCurrent);
- ASSERT_TRUE(
- layer->raster_cache_item()->TryToPrepareRasterCache(paint_context()));
-
- use_null_raster_cache();
-
- layer->Preroll(preroll_context());
- ASSERT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(), RasterCacheItem::kNone);
-}
-
TEST_F(ClipRRectLayerTest, NoSaveLayerShouldNotCache) {
auto path1 = SkPath().addRect({10, 10, 30, 30});
@@ -594,23 +551,24 @@
use_mock_raster_cache();
preroll_context()->state_stack.set_preroll_delegate(initial_transform);
- EXPECT_EQ(layer->raster_cache_item(), nullptr);
+
+ const auto* clip_cache_item = layer->raster_cache_item();
layer->Preroll(preroll_context());
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
- EXPECT_EQ(layer->raster_cache_item(), nullptr);
+ EXPECT_EQ(clip_cache_item->cache_state(), RasterCacheItem::CacheState::kNone);
layer->Preroll(preroll_context());
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
- EXPECT_EQ(layer->raster_cache_item(), nullptr);
+ EXPECT_EQ(clip_cache_item->cache_state(), RasterCacheItem::CacheState::kNone);
layer->Preroll(preroll_context());
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
- EXPECT_EQ(layer->raster_cache_item(), nullptr);
+ EXPECT_EQ(clip_cache_item->cache_state(), RasterCacheItem::CacheState::kNone);
}
TEST_F(ClipRRectLayerTest, EmptyClipDoesNotCullPlatformView) {
diff --git a/flow/layers/clip_shape_layer.h b/flow/layers/clip_shape_layer.h
index 3af0b3f..d332678 100644
--- a/flow/layers/clip_shape_layer.h
+++ b/flow/layers/clip_shape_layer.h
@@ -48,7 +48,9 @@
// We can use the raster_cache for children only when the use_save_layer is
// true so if use_save_layer is false we pass the layer_raster_item is
// nullptr which mean we don't do raster cache logic.
- AutoCache cache(*this, context, uses_save_layer);
+ AutoCache cache =
+ AutoCache(uses_save_layer ? layer_raster_cache_item_.get() : nullptr,
+ context, context->state_stack.transform_3x3());
Layer::AutoPrerollSaveLayerState save =
Layer::AutoPrerollSaveLayerState::Create(
diff --git a/flow/layers/color_filter_layer.cc b/flow/layers/color_filter_layer.cc
index aa25727..056efa7 100644
--- a/flow/layers/color_filter_layer.cc
+++ b/flow/layers/color_filter_layer.cc
@@ -39,7 +39,8 @@
void ColorFilterLayer::Preroll(PrerollContext* context) {
Layer::AutoPrerollSaveLayerState save =
Layer::AutoPrerollSaveLayerState::Create(context);
- AutoCache cache(*this, context);
+ AutoCache cache = AutoCache(layer_raster_cache_item_.get(), context,
+ context->state_stack.transform_3x3());
ContainerLayer::Preroll(context);
diff --git a/flow/layers/color_filter_layer_unittests.cc b/flow/layers/color_filter_layer_unittests.cc
index 5ecc790..1ec1f35 100644
--- a/flow/layers/color_filter_layer_unittests.cc
+++ b/flow/layers/color_filter_layer_unittests.cc
@@ -271,25 +271,27 @@
other_canvas.Transform(other_transform);
use_mock_raster_cache();
+ const auto* cacheable_color_filter_item = layer->raster_cache_item();
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
- EXPECT_EQ(layer->raster_cache_item(), nullptr);
+ EXPECT_EQ(cacheable_color_filter_item->cache_state(),
+ RasterCacheItem::CacheState::kNone);
+ EXPECT_FALSE(cacheable_color_filter_item->GetId().has_value());
preroll_context()->state_stack.set_preroll_delegate(initial_transform);
layer->Preroll(preroll_context());
- EXPECT_NE(layer->raster_cache_item(), nullptr);
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)1);
- EXPECT_EQ(layer->raster_cache_item()->cache_state(),
+ EXPECT_EQ(cacheable_color_filter_item->cache_state(),
RasterCacheItem::CacheState::kChildren);
EXPECT_EQ(
- layer->raster_cache_item()->GetId().value(),
+ cacheable_color_filter_item->GetId().value(),
RasterCacheKeyID(RasterCacheKeyID::LayerChildrenIds(layer.get()).value(),
RasterCacheKeyType::kLayerChildren));
- EXPECT_FALSE(raster_cache()->Draw(layer->raster_cache_item()->GetId().value(),
- other_canvas, &paint));
- EXPECT_TRUE(raster_cache()->Draw(layer->raster_cache_item()->GetId().value(),
+ EXPECT_FALSE(raster_cache()->Draw(
+ cacheable_color_filter_item->GetId().value(), other_canvas, &paint));
+ EXPECT_TRUE(raster_cache()->Draw(cacheable_color_filter_item->GetId().value(),
cache_canvas, &paint));
}
@@ -315,65 +317,30 @@
use_mock_raster_cache();
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
- EXPECT_EQ(layer->raster_cache_item(), nullptr);
+ const auto* cacheable_color_filter_item = layer->raster_cache_item();
+ EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
+
+ EXPECT_EQ(cacheable_color_filter_item->cache_state(),
+ RasterCacheItem::CacheState::kNone);
+ EXPECT_FALSE(cacheable_color_filter_item->GetId().has_value());
preroll_context()->state_stack.set_preroll_delegate(initial_transform);
layer->Preroll(preroll_context());
- EXPECT_NE(layer->raster_cache_item(), nullptr);
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)1);
- EXPECT_EQ(layer->raster_cache_item()->cache_state(),
+ EXPECT_EQ(cacheable_color_filter_item->cache_state(),
RasterCacheItem::CacheState::kChildren);
EXPECT_EQ(
- layer->raster_cache_item()->GetId().value(),
+ cacheable_color_filter_item->GetId().value(),
RasterCacheKeyID(RasterCacheKeyID::LayerChildrenIds(layer.get()).value(),
RasterCacheKeyType::kLayerChildren));
- EXPECT_FALSE(raster_cache()->Draw(layer->raster_cache_item()->GetId().value(),
- other_canvas, &paint));
- EXPECT_TRUE(raster_cache()->Draw(layer->raster_cache_item()->GetId().value(),
+ EXPECT_FALSE(raster_cache()->Draw(
+ cacheable_color_filter_item->GetId().value(), other_canvas, &paint));
+ EXPECT_TRUE(raster_cache()->Draw(cacheable_color_filter_item->GetId().value(),
cache_canvas, &paint));
}
-TEST_F(ColorFilterLayerTest, NullRasterCacheResetsRasterCacheItem) {
- auto layer_filter = DlSrgbToLinearGammaColorFilter::instance;
- const SkPath child_path = SkPath().addRect(SkRect::MakeWH(5.0f, 5.0f));
- DlPaint paint = DlPaint();
- auto mock_layer = std::make_shared<MockLayer>(child_path);
- auto layer = std::make_shared<ColorFilterLayer>(layer_filter);
- layer->Add(mock_layer);
-
- ASSERT_EQ(layer->raster_cache_item(), nullptr);
-
- layer->Preroll(preroll_context());
- ASSERT_EQ(layer->raster_cache_item(), nullptr);
-
- use_mock_raster_cache();
-
- int limit = RasterCacheUtil::kMinimumRendersBeforeCachingFilterLayer;
- for (int i = 1; i < limit; i++) {
- layer->Preroll(preroll_context());
- ASSERT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(),
- RasterCacheItem::kChildren);
- ASSERT_TRUE(
- layer->raster_cache_item()->TryToPrepareRasterCache(paint_context()));
- }
-
- layer->Preroll(preroll_context());
- ASSERT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(),
- RasterCacheItem::kCurrent);
- ASSERT_TRUE(
- layer->raster_cache_item()->TryToPrepareRasterCache(paint_context()));
-
- use_null_raster_cache();
-
- layer->Preroll(preroll_context());
- ASSERT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(), RasterCacheItem::kNone);
-}
-
TEST_F(ColorFilterLayerTest, CacheColorFilterLayerSelf) {
auto layer_filter = DlSrgbToLinearGammaColorFilter::instance;
auto initial_transform = SkMatrix::Translate(50.0, 25.5);
@@ -395,28 +362,25 @@
use_mock_raster_cache();
preroll_context()->state_stack.set_preroll_delegate(initial_transform);
- EXPECT_EQ(layer->raster_cache_item(), nullptr);
+ const auto* cacheable_color_filter_item = layer->raster_cache_item();
// frame 1.
layer->Preroll(preroll_context());
- EXPECT_NE(layer->raster_cache_item(), nullptr);
layer->Paint(paint_context());
// frame 2.
layer->Preroll(preroll_context());
- EXPECT_NE(layer->raster_cache_item(), nullptr);
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
// ColorFilterLayer default cache children.
- EXPECT_EQ(layer->raster_cache_item()->cache_state(),
+ EXPECT_EQ(cacheable_color_filter_item->cache_state(),
RasterCacheItem::CacheState::kChildren);
- EXPECT_TRUE(raster_cache()->Draw(layer->raster_cache_item()->GetId().value(),
+ EXPECT_TRUE(raster_cache()->Draw(cacheable_color_filter_item->GetId().value(),
cache_canvas, &paint));
- EXPECT_FALSE(raster_cache()->Draw(layer->raster_cache_item()->GetId().value(),
- other_canvas, &paint));
+ EXPECT_FALSE(raster_cache()->Draw(
+ cacheable_color_filter_item->GetId().value(), other_canvas, &paint));
layer->Paint(paint_context());
// frame 3.
layer->Preroll(preroll_context());
- EXPECT_NE(layer->raster_cache_item(), nullptr);
layer->Paint(paint_context());
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
@@ -425,14 +389,14 @@
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)2);
// ColorFilterLayer default cache itself.
- EXPECT_EQ(layer->raster_cache_item()->cache_state(),
+ EXPECT_EQ(cacheable_color_filter_item->cache_state(),
RasterCacheItem::CacheState::kCurrent);
- EXPECT_EQ(layer->raster_cache_item()->GetId(),
+ EXPECT_EQ(cacheable_color_filter_item->GetId(),
RasterCacheKeyID(layer->unique_id(), RasterCacheKeyType::kLayer));
- EXPECT_TRUE(raster_cache()->Draw(layer->raster_cache_item()->GetId().value(),
+ EXPECT_TRUE(raster_cache()->Draw(cacheable_color_filter_item->GetId().value(),
cache_canvas, &paint));
- EXPECT_FALSE(raster_cache()->Draw(layer->raster_cache_item()->GetId().value(),
- other_canvas, &paint));
+ EXPECT_FALSE(raster_cache()->Draw(
+ cacheable_color_filter_item->GetId().value(), other_canvas, &paint));
}
TEST_F(ColorFilterLayerTest, OpacityInheritance) {
diff --git a/flow/layers/display_list_layer.cc b/flow/layers/display_list_layer.cc
index 03eaf0c..543af52 100644
--- a/flow/layers/display_list_layer.cc
+++ b/flow/layers/display_list_layer.cc
@@ -19,26 +19,11 @@
sk_sp<DisplayList> display_list,
bool is_complex,
bool will_change)
- : offset_(offset),
- display_list_(std::move(display_list)),
- is_complex_(is_complex),
- will_change_(will_change) {
+ : offset_(offset), display_list_(std::move(display_list)) {
if (display_list_) {
bounds_ = display_list_->bounds().makeOffset(offset_.x(), offset_.y());
- }
-}
-
-RasterCacheItem* DisplayListLayer::realize_raster_cache_item() {
- if (!display_list_raster_cache_item_) {
display_list_raster_cache_item_ = DisplayListRasterCacheItem::Make(
- display_list_, offset_, is_complex_, will_change_);
- }
- return display_list_raster_cache_item_.get();
-}
-
-void DisplayListLayer::disable_raster_cache_item() {
- if (display_list_raster_cache_item_) {
- display_list_raster_cache_item_->reset_cache_state();
+ display_list_, offset_, is_complex, will_change);
}
}
@@ -110,7 +95,8 @@
void DisplayListLayer::Preroll(PrerollContext* context) {
DisplayList* disp_list = display_list();
- AutoCache cache(*this, context);
+ AutoCache cache = AutoCache(display_list_raster_cache_item_.get(), context,
+ context->state_stack.transform_3x3());
if (disp_list->can_apply_group_opacity()) {
context->renderable_state_flags = LayerStateStack::kCallerCanApplyOpacity;
}
diff --git a/flow/layers/display_list_layer.h b/flow/layers/display_list_layer.h
index 88243cc..d7efe4e 100644
--- a/flow/layers/display_list_layer.h
+++ b/flow/layers/display_list_layer.h
@@ -8,14 +8,13 @@
#include <memory>
#include "flutter/display_list/display_list.h"
-#include "flutter/flow/layers/cacheable_layer.h"
#include "flutter/flow/layers/display_list_raster_cache_item.h"
#include "flutter/flow/layers/layer.h"
#include "flutter/flow/raster_cache_item.h"
namespace flutter {
-class DisplayListLayer : public Layer, public CacheableLayer {
+class DisplayListLayer : public Layer {
public:
static constexpr size_t kMaxBytesToCompare = 10000;
@@ -48,18 +47,12 @@
}
private:
- RasterCacheItem* realize_raster_cache_item() override;
- void disable_raster_cache_item() override;
std::unique_ptr<DisplayListRasterCacheItem> display_list_raster_cache_item_;
- friend class AutoCache;
-
SkPoint offset_;
SkRect bounds_;
sk_sp<DisplayList> display_list_;
- bool is_complex_;
- bool will_change_;
static bool Compare(DiffContext::Statistics& statistics,
const DisplayListLayer* l1,
diff --git a/flow/layers/display_list_layer_unittests.cc b/flow/layers/display_list_layer_unittests.cc
index 286021e..2791577 100644
--- a/flow/layers/display_list_layer_unittests.cc
+++ b/flow/layers/display_list_layer_unittests.cc
@@ -474,46 +474,6 @@
EXPECT_EQ(0u, snapshot_store.Size());
}
-TEST_F(DisplayListLayerTest, NullRasterCacheResetsRasterCacheItem) {
- const SkPoint layer_offset = SkPoint::Make(1.5f, -0.5f);
- const SkRect picture_bounds = SkRect::MakeLTRB(5.0f, 6.0f, 20.5f, 21.5f);
- DisplayListBuilder builder;
- builder.DrawRect(picture_bounds, DlPaint());
- auto display_list = builder.Build();
- auto layer = std::make_shared<DisplayListLayer>(layer_offset, display_list,
- true, false);
-
- ASSERT_EQ(layer->raster_cache_item(), nullptr);
-
- layer->Preroll(preroll_context());
- ASSERT_EQ(layer->raster_cache_item(), nullptr);
-
- use_mock_raster_cache();
-
- size_t limit = raster_cache()->access_threshold();
- for (size_t i = 0; i < limit; i++) {
- layer->Preroll(preroll_context());
- ASSERT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(),
- RasterCacheItem::kNone);
- ASSERT_FALSE(
- layer->raster_cache_item()->TryToPrepareRasterCache(paint_context()));
- }
-
- layer->Preroll(preroll_context());
- ASSERT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(),
- RasterCacheItem::kCurrent);
- ASSERT_TRUE(
- layer->raster_cache_item()->TryToPrepareRasterCache(paint_context()));
-
- use_null_raster_cache();
-
- layer->Preroll(preroll_context());
- ASSERT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(), RasterCacheItem::kNone);
-}
-
TEST_F(DisplayListLayerTest, DisplayListAccessCountDependsOnVisibility) {
const SkPoint layer_offset = SkPoint::Make(1.5f, -0.5f);
const SkRect picture_bounds = SkRect::MakeLTRB(5.0f, 6.0f, 20.5f, 21.5f);
@@ -525,10 +485,9 @@
auto layer = std::make_shared<DisplayListLayer>(layer_offset, display_list,
true, false);
+ auto raster_cache_item = layer->raster_cache_item();
use_mock_raster_cache();
- EXPECT_EQ(layer->raster_cache_item(), nullptr);
-
// First Preroll the DisplayListLayer a few times where it does not intersect
// the cull rect. No caching progress should occur during this time, the
// access_count should remain 0 because the DisplayList was never "visible".
@@ -537,19 +496,16 @@
for (int i = 0; i < 10; i++) {
preroll_context()->raster_cached_entries->clear();
layer->Preroll(preroll_context());
- EXPECT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(),
- RasterCacheItem::kNone);
- ASSERT_TRUE(layer->raster_cache_item()->GetId().has_value());
+ ASSERT_EQ(raster_cache_item->cache_state(), RasterCacheItem::kNone);
+ ASSERT_TRUE(raster_cache_item->GetId().has_value());
ASSERT_EQ(preroll_context()->raster_cache->GetAccessCount(
- layer->raster_cache_item()->GetId().value(), SkMatrix::I()),
+ raster_cache_item->GetId().value(), SkMatrix::I()),
0);
ASSERT_EQ(preroll_context()->raster_cached_entries->size(), size_t(1));
ASSERT_EQ(preroll_context()->raster_cache->EstimatePictureCacheByteSize(),
size_t(0));
- ASSERT_FALSE(
- layer->raster_cache_item()->TryToPrepareRasterCache(paint_context()));
- ASSERT_FALSE(layer->raster_cache_item()->Draw(paint_context(), nullptr));
+ ASSERT_FALSE(raster_cache_item->TryToPrepareRasterCache(paint_context()));
+ ASSERT_FALSE(raster_cache_item->Draw(paint_context(), nullptr));
}
// Next Preroll the DisplayListLayer once where it does intersect
@@ -560,18 +516,16 @@
preroll_context()->state_stack.set_preroll_delegate(hit_cull_rect);
preroll_context()->raster_cached_entries->clear();
layer->Preroll(preroll_context());
- EXPECT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(), RasterCacheItem::kNone);
- ASSERT_TRUE(layer->raster_cache_item()->GetId().has_value());
+ ASSERT_EQ(raster_cache_item->cache_state(), RasterCacheItem::kNone);
+ ASSERT_TRUE(raster_cache_item->GetId().has_value());
ASSERT_EQ(preroll_context()->raster_cache->GetAccessCount(
- layer->raster_cache_item()->GetId().value(), SkMatrix::I()),
+ raster_cache_item->GetId().value(), SkMatrix::I()),
1);
ASSERT_EQ(preroll_context()->raster_cached_entries->size(), size_t(1));
ASSERT_EQ(preroll_context()->raster_cache->EstimatePictureCacheByteSize(),
size_t(0));
- ASSERT_FALSE(
- layer->raster_cache_item()->TryToPrepareRasterCache(paint_context()));
- ASSERT_FALSE(layer->raster_cache_item()->Draw(paint_context(), nullptr));
+ ASSERT_FALSE(raster_cache_item->TryToPrepareRasterCache(paint_context()));
+ ASSERT_FALSE(raster_cache_item->Draw(paint_context(), nullptr));
// Now we can Preroll the DisplayListLayer again with a cull rect that
// it does not intersect and it should continue to count these operations
@@ -582,19 +536,16 @@
for (int i = 0; i < 10; i++) {
preroll_context()->raster_cached_entries->clear();
layer->Preroll(preroll_context());
- EXPECT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(),
- RasterCacheItem::kNone);
- ASSERT_TRUE(layer->raster_cache_item()->GetId().has_value());
+ ASSERT_EQ(raster_cache_item->cache_state(), RasterCacheItem::kNone);
+ ASSERT_TRUE(raster_cache_item->GetId().has_value());
ASSERT_EQ(preroll_context()->raster_cache->GetAccessCount(
- layer->raster_cache_item()->GetId().value(), SkMatrix::I()),
+ raster_cache_item->GetId().value(), SkMatrix::I()),
i + 2);
ASSERT_EQ(preroll_context()->raster_cached_entries->size(), size_t(1));
ASSERT_EQ(preroll_context()->raster_cache->EstimatePictureCacheByteSize(),
size_t(0));
- ASSERT_FALSE(
- layer->raster_cache_item()->TryToPrepareRasterCache(paint_context()));
- ASSERT_FALSE(layer->raster_cache_item()->Draw(paint_context(), nullptr));
+ ASSERT_FALSE(raster_cache_item->TryToPrepareRasterCache(paint_context()));
+ ASSERT_FALSE(raster_cache_item->Draw(paint_context(), nullptr));
}
// Finally Preroll the DisplayListLayer again where it does intersect
@@ -605,21 +556,18 @@
preroll_context()->state_stack.set_preroll_delegate(hit_cull_rect);
preroll_context()->raster_cached_entries->clear();
layer->Preroll(preroll_context());
- EXPECT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(),
- RasterCacheItem::kCurrent);
- ASSERT_TRUE(layer->raster_cache_item()->GetId().has_value());
+ ASSERT_EQ(raster_cache_item->cache_state(), RasterCacheItem::kCurrent);
+ ASSERT_TRUE(raster_cache_item->GetId().has_value());
ASSERT_EQ(preroll_context()->raster_cache->GetAccessCount(
- layer->raster_cache_item()->GetId().value(), SkMatrix::I()),
+ raster_cache_item->GetId().value(), SkMatrix::I()),
12);
ASSERT_EQ(preroll_context()->raster_cached_entries->size(), size_t(1));
ASSERT_EQ(preroll_context()->raster_cache->EstimatePictureCacheByteSize(),
size_t(0));
- ASSERT_TRUE(
- layer->raster_cache_item()->TryToPrepareRasterCache(paint_context()));
+ ASSERT_TRUE(raster_cache_item->TryToPrepareRasterCache(paint_context()));
ASSERT_GT(preroll_context()->raster_cache->EstimatePictureCacheByteSize(),
size_t(0));
- ASSERT_TRUE(layer->raster_cache_item()->Draw(paint_context(), nullptr));
+ ASSERT_TRUE(raster_cache_item->Draw(paint_context(), nullptr));
}
TEST_F(DisplayListLayerTest, OverflowCachedDisplayListOpacityInheritance) {
diff --git a/flow/layers/image_filter_layer.cc b/flow/layers/image_filter_layer.cc
index 27d8abe..834df45 100644
--- a/flow/layers/image_filter_layer.cc
+++ b/flow/layers/image_filter_layer.cc
@@ -56,7 +56,8 @@
Layer::AutoPrerollSaveLayerState save =
Layer::AutoPrerollSaveLayerState::Create(context);
- AutoCache cache(*this, context);
+ AutoCache cache = AutoCache(layer_raster_cache_item_.get(), context,
+ context->state_stack.transform_3x3());
SkRect child_bounds = SkRect::MakeEmpty();
@@ -86,9 +87,13 @@
// CacheChildren only when the transformed_filter_ doesn't equal null.
// So in here we reset the LayerRasterCacheItem cache state.
+ layer_raster_cache_item_->MarkNotCacheChildren();
+
transformed_filter_ =
filter_->makeWithLocalMatrix(context->state_stack.transform_3x3());
- MarkCanCacheChildren(transformed_filter_ != nullptr);
+ if (transformed_filter_) {
+ layer_raster_cache_item_->MarkCacheChildren();
+ }
}
void ImageFilterLayer::Paint(PaintContext& context) const {
diff --git a/flow/layers/image_filter_layer_unittests.cc b/flow/layers/image_filter_layer_unittests.cc
index 64046f5..ee8f08c 100644
--- a/flow/layers/image_filter_layer_unittests.cc
+++ b/flow/layers/image_filter_layer_unittests.cc
@@ -367,26 +367,27 @@
DlPaint paint;
use_mock_raster_cache();
- EXPECT_EQ(layer->raster_cache_item(), nullptr);
+ const auto* cacheable_image_filter_item = layer->raster_cache_item();
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
- EXPECT_EQ(cacheable_items().size(), 0u);
+ // ImageFilterLayer default cache itself.
+ EXPECT_EQ(cacheable_image_filter_item->cache_state(),
+ RasterCacheItem::CacheState::kNone);
+ EXPECT_FALSE(cacheable_image_filter_item->Draw(paint_context(), &paint));
preroll_context()->state_stack.set_preroll_delegate(initial_transform);
layer->Preroll(preroll_context());
- EXPECT_NE(layer->raster_cache_item(), nullptr);
- EXPECT_EQ(cacheable_items().size(), 1u);
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)1);
// The layer_cache_item's strategy is Children, mean we will must cache
// his children
- EXPECT_EQ(layer->raster_cache_item()->cache_state(),
+ EXPECT_EQ(cacheable_image_filter_item->cache_state(),
RasterCacheItem::CacheState::kChildren);
- EXPECT_TRUE(raster_cache()->Draw(layer->raster_cache_item()->GetId().value(),
+ EXPECT_TRUE(raster_cache()->Draw(cacheable_image_filter_item->GetId().value(),
cache_canvas, &paint));
- EXPECT_FALSE(raster_cache()->Draw(layer->raster_cache_item()->GetId().value(),
- other_canvas, &paint));
+ EXPECT_FALSE(raster_cache()->Draw(
+ cacheable_image_filter_item->GetId().value(), other_canvas, &paint));
}
TEST_F(ImageFilterLayerTest, CacheChildren) {
@@ -412,27 +413,30 @@
use_mock_raster_cache();
- EXPECT_EQ(layer->raster_cache_item(), nullptr);
+ const auto* cacheable_image_filter_item = layer->raster_cache_item();
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
+ // ImageFilterLayer default cache itself.
+ EXPECT_EQ(cacheable_image_filter_item->cache_state(),
+ RasterCacheItem::CacheState::kNone);
+ EXPECT_FALSE(cacheable_image_filter_item->Draw(paint_context(), &paint));
+
preroll_context()->state_stack.set_preroll_delegate(initial_transform);
layer->Preroll(preroll_context());
- EXPECT_NE(layer->raster_cache_item(), nullptr);
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)1);
// The layer_cache_item's strategy is Children, mean we will must cache his
// children
- EXPECT_EQ(layer->raster_cache_item()->cache_state(),
+ EXPECT_EQ(cacheable_image_filter_item->cache_state(),
RasterCacheItem::CacheState::kChildren);
- EXPECT_TRUE(raster_cache()->Draw(layer->raster_cache_item()->GetId().value(),
+ EXPECT_TRUE(raster_cache()->Draw(cacheable_image_filter_item->GetId().value(),
cache_canvas, &paint));
- EXPECT_FALSE(raster_cache()->Draw(layer->raster_cache_item()->GetId().value(),
- other_canvas, &paint));
+ EXPECT_FALSE(raster_cache()->Draw(
+ cacheable_image_filter_item->GetId().value(), other_canvas, &paint));
layer->Preroll(preroll_context());
- EXPECT_NE(layer->raster_cache_item(), nullptr);
SkRect children_bounds = child_path1.getBounds();
children_bounds.join(child_path2.getBounds());
@@ -455,7 +459,7 @@
expected_builder.Transform(snapped_matrix);
DlPaint dl_paint;
dl_paint.setImageFilter(transformed_filter.get());
- raster_cache()->Draw(layer->raster_cache_item()->GetId().value(),
+ raster_cache()->Draw(cacheable_image_filter_item->GetId().value(),
expected_builder, &dl_paint);
}
expected_builder.Restore();
@@ -464,45 +468,6 @@
EXPECT_TRUE(DisplayListsEQ_Verbose(display_list(), expected_builder.Build()));
}
-TEST_F(ImageFilterLayerTest, NullRasterCacheResetsRasterCacheItem) {
- auto dl_image_filter = std::make_shared<DlMatrixImageFilter>(
- SkMatrix(), DlImageSampling::kMipmapLinear);
- const SkPath child_path = SkPath().addRect(SkRect::MakeWH(5.0f, 5.0f));
- auto mock_layer = std::make_shared<MockLayer>(child_path);
- auto layer = std::make_shared<ImageFilterLayer>(dl_image_filter);
- layer->Add(mock_layer);
-
- ASSERT_EQ(layer->raster_cache_item(), nullptr);
-
- layer->Preroll(preroll_context());
- ASSERT_EQ(layer->raster_cache_item(), nullptr);
-
- use_mock_raster_cache();
-
- int limit = RasterCacheUtil::kMinimumRendersBeforeCachingFilterLayer;
- for (int i = 1; i < limit; i++) {
- layer->Preroll(preroll_context());
- ASSERT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(),
- RasterCacheItem::kChildren);
- ASSERT_TRUE(
- layer->raster_cache_item()->TryToPrepareRasterCache(paint_context()));
- }
-
- layer->Preroll(preroll_context());
- ASSERT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(),
- RasterCacheItem::kCurrent);
- ASSERT_TRUE(
- layer->raster_cache_item()->TryToPrepareRasterCache(paint_context()));
-
- use_null_raster_cache();
-
- layer->Preroll(preroll_context());
- ASSERT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(), RasterCacheItem::kNone);
-}
-
TEST_F(ImageFilterLayerTest, CacheImageFilterLayerSelf) {
auto dl_image_filter = std::make_shared<DlMatrixImageFilter>(
SkMatrix(), DlImageSampling::kMipmapLinear);
@@ -530,10 +495,9 @@
use_mock_raster_cache();
preroll_context()->state_stack.set_preroll_delegate(initial_transform);
- EXPECT_EQ(layer->raster_cache_item(), nullptr);
+ const auto* cacheable_image_filter_item = layer->raster_cache_item();
// frame 1.
layer->Preroll(preroll_context());
- EXPECT_NE(layer->raster_cache_item(), nullptr);
layer->Paint(display_list_paint_context());
{
@@ -573,14 +537,14 @@
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)2);
// ImageFilterLayer default cache itself.
- EXPECT_EQ(layer->raster_cache_item()->cache_state(),
+ EXPECT_EQ(cacheable_image_filter_item->cache_state(),
RasterCacheItem::CacheState::kCurrent);
- EXPECT_EQ(layer->raster_cache_item()->GetId(),
+ EXPECT_EQ(cacheable_image_filter_item->GetId(),
RasterCacheKeyID(layer->unique_id(), RasterCacheKeyType::kLayer));
- EXPECT_TRUE(raster_cache()->Draw(layer->raster_cache_item()->GetId().value(),
+ EXPECT_TRUE(raster_cache()->Draw(cacheable_image_filter_item->GetId().value(),
cache_canvas, &paint));
- EXPECT_FALSE(raster_cache()->Draw(layer->raster_cache_item()->GetId().value(),
- other_canvas, &paint));
+ EXPECT_FALSE(raster_cache()->Draw(
+ cacheable_image_filter_item->GetId().value(), other_canvas, &paint));
layer->Preroll(preroll_context());
@@ -592,7 +556,7 @@
expected_builder.Save();
{
EXPECT_TRUE(
- raster_cache()->Draw(layer->raster_cache_item()->GetId().value(),
+ raster_cache()->Draw(cacheable_image_filter_item->GetId().value(),
expected_builder, nullptr));
}
expected_builder.Restore();
diff --git a/flow/layers/layer_raster_cache_item.h b/flow/layers/layer_raster_cache_item.h
index b383ac3..53e9a65 100644
--- a/flow/layers/layer_raster_cache_item.h
+++ b/flow/layers/layer_raster_cache_item.h
@@ -45,9 +45,9 @@
bool TryToPrepareRasterCache(const PaintContext& context,
bool parent_cached = false) const override;
- void MarkCanCacheChildren(bool can_cache_children) {
- can_cache_children_ = can_cache_children;
- }
+ void MarkCacheChildren() { can_cache_children_ = true; }
+
+ void MarkNotCacheChildren() { can_cache_children_ = false; }
bool IsCacheChildren() const { return cache_state_ == CacheState::kChildren; }
diff --git a/flow/layers/opacity_layer.cc b/flow/layers/opacity_layer.cc
index 20843be..8b55dff 100644
--- a/flow/layers/opacity_layer.cc
+++ b/flow/layers/opacity_layer.cc
@@ -42,7 +42,8 @@
mutator.translate(offset_);
mutator.applyOpacity(SkRect(), DlColor::toOpacity(alpha_));
- AutoCache auto_cache(*this, context);
+ AutoCache auto_cache = AutoCache(layer_raster_cache_item_.get(), context,
+ context->state_stack.transform_3x3());
Layer::AutoPrerollSaveLayerState save =
Layer::AutoPrerollSaveLayerState::Create(context);
@@ -77,7 +78,7 @@
mutator.applyOpacity(child_paint_bounds(), opacity());
- if (context.raster_cache && !children_can_accept_opacity()) {
+ if (!children_can_accept_opacity()) {
DlPaint paint;
if (layer_raster_cache_item_->Draw(context,
context.state_stack.fill(paint))) {
diff --git a/flow/layers/opacity_layer_unittests.cc b/flow/layers/opacity_layer_unittests.cc
index 3a64fc3..71ccdc1 100644
--- a/flow/layers/opacity_layer_unittests.cc
+++ b/flow/layers/opacity_layer_unittests.cc
@@ -103,24 +103,29 @@
use_mock_raster_cache();
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
- EXPECT_EQ(layer->raster_cache_item(), nullptr);
+
+ const auto* cacheable_opacity_item = layer->raster_cache_item();
+
+ EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
+ EXPECT_EQ(cacheable_opacity_item->cache_state(),
+ RasterCacheItem::CacheState::kNone);
+ EXPECT_FALSE(cacheable_opacity_item->GetId().has_value());
preroll_context()->state_stack.set_preroll_delegate(initial_transform);
layer->Preroll(preroll_context());
- EXPECT_NE(layer->raster_cache_item(), nullptr);
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)1);
- EXPECT_EQ(layer->raster_cache_item()->cache_state(),
+ EXPECT_EQ(cacheable_opacity_item->cache_state(),
RasterCacheItem::CacheState::kChildren);
EXPECT_EQ(
- layer->raster_cache_item()->GetId().value(),
+ cacheable_opacity_item->GetId().value(),
RasterCacheKeyID(RasterCacheKeyID::LayerChildrenIds(layer.get()).value(),
RasterCacheKeyType::kLayerChildren));
- EXPECT_FALSE(raster_cache()->Draw(layer->raster_cache_item()->GetId().value(),
+ EXPECT_FALSE(raster_cache()->Draw(cacheable_opacity_item->GetId().value(),
other_canvas, &paint));
- EXPECT_TRUE(raster_cache()->Draw(layer->raster_cache_item()->GetId().value(),
+ EXPECT_TRUE(raster_cache()->Draw(cacheable_opacity_item->GetId().value(),
cache_canvas, &paint));
}
@@ -147,61 +152,32 @@
use_mock_raster_cache();
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
- EXPECT_EQ(layer->raster_cache_item(), nullptr);
+
+ const auto* cacheable_opacity_item = layer->raster_cache_item();
+
+ EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
+ EXPECT_EQ(cacheable_opacity_item->cache_state(),
+ RasterCacheItem::CacheState::kNone);
+ EXPECT_FALSE(cacheable_opacity_item->GetId().has_value());
preroll_context()->state_stack.set_preroll_delegate(initial_transform);
layer->Preroll(preroll_context());
- EXPECT_NE(layer->raster_cache_item(), nullptr);
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)1);
- EXPECT_EQ(layer->raster_cache_item()->cache_state(),
+ EXPECT_EQ(cacheable_opacity_item->cache_state(),
RasterCacheItem::CacheState::kChildren);
EXPECT_EQ(
- layer->raster_cache_item()->GetId().value(),
+ cacheable_opacity_item->GetId().value(),
RasterCacheKeyID(RasterCacheKeyID::LayerChildrenIds(layer.get()).value(),
RasterCacheKeyType::kLayerChildren));
- EXPECT_FALSE(raster_cache()->Draw(layer->raster_cache_item()->GetId().value(),
+ EXPECT_FALSE(raster_cache()->Draw(cacheable_opacity_item->GetId().value(),
other_canvas, &paint));
- EXPECT_TRUE(raster_cache()->Draw(layer->raster_cache_item()->GetId().value(),
+ EXPECT_TRUE(raster_cache()->Draw(cacheable_opacity_item->GetId().value(),
cache_canvas, &paint));
}
-TEST_F(OpacityLayerTest, NullRasterCacheResetsRasterCacheItem) {
- const SkAlpha alpha_half = 255 / 2;
- const SkPath child_path = SkPath().addRect(SkRect::MakeWH(5.0f, 5.0f));
- auto mock_layer = std::make_shared<MockLayer>(child_path);
- mock_layer->set_fake_opacity_compatible(false);
- auto layer =
- std::make_shared<OpacityLayer>(alpha_half, SkPoint::Make(0.0f, 0.0f));
- layer->Add(mock_layer);
-
- ASSERT_EQ(layer->raster_cache_item(), nullptr);
-
- layer->Preroll(preroll_context());
- ASSERT_EQ(layer->raster_cache_item(), nullptr);
-
- use_mock_raster_cache();
-
- // OpacityLayer will never cache itself, only its children
- int limit = 10 * RasterCacheUtil::kMinimumRendersBeforeCachingFilterLayer;
- for (int i = 1; i < limit; i++) {
- layer->Preroll(preroll_context());
- ASSERT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(),
- RasterCacheItem::kChildren);
- ASSERT_TRUE(
- layer->raster_cache_item()->TryToPrepareRasterCache(paint_context()));
- }
-
- use_null_raster_cache();
-
- layer->Preroll(preroll_context());
- ASSERT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(), RasterCacheItem::kNone);
-}
-
TEST_F(OpacityLayerTest, ShouldNotCacheChildren) {
DlPaint paint;
auto opacity_layer =
@@ -214,20 +190,24 @@
use_mock_raster_cache();
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
- EXPECT_EQ(opacity_layer->raster_cache_item(), nullptr);
+
+ const auto* cacheable_opacity_item = opacity_layer->raster_cache_item();
+
+ EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
+ EXPECT_EQ(cacheable_opacity_item->cache_state(),
+ RasterCacheItem::CacheState::kNone);
+ EXPECT_FALSE(cacheable_opacity_item->GetId().has_value());
opacity_layer->Preroll(preroll_context());
- EXPECT_NE(opacity_layer->raster_cache_item(), nullptr);
EXPECT_EQ(context->renderable_state_flags,
LayerStateStack::kCallerCanApplyOpacity);
EXPECT_TRUE(opacity_layer->children_can_accept_opacity());
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
- EXPECT_EQ(opacity_layer->raster_cache_item()->cache_state(),
+ EXPECT_EQ(cacheable_opacity_item->cache_state(),
RasterCacheItem::CacheState::kNone);
- EXPECT_FALSE(
- opacity_layer->raster_cache_item()->Draw(paint_context(), &paint));
+ EXPECT_FALSE(cacheable_opacity_item->Draw(paint_context(), &paint));
}
TEST_F(OpacityLayerTest, FullyOpaque) {
diff --git a/flow/layers/shader_mask_layer.cc b/flow/layers/shader_mask_layer.cc
index ccf6ee3..bf7b81f 100644
--- a/flow/layers/shader_mask_layer.cc
+++ b/flow/layers/shader_mask_layer.cc
@@ -37,7 +37,8 @@
void ShaderMaskLayer::Preroll(PrerollContext* context) {
Layer::AutoPrerollSaveLayerState save =
Layer::AutoPrerollSaveLayerState::Create(context);
- AutoCache cache(*this, context);
+ AutoCache cache = AutoCache(layer_raster_cache_item_.get(), context,
+ context->state_stack.transform_3x3());
ContainerLayer::Preroll(context);
// We always paint with a saveLayer (or a cached rendering),
diff --git a/flow/layers/shader_mask_layer_unittests.cc b/flow/layers/shader_mask_layer_unittests.cc
index f721263..4354f87 100644
--- a/flow/layers/shader_mask_layer_unittests.cc
+++ b/flow/layers/shader_mask_layer_unittests.cc
@@ -334,78 +334,39 @@
use_mock_raster_cache();
preroll_context()->state_stack.set_preroll_delegate(initial_transform);
+ const auto* cacheable_shader_masker_item = layer->raster_cache_item();
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
- EXPECT_EQ(layer->raster_cache_item(), nullptr);
+ EXPECT_EQ(cacheable_shader_masker_item->cache_state(),
+ RasterCacheItem::CacheState::kNone);
+ EXPECT_FALSE(cacheable_shader_masker_item->GetId().has_value());
// frame 1.
layer->Preroll(preroll_context());
- EXPECT_NE(layer->raster_cache_item(), nullptr);
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
- EXPECT_EQ(layer->raster_cache_item()->cache_state(),
+ EXPECT_EQ(cacheable_shader_masker_item->cache_state(),
RasterCacheItem::CacheState::kNone);
- EXPECT_FALSE(layer->raster_cache_item()->GetId().has_value());
+ EXPECT_FALSE(cacheable_shader_masker_item->GetId().has_value());
// frame 2.
layer->Preroll(preroll_context());
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)0);
- EXPECT_EQ(layer->raster_cache_item()->cache_state(),
+ EXPECT_EQ(cacheable_shader_masker_item->cache_state(),
RasterCacheItem::CacheState::kNone);
- EXPECT_FALSE(layer->raster_cache_item()->GetId().has_value());
+ EXPECT_FALSE(cacheable_shader_masker_item->GetId().has_value());
// frame 3.
layer->Preroll(preroll_context());
LayerTree::TryToRasterCache(cacheable_items(), &paint_context());
EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (size_t)1);
- EXPECT_EQ(layer->raster_cache_item()->cache_state(),
+ EXPECT_EQ(cacheable_shader_masker_item->cache_state(),
RasterCacheItem::CacheState::kCurrent);
- EXPECT_TRUE(raster_cache()->Draw(layer->raster_cache_item()->GetId().value(),
- cache_canvas, &paint));
-}
-
-TEST_F(ShaderMaskLayerTest, NullRasterCacheResetsRasterCacheItem) {
- auto dl_filter = MakeFilter(DlColor::kBlue());
- DlPaint paint;
- const SkRect layer_bounds = SkRect::MakeLTRB(2.0f, 4.0f, 20.5f, 20.5f);
- const SkPath child_path = SkPath().addRect(SkRect::MakeWH(5.0f, 5.0f));
- auto mock_layer = std::make_shared<MockLayer>(child_path);
- auto layer = std::make_shared<ShaderMaskLayer>(dl_filter, layer_bounds,
- DlBlendMode::kSrc);
- layer->Add(mock_layer);
-
- ASSERT_EQ(layer->raster_cache_item(), nullptr);
-
- layer->Preroll(preroll_context());
- ASSERT_EQ(layer->raster_cache_item(), nullptr);
-
- use_mock_raster_cache();
-
- int limit = RasterCacheUtil::kMinimumRendersBeforeCachingFilterLayer;
- for (int i = 1; i < limit; i++) {
- layer->Preroll(preroll_context());
- ASSERT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(),
- RasterCacheItem::kNone);
- ASSERT_FALSE(
- layer->raster_cache_item()->TryToPrepareRasterCache(paint_context()));
- }
-
- layer->Preroll(preroll_context());
- ASSERT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(),
- RasterCacheItem::kCurrent);
- ASSERT_TRUE(
- layer->raster_cache_item()->TryToPrepareRasterCache(paint_context()));
-
- use_null_raster_cache();
-
- layer->Preroll(preroll_context());
- ASSERT_NE(layer->raster_cache_item(), nullptr);
- ASSERT_EQ(layer->raster_cache_item()->cache_state(), RasterCacheItem::kNone);
+ EXPECT_TRUE(raster_cache()->Draw(
+ cacheable_shader_masker_item->GetId().value(), cache_canvas, &paint));
}
TEST_F(ShaderMaskLayerTest, OpacityInheritance) {
diff --git a/flow/raster_cache_item.h b/flow/raster_cache_item.h
index 78c7c9f..6df3066 100644
--- a/flow/raster_cache_item.h
+++ b/flow/raster_cache_item.h
@@ -57,8 +57,6 @@
void set_matrix(const SkMatrix& matrix) { matrix_ = matrix; }
- void reset_cache_state() { cache_state_ = kNone; }
-
CacheState cache_state() const { return cache_state_; }
bool need_caching() const { return cache_state_ != CacheState::kNone; }
diff --git a/flow/testing/mock_layer.cc b/flow/testing/mock_layer.cc
index 31e5f5d..4f0453c 100644
--- a/flow/testing/mock_layer.cc
+++ b/flow/testing/mock_layer.cc
@@ -66,29 +66,17 @@
void MockCacheableContainerLayer::Preroll(PrerollContext* context) {
Layer::AutoPrerollSaveLayerState save =
Layer::AutoPrerollSaveLayerState::Create(context);
- AutoCache cache(*this, context);
+ auto cache = AutoCache(layer_raster_cache_item_.get(), context,
+ context->state_stack.transform_3x3());
ContainerLayer::Preroll(context);
}
-RasterCacheItem* MockCacheableLayer::realize_raster_cache_item() {
- if (!raster_cache_item_) {
- raster_cache_item_ =
- std::make_unique<MockLayerCacheableItem>(this, render_limit_);
- }
- return raster_cache_item_.get();
-}
-
-void MockCacheableLayer::disable_raster_cache_item() {
- if (raster_cache_item_) {
- raster_cache_item_->reset_cache_state();
- }
-}
-
void MockCacheableLayer::Preroll(PrerollContext* context) {
Layer::AutoPrerollSaveLayerState save =
Layer::AutoPrerollSaveLayerState::Create(context);
- AutoCache cache(*this, context);
+ auto cache = AutoCache(raster_cache_item_.get(), context,
+ context->state_stack.transform_3x3());
MockLayer::Preroll(context);
}
diff --git a/flow/testing/mock_layer.h b/flow/testing/mock_layer.h
index 0ceb4f4..4d2efdf 100644
--- a/flow/testing/mock_layer.h
+++ b/flow/testing/mock_layer.h
@@ -150,12 +150,15 @@
public:
using LayerRasterCacheItem::LayerRasterCacheItem;
};
-class MockCacheableLayer : public MockLayer, public CacheableLayer {
+class MockCacheableLayer : public MockLayer {
public:
explicit MockCacheableLayer(SkPath path,
DlPaint paint = DlPaint(),
int render_limit = 3)
- : MockLayer(path, paint), render_limit_(render_limit) {}
+ : MockLayer(path, paint) {
+ raster_cache_item_ =
+ std::make_unique<MockLayerCacheableItem>(this, render_limit);
+ }
const LayerRasterCacheItem* raster_cache_item() const {
return raster_cache_item_.get();
@@ -164,11 +167,7 @@
void Preroll(PrerollContext* context) override;
private:
- RasterCacheItem* realize_raster_cache_item() override;
- void disable_raster_cache_item() override;
std::unique_ptr<LayerRasterCacheItem> raster_cache_item_;
-
- int render_limit_;
};
} // namespace testing
diff --git a/flow/testing/mock_raster_cache.cc b/flow/testing/mock_raster_cache.cc
index 3aba6b1..9effd6a 100644
--- a/flow/testing/mock_raster_cache.cc
+++ b/flow/testing/mock_raster_cache.cc
@@ -62,8 +62,7 @@
DisplayListRasterCacheItem display_list_item(display_list, SkPoint(), true,
false);
for (size_t i = 0; i < access_threshold(); i++) {
- display_list_item.PrerollSetup(&preroll_context_, ctm);
- display_list_item.PrerollFinalize(&preroll_context_, ctm);
+ AutoCache(&display_list_item, &preroll_context_, ctm);
}
RasterCache::Context r_context = {
// clang-format off