compositor_vsync_manager.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ui/compositor/compositor_vsync_manager.h"
6
7namespace ui {
8
9CompositorVSyncManager::CompositorVSyncManager()
10    : observer_list_(new ObserverListThreadSafe<Observer>()),
11      authoritative_vsync_interval_(base::TimeDelta::FromSeconds(0)) {}
12
13CompositorVSyncManager::~CompositorVSyncManager() {}
14
15void CompositorVSyncManager::SetAuthoritativeVSyncInterval(
16    base::TimeDelta interval) {
17  base::TimeTicks timebase;
18  {
19    base::AutoLock lock(vsync_parameters_lock_);
20    timebase = last_timebase_;
21    authoritative_vsync_interval_ = interval;
22    last_interval_ = interval;
23  }
24  NotifyObservers(timebase, interval);
25}
26
27void CompositorVSyncManager::UpdateVSyncParameters(base::TimeTicks timebase,
28                                                   base::TimeDelta interval) {
29  {
30    base::AutoLock lock(vsync_parameters_lock_);
31    if (authoritative_vsync_interval_ != base::TimeDelta::FromSeconds(0))
32      interval = authoritative_vsync_interval_;
33    last_timebase_ = timebase;
34    last_interval_ = interval;
35  }
36  NotifyObservers(timebase, interval);
37}
38
39void CompositorVSyncManager::AddObserver(Observer* observer) {
40  base::TimeTicks timebase;
41  base::TimeDelta interval;
42  {
43    base::AutoLock lock(vsync_parameters_lock_);
44    timebase = last_timebase_;
45    interval = last_interval_;
46  }
47  observer_list_->AddObserver(observer);
48  observer->OnUpdateVSyncParameters(timebase, interval);
49}
50
51void CompositorVSyncManager::RemoveObserver(Observer* observer) {
52  observer_list_->RemoveObserver(observer);
53}
54
55void CompositorVSyncManager::NotifyObservers(base::TimeTicks timebase,
56                                             base::TimeDelta interval) {
57  observer_list_->Notify(
58      &CompositorVSyncManager::Observer::OnUpdateVSyncParameters,
59      timebase,
60      interval);
61}
62
63}  // namespace ui
64