16 std::shared_ptr<PlatformViewAndroidJNI> jni_facade,
17 std::shared_ptr<AndroidSurfaceFactory> surface_factory,
20 android_context_(android_context),
21 jni_facade_(
std::move(jni_facade)),
22 surface_factory_(
std::move(surface_factory)),
30 std::unique_ptr<EmbeddedViewParams>
params) {
32 "AndroidExternalViewEmbedder::PrerollCompositeEmbeddedView");
35 std::unique_ptr<EmbedderViewSlice>
view;
36 view = std::make_unique<DisplayListEmbedderViewSlice>(view_bounds);
39 composition_order_.push_back(
view_id);
41 if (view_params_.count(
view_id) == 1 &&
50 if (slices_.count(
view_id) == 1) {
51 return slices_.at(
view_id)->canvas();
61 return params.finalBoundingRect();
66 int64_t flutter_view_id,
67 GrDirectContext* context,
68 const std::shared_ptr<impeller::AiksContext>& aiks_context,
69 std::unique_ptr<SurfaceFrame> frame) {
70 TRACE_EVENT0(
"flutter",
"AndroidExternalViewEmbedder::SubmitFlutterView");
75 if (!FrameHasPlatformLayers()) {
80 std::unordered_map<int64_t, DlRect> view_rects;
81 for (
auto platform_id : composition_order_) {
85 std::unordered_map<int64_t, DlRect> overlay_layers =
97 auto should_submit_current_frame = previous_frame_view_count_ > 0;
98 if (should_submit_current_frame) {
102 for (int64_t
view_id : composition_order_) {
107 jni_facade_->FlutterViewOnDisplayPlatformView(
113 params.sizePoints().width * device_pixel_ratio_,
114 params.sizePoints().height * device_pixel_ratio_,
117 std::unordered_map<int64_t, DlRect>::const_iterator overlay =
119 if (overlay == overlay_layers.end()) {
122 std::unique_ptr<SurfaceFrame> frame =
123 CreateSurfaceIfNeeded(context,
128 if (should_submit_current_frame) {
135std::unique_ptr<SurfaceFrame>
136AndroidExternalViewEmbedder::CreateSurfaceIfNeeded(GrDirectContext* context,
140 std::shared_ptr<OverlayLayer> layer = surface_pool_->GetLayer(
141 context, android_context_, jni_facade_, surface_factory_);
143 std::unique_ptr<SurfaceFrame> frame =
144 layer->surface->AcquireFrame(frame_size_);
147 jni_facade_->FlutterViewDisplayOverlaySurface(layer->id,
153 DlCanvas* overlay_canvas = frame->Canvas();
165 if (!FrameHasPlatformLayers()) {
168 if (!raster_thread_merger->IsMerged()) {
178 raster_thread_merger->MergeWithLease(kDefaultMergedLeaseDuration);
181 raster_thread_merger->ExtendLeaseTo(kDefaultMergedLeaseDuration);
184 if (previous_frame_view_count_ == 0) {
190bool AndroidExternalViewEmbedder::FrameHasPlatformLayers() {
191 return !composition_order_.empty();
200void AndroidExternalViewEmbedder::Reset() {
201 previous_frame_view_count_ = composition_order_.size();
203 composition_order_.clear();
209 GrDirectContext* context,
212 if (raster_thread_merger->IsOnPlatformThread()) {
213 jni_facade_->FlutterViewBeginFrame();
220 double device_pixel_ratio) {
225 if (frame_size_ != frame_size) {
228 surface_pool_->SetFrameSize(frame_size);
232 jni_facade->MaybeResizeSurfaceView(frame_size.
width, frame_size.
height);
235 frame_size_ = frame_size;
236 device_pixel_ratio_ = device_pixel_ratio;
246 bool should_resubmit_frame,
248 surface_pool_->RecycleLayers();
250 if (raster_thread_merger->IsOnPlatformThread()) {
251 jni_facade_->FlutterViewEndFrame();
266void AndroidExternalViewEmbedder::DestroySurfaces() {
267 if (!surface_pool_->HasLayers()) {
273 surface_pool_->DestroyLayers(jni_facade_);
Holds state that is shared across Android surfaces.
void EndFrame(bool should_resubmit_frame, const fml::RefPtr< fml::RasterThreadMerger > &raster_thread_merger) override
PostPrerollResult PostPrerollAction(const fml::RefPtr< fml::RasterThreadMerger > &raster_thread_merger) override
void PrerollCompositeEmbeddedView(int64_t view_id, std::unique_ptr< flutter::EmbeddedViewParams > params) override
void CancelFrame() override
void SubmitFlutterView(int64_t flutter_view_id, GrDirectContext *context, const std::shared_ptr< impeller::AiksContext > &aiks_context, std::unique_ptr< SurfaceFrame > frame) override
DlCanvas * CompositeEmbeddedView(int64_t view_id) override
void BeginFrame(GrDirectContext *context, const fml::RefPtr< fml::RasterThreadMerger > &raster_thread_merger) override
void PrepareFlutterView(DlISize frame_size, double device_pixel_ratio) override
AndroidExternalViewEmbedder(const AndroidContext &android_context, std::shared_ptr< PlatformViewAndroidJNI > jni_facade, std::shared_ptr< AndroidSurfaceFactory > surface_factory, const TaskRunners &task_runners)
DlRect GetViewRect(int64_t view_id) const
bool SupportsDynamicThreadMerging() override
DlCanvas * GetRootCanvas() override
Developer-facing API for rendering anything within the engine.
virtual void Translate(DlScalar tx, DlScalar ty)=0
void Clear(DlColor color)
virtual void render_into(DlCanvas *canvas)=0
fml::RefPtr< fml::TaskRunner > GetPlatformTaskRunner() const
static void RunNowOrPostTask(const fml::RefPtr< fml::TaskRunner > &runner, const fml::closure &task)
virtual void PostTask(const fml::closure &task) override
const EmbeddedViewParams * params
TaskRunners task_runners_
G_BEGIN_DECLS FlutterViewId view_id
#define FML_DCHECK(condition)
constexpr int64_t kFlutterImplicitViewId
std::unordered_map< int64_t, DlRect > SliceViews(DlCanvas *background_canvas, const std::vector< int64_t > &composition_order, const std::unordered_map< int64_t, std::unique_ptr< EmbedderViewSlice > > &slices, const std::unordered_map< int64_t, DlRect > &view_rects)
Compute the required overlay layers and clip the view slices according to the size and position of th...
internal::CopyableLambda< T > MakeCopyable(T lambda)
static constexpr DlColor kTransparent()
constexpr Type GetY() const
Returns the Y coordinate of the upper left corner, equivalent to |GetOrigin().y|.
constexpr Type GetHeight() const
Returns the height of the rectangle, equivalent to |GetSize().height|.
constexpr Type GetX() const
Returns the X coordinate of the upper left corner, equivalent to |GetOrigin().x|.
static constexpr TRect MakeSize(const TSize< U > &size)
constexpr Type GetWidth() const
Returns the width of the rectangle, equivalent to |GetSize().width|.
#define TRACE_EVENT0(category_group, name)