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(); |