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

Commit b8bb76f

Browse files
committed
Collection Raster Cacheable OpacityLayer in Preroll
1 parent 554d0b8 commit b8bb76f

File tree

5 files changed

+33
-11
lines changed

5 files changed

+33
-11
lines changed

flow/layers/color_filter_layer.cc

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,7 @@ void ColorFilterLayer::Preroll(PrerollContext* context,
4141
context->raster_cached_entries.size() - current_index;
4242
auto cache_type = NeedCaching(context, matrix);
4343
if (cache_type == CacheableLayer::CacheType::kChildren) {
44-
cacheable_entry->GetCacheableWrapper()
45-
->GetCacheableLayer()
46-
->NeedCacheChildren();
44+
cacheable_entry->MarkLayerChildrenNeedCached();
4745
}
4846
}
4947

flow/layers/image_filter_layer.cc

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,7 @@ void ImageFilterLayer::Preroll(PrerollContext* context,
6060
cacheable_entry->need_caching = false;
6161
} else if (cache_type == CacheableLayer::CacheType::kChildren) {
6262
// Replace Cacheable child
63-
cacheable_entry->GetCacheableWrapper()
64-
->GetCacheableLayer()
65-
->NeedCacheChildren();
63+
cacheable_entry->MarkLayerChildrenNeedCached();
6664
}
6765

6866
if (!filter_) {

flow/layers/opacity_layer.cc

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

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

7+
#include "flutter/flow/layers/cacheable_layer.h"
8+
#include "flutter/flow/raster_cacheable_entry.h"
79
#include "flutter/fml/trace_event.h"
810
#include "third_party/skia/include/core/SkPaint.h"
911

@@ -39,6 +41,11 @@ void OpacityLayer::Preroll(PrerollContext* context, const SkMatrix& matrix) {
3941
TRACE_EVENT0("flutter", "OpacityLayer::Preroll");
4042
FML_DCHECK(!layers().empty()); // We can't be a leaf.
4143

44+
auto cacheable_entry =
45+
RasterCacheableEntry::MarkLayerCacheable(this, *context, matrix);
46+
context->raster_cached_entries.emplace_back(cacheable_entry);
47+
auto current_index = context->raster_cached_entries.size();
48+
4249
SkMatrix child_matrix = matrix;
4350
child_matrix.preTranslate(offset_.fX, offset_.fY);
4451

@@ -54,23 +61,36 @@ void OpacityLayer::Preroll(PrerollContext* context, const SkMatrix& matrix) {
5461
ContainerLayer::Preroll(context, child_matrix);
5562
context->mutators_stack.Pop();
5663
context->mutators_stack.Pop();
57-
5864
set_children_can_accept_opacity(context->subtree_can_inherit_opacity);
5965

6066
set_paint_bounds(paint_bounds().makeOffset(offset_.fX, offset_.fY));
6167

62-
if (!children_can_accept_opacity()) {
68+
cacheable_entry->num_child_entries =
69+
context->raster_cached_entries.size() - current_index;
70+
71+
auto cache_type = NeedCaching(context, matrix);
72+
if (cache_type == CacheableLayer::CacheType::kChildren) {
6373
#ifndef SUPPORT_FRACTIONAL_TRANSLATION
6474
child_matrix = RasterCache::GetIntegralTransCTM(child_matrix);
6575
#endif
66-
TryToPrepareRasterCache(context, child_matrix,
67-
RasterCacheLayerStrategy::kLayerChildren);
76+
cacheable_entry->matrix = child_matrix;
77+
cacheable_entry->MarkLayerChildrenNeedCached();
78+
} else if (cache_type == CacheableLayer::CacheType::kNone) {
79+
cacheable_entry->need_caching = false;
6880
}
6981

7082
// Restore cull_rect
7183
context->cull_rect = context->cull_rect.makeOffset(offset_.fX, offset_.fY);
7284
}
7385

86+
CacheableLayer::CacheType OpacityLayer::NeedCaching(PrerollContext* context,
87+
const SkMatrix& ctm) {
88+
if (!children_can_accept_opacity()) {
89+
return CacheableLayer::CacheType::kChildren;
90+
}
91+
return CacheableLayer::CacheType::kNone;
92+
}
93+
7494
void OpacityLayer::Paint(PaintContext& context) const {
7595
TRACE_EVENT0("flutter", "OpacityLayer::Paint");
7696
FML_DCHECK(needs_painting(context));

flow/layers/opacity_layer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ class OpacityLayer : public ContainerLayer {
3333

3434
void Paint(PaintContext& context) const override;
3535

36+
CacheableLayer::CacheType NeedCaching(PrerollContext* context,
37+
const SkMatrix& ctm) override;
38+
3639
// Returns whether the children are capable of inheriting an opacity value
3740
// and modifying their rendering accordingly. This value is only guaranteed
3841
// to be valid after the local |Preroll| method is called.

flow/raster_cacheable_entry.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
#define FLUTTER_FLOW_RASTER_CACHEABLE_ENTRY_H_
77

88
#include <memory>
9-
#include <unordered_map>
109

1110
#include "flutter/flow/embedded_views.h"
1211
#include "include/core/SkPicture.h"
@@ -158,6 +157,10 @@ class RasterCacheableEntry {
158157

159158
CacheableItemWrapperBase* GetCacheableWrapper() const { return item_.get(); }
160159

160+
void MarkLayerChildrenNeedCached() {
161+
item_->GetCacheableLayer()->NeedCacheChildren();
162+
}
163+
161164
void TryToPrepareRasterCache(PrerollContext* context);
162165

163166
SkMatrix matrix;

0 commit comments

Comments
 (0)