diff options
Diffstat (limited to 'chromium/ui/compositor/compositor_vsync_manager.cc')
-rw-r--r-- | chromium/ui/compositor/compositor_vsync_manager.cc | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/chromium/ui/compositor/compositor_vsync_manager.cc b/chromium/ui/compositor/compositor_vsync_manager.cc new file mode 100644 index 00000000000..1a10d4ad309 --- /dev/null +++ b/chromium/ui/compositor/compositor_vsync_manager.cc @@ -0,0 +1,63 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/compositor/compositor_vsync_manager.h" + +namespace ui { + +CompositorVSyncManager::CompositorVSyncManager() + : observer_list_(new ObserverListThreadSafe<Observer>()), + authoritative_vsync_interval_(base::TimeDelta::FromSeconds(0)) {} + +CompositorVSyncManager::~CompositorVSyncManager() {} + +void CompositorVSyncManager::SetAuthoritativeVSyncInterval( + base::TimeDelta interval) { + base::TimeTicks timebase; + { + base::AutoLock lock(vsync_parameters_lock_); + timebase = last_timebase_; + authoritative_vsync_interval_ = interval; + last_interval_ = interval; + } + NotifyObservers(timebase, interval); +} + +void CompositorVSyncManager::UpdateVSyncParameters(base::TimeTicks timebase, + base::TimeDelta interval) { + { + base::AutoLock lock(vsync_parameters_lock_); + if (authoritative_vsync_interval_ != base::TimeDelta::FromSeconds(0)) + interval = authoritative_vsync_interval_; + last_timebase_ = timebase; + last_interval_ = interval; + } + NotifyObservers(timebase, interval); +} + +void CompositorVSyncManager::AddObserver(Observer* observer) { + base::TimeTicks timebase; + base::TimeDelta interval; + { + base::AutoLock lock(vsync_parameters_lock_); + timebase = last_timebase_; + interval = last_interval_; + } + observer_list_->AddObserver(observer); + observer->OnUpdateVSyncParameters(timebase, interval); +} + +void CompositorVSyncManager::RemoveObserver(Observer* observer) { + observer_list_->RemoveObserver(observer); +} + +void CompositorVSyncManager::NotifyObservers(base::TimeTicks timebase, + base::TimeDelta interval) { + observer_list_->Notify( + &CompositorVSyncManager::Observer::OnUpdateVSyncParameters, + timebase, + interval); +} + +} // namespace ui |