15 std::shared_ptr<PlatformViewAndroidJNI> jni_facade,
16 std::shared_ptr<AndroidSurfaceFactory> surface_factory,
19 android_context_(android_context),
20 jni_facade_(
std::move(jni_facade)),
21 surface_factory_(
std::move(surface_factory)),
29 std::unique_ptr<EmbeddedViewParams>
params) {
31 "AndroidExternalViewEmbedder::PrerollCompositeEmbeddedView");
34 std::unique_ptr<EmbedderViewSlice>
view;
35 view = std::make_unique<DisplayListEmbedderViewSlice>(view_bounds);
38 composition_order_.push_back(
view_id);
40 if (view_params_.count(
view_id) == 1 &&
49 if (slices_.count(
view_id) == 1) {
50 return slices_.at(
view_id)->canvas();
60 return params.finalBoundingRect();
65 int64_t flutter_view_id,
66 GrDirectContext* context,
67 const std::shared_ptr<impeller::AiksContext>& aiks_context,
68 std::unique_ptr<SurfaceFrame> frame) {
69 TRACE_EVENT0(
"flutter",
"AndroidExternalViewEmbedder::SubmitFlutterView");
74 if (!FrameHasPlatformLayers()) {
79 std::unordered_map<int64_t, DlRect> view_rects;
80 for (
auto platform_id : composition_order_) {
84 std::unordered_map<int64_t, DlRect> overlay_layers =
96 auto should_submit_current_frame = previous_frame_view_count_ > 0;
97 if (should_submit_current_frame) {
101 for (int64_t
view_id : composition_order_) {
106 jni_facade_->FlutterViewOnDisplayPlatformView(
112 params.sizePoints().width * device_pixel_ratio_,
113 params.sizePoints().height * device_pixel_ratio_,
116 std::unordered_map<int64_t, DlRect>::const_iterator overlay =
118 if (overlay == overlay_layers.end()) {
121 std::unique_ptr<SurfaceFrame> frame =
122 CreateSurfaceIfNeeded(context,
127 if (should_submit_current_frame) {
134std::unique_ptr<SurfaceFrame>
135AndroidExternalViewEmbedder::CreateSurfaceIfNeeded(GrDirectContext* context,
139 std::shared_ptr<OverlayLayer> layer = surface_pool_->GetLayer(
140 context, android_context_, jni_facade_, surface_factory_);
142 std::unique_ptr<SurfaceFrame> frame =
143 layer->surface->AcquireFrame(frame_size_);
146 jni_facade_->FlutterViewDisplayOverlaySurface(layer->id,
152 DlCanvas* overlay_canvas = frame->Canvas();
164 if (!FrameHasPlatformLayers()) {
167 if (!raster_thread_merger->IsMerged()) {
177 raster_thread_merger->MergeWithLease(kDefaultMergedLeaseDuration);
180 raster_thread_merger->ExtendLeaseTo(kDefaultMergedLeaseDuration);
183 if (previous_frame_view_count_ == 0) {
189bool AndroidExternalViewEmbedder::FrameHasPlatformLayers() {
190 return !composition_order_.empty();
199void AndroidExternalViewEmbedder::Reset() {
200 previous_frame_view_count_ = composition_order_.size();
202 composition_order_.clear();
208 GrDirectContext* context,
211 if (raster_thread_merger->IsOnPlatformThread()) {
212 jni_facade_->FlutterViewBeginFrame();
219 double device_pixel_ratio) {
224 if (frame_size_ != frame_size) {
227 surface_pool_->SetFrameSize(frame_size);
229 frame_size_ = frame_size;
230 device_pixel_ratio_ = device_pixel_ratio;
240 bool should_resubmit_frame,
242 surface_pool_->RecycleLayers();
244 if (raster_thread_merger->IsOnPlatformThread()) {
245 jni_facade_->FlutterViewEndFrame();
260void AndroidExternalViewEmbedder::DestroySurfaces() {
261 if (!surface_pool_->HasLayers()) {
267 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)
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...
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)