[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