Flutter Engine
 
Loading...
Searching...
No Matches
flutter::EmbedderExternalView Class Reference

#include <embedder_external_view.h>

Classes

struct  RenderTargetDescriptor
 
struct  ViewIdentifier
 

Public Types

using PlatformViewID = int64_t
 
using ViewIdentifierSet = std::unordered_set< ViewIdentifier, ViewIdentifier::Hash, ViewIdentifier::Equal >
 
using PendingViews = std::unordered_map< ViewIdentifier, std::unique_ptr< EmbedderExternalView >, ViewIdentifier::Hash, ViewIdentifier::Equal >
 

Public Member Functions

 EmbedderExternalView (const DlISize &frame_size, const DlMatrix &surface_transformation)
 
 EmbedderExternalView (const DlISize &frame_size, const DlMatrix &surface_transformation, ViewIdentifier view_identifier, std::unique_ptr< EmbeddedViewParams > params)
 
 ~EmbedderExternalView ()
 
bool IsRootView () const
 
bool HasPlatformView () const
 
bool HasEngineRenderedContents ()
 
ViewIdentifier GetViewIdentifier () const
 
const EmbeddedViewParamsGetEmbeddedViewParams () const
 
RenderTargetDescriptor CreateRenderTargetDescriptor () const
 
DlCanvasGetCanvas ()
 
DlISize GetRenderSurfaceSize () const
 
bool Render (const EmbedderRenderTarget &render_target, bool clear_surface=true)
 
const DlRegionGetDlRegion () const
 

Detailed Description

Definition at line 19 of file embedder_external_view.h.

Member Typedef Documentation

◆ PendingViews

◆ PlatformViewID

Definition at line 21 of file embedder_external_view.h.

◆ ViewIdentifierSet

Constructor & Destructor Documentation

◆ EmbedderExternalView() [1/2]

flutter::EmbedderExternalView::EmbedderExternalView ( const DlISize frame_size,
const DlMatrix surface_transformation 
)

Definition at line 27 of file embedder_external_view.cc.

30 : EmbedderExternalView(frame_size, surface_transformation, {}, nullptr) {}
EmbedderExternalView(const DlISize &frame_size, const DlMatrix &surface_transformation)

◆ EmbedderExternalView() [2/2]

flutter::EmbedderExternalView::EmbedderExternalView ( const DlISize frame_size,
const DlMatrix surface_transformation,
ViewIdentifier  view_identifier,
std::unique_ptr< EmbeddedViewParams params 
)

Definition at line 32 of file embedder_external_view.cc.

37 : render_surface_size_(
38 TransformedSurfaceSize(frame_size, surface_transformation)),
39 surface_transformation_(surface_transformation),
40 view_identifier_(view_identifier),
41 embedded_view_params_(std::move(params)),
42 slice_(std::make_unique<DisplayListEmbedderViewSlice>(
43 DlRect::MakeSize(frame_size))) {}
EmbedderExternalView::ViewIdentifier view_identifier
const EmbeddedViewParams * params
static DlISize TransformedSurfaceSize(const DlISize &size, const DlMatrix &transformation)
static constexpr TRect MakeSize(const TSize< U > &size)
Definition rect.h:150

◆ ~EmbedderExternalView()

flutter::EmbedderExternalView::~EmbedderExternalView ( )
default

Member Function Documentation

◆ CreateRenderTargetDescriptor()

EmbedderExternalView::RenderTargetDescriptor flutter::EmbedderExternalView::CreateRenderTargetDescriptor ( ) const

Definition at line 48 of file embedder_external_view.cc.

48 {
49 return RenderTargetDescriptor(render_surface_size_);
50}

◆ GetCanvas()

DlCanvas * flutter::EmbedderExternalView::GetCanvas ( )

Definition at line 52 of file embedder_external_view.cc.

52 {
53 return slice_->canvas();
54}

◆ GetDlRegion()

const DlRegion & flutter::EmbedderExternalView::GetDlRegion ( ) const

Definition at line 68 of file embedder_external_view.cc.

68 {
69 return slice_->getRegion();
70}

◆ GetEmbeddedViewParams()

const EmbeddedViewParams * flutter::EmbedderExternalView::GetEmbeddedViewParams ( ) const

Definition at line 89 of file embedder_external_view.cc.

89 {
90 return embedded_view_params_.get();
91}

◆ GetRenderSurfaceSize()

DlISize flutter::EmbedderExternalView::GetRenderSurfaceSize ( ) const

Definition at line 56 of file embedder_external_view.cc.

56 {
57 return render_surface_size_;
58}

◆ GetViewIdentifier()

EmbedderExternalView::ViewIdentifier flutter::EmbedderExternalView::GetViewIdentifier ( ) const

Definition at line 84 of file embedder_external_view.cc.

85 {
86 return view_identifier_;
87}

◆ HasEngineRenderedContents()

bool flutter::EmbedderExternalView::HasEngineRenderedContents ( )

Definition at line 72 of file embedder_external_view.cc.

72 {
73 if (has_engine_rendered_contents_.has_value()) {
74 return has_engine_rendered_contents_.value();
75 }
76 TryEndRecording();
77 DlOpSpy dl_op_spy;
78 slice_->dispatch(dl_op_spy);
79 has_engine_rendered_contents_ = dl_op_spy.did_draw() && !slice_->is_empty();
80 // NOLINTNEXTLINE(bugprone-unchecked-optional-access)
81 return has_engine_rendered_contents_.value();
82}

References flutter::DlOpSpy::did_draw().

Referenced by Render().

◆ HasPlatformView()

bool flutter::EmbedderExternalView::HasPlatformView ( ) const

Definition at line 64 of file embedder_external_view.cc.

64 {
65 return view_identifier_.platform_view_id.has_value();
66}

References flutter::EmbedderExternalView::ViewIdentifier::platform_view_id.

Referenced by IsRootView().

◆ IsRootView()

bool flutter::EmbedderExternalView::IsRootView ( ) const

Definition at line 60 of file embedder_external_view.cc.

60 {
61 return !HasPlatformView();
62}

References HasPlatformView().

◆ Render()

bool flutter::EmbedderExternalView::Render ( const EmbedderRenderTarget render_target,
bool  clear_surface = true 
)

Definition at line 114 of file embedder_external_view.cc.

115 {
116 TRACE_EVENT0("flutter", "EmbedderExternalView::Render");
117 TryEndRecording();
119 << "Unnecessarily asked to render into a render target when there was "
120 "nothing to render.";
121
122#ifdef IMPELLER_SUPPORTS_RENDERING
123 auto* impeller_target = render_target.GetImpellerRenderTarget();
124 if (impeller_target) {
125 auto aiks_context = render_target.GetAiksContext();
126
127 auto dl_builder = DisplayListBuilder();
128 dl_builder.SetTransform(surface_transformation_);
129 slice_->render_into(&dl_builder);
130 auto display_list = dl_builder.Build();
131
132 auto cull_rect =
133 impeller::Rect::MakeSize(impeller_target->GetRenderTargetSize());
134
135 return impeller::RenderToTarget(aiks_context->GetContentContext(), //
136 *impeller_target, //
137 display_list, //
138 cull_rect, //
139 /*reset_host_buffer=*/true, //
140 /*is_onscreen=*/false //
141 );
142 }
143#endif // IMPELLER_SUPPORTS_RENDERING
144
145#if SLIMPELLER
146 FML_LOG(FATAL) << "Impeller opt-out unavailable.";
147 return false;
148#else // SLIMPELLER
149 auto skia_surface = render_target.GetSkiaSurface();
150 if (!skia_surface) {
151 return false;
152 }
153
154 auto [ok, invalidate_api_state] = render_target.MaybeMakeCurrent();
155
156 if (invalidate_api_state) {
157 InvalidateApiState(*skia_surface);
158 }
159 if (!ok) {
160 FML_LOG(ERROR) << "Could not make the surface current.";
161 return false;
162 }
163
164 // Clear the current render target (most likely EGLSurface) at the
165 // end of this scope.
166 fml::ScopedCleanupClosure clear_current_surface([&]() {
167 auto [ok, invalidate_api_state] = render_target.MaybeClearCurrent();
168 if (invalidate_api_state) {
169 InvalidateApiState(*skia_surface);
170 }
171 if (!ok) {
172 FML_LOG(ERROR) << "Could not clear the current surface.";
173 }
174 });
175
176 FML_DCHECK(render_target.GetRenderTargetSize() == render_surface_size_);
177
178 auto canvas = skia_surface->getCanvas();
179 if (!canvas) {
180 return false;
181 }
182 DlSkCanvasAdapter dl_canvas(canvas);
183 int restore_count = dl_canvas.GetSaveCount();
184 dl_canvas.SetTransform(surface_transformation_);
185 if (clear_surface) {
186 dl_canvas.Clear(DlColor::kTransparent());
187 }
188 slice_->render_into(&dl_canvas);
189 dl_canvas.RestoreToCount(restore_count);
190 dl_canvas.Flush();
191#endif // !SLIMPELLER
192
193 return true;
194}
Wraps a closure that is invoked in the destructor unless released by the caller.
Definition closure.h:32
#define FML_LOG(severity)
Definition logging.h:101
#define FML_DCHECK(condition)
Definition logging.h:122
static void InvalidateApiState(SkSurface &skia_surface)
bool RenderToTarget(ContentContext &context, RenderTarget render_target, const sk_sp< flutter::DisplayList > &display_list, Rect cull_rect, bool reset_host_buffer, bool is_onscreen)
Render the provided display list to the render target.
static constexpr DlColor kTransparent()
Definition dl_color.h:68
#define TRACE_EVENT0(category_group, name)

References flutter::DlCanvas::Clear(), flutter::DlSkCanvasAdapter::Flush(), FML_DCHECK, FML_LOG, flutter::EmbedderRenderTarget::GetAiksContext(), flutter::EmbedderRenderTarget::GetImpellerRenderTarget(), flutter::EmbedderRenderTarget::GetRenderTargetSize(), flutter::DlSkCanvasAdapter::GetSaveCount(), flutter::EmbedderRenderTarget::GetSkiaSurface(), HasEngineRenderedContents(), flutter::InvalidateApiState(), flutter::DlColor::kTransparent(), impeller::TRect< Scalar >::MakeSize(), flutter::EmbedderRenderTarget::MaybeClearCurrent(), flutter::EmbedderRenderTarget::MaybeMakeCurrent(), impeller::RenderToTarget(), flutter::DlSkCanvasAdapter::RestoreToCount(), flutter::DlSkCanvasAdapter::SetTransform(), and TRACE_EVENT0.


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