1212
1313namespace shell {
1414
15- Animator::Animator (ftl::WeakPtr<Rasterizer> rasterizer, Engine* engine)
15+ Animator::Animator (ftl::WeakPtr<Rasterizer> rasterizer,
16+ VsyncWaiter* waiter,
17+ Engine* engine)
1618 : rasterizer_(rasterizer),
19+ waiter_ (waiter),
1720 engine_(engine),
1821 layer_tree_pipeline_(ftl::MakeRefCounted<LayerTreePipeline>(3 )),
1922 pending_frame_semaphore_(1 ),
2023 paused_(false ),
21- weak_factory_(this ) {
22- new sky::services::vsync::VsyncProviderFallbackImpl (
23- mojo::InterfaceRequest<::vsync::VSyncProvider>(
24- mojo::GetProxy (&fallback_vsync_provider_)));
25- }
24+ weak_factory_(this ) {}
2625
2726Animator::~Animator () = default ;
2827
@@ -39,7 +38,7 @@ void Animator::Start() {
3938 RequestFrame ();
4039}
4140
42- void Animator::BeginFrame (int64_t time_stamp ) {
41+ void Animator::BeginFrame (ftl::TimePoint frame_time ) {
4342 pending_frame_semaphore_.Signal ();
4443
4544 if (!producer_continuation_) {
@@ -63,6 +62,8 @@ void Animator::BeginFrame(int64_t time_stamp) {
6362 // to service potential frame.
6463 DCHECK (producer_continuation_);
6564
65+ // TODO(abarth): We should use |frame_time| instead, but the frame time we get
66+ // on Android appears to be unstable.
6667 last_begin_frame_time_ = ftl::TimePoint::Now ();
6768 engine_->BeginFrame (last_begin_frame_time_);
6869}
@@ -92,7 +93,7 @@ void Animator::RequestFrame() {
9293
9394 if (!pending_frame_semaphore_.TryWait ()) {
9495 // Multiple calls to Animator::RequestFrame will still result in a single
95- // request to the VSyncProvider .
96+ // request to the VsyncWaiter .
9697 return ;
9798 }
9899
@@ -107,30 +108,16 @@ void Animator::RequestFrame() {
107108 if (!self.get ())
108109 return ;
109110 TRACE_EVENT_INSTANT0 (" flutter" , " RequestFrame" , TRACE_EVENT_SCOPE_PROCESS );
110- self->AwaitVSync (base::Bind (&Animator::BeginFrame, self) );
111+ self->AwaitVSync ();
111112 });
112113}
113114
114- void Animator::set_vsync_provider (vsync::VSyncProviderPtr vsync_provider) {
115- vsync_provider_ = vsync_provider.Pass ();
116-
117- // We may be waiting on a VSync signal from the old VSync provider.
118- pending_frame_semaphore_.Signal ();
119-
120- RequestFrame ();
121- }
122-
123- void Animator::AwaitVSync (
124- const vsync::VSyncProvider::AwaitVSyncCallback& callback) {
125- // First, try the platform provided VSync provider.
126- if (vsync_provider_) {
127- vsync_provider_->AwaitVSync (callback);
128- return ;
129- }
130-
131- // Then, use the fallback provider if the platform cannot reliably supply
132- // VSync signals to us.
133- return fallback_vsync_provider_->AwaitVSync (callback);
115+ void Animator::AwaitVSync () {
116+ waiter_->AsyncWaitForVsync ([self = weak_factory_.GetWeakPtr ()](
117+ ftl::TimePoint frame_time) {
118+ if (self)
119+ self->BeginFrame (frame_time);
120+ });
134121}
135122
136123} // namespace shell
0 commit comments