From e9121df3bb91103f4cbc8b274b2466fc0dbe9c13 Mon Sep 17 00:00:00 2001 From: Chinmay Garde Date: Fri, 19 Aug 2016 12:52:54 -0700 Subject: [PATCH] Make the animator host an implicit fallback VSync provider in case platforms cant provide their own. (#2953) --- services/vsync/BUILD.gn | 31 +++++++++++++++++-------------- sky/shell/BUILD.gn | 7 ++++--- sky/shell/ui/animator.cc | 21 +++++++++++++++++++-- sky/shell/ui/animator.h | 4 ++++ 4 files changed, 44 insertions(+), 19 deletions(-) diff --git a/services/vsync/BUILD.gn b/services/vsync/BUILD.gn index 93d0fa16b..c019d815a 100644 --- a/services/vsync/BUILD.gn +++ b/services/vsync/BUILD.gn @@ -4,8 +4,22 @@ import("//mojo/public/tools/bindings/mojom.gni") +source_set("vsync_lib_fallback") { + sources = [ + "fallback/vsync_provider_fallback_impl.h", + "fallback/vsync_provider_fallback_impl.cc", + ] + + deps = [ + "//base:base", + "//mojo/public/cpp/application", + "//mojo/public/cpp/bindings:utility", + "//mojo/services/vsync/interfaces", + ] +} + group("vsync") { - deps = [ ":vsync_lib" ] + deps = [ ":vsync_lib", ":vsync_lib_fallback" ] } if (is_android) { @@ -54,18 +68,7 @@ if (is_android) { ] } } else { - # Fallback VSync (avoid if at all possible) - source_set("vsync_lib") { - sources = [ - "fallback/vsync_provider_fallback_impl.h", - "fallback/vsync_provider_fallback_impl.cc", - ] - - deps = [ - "//base:base", - "//mojo/public/cpp/application", - "//mojo/public/cpp/bindings:utility", - "//mojo/services/vsync/interfaces", - ] + group("vsync_lib") { + # Empty, will use fallbacks by default. } } diff --git a/sky/shell/BUILD.gn b/sky/shell/BUILD.gn index c6574156f..f84106da1 100644 --- a/sky/shell/BUILD.gn +++ b/sky/shell/BUILD.gn @@ -46,9 +46,8 @@ source_set("common") { ] public_deps = [ - ":generate_sky_embedder_diagnostic_server_resources_cc", - "//base:i18n", "//base", + "//base:i18n", "//build/config/sanitizers:deps", "//dart/runtime:libdart", "//flutter/assets", @@ -57,16 +56,17 @@ source_set("common") { "//flutter/glue", "//flutter/lib/ui", "//flutter/runtime", - "//flutter/synchronization", "//flutter/services/editing:interfaces", "//flutter/services/engine:interfaces", "//flutter/services/platform", "//flutter/services/pointer:interfaces", "//flutter/services/semantics:interfaces", + "//flutter/services/vsync:vsync_lib_fallback", "//flutter/skia", "//flutter/sky/engine", "//flutter/sky/engine/core:core", "//flutter/sky/engine/wtf", + "//flutter/synchronization", "//lib/ftl", "//lib/tonic", "//mojo/common", @@ -79,6 +79,7 @@ source_set("common") { "//mojo/services/gfx/composition/interfaces", "//mojo/services/navigation/interfaces", "//mojo/services/vsync/interfaces", + ":generate_sky_embedder_diagnostic_server_resources_cc", ] } diff --git a/sky/shell/ui/animator.cc b/sky/shell/ui/animator.cc index d719a1660..6b1e22eb1 100644 --- a/sky/shell/ui/animator.cc +++ b/sky/shell/ui/animator.cc @@ -18,7 +18,11 @@ Animator::Animator(Rasterizer* rasterizer, Engine* engine) layer_tree_pipeline_(ftl::MakeRefCounted(3)), pending_frame_semaphore_(1), paused_(false), - weak_factory_(this) {} + weak_factory_(this) { + new services::vsync::VsyncProviderFallbackImpl( + mojo::InterfaceRequest<::vsync::VSyncProvider>( + mojo::GetProxy(&fallback_vsync_provider_))); +} Animator::~Animator() = default; @@ -96,7 +100,7 @@ void Animator::RequestFrame() { DCHECK(weak->vsync_provider_) << "A VSync provider must be present to schedule a frame."; - weak->vsync_provider_->AwaitVSync(base::Bind(&Animator::BeginFrame, weak)); + weak->AwaitVSync(base::Bind(&Animator::BeginFrame, weak)); }); } @@ -105,5 +109,18 @@ void Animator::set_vsync_provider(vsync::VSyncProviderPtr vsync_provider) { RequestFrame(); } +void Animator::AwaitVSync( + const vsync::VSyncProvider::AwaitVSyncCallback& callback) { + // First, try the platform provided VSync provider. + if (vsync_provider_) { + vsync_provider_->AwaitVSync(callback); + return; + } + + // Then, use the fallback provider if the platform cannot reliably supply + // VSync signals to us. + return fallback_vsync_provider_->AwaitVSync(callback); +} + } // namespace shell } // namespace sky diff --git a/sky/shell/ui/animator.h b/sky/shell/ui/animator.h index 27281dbd2..fca206061 100644 --- a/sky/shell/ui/animator.h +++ b/sky/shell/ui/animator.h @@ -13,6 +13,7 @@ #include "lib/ftl/memory/ref_ptr.h" #include "lib/ftl/time/time_point.h" #include "mojo/services/vsync/interfaces/vsync.mojom.h" +#include "flutter/services/vsync/fallback/vsync_provider_fallback_impl.h" namespace sky { namespace shell { @@ -38,9 +39,12 @@ class Animator { void BeginFrame(int64_t time_stamp); + void AwaitVSync(const vsync::VSyncProvider::AwaitVSyncCallback& callback); + Rasterizer* rasterizer_; Engine* engine_; vsync::VSyncProviderPtr vsync_provider_; + vsync::VSyncProviderPtr fallback_vsync_provider_; ftl::RefPtr layer_tree_pipeline_; flutter::Semaphore pending_frame_semaphore_; std::unique_ptr renderable_tree_; -- GitLab