diff --git a/engine/src/flutter/compositor/BUILD.gn b/engine/src/flutter/compositor/BUILD.gn index be370a8b83..575593e45f 100644 --- a/engine/src/flutter/compositor/BUILD.gn +++ b/engine/src/flutter/compositor/BUILD.gn @@ -38,6 +38,7 @@ static_library("compositor") { "//mojo/services/public/interfaces/surfaces:surface_id", "//mojo/skia", "//skia", + "//sky/scheduler", "//ui/gfx/geometry", ] } diff --git a/engine/src/flutter/compositor/layer_host.cc b/engine/src/flutter/compositor/layer_host.cc index 2cd2de038c..a00dbd98c1 100644 --- a/engine/src/flutter/compositor/layer_host.cc +++ b/engine/src/flutter/compositor/layer_host.cc @@ -4,6 +4,7 @@ #include "sky/compositor/layer_host.h" +#include "base/message_loop/message_loop.h" #include "mojo/converters/geometry/geometry_type_converters.h" #include "mojo/gpu/gl_context.h" #include "mojo/services/public/cpp/surfaces/surfaces_utils.h" @@ -17,13 +18,17 @@ LayerHost::LayerHost(LayerHostClient* client) surface_holder_(this, client->GetShell()), gl_context_(mojo::GLContext::Create(client->GetShell())), ganesh_context_(gl_context_), - resource_manager_(gl_context_) { + resource_manager_(gl_context_), + scheduler_(this, base::MessageLoop::current()->task_runner()) { + scheduler_.UpdateVSync( + TimeInterval(base::TimeTicks(), base::TimeDelta::FromSecondsD(1.0 / 60))); } LayerHost::~LayerHost() { } void LayerHost::SetNeedsAnimate() { + scheduler_.SetNeedsFrame(); } void LayerHost::SetRootLayer(scoped_refptr layer) { @@ -32,12 +37,6 @@ void LayerHost::SetRootLayer(scoped_refptr layer) { root_layer_->set_host(this); } -void LayerHost::OnReadyForNextFrame() { - client_->BeginFrame(); - root_layer_->Display(); - Upload(root_layer_.get()); -} - void LayerHost::OnSurfaceIdAvailable(mojo::SurfaceIdPtr surface_id) { client_->OnSurfaceIdAvailable(surface_id.Pass()); } @@ -47,6 +46,13 @@ void LayerHost::ReturnResources( resource_manager_.ReturnResources(resources.Pass()); } +void LayerHost::BeginFrame(base::TimeTicks frame_time, + base::TimeTicks deadline) { + client_->BeginFrame(frame_time); + root_layer_->Display(); + Upload(root_layer_.get()); +} + void LayerHost::Upload(Layer* layer) { gfx::Size size = layer->size(); surface_holder_.SetSize(size); diff --git a/engine/src/flutter/compositor/layer_host.h b/engine/src/flutter/compositor/layer_host.h index d559cdfaba..197ff9a9e8 100644 --- a/engine/src/flutter/compositor/layer_host.h +++ b/engine/src/flutter/compositor/layer_host.h @@ -11,13 +11,14 @@ #include "sky/compositor/layer_host_client.h" #include "sky/compositor/resource_manager.h" #include "sky/compositor/surface_holder.h" +#include "sky/scheduler/scheduler.h" namespace sky { class ResourceManager; class Layer; class LayerHostClient; -class LayerHost : public SurfaceHolder::Client { +class LayerHost : public SurfaceHolder::Client, public Scheduler::Client { public: explicit LayerHost(LayerHostClient* client); ~LayerHost(); @@ -41,11 +42,14 @@ class LayerHost : public SurfaceHolder::Client { private: // SurfaceHolder::Client - void OnReadyForNextFrame() override; void OnSurfaceIdAvailable(mojo::SurfaceIdPtr surface_id) override; void ReturnResources( mojo::Array resources) override; + // Scheduler::Client + void BeginFrame(base::TimeTicks frame_time, + base::TimeTicks deadline) override; + void Upload(Layer* layer); LayerHostClient* client_; @@ -53,6 +57,7 @@ class LayerHost : public SurfaceHolder::Client { base::WeakPtr gl_context_; mojo::GaneshContext ganesh_context_; ResourceManager resource_manager_; + Scheduler scheduler_; scoped_refptr root_layer_; diff --git a/engine/src/flutter/compositor/layer_host_client.h b/engine/src/flutter/compositor/layer_host_client.h index c0d2c2ccac..22a79e1f5d 100644 --- a/engine/src/flutter/compositor/layer_host_client.h +++ b/engine/src/flutter/compositor/layer_host_client.h @@ -5,6 +5,7 @@ #ifndef SKY_COMPOSITOR_LAYER_HOST_CLIENT_H_ #define SKY_COMPOSITOR_LAYER_HOST_CLIENT_H_ +#include "base/time/time.h" #include "mojo/services/public/interfaces/surfaces/surface_id.mojom.h" namespace mojo { @@ -16,7 +17,7 @@ namespace sky { class LayerHostClient { public: virtual mojo::Shell* GetShell() = 0; - virtual void BeginFrame() = 0; + virtual void BeginFrame(base::TimeTicks frame_time) = 0; virtual void OnSurfaceIdAvailable(mojo::SurfaceIdPtr surface_id) = 0; protected: diff --git a/engine/src/flutter/compositor/surface_holder.cc b/engine/src/flutter/compositor/surface_holder.cc index 52741fd698..5288efa517 100644 --- a/engine/src/flutter/compositor/surface_holder.cc +++ b/engine/src/flutter/compositor/surface_holder.cc @@ -5,6 +5,7 @@ #include "sky/compositor/surface_holder.h" #include "base/bind.h" +#include "base/message_loop/message_loop.h" #include "mojo/converters/geometry/geometry_type_converters.h" #include "mojo/public/cpp/application/connect.h" #include "mojo/public/interfaces/application/shell.mojom.h" @@ -58,7 +59,6 @@ void SurfaceHolder::ReturnResources( if (!resources.size()) return; client_->ReturnResources(resources.Pass()); - client_->OnReadyForNextFrame(); } void SurfaceHolder::OnSurfaceConnectionCreated(mojo::SurfacePtr surface, @@ -66,8 +66,6 @@ void SurfaceHolder::OnSurfaceConnectionCreated(mojo::SurfacePtr surface, surface_ = surface.Pass(); surface_.set_client(this); surface_allocator_.reset(new SurfaceAllocator(id_namespace)); - - client_->OnReadyForNextFrame(); } } // namespace sky diff --git a/engine/src/flutter/compositor/surface_holder.h b/engine/src/flutter/compositor/surface_holder.h index ee352edb4c..3ff3703cac 100644 --- a/engine/src/flutter/compositor/surface_holder.h +++ b/engine/src/flutter/compositor/surface_holder.h @@ -23,7 +23,6 @@ class SurfaceHolder : public mojo::SurfaceClient { public: class Client { public: - virtual void OnReadyForNextFrame() = 0; virtual void OnSurfaceIdAvailable(mojo::SurfaceIdPtr surface_id) = 0; virtual void ReturnResources( mojo::Array resources) = 0;