Home | History | Annotate | Download | only in compositor
      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 
      7 namespace ui {
      8 
      9 CompositorVSyncManager::CompositorVSyncManager()
     10     : observer_list_(new ObserverListThreadSafe<Observer>()),
     11       authoritative_vsync_interval_(base::TimeDelta::FromSeconds(0)) {}
     12 
     13 CompositorVSyncManager::~CompositorVSyncManager() {}
     14 
     15 void 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 
     27 void 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 
     39 void 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 
     51 void CompositorVSyncManager::RemoveObserver(Observer* observer) {
     52   observer_list_->RemoveObserver(observer);
     53 }
     54 
     55 void 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