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

Commit af17d91

Browse files
committed
Evicting unused cache entries before RasterCache actions
1 parent b287384 commit af17d91

File tree

6 files changed

+32
-15
lines changed

6 files changed

+32
-15
lines changed

flow/frame_timings_recorder_unittests.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ TEST(FrameTimingsRecorderTest, RecordRasterTimesWithCache) {
102102
cache.AddMockPicture(100, 100);
103103
size_t picture_bytes = cache.EstimatePictureCacheByteSize();
104104
EXPECT_GT(picture_bytes, 0u);
105+
cache.ClearUnusedEntry();
105106

106107
cache.CleanupAfterFrame();
107108

@@ -266,7 +267,7 @@ TEST(FrameTimingsRecorderTest, ClonedHasSameRasterEndWithCache) {
266267
cache.AddMockPicture(100, 100);
267268
size_t picture_bytes = cache.EstimatePictureCacheByteSize();
268269
EXPECT_GT(picture_bytes, 0u);
269-
270+
cache.ClearUnusedEntry();
270271
cache.CleanupAfterFrame();
271272
recorder->RecordRasterEnd(&cache);
272273

flow/layers/container_layer_unittests.cc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@ TEST_F(ContainerLayerTest, RasterCacheTest) {
270270
use_mock_raster_cache();
271271
preroll_context()->raster_cache->PrepareNewFrame();
272272
layer->Preroll(preroll_context(), SkMatrix::I());
273+
preroll_context()->raster_cache->ClearUnusedEntry();
273274
// Cache the cacheable entries
274275
LayerTree::TryToRasterCache(*(preroll_context()->raster_cached_entries),
275276
&paint_context());
@@ -309,6 +310,7 @@ TEST_F(ContainerLayerTest, RasterCacheTest) {
309310
preroll_context()->raster_cached_entries->clear();
310311
preroll_context()->raster_cache->PrepareNewFrame();
311312
layer->Preroll(preroll_context(), SkMatrix::I());
313+
preroll_context()->raster_cache->ClearUnusedEntry();
312314

313315
// Cache the cacheable entries
314316
LayerTree::TryToRasterCache(*(preroll_context()->raster_cached_entries),
@@ -352,7 +354,7 @@ TEST_F(ContainerLayerTest, RasterCacheTest) {
352354
preroll_context()->raster_cache->PrepareNewFrame();
353355
preroll_context()->raster_cached_entries->clear();
354356
layer->Preroll(preroll_context(), SkMatrix::I());
355-
357+
preroll_context()->raster_cache->ClearUnusedEntry();
356358
// Cache the cacheable entries
357359
LayerTree::TryToRasterCache(*(preroll_context()->raster_cached_entries),
358360
&paint_context());
@@ -393,6 +395,7 @@ TEST_F(ContainerLayerTest, RasterCacheTest) {
393395
// frame4
394396
preroll_context()->raster_cached_entries->clear();
395397
layer->Preroll(preroll_context(), SkMatrix::I());
398+
preroll_context()->raster_cache->ClearUnusedEntry();
396399
LayerTree::TryToRasterCache(*(preroll_context()->raster_cached_entries),
397400
&paint_context());
398401
preroll_context()->raster_cache->CleanupAfterFrame();

flow/layers/layer_tree.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ void LayerTree::Paint(CompositorContext::ScopedFrame& frame,
150150
};
151151

152152
if (cache) {
153+
cache->ClearUnusedEntry();
153154
TryToRasterCache(raster_cache_items_, &context, ignore_raster_cache);
154155
}
155156

flow/raster_cache.cc

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -166,14 +166,10 @@ void RasterCache::PrepareNewFrame() {
166166
void RasterCache::SweepOneCacheAfterFrame(RasterCacheKey::Map<Entry>& cache,
167167
RasterCacheMetrics& picture_metrics,
168168
RasterCacheMetrics& layer_metrics) {
169-
std::vector<RasterCacheKey::Map<Entry>::iterator> dead;
170-
171169
for (auto it = cache.begin(); it != cache.end(); ++it) {
172170
Entry& entry = it->second;
173-
174-
if (!entry.encountered_this_frame) {
175-
dead.push_back(it);
176-
} else if (entry.image) {
171+
FML_CHECK(entry.encountered_this_frame);
172+
if (entry.image) {
177173
RasterCacheKeyKind kind = it->first.kind();
178174
switch (kind) {
179175
case RasterCacheKeyKind::kDisplayListMetrics:
@@ -188,28 +184,40 @@ void RasterCache::SweepOneCacheAfterFrame(RasterCacheKey::Map<Entry>& cache,
188184
}
189185
entry.encountered_this_frame = false;
190186
}
187+
}
188+
189+
void RasterCache::ClearUnusedEntry() {
190+
picture_metrics_ = {};
191+
layer_metrics_ = {};
192+
193+
std::vector<RasterCacheKey::Map<Entry>::iterator> dead;
194+
195+
for (auto it = cache_.begin(); it != cache_.end(); ++it) {
196+
Entry& entry = it->second;
197+
if (!entry.encountered_this_frame) {
198+
dead.push_back(it);
199+
}
200+
}
191201

192202
for (auto it : dead) {
193203
if (it->second.image) {
194204
RasterCacheKeyKind kind = it->first.kind();
195205
switch (kind) {
196206
case RasterCacheKeyKind::kDisplayListMetrics:
197-
picture_metrics.eviction_count++;
198-
picture_metrics.eviction_bytes += it->second.image->image_bytes();
207+
picture_metrics_.eviction_count++;
208+
picture_metrics_.eviction_bytes += it->second.image->image_bytes();
199209
break;
200210
case RasterCacheKeyKind::kLayerMetrics:
201-
layer_metrics.eviction_count++;
202-
layer_metrics.eviction_bytes += it->second.image->image_bytes();
211+
layer_metrics_.eviction_count++;
212+
layer_metrics_.eviction_bytes += it->second.image->image_bytes();
203213
break;
204214
}
205215
}
206-
cache.erase(it);
216+
cache_.erase(it);
207217
}
208218
}
209219

210220
void RasterCache::CleanupAfterFrame() {
211-
picture_metrics_ = {};
212-
layer_metrics_ = {};
213221
SweepOneCacheAfterFrame(cache_, picture_metrics_, layer_metrics_);
214222
TraceStatsToTimeline();
215223
}

flow/raster_cache.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ class RasterCache {
127127

128128
void PrepareNewFrame();
129129

130+
void ClearUnusedEntry();
131+
130132
void CleanupAfterFrame();
131133

132134
void Clear();

flow/raster_cache_unittests.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@ TEST(RasterCache, SweepsRemoveUnusedSkPictures) {
275275
cache.CleanupAfterFrame();
276276

277277
cache.PrepareNewFrame();
278+
cache.ClearUnusedEntry();
278279
cache.CleanupAfterFrame(); // Extra frame without a Get image access.
279280

280281
cache.PrepareNewFrame();
@@ -319,6 +320,7 @@ TEST(RasterCache, SweepsRemoveUnusedDisplayLists) {
319320
cache.CleanupAfterFrame();
320321

321322
cache.PrepareNewFrame();
323+
cache.ClearUnusedEntry();
322324
cache.CleanupAfterFrame(); // Extra frame without a Get image access.
323325

324326
cache.PrepareNewFrame();

0 commit comments

Comments
 (0)