15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/compositor/compositor_vsync_manager.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace ui {
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)CompositorVSyncManager::CompositorVSyncManager()
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : observer_list_(new ObserverListThreadSafe<Observer>()),
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      authoritative_vsync_interval_(base::TimeDelta::FromSeconds(0)) {}
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)CompositorVSyncManager::~CompositorVSyncManager() {}
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CompositorVSyncManager::SetAuthoritativeVSyncInterval(
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::TimeDelta interval) {
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::TimeTicks timebase;
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::AutoLock lock(vsync_parameters_lock_);
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    timebase = last_timebase_;
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    authoritative_vsync_interval_ = interval;
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    last_interval_ = interval;
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NotifyObservers(timebase, interval);
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CompositorVSyncManager::UpdateVSyncParameters(base::TimeTicks timebase,
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                   base::TimeDelta interval) {
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::AutoLock lock(vsync_parameters_lock_);
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (authoritative_vsync_interval_ != base::TimeDelta::FromSeconds(0))
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      interval = authoritative_vsync_interval_;
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    last_timebase_ = timebase;
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    last_interval_ = interval;
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NotifyObservers(timebase, interval);
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CompositorVSyncManager::AddObserver(Observer* observer) {
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::TimeTicks timebase;
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::TimeDelta interval;
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::AutoLock lock(vsync_parameters_lock_);
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    timebase = last_timebase_;
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    interval = last_interval_;
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  observer_list_->AddObserver(observer);
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  observer->OnUpdateVSyncParameters(timebase, interval);
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CompositorVSyncManager::RemoveObserver(Observer* observer) {
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  observer_list_->RemoveObserver(observer);
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CompositorVSyncManager::NotifyObservers(base::TimeTicks timebase,
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                             base::TimeDelta interval) {
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  observer_list_->Notify(
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      &CompositorVSyncManager::Observer::OnUpdateVSyncParameters,
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      timebase,
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      interval);
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace ui
64