Skip to content

Commit

Permalink
vsync_waiter_fallback should schedule firecallback for future (flutte…
Browse files Browse the repository at this point in the history
  • Loading branch information
iskakaushik authored and dnfield committed Oct 6, 2021
1 parent 0f2d2d3 commit 64b28b1
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 7 deletions.
9 changes: 6 additions & 3 deletions shell/common/vsync_waiter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@
#include "flow/frame_timings.h"
#include "flutter/fml/task_runner.h"
#include "flutter/fml/trace_event.h"
#include "fml/logging.h"
#include "fml/message_loop_task_queues.h"
#include "fml/task_queue_id.h"
#include "fml/time/time_point.h"

namespace flutter {

Expand Down Expand Up @@ -95,6 +97,8 @@ void VsyncWaiter::ScheduleSecondaryCallback(uintptr_t id,
void VsyncWaiter::FireCallback(fml::TimePoint frame_start_time,
fml::TimePoint frame_target_time,
bool pause_secondary_tasks) {
FML_DCHECK(fml::TimePoint::Now() >= frame_start_time);

Callback callback;
std::vector<fml::closure> secondary_callbacks;

Expand Down Expand Up @@ -137,7 +141,7 @@ void VsyncWaiter::FireCallback(fml::TimePoint frame_start_time,
ui_task_queue_id = task_runners_.GetUITaskRunner()->GetTaskQueueId();
}

task_runners_.GetUITaskRunner()->PostTaskForTime(
task_runners_.GetUITaskRunner()->PostTask(
[ui_task_queue_id, callback, flow_identifier, frame_start_time,
frame_target_time, pause_secondary_tasks]() {
FML_TRACE_EVENT("flutter", kVsyncTraceName, "StartTime",
Expand All @@ -151,8 +155,7 @@ void VsyncWaiter::FireCallback(fml::TimePoint frame_start_time,
if (pause_secondary_tasks) {
ResumeDartMicroTasks(ui_task_queue_id);
}
},
frame_start_time);
});
}

for (auto& secondary_callback : secondary_callbacks) {
Expand Down
2 changes: 2 additions & 0 deletions shell/common/vsync_waiter.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ class VsyncWaiter : public std::enable_shared_from_this<VsyncWaiter> {
// as AwaitVSync().
virtual void AwaitVSyncForSecondaryCallback() { AwaitVSync(); }

// Schedules the callback on the UI task runner. Needs to be invoked as close
// to the `frame_start_time` as possible.
void FireCallback(fml::TimePoint frame_start_time,
fml::TimePoint frame_target_time,
bool pause_secondary_tasks = true);
Expand Down
20 changes: 16 additions & 4 deletions shell/common/vsync_waiter_fallback.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@

#include "flutter/shell/common/vsync_waiter_fallback.h"

#include <memory>

#include "flutter/fml/logging.h"
#include "flutter/fml/message_loop.h"
#include "flutter/fml/trace_event.h"

namespace flutter {
Expand Down Expand Up @@ -35,11 +38,20 @@ void VsyncWaiterFallback::AwaitVSync() {

constexpr fml::TimeDelta kSingleFrameInterval =
fml::TimeDelta::FromSecondsF(1.0 / 60.0);

auto next =
auto frame_start_time =
SnapToNextTick(fml::TimePoint::Now(), phase_, kSingleFrameInterval);

FireCallback(next, next + kSingleFrameInterval, !for_testing_);
auto frame_target_time = frame_start_time + kSingleFrameInterval;
std::weak_ptr<VsyncWaiterFallback> weak_this =
std::static_pointer_cast<VsyncWaiterFallback>(shared_from_this());

task_runners_.GetUITaskRunner()->PostTaskForTime(
[frame_start_time, frame_target_time, weak_this]() {
if (auto vsync_waiter = weak_this.lock()) {
vsync_waiter->FireCallback(frame_start_time, frame_target_time,
!vsync_waiter->for_testing_);
}
},
frame_start_time);
}

} // namespace flutter

0 comments on commit 64b28b1

Please sign in to comment.