Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 01d75bd

Browse files
committed
For MacOS, rasterizer will only use the compositor if there is a platform view
in the layer tree. Otherwise the current render path will be used. This is to avoid regression as Compositor currently doesn't fully support resizing.
1 parent 1a3a6d2 commit 01d75bd

15 files changed

+102
-11
lines changed

flow/layers/container_layer.cc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,19 @@ void ContainerLayer::TryToPrepareRasterCache(PrerollContext* context,
9696
}
9797
}
9898

99+
#if defined(OS_MACOSX)
100+
bool ContainerLayer::HasPlatformView() {
101+
bool hasPlatformView = false;
102+
for (auto& layer : layers_) {
103+
if (layer->HasPlatformView()) {
104+
hasPlatformView = true;
105+
}
106+
}
107+
108+
return hasPlatformView;
109+
}
110+
#endif
111+
99112
#if defined(LEGACY_FUCHSIA_EMBEDDER)
100113

101114
void ContainerLayer::CheckForChildLayerBelow(PrerollContext* context) {

flow/layers/container_layer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ class ContainerLayer : public Layer {
1919

2020
void Preroll(PrerollContext* context, const SkMatrix& matrix) override;
2121
void Paint(PaintContext& context) const override;
22+
#if defined(OS_MACOSX)
23+
bool HasPlatformView() override;
24+
#endif
2225
#if defined(LEGACY_FUCHSIA_EMBEDDER)
2326
void CheckForChildLayerBelow(PrerollContext* context) override;
2427
void UpdateScene(std::shared_ptr<SceneUpdateContext> context) override;

flow/layers/layer.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ uint64_t Layer::NextUniqueID() {
2727

2828
void Layer::Preroll(PrerollContext* context, const SkMatrix& matrix) {}
2929

30+
#if defined(OS_MACOSX)
31+
bool Layer::HasPlatformView() {
32+
return false;
33+
}
34+
#endif
35+
3036
Layer::AutoPrerollSaveLayerState::AutoPrerollSaveLayerState(
3137
PrerollContext* preroll_context,
3238
bool save_layer_is_active,

flow/layers/layer.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ class Layer {
7575

7676
virtual void Preroll(PrerollContext* context, const SkMatrix& matrix);
7777

78+
#if defined(OS_MACOSX)
79+
virtual bool HasPlatformView();
80+
#endif
81+
7882
// Used during Preroll by layers that employ a saveLayer to manage the
7983
// PrerollContext settings with values affected by the saveLayer mechanism.
8084
// This object must be created before calling Preroll on the children to

flow/layers/layer_tree.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,11 @@ bool LayerTree::Preroll(CompositorContext::ScopedFrame& frame,
6060
root_layer_->Preroll(&context, frame.root_surface_transformation());
6161
return context.surface_needs_readback;
6262
}
63+
#if defined(OS_MACOSX)
64+
bool LayerTree::HasPlatformView() {
65+
return root_layer_->HasPlatformView();
66+
}
67+
#endif
6368

6469
#if defined(LEGACY_FUCHSIA_EMBEDDER)
6570
void LayerTree::UpdateScene(std::shared_ptr<SceneUpdateContext> context) {

flow/layers/layer_tree.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ class LayerTree {
3131
bool Preroll(CompositorContext::ScopedFrame& frame,
3232
bool ignore_raster_cache = false);
3333

34+
// Used to check before Prerolling to see if the layer tree
35+
// contains a platform view.
36+
// Specifically used for MacOS to determine if the compositor
37+
// should be used.
38+
#if defined(OS_MACOSX)
39+
bool HasPlatformView();
40+
#endif
3441
#if defined(LEGACY_FUCHSIA_EMBEDDER)
3542
void UpdateScene(std::shared_ptr<SceneUpdateContext> context);
3643
#endif

flow/layers/platform_view_layer.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ void PlatformViewLayer::Preroll(PrerollContext* context,
3434
std::move(params));
3535
}
3636

37+
#if defined(OS_MACOSX)
38+
bool PlatformViewLayer::HasPlatformView() {
39+
return true;
40+
}
41+
#endif
42+
3743
void PlatformViewLayer::Paint(PaintContext& context) const {
3844
if (context.view_embedder == nullptr) {
3945
#if !defined(LEGACY_FUCHSIA_EMBEDDER)

flow/layers/platform_view_layer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ class PlatformViewLayer : public Layer {
1717

1818
void Preroll(PrerollContext* context, const SkMatrix& matrix) override;
1919
void Paint(PaintContext& context) const override;
20+
#if defined(OS_MACOSX)
21+
bool HasPlatformView() override;
22+
#endif
2023
#if defined(LEGACY_FUCHSIA_EMBEDDER)
2124
// Updates the system composited scene.
2225
void UpdateScene(std::shared_ptr<SceneUpdateContext> context) override;

flow/surface.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,6 @@ bool Surface::ClearRenderContext() {
1818
return false;
1919
}
2020

21+
void Surface::SetRenderToSurface(bool render_to_surface) {}
22+
2123
} // namespace flutter

flow/surface.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ class Surface {
3333

3434
virtual bool ClearRenderContext();
3535

36+
// SetRenderToSurface sets whether or not the surface should be rendered to.
37+
// This is needed for MacOS as we want to render scenes without platform views
38+
// to the surface even in the existence of a external_view_embedder.
39+
virtual void SetRenderToSurface(bool render_to_surface);
40+
3641
private:
3742
FML_DISALLOW_COPY_AND_ASSIGN(Surface);
3843
};

shell/common/rasterizer.cc

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -424,13 +424,27 @@ RasterStatus Rasterizer::DrawToSurface(flutter::LayerTree& layer_tree) {
424424
compositor_context_->ui_time().SetLapTime(layer_tree.build_time());
425425

426426
SkCanvas* embedder_root_canvas = nullptr;
427+
#if defined(OS_MACOSX)
428+
// For MacOS, we only want to use the external_view_embedder / compositor
429+
// if there is a platform view in the layer tree.
430+
bool hasPlatformView = layer_tree.HasPlatformView();
431+
if (external_view_embedder_ && hasPlatformView) {
432+
#else
427433
if (external_view_embedder_) {
434+
#endif
428435
external_view_embedder_->BeginFrame(
429436
layer_tree.frame_size(), surface_->GetContext(),
430437
layer_tree.device_pixel_ratio(), raster_thread_merger_);
431438
embedder_root_canvas = external_view_embedder_->GetRootCanvas();
432439
}
433440

441+
#if defined(OS_MACOSX)
442+
if (external_view_embedder_ && hasPlatformView) {
443+
surface_->SetRenderToSurface(false);
444+
} else {
445+
surface_->SetRenderToSurface(true);
446+
}
447+
#endif
434448
// On Android, the external view embedder deletes surfaces in `BeginFrame`.
435449
//
436450
// Deleting a surface also clears the GL context. Therefore, acquire the
@@ -450,14 +464,23 @@ RasterStatus Rasterizer::DrawToSurface(flutter::LayerTree& layer_tree) {
450464
auto root_surface_canvas =
451465
embedder_root_canvas ? embedder_root_canvas : frame->SkiaCanvas();
452466

467+
#if defined(OS_MACOSX)
468+
auto external_view_embedder =
469+
hasPlatformView ? external_view_embedder_.get() : nullptr;
470+
auto raster_thread_merger = hasPlatformView ? raster_thread_merger_ : nullptr;
471+
#else
472+
auto external_view_embedder = external_view_embedder_.get();
473+
auto raster_thread_merger = raster_thread_merger_;
474+
#endif
475+
453476
auto compositor_frame = compositor_context_->AcquireFrame(
454-
surface_->GetContext(), // skia GrContext
455-
root_surface_canvas, // root surface canvas
456-
external_view_embedder_.get(), // external view embedder
457-
root_surface_transformation, // root surface transformation
458-
true, // instrumentation enabled
459-
frame->supports_readback(), // surface supports pixel reads
460-
raster_thread_merger_ // thread merger
477+
surface_->GetContext(), // skia GrContext
478+
root_surface_canvas, // root surface canvas
479+
external_view_embedder, // external view embedder
480+
root_surface_transformation, // root surface transformation
481+
true, // instrumentation enabled
482+
frame->supports_readback(), // surface supports pixel reads
483+
raster_thread_merger // thread merger
461484
);
462485

463486
if (compositor_frame) {
@@ -466,8 +489,14 @@ RasterStatus Rasterizer::DrawToSurface(flutter::LayerTree& layer_tree) {
466489
raster_status == RasterStatus::kSkipAndRetry) {
467490
return raster_status;
468491
}
492+
#if defined(OS_MACOSX)
493+
if (external_view_embedder_ &&
494+
(!raster_thread_merger_ || raster_thread_merger_->IsMerged()) &&
495+
hasPlatformView) {
496+
#else
469497
if (external_view_embedder_ &&
470498
(!raster_thread_merger_ || raster_thread_merger_->IsMerged())) {
499+
#endif
471500
FML_DCHECK(!frame->IsSubmitted());
472501
external_view_embedder_->SubmitFrame(surface_->GetContext(),
473502
std::move(frame));

shell/gpu/gpu_surface_gl.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,4 +343,9 @@ bool GPUSurfaceGL::ClearRenderContext() {
343343
return delegate_->GLContextClearCurrent();
344344
}
345345

346+
// |Surface|
347+
void GPUSurfaceGL::SetRenderToSurface(bool render_to_surface) {
348+
render_to_surface_ = render_to_surface;
349+
}
350+
346351
} // namespace flutter

shell/gpu/gpu_surface_gl.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ class GPUSurfaceGL : public Surface {
4848
// |Surface|
4949
bool ClearRenderContext() override;
5050

51+
// |Surface|
52+
void SetRenderToSurface(bool render_to_surface) override;
53+
5154
private:
5255
GPUSurfaceGLDelegate* delegate_;
5356
sk_sp<GrDirectContext> context_;
@@ -59,7 +62,7 @@ class GPUSurfaceGL : public Surface {
5962
// external view embedder may want to render to the root surface. This is a
6063
// hack to make avoid allocating resources for the root surface when an
6164
// external view embedder is present.
62-
const bool render_to_surface_;
65+
bool render_to_surface_;
6366
bool valid_ = false;
6467
fml::TaskRunnerAffineWeakPtrFactory<GPUSurfaceGL> weak_factory_;
6568

shell/gpu/gpu_surface_software.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class GPUSurfaceSoftware : public Surface {
3737
// external view embedder may want to render to the root surface. This is a
3838
// hack to make avoid allocating resources for the root surface when an
3939
// external view embedder is present.
40-
const bool render_to_surface_;
40+
bool render_to_surface_;
4141
fml::TaskRunnerAffineWeakPtrFactory<GPUSurfaceSoftware> weak_factory_;
4242

4343
FML_DISALLOW_COPY_AND_ASSIGN(GPUSurfaceSoftware);

shell/platform/darwin/macos/framework/Source/FlutterMacOSGLCompositor.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ namespace flutter {
1515
// FlutterMacOSGLCompositor creates and manages the backing stores used for
1616
// rendering Flutter content and presents Flutter content and Platform views.
1717
// Platform views are not yet supported.
18-
// FlutterMacOSGLCompositor is created and destroyed by FlutterEngine.
18+
// FlutterMacOSGLCompositor is created and destroyed by FlutterEngine.
1919
class FlutterMacOSGLCompositor {
2020
public:
2121
FlutterMacOSGLCompositor(FlutterViewController* view_controller);
2222

2323
// Creates a FlutterSurfaceManager and uses the FlutterSurfaceManager's
2424
// underlying FBO and texture in the backing store.
25-
// Any additional state allocated for the backing store and
25+
// Any additional state allocated for the backing store and
2626
// saved as user_data in the backing store must be collected
2727
// in the backing_store's desctruction_callback field which will
2828
// be called when the embedder collects the backing store.

0 commit comments

Comments
 (0)