5#ifndef FLUTTER_FLOW_RASTER_CACHE_H_
6#define FLUTTER_FLOW_RASTER_CACHE_H_
11#include <unordered_map>
20#include "third_party/skia/include/core/SkMatrix.h"
21#include "third_party/skia/include/core/SkRect.h"
33 const SkRect& logical_rect,
35 sk_sp<const DlRTree> rtree =
nullptr);
41 bool preserve_rtree)
const;
44 return image_ ?
ToSkISize(image_->GetSize()) : SkISize::Make(0, 0);
48 return image_ ? image_->GetApproximateByteSize() : 0;
52 sk_sp<DlImage> image_;
55 sk_sp<const DlRTree> rtree_;
133 std::unique_ptr<RasterCacheResult>
Rasterize(
135 sk_sp<const DlRTree> rtree,
136 const std::function<
void(
DlCanvas*)>& draw_function,
138 draw_checkerboard)
const;
142 size_t picture_and_display_list_cache_limit_per_frame =
160 bool preserve_rtree =
false)
const;
221 return access_threshold_ != 0 && display_list_cached_this_frame_ <
222 display_list_cache_limit_per_frame_;
236 const SkMatrix& matrix,
246 const Context& raster_cache_context,
247 const std::function<
void(
DlCanvas*)>& render_function,
248 sk_sp<const DlRTree> rtree =
nullptr)
const;
252 bool encountered_this_frame =
false;
253 bool visible_this_frame =
false;
254 size_t accesses_since_visible = 0;
255 std::unique_ptr<RasterCacheResult>
image;
258 void UpdateMetrics();
262 const size_t access_threshold_;
263 const size_t display_list_cache_limit_per_frame_;
264 mutable size_t display_list_cached_this_frame_ = 0;
265 RasterCacheMetrics layer_metrics_;
266 RasterCacheMetrics picture_metrics_;
267 mutable RasterCacheKey::Map<Entry> cache_;
268 bool checkerboard_images_ =
false;
270 void TraceStatsToTimeline()
const;
Developer-facing API for rendering anything within the engine.
virtual ~RasterCache()=default
bool Draw(const RasterCacheKeyID &id, DlCanvas &canvas, const DlPaint *paint, bool preserve_rtree=false) const
CacheInfo MarkSeen(const RasterCacheKeyID &id, const SkMatrix &matrix, bool visible) const
The entry whose RasterCacheKey is generated by RasterCacheKeyID and matrix is marked as encountered b...
size_t access_threshold() const
Return the number of frames that a picture must be prepared before it will be cached....
const RasterCacheMetrics & picture_metrics() const
size_t EstimatePictureCacheByteSize() const
Estimate how much memory is used by picture raster cache entries in bytes.
const RasterCacheMetrics & layer_metrics() const
bool HasEntry(const RasterCacheKeyID &id, const SkMatrix &) const
bool UpdateCacheEntry(const RasterCacheKeyID &id, const Context &raster_cache_context, const std::function< void(DlCanvas *)> &render_function, sk_sp< const DlRTree > rtree=nullptr) const
bool GenerateNewCacheInThisFrame() const
int GetAccessCount(const RasterCacheKeyID &id, const SkMatrix &matrix) const
size_t GetCachedEntriesCount() const
size_t GetPictureCachedEntriesCount() const
size_t EstimateLayerCacheByteSize() const
Estimate how much memory is used by layer raster cache entries in bytes.
size_t GetLayerCachedEntriesCount() const
void EvictUnusedCacheEntries()
std::unique_ptr< RasterCacheResult > Rasterize(const RasterCache::Context &context, sk_sp< const DlRTree > rtree, const std::function< void(DlCanvas *)> &draw_function, const std::function< void(DlCanvas *, const DlRect &rect)> &draw_checkerboard) const
virtual SkISize image_dimensions() const
virtual void draw(DlCanvas &canvas, const DlPaint *paint, bool preserve_rtree) const
virtual int64_t image_bytes() const
virtual ~RasterCacheResult()=default
To do anything rendering related with Impeller, you need a context.
FlutterVulkanImage * image
#define FML_DISALLOW_COPY_AND_ASSIGN(TypeName)
const SkISize & ToSkISize(const DlISize &size)
const size_t accesses_since_visible
const SkRect & logical_rect
GrDirectContext * gr_context
const sk_sp< SkColorSpace > dst_color_space
size_t total_count() const
size_t total_bytes() const
static constexpr int kDefaultPictureAndDisplayListCacheLimitPerFrame