15 bool has_raster_cache,
16 bool impeller_enabled) {
21 : empty_paint_region_map,
22 has_raster_cache, impeller_enabled);
26 const Layer* prev_root_layer =
nullptr;
27 if (!prev_layer_tree_ ||
33 prev_root_layer = prev_layer_tree_->
root_layer();
39 context.ComputeDamage(additional_damage_, horizontal_clip_alignment_,
40 vertical_clip_alignment_);
48 raster_time_(fixed_refresh_rate_updater_),
49 ui_time_(fixed_refresh_rate_updater_) {}
53 raster_time_(updater),
58void CompositorContext::BeginFrame(ScopedFrame& frame,
59 bool enable_instrumentation) {
60 if (enable_instrumentation) {
65void CompositorContext::EndFrame(ScopedFrame& frame,
66 bool enable_instrumentation) {
67 if (enable_instrumentation) {
73 GrDirectContext* gr_context,
76 const DlMatrix& root_surface_transformation,
77 bool instrumentation_enabled,
78 bool surface_supports_readback,
82 return std::make_unique<ScopedFrame>(
83 *
this, gr_context, canvas, view_embedder, root_surface_transformation,
84 instrumentation_enabled, surface_supports_readback, raster_thread_merger,
90 GrDirectContext* gr_context,
93 const DlMatrix& root_surface_transformation,
94 bool instrumentation_enabled,
95 bool surface_supports_readback,
99 gr_context_(gr_context),
101 aiks_context_(aiks_context),
102 view_embedder_(view_embedder),
103 root_surface_transformation_(root_surface_transformation),
104 instrumentation_enabled_(instrumentation_enabled),
105 surface_supports_readback_(surface_supports_readback),
106 raster_thread_merger_(
std::move(raster_thread_merger)) {
107 context_.BeginFrame(*
this, instrumentation_enabled_);
111 context_.EndFrame(*
this, instrumentation_enabled_);
116 bool ignore_raster_cache,
118 TRACE_EVENT0(
"flutter",
"CompositorContext::ScopedFrame::Raster");
120 std::optional<DlRect> clip_rect;
122 clip_rect = frame_damage->
ComputeClipRect(layer_tree, !ignore_raster_cache,
126 !ShouldPerformPartialRepaint(clip_rect, layer_tree.
frame_size())) {
127 clip_rect = std::nullopt;
128 frame_damage->
Reset();
132 bool root_needs_readback = layer_tree.
Preroll(
133 *
this, ignore_raster_cache, clip_rect ? *clip_rect :
kGiantRect);
134 bool needs_save_layer = root_needs_readback && !surface_supports_readback();
136 if (view_embedder_ && raster_thread_merger_) {
137 post_preroll_result =
138 view_embedder_->PostPrerollAction(raster_thread_merger_);
149 PaintLayerTreeImpeller(layer_tree, clip_rect, ignore_raster_cache);
151 PaintLayerTreeSkia(layer_tree, clip_rect, needs_save_layer,
152 ignore_raster_cache);
157void CompositorContext::ScopedFrame::PaintLayerTreeSkia(
159 std::optional<DlRect> clip_rect,
160 bool needs_save_layer,
161 bool ignore_raster_cache) {
166 canvas()->ClipRect(*clip_rect);
169 if (needs_save_layer) {
174 canvas()->SaveLayer(bounds, &paint);
180 layer_tree.
Paint(*
this, ignore_raster_cache);
183void CompositorContext::ScopedFrame::PaintLayerTreeImpeller(
185 std::optional<DlRect> clip_rect,
186 bool ignore_raster_cache) {
187 DlAutoCanvasRestore restore(canvas(), clip_rect.has_value());
191 canvas()->ClipRect(clip_rect.value());
196 layer_tree.
Paint(*
this, ignore_raster_cache);
212bool CompositorContext::ShouldPerformPartialRepaint(
213 std::optional<DlRect> damage_rect,
215 if (!damage_rect.has_value()) {
218 if (damage_rect->GetWidth() >= layer_tree_size.
width &&
219 damage_rect->GetHeight() >= layer_tree_size.
height) {
222 auto rx = damage_rect->GetWidth() / layer_tree_size.
width;
223 auto ry = damage_rect->GetHeight() / layer_tree_size.
height;
228 texture_registry_->OnGrContextCreated();
230 raster_cache_.Clear();
235 texture_registry_->OnGrContextDestroyed();
237 raster_cache_.Clear();
virtual RasterStatus Raster(LayerTree &layer_tree, bool ignore_raster_cache, FrameDamage *frame_damage)
ScopedFrame(CompositorContext &context, GrDirectContext *gr_context, DlCanvas *canvas, ExternalViewEmbedder *view_embedder, const DlMatrix &root_surface_transformation, bool instrumentation_enabled, bool surface_supports_readback, fml::RefPtr< fml::RasterThreadMerger > raster_thread_merger, impeller::AiksContext *aiks_context)
void OnGrContextCreated()
virtual std::unique_ptr< ScopedFrame > AcquireFrame(GrDirectContext *gr_context, DlCanvas *canvas, ExternalViewEmbedder *view_embedder, const DlMatrix &root_surface_transformation, bool instrumentation_enabled, bool surface_supports_readback, fml::RefPtr< fml::RasterThreadMerger > raster_thread_merger, impeller::AiksContext *aiks_context)
void OnGrContextDestroyed()
virtual ~CompositorContext()
bool PushCullRect(const DlRect &clip)
Developer-facing API for rendering anything within the engine.
DlPaint & setBlendMode(DlBlendMode mode)
std::optional< DlRect > ComputeClipRect(flutter::LayerTree &layer_tree, bool has_raster_cache, bool impeller_enabled)
virtual void Diff(DiffContext *context, const Layer *old_layer)
Layer * root_layer() const
void Paint(CompositorContext::ScopedFrame &frame, bool ignore_raster_cache=false) const
const PaintRegionMap & paint_region_map() const
const DlISize & frame_size() const
bool Preroll(CompositorContext::ScopedFrame &frame, bool ignore_raster_cache=false, DlRect cull_rect=kGiantRect)
The refresh rate interface for Stopwatch.
std::map< uint64_t, PaintRegion > PaintRegionMap
constexpr float kImpellerRepaintRatio
The max ratio of pixel width or height to size that is dirty which results in a partial repaint.
static constexpr DlRect kGiantRect
static constexpr DlColor kTransparent()
A 4x4 matrix using column-major storage.
static constexpr std::enable_if_t< std::is_floating_point_v< FT >, TRect > Make(const TRect< U > &rect)
static constexpr TRect MakeSize(const TSize< U > &size)
#define TRACE_EVENT0(category_group, name)