| Index: ui/accelerated_widget_mac/display_link_mac.cc
|
| diff --git a/ui/accelerated_widget_mac/display_link_mac.cc b/ui/accelerated_widget_mac/display_link_mac.cc
|
| index c9a30699a06fff31a5b8117c2cfb7f5d7b64e0c6..3013efb58e9469864717da37468c9117d2854ded 100644
|
| --- a/ui/accelerated_widget_mac/display_link_mac.cc
|
| +++ b/ui/accelerated_widget_mac/display_link_mac.cc
|
| @@ -27,6 +27,9 @@ namespace ui {
|
| // static
|
| scoped_refptr<DisplayLinkMac> DisplayLinkMac::GetForDisplay(
|
| CGDirectDisplayID display_id) {
|
| + if (!display_id)
|
| + return nullptr;
|
| +
|
| // Return the existing display link for this display, if it exists.
|
| DisplayMap::iterator found = display_map_.Get().find(display_id);
|
| if (found != display_map_.Get().end()) {
|
| @@ -105,6 +108,22 @@ bool DisplayLinkMac::GetVSyncParameters(
|
| return true;
|
| }
|
|
|
| +base::TimeTicks DisplayLinkMac::GetNextVSyncTimeAfter(
|
| + const base::TimeTicks& from, double interval_fraction) {
|
| + if (!timebase_and_interval_valid_) {
|
| + StartOrContinueDisplayLink();
|
| + return from;
|
| + }
|
| +
|
| + // Compute the previous vsync time.
|
| + base::TimeTicks previous_vsync =
|
| + interval_ * ((from - timebase_remainder_) / interval_) +
|
| + timebase_remainder_;
|
| +
|
| + // Return |interval_fraction| through the next vsync.
|
| + return previous_vsync + (1 + interval_fraction) * interval_;
|
| +}
|
| +
|
| void DisplayLinkMac::Tick(const CVTimeStamp& cv_time) {
|
| TRACE_EVENT0("ui", "DisplayLinkMac::Tick");
|
|
|
| @@ -123,6 +142,9 @@ void DisplayLinkMac::Tick(const CVTimeStamp& cv_time) {
|
| cv_time.hostTime / 1000);
|
| interval_ = base::TimeDelta::FromMicroseconds(
|
| 1000000 * static_cast<int64>(numerator) / denominator);
|
| + // Compute |timebase_remainder_| to be the first vsync after time zero.
|
| + timebase_remainder_ =
|
| + timebase_ - interval_ * ((timebase_ - base::TimeTicks()) / interval_);
|
| timebase_and_interval_valid_ = true;
|
|
|
| StopDisplayLink();
|
|
|