未验证 提交 21c265cc 编写于 作者: A Amir Hardon 提交者: GitHub

Synchronize Flutter's rendering with CA. (#6807)

Right now we do it whenever the platform views preview flag is on.
This is less efficient, filed
https://github.com/flutter/flutter/issues/24133 to only do this when
there's a platform view in the tree.
上级 a64049a1
......@@ -27,7 +27,7 @@ class ExternalViewEmbedder {
public:
ExternalViewEmbedder() = default;
virtual void SetFrameSize(SkISize frame_size) = 0;
virtual void BeginFrame(SkISize frame_size) = 0;
virtual void PrerollCompositeEmbeddedView(int view_id) = 0;
......
......@@ -165,7 +165,7 @@ bool Rasterizer::DrawToSurface(flow::LayerTree& layer_tree) {
auto external_view_embedder = surface_->GetExternalViewEmbedder();
if (external_view_embedder != nullptr) {
external_view_embedder->SetFrameSize(layer_tree.frame_size());
external_view_embedder->BeginFrame(layer_tree.frame_size());
}
auto compositor_frame = compositor_context_->AcquireFrame(
......
......@@ -71,6 +71,11 @@
- (std::unique_ptr<shell::IOSSurfaceGL>)createGLSurfaceWithContext:
(std::shared_ptr<shell::IOSGLContext>)gl_context {
fml::scoped_nsobject<CAEAGLLayer> eagl_layer(reinterpret_cast<CAEAGLLayer*>([self.layer retain]));
// TODO(amirh): We can lower this to iOS 8.0 once we have a Metal rendering backend.
// https://github.com/flutter/flutter/issues/24132
if (@available(iOS 9.0, *)) {
eagl_layer.get().presentsWithTransaction = YES;
}
return std::make_unique<shell::IOSSurfaceGL>(eagl_layer, std::move(gl_context));
}
......
......@@ -79,6 +79,15 @@ id<FlutterViewEngineDelegate> _delegate;
if ([self.layer isKindOfClass:[CAEAGLLayer class]]) {
fml::scoped_nsobject<CAEAGLLayer> eagl_layer(
reinterpret_cast<CAEAGLLayer*>([self.layer retain]));
if (shell::IsIosEmbeddedViewsPreviewEnabled()) {
// TODO(amirh): We can lower this to iOS 8.0 once we have a Metal rendering backend.
// https://github.com/flutter/flutter/issues/24132
if (@available(iOS 9.0, *)) {
// TODO(amirh): only do this if there's an embedded view.
// https://github.com/flutter/flutter/issues/24133
eagl_layer.get().presentsWithTransaction = YES;
}
}
return std::make_unique<shell::IOSSurfaceGL>(std::move(eagl_layer),
[_delegate platformViewsController]);
} else {
......
......@@ -51,7 +51,7 @@ class IOSSurfaceGL : public IOSSurface,
flow::ExternalViewEmbedder* GetExternalViewEmbedder() override;
// |flow::ExternalViewEmbedder|
void SetFrameSize(SkISize frame_size) override;
void BeginFrame(SkISize frame_size) override;
// |flow::ExternalViewEmbedder|
void PrerollCompositeEmbeddedView(int view_id) override;
......
......@@ -82,10 +82,11 @@ flow::ExternalViewEmbedder* IOSSurfaceGL::GetExternalViewEmbedder() {
}
}
void IOSSurfaceGL::SetFrameSize(SkISize frame_size) {
void IOSSurfaceGL::BeginFrame(SkISize frame_size) {
FlutterPlatformViewsController* platform_views_controller = GetPlatformViewsController();
FML_CHECK(platform_views_controller != nullptr);
platform_views_controller->SetFrameSize(frame_size);
[CATransaction begin];
}
void IOSSurfaceGL::PrerollCompositeEmbeddedView(int view_id) {
......@@ -111,7 +112,10 @@ bool IOSSurfaceGL::SubmitFrame(GrContext* context) {
if (platform_views_controller == nullptr) {
return true;
}
return platform_views_controller->SubmitFrame(true, std::move(context), context_);
bool submitted = platform_views_controller->SubmitFrame(true, std::move(context), context_);
[CATransaction commit];
return submitted;
}
} // namespace shell
......@@ -46,7 +46,7 @@ class IOSSurfaceSoftware final : public IOSSurface,
flow::ExternalViewEmbedder* GetExternalViewEmbedder() override;
// |flow::ExternalViewEmbedder|
void SetFrameSize(SkISize frame_size) override;
void BeginFrame(SkISize frame_size) override;
// |flow::ExternalViewEmbedder|
void PrerollCompositeEmbeddedView(int view_id) override;
......
......@@ -134,7 +134,7 @@ flow::ExternalViewEmbedder* IOSSurfaceSoftware::GetExternalViewEmbedder() {
}
}
void IOSSurfaceSoftware::SetFrameSize(SkISize frame_size) {
void IOSSurfaceSoftware::BeginFrame(SkISize frame_size) {
FlutterPlatformViewsController* platform_views_controller = GetPlatformViewsController();
FML_CHECK(platform_views_controller != nullptr);
platform_views_controller->SetFrameSize(frame_size);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册