Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Private Member Functions | List of all members
flutter::EmbedderExternalViewEmbedder Class Referencefinal

The external view embedder used by the generic embedder API. This class acts a proxy between the rasterizer and the embedder when the rasterizer is rendering into multiple layers. It asks the embedder for the render targets for the various layers the rasterizer is rendering into, recycles the render targets as necessary and converts rasterizer specific metadata into an embedder friendly format so that it can present the layers on-screen. More...

#include <embedder_external_view_embedder.h>

Inheritance diagram for flutter::EmbedderExternalViewEmbedder:
flutter::ExternalViewEmbedder

Public Types

using CreateRenderTargetCallback = std::function< std::unique_ptr< EmbedderRenderTarget >(GrDirectContext *context, const std::shared_ptr< impeller::AiksContext > &aiks_context, const FlutterBackingStoreConfig &config)>
 
using PresentCallback = std::function< bool(FlutterViewId view_id, const std::vector< const FlutterLayer * > &layers)>
 
using SurfaceTransformationCallback = std::function< SkMatrix(void)>
 

Public Member Functions

 EmbedderExternalViewEmbedder (bool avoid_backing_store_cache, const CreateRenderTargetCallback &create_render_target_callback, const PresentCallback &present_callback)
 Creates an external view embedder used by the generic embedder API.
 
 ~EmbedderExternalViewEmbedder () override
 Collects the external view embedder.
 
void CollectView (int64_t view_id) override
 
void SetSurfaceTransformationCallback (SurfaceTransformationCallback surface_transformation_callback)
 Sets the surface transformation callback used by the external view embedder to ask the platform for the per frame root surface transformation.
 
- Public Member Functions inherited from flutter::ExternalViewEmbedder
 ExternalViewEmbedder ()=default
 
virtual ~ExternalViewEmbedder ()=default
 
virtual PostPrerollResult PostPrerollAction (const fml::RefPtr< fml::RasterThreadMerger > &raster_thread_merger)
 
virtual void EndFrame (bool should_resubmit_frame, const fml::RefPtr< fml::RasterThreadMerger > &raster_thread_merger)
 
virtual bool SupportsDynamicThreadMerging ()
 
virtual void Teardown ()
 
void SetUsedThisFrame (bool used_this_frame)
 
bool GetUsedThisFrame () const
 
virtual void PushVisitedPlatformView (int64_t platform_view_id)
 
virtual void PushFilterToVisitedPlatformViews (const std::shared_ptr< const DlImageFilter > &filter, const SkRect &filter_rect)
 

Private Member Functions

void CancelFrame () override
 
void BeginFrame (GrDirectContext *context, const fml::RefPtr< fml::RasterThreadMerger > &raster_thread_merger) override
 
void PrepareFlutterView (SkISize frame_size, double device_pixel_ratio) override
 
void PrerollCompositeEmbeddedView (int64_t view_id, std::unique_ptr< EmbeddedViewParams > params) override
 
DlCanvasCompositeEmbeddedView (int64_t view_id) override
 
void SubmitFlutterView (int64_t flutter_view_id, GrDirectContext *context, const std::shared_ptr< impeller::AiksContext > &aiks_context, std::unique_ptr< SurfaceFrame > frame) override
 
DlCanvasGetRootCanvas () override
 

Detailed Description

The external view embedder used by the generic embedder API. This class acts a proxy between the rasterizer and the embedder when the rasterizer is rendering into multiple layers. It asks the embedder for the render targets for the various layers the rasterizer is rendering into, recycles the render targets as necessary and converts rasterizer specific metadata into an embedder friendly format so that it can present the layers on-screen.

Definition at line 30 of file embedder_external_view_embedder.h.

Member Typedef Documentation

◆ CreateRenderTargetCallback

using flutter::EmbedderExternalViewEmbedder::CreateRenderTargetCallback = std::function<std::unique_ptr<EmbedderRenderTarget>( GrDirectContext* context, const std::shared_ptr<impeller::AiksContext>& aiks_context, const FlutterBackingStoreConfig& config)>

Definition at line 32 of file embedder_external_view_embedder.h.

◆ PresentCallback

using flutter::EmbedderExternalViewEmbedder::PresentCallback = std::function<bool(FlutterViewId view_id, const std::vector<const FlutterLayer*>& layers)>

Definition at line 37 of file embedder_external_view_embedder.h.

◆ SurfaceTransformationCallback

Definition at line 40 of file embedder_external_view_embedder.h.

Constructor & Destructor Documentation

◆ EmbedderExternalViewEmbedder()

flutter::EmbedderExternalViewEmbedder::EmbedderExternalViewEmbedder ( bool  avoid_backing_store_cache,
const CreateRenderTargetCallback create_render_target_callback,
const PresentCallback present_callback 
)

Creates an external view embedder used by the generic embedder API.

Parameters
[in]avoid_backing_store_cacheIf set, create_render_target_callback will beinvoked every frame for every engine composited layer. The result will not cached.
[in]create_render_target_callbackThe render target callback used to request the render target for a layer.
[in]present_callbackThe callback used to forward a collection of layers (backed by fulfilled render targets) to the embedder for presentation.

Definition at line 19 of file embedder_external_view_embedder.cc.

23 : avoid_backing_store_cache_(avoid_backing_store_cache),
24 create_render_target_callback_(create_render_target_callback),
25 present_callback_(present_callback) {
26 FML_DCHECK(create_render_target_callback_);
27 FML_DCHECK(present_callback_);
28}
#define FML_DCHECK(condition)
Definition logging.h:103

◆ ~EmbedderExternalViewEmbedder()

flutter::EmbedderExternalViewEmbedder::~EmbedderExternalViewEmbedder ( )
overridedefault

Collects the external view embedder.

Member Function Documentation

◆ BeginFrame()

void flutter::EmbedderExternalViewEmbedder::BeginFrame ( GrDirectContext context,
const fml::RefPtr< fml::RasterThreadMerger > &  raster_thread_merger 
)
overrideprivatevirtual

Implements flutter::ExternalViewEmbedder.

Definition at line 60 of file embedder_external_view_embedder.cc.

62 {}

◆ CancelFrame()

void flutter::EmbedderExternalViewEmbedder::CancelFrame ( )
overrideprivatevirtual

Implements flutter::ExternalViewEmbedder.

Definition at line 55 of file embedder_external_view_embedder.cc.

55 {
56 Reset();
57}

◆ CollectView()

void flutter::EmbedderExternalViewEmbedder::CollectView ( int64_t  view_id)
overridevirtual

Reimplemented from flutter::ExternalViewEmbedder.

Definition at line 32 of file embedder_external_view_embedder.cc.

32 {
33 render_target_caches_.erase(view_id);
34}

◆ CompositeEmbeddedView()

DlCanvas * flutter::EmbedderExternalViewEmbedder::CompositeEmbeddedView ( int64_t  view_id)
overrideprivatevirtual

Implements flutter::ExternalViewEmbedder.

Definition at line 109 of file embedder_external_view_embedder.cc.

109 {
110 auto vid = EmbedderExternalView::ViewIdentifier(view_id);
111 auto found = pending_views_.find(vid);
112 if (found == pending_views_.end()) {
113 FML_DCHECK(false) << "Attempted to composite a view that was not "
114 "pre-rolled.";
115 return nullptr;
116 }
117 return found->second->GetCanvas();
118}

◆ GetRootCanvas()

DlCanvas * flutter::EmbedderExternalViewEmbedder::GetRootCanvas ( )
overrideprivatevirtual

Implements flutter::ExternalViewEmbedder.

Definition at line 96 of file embedder_external_view_embedder.cc.

96 {
97 auto found = pending_views_.find(kRootViewIdentifier);
98 if (found == pending_views_.end()) {
99 FML_DLOG(WARNING)
100 << "No root canvas could be found. This is extremely unlikely and "
101 "indicates that the external view embedder did not receive the "
102 "notification to begin the frame.";
103 return nullptr;
104 }
105 return found->second->GetCanvas();
106}
#define FML_DLOG(severity)
Definition logging.h:102
static const auto kRootViewIdentifier

◆ PrepareFlutterView()

void flutter::EmbedderExternalViewEmbedder::PrepareFlutterView ( SkISize  frame_size,
double  device_pixel_ratio 
)
overrideprivatevirtual

Implements flutter::ExternalViewEmbedder.

Definition at line 65 of file embedder_external_view_embedder.cc.

67 {
68 Reset();
69
70 pending_frame_size_ = frame_size;
71 pending_device_pixel_ratio_ = device_pixel_ratio;
72 pending_surface_transformation_ = GetSurfaceTransformation();
73
74 pending_views_[kRootViewIdentifier] = std::make_unique<EmbedderExternalView>(
75 pending_frame_size_, pending_surface_transformation_);
76 composition_order_.push_back(kRootViewIdentifier);
77}

◆ PrerollCompositeEmbeddedView()

void flutter::EmbedderExternalViewEmbedder::PrerollCompositeEmbeddedView ( int64_t  view_id,
std::unique_ptr< EmbeddedViewParams params 
)
overrideprivatevirtual

Implements flutter::ExternalViewEmbedder.

Definition at line 80 of file embedder_external_view_embedder.cc.

82 {
83 auto vid = EmbedderExternalView::ViewIdentifier(view_id);
84 FML_DCHECK(pending_views_.count(vid) == 0);
85
86 pending_views_[vid] = std::make_unique<EmbedderExternalView>(
87 pending_frame_size_, // frame size
88 pending_surface_transformation_, // surface xformation
89 vid, // view identifier
90 std::move(params) // embedded view params
91 );
92 composition_order_.push_back(vid);
93}
const EmbeddedViewParams * params

◆ SetSurfaceTransformationCallback()

void flutter::EmbedderExternalViewEmbedder::SetSurfaceTransformationCallback ( SurfaceTransformationCallback  surface_transformation_callback)

Sets the surface transformation callback used by the external view embedder to ask the platform for the per frame root surface transformation.

Parameters
[in]surface_transformation_callbackThe surface transformation callback

Definition at line 36 of file embedder_external_view_embedder.cc.

37 {
38 surface_transformation_callback_ = std::move(surface_transformation_callback);
39}

◆ SubmitFlutterView()

void flutter::EmbedderExternalViewEmbedder::SubmitFlutterView ( int64_t  flutter_view_id,
GrDirectContext context,
const std::shared_ptr< impeller::AiksContext > &  aiks_context,
std::unique_ptr< SurfaceFrame frame 
)
overrideprivatevirtual

Reimplemented from flutter::ExternalViewEmbedder.

Definition at line 421 of file embedder_external_view_embedder.cc.

425 {
426 // The unordered_map render_target_cache creates a new entry if the view ID is
427 // unrecognized.
428 EmbedderRenderTargetCache& render_target_cache =
429 render_target_caches_[flutter_view_id];
430 SkRect _rect = SkRect::MakeIWH(pending_frame_size_.width(),
431 pending_frame_size_.height());
432 pending_surface_transformation_.mapRect(&_rect);
433
434 LayerBuilder builder(SkISize::Make(_rect.width(), _rect.height()));
435
436 for (auto view_id : composition_order_) {
437 auto& view = pending_views_[view_id];
438 builder.AddExternalView(view.get());
439 }
440
441 builder.PrepareBackingStore([&](const SkISize& frame_size) {
442 if (!avoid_backing_store_cache_) {
443 std::unique_ptr<EmbedderRenderTarget> target =
444 render_target_cache.GetRenderTarget(
445 EmbedderExternalView::RenderTargetDescriptor(frame_size));
446 if (target != nullptr) {
447 return target;
448 }
449 }
450 auto config = MakeBackingStoreConfig(flutter_view_id, frame_size);
451 return create_render_target_callback_(context, aiks_context, config);
452 });
453
454 // This is where unused render targets will be collected. Control may flow
455 // to the embedder. Here, the embedder has the opportunity to trample on the
456 // OpenGL context.
457 //
458 // For optimum performance, we should tell the render target cache to clear
459 // its unused entries before allocating new ones. This collection step
460 // before allocating new render targets ameliorates peak memory usage within
461 // the frame. But, this causes an issue in a known internal embedder. To
462 // work around this issue while that embedder migrates, collection of render
463 // targets is deferred after the presentation.
464 //
465 // @warning: Embedder may trample on our OpenGL context here.
466 auto deferred_cleanup_render_targets =
467 render_target_cache.ClearAllRenderTargetsInCache();
468
469 // The OpenGL context could have been trampled by the embedder at this point
470 // as it attempted to collect old render targets and create new ones. Tell
471 // Skia to not rely on existing bindings.
472 if (context) {
474 }
475
476 builder.Render();
477
478 // We are going to be transferring control back over to the embedder there
479 // the context may be trampled upon again. Flush all operations to the
480 // underlying rendering API.
481 //
482 // @warning: Embedder may trample on our OpenGL context here.
483 if (context) {
484 context->flushAndSubmit();
485 }
486
487 {
488 auto presentation_time_optional = frame->submit_info().presentation_time;
489 uint64_t presentation_time =
490 presentation_time_optional.has_value()
491 ? presentation_time_optional->ToEpochDelta().ToNanoseconds()
492 : 0;
493
494 // Submit the scribbled layer to the embedder for presentation.
495 //
496 // @warning: Embedder may trample on our OpenGL context here.
497 EmbedderLayers presented_layers(
498 pending_frame_size_, pending_device_pixel_ratio_,
499 pending_surface_transformation_, presentation_time);
500
501 builder.PushLayers(presented_layers);
502
503 presented_layers.InvokePresentCallback(flutter_view_id, present_callback_);
504 }
505
506 // See why this is necessary in the comment where this collection in
507 // realized.
508 //
509 // @warning: Embedder may trample on our OpenGL context here.
510 deferred_cleanup_render_targets.clear();
511
512 auto render_targets = builder.ClearAndCollectRenderTargets();
513 for (auto& render_target : render_targets) {
514 if (!avoid_backing_store_cache_) {
515 render_target_cache.CacheRenderTarget(std::move(render_target));
516 }
517 }
518
519 frame->Submit();
520}
static const uint32_t kAll_GrBackendState
Definition GrTypes.h:176
void resetContext(uint32_t state=kAll_GrBackendState)
void flushAndSubmit(GrSyncCpu sync=GrSyncCpu::kNo)
bool mapRect(SkRect *dst, const SkRect &src, SkApplyPerspectiveClip pc=SkApplyPerspectiveClip::kYes) const
double frame
Definition examples.cpp:31
uint32_t * target
static FlutterBackingStoreConfig MakeBackingStoreConfig(int64_t view_id, const SkISize &backing_store_size)
static constexpr SkISize Make(int32_t w, int32_t h)
Definition SkSize.h:20
constexpr int32_t width() const
Definition SkSize.h:36
constexpr int32_t height() const
Definition SkSize.h:37
static SkRect MakeIWH(int w, int h)
Definition SkRect.h:623
constexpr float height() const
Definition SkRect.h:769
constexpr float width() const
Definition SkRect.h:762

The documentation for this class was generated from the following files: