Chromium Code Reviews| Index: cc/scheduler/frame_source.h |
| diff --git a/cc/scheduler/frame_source.h b/cc/scheduler/frame_source.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..e59dac3537c08267663a22788fd9293e32762c42 |
| --- /dev/null |
| +++ b/cc/scheduler/frame_source.h |
| @@ -0,0 +1,241 @@ |
| +// 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. |
| + |
| +#ifndef CC_SCHEDULER_FRAME_SOURCE_H_ |
| +#define CC_SCHEDULER_FRAME_SOURCE_H_ |
| + |
| +#include <set> |
| +#include <string> |
| + |
| +#include "base/debug/trace_event.h" |
| +#include "base/logging.h" |
| +#include "cc/output/begin_frame_args.h" |
| +#include "cc/scheduler/delay_based_time_source.h" |
| +#include "ui/compositor/compositor_vsync_manager.h" |
| +#include "ui/gfx/frame_time.h" |
| + |
| +namespace cc { |
| + |
| +/** |
| + * |
| + */ |
| +class CC_EXPORT VSyncObserverImpl |
|
brianderson
2014/09/13 01:38:12
Maybe call this VSyncParameterObserver so it's cle
|
| + : public ui::CompositorVSyncManager::Observer { |
| + public: |
| + VSyncObserverImpl(base::TimeTicks initial_vsync_timebase, |
| + base::TimeDelta initial_vsync_interval); |
| + virtual ~VSyncObserverImpl(); |
| + |
| + virtual void OnUpdateVSyncParameters( |
| + base::TimeTicks new_vsync_timebase, |
| + base::TimeDelta new_vsync_interval) OVERRIDE; |
| + |
| + virtual base::TimeTicks VSyncTimebase() const; |
| + virtual base::TimeDelta VSyncInterval() const; |
| + |
| + // Tracing support |
| + virtual void AsValueInto(base::debug::TracedValue* dict) const; |
| + |
| + protected: |
| + virtual void OnTimeBaseAndIntervalChange( |
| + const base::TimeTicks new_vsync_timebase, |
| + const base::TimeDelta new_vsync_interval) {} |
| + |
| + private: |
| + base::TimeTicks vsync_timebase_; |
| + base::TimeDelta vsync_interval_; |
| +}; |
| + |
| +/** |
| + * |
| + */ |
| +class CC_EXPORT BeginFrameObserver { |
| + public: |
| + virtual const BeginFrameArgs& LastBeginFrameArgs() const = 0; |
| + virtual void OnBeginFrame(const BeginFrameArgs& args) = 0; |
| + |
| + // Tracing support |
| + virtual void AsValueInto(base::debug::TracedValue* dict) const = 0; |
| +}; |
| + |
| +/* Allows multiple observers to be connected to a single BeginFrameSource. |
| +class MultiBeginFrameObserver : public BeginFrameObserver { |
| + public: |
| + void AddObserver(BeginFrameObserver* obs) OVERRIDE { |
| + observer_list_.AddObserver(obs); |
| + } |
| + void RemoveObserver(BeginFrameObserver* obs) OVERRIDE { |
| + observer_list_.RemoveObserver(obs); |
| + } |
| + |
| + virtual void OnBeginFrame(const BeginFrameArgs& args) OVERRIDE { |
| + FOR_EACH_OBSERVER(BeginFrameObserver, observer_list_, OnBeginFrame(args)); |
| + } |
| + private: |
| + ObserverList<BeginFrameObserver> observer_list_; |
| +}; |
| +*/ |
| + |
| +/** |
| + * |
| + */ |
| +class CC_EXPORT BeginFrameSource { |
|
brianderson
2014/09/13 01:38:12
Would it make sense to split this into a BeginFram
|
| + public: |
| + virtual ~BeginFrameSource() {} |
| + |
| + // Should the frame source be sending begin frames? |
| + virtual bool NeedsBeginFrames() = 0; |
| + virtual void SetNeedsBeginFrames(bool needs_begin_frames) = 0; |
| + // This method provides backpressure to a frame source rather then toggling |
| + // SetGenerateFrames. It is used by systems like the BackToBackFrameSource to |
| + // make sure only one frame is pending at a time. |
| + virtual void FinishedFrame(size_t remaining_frames) = 0; |
| + |
| + void AddObserver(BeginFrameObserver* obs); |
| + void RemoveObserver(BeginFrameObserver* obs); |
| + |
| + // Tracing support |
| + virtual void AsValueInto(base::debug::TracedValue* dict) const = 0; |
| + |
| + protected: |
| + void SendBeginFrame(const BeginFrameArgs& args); |
| + BeginFrameObserver* observer_ = NULL; |
| +}; |
| + |
| +/** |
| + * A frame source which throttles down another begin frame source. |
| + */ |
| +class CC_EXPORT ThrottledBeginFrameSource : public BeginFrameSource, |
|
brianderson
2014/09/13 01:38:13
Let's keep this class out of this patch and add it
|
| + public BeginFrameObserver { |
| + public: |
| + static scoped_ptr<ThrottledBeginFrameSource> Create(base::TimeDelta interval); |
| + virtual ~ThrottledBeginFrameSource(); |
| + |
| + void SetMinimumInterval(base::TimeDelta new_minimum_interval); |
| + virtual void AddSource(BeginFrameSource* new_source); |
| + virtual void RemoveSource(BeginFrameSource* new_source); |
| + |
| + // BeginFrameObserver |
| + virtual void OnBeginFrame(const BeginFrameArgs& args) OVERRIDE; |
| + virtual const BeginFrameArgs& LastBeginFrameArgs() const OVERRIDE; |
| + |
| + // BeginFrameSource |
| + virtual bool NeedsBeginFrames() OVERRIDE; |
| + virtual void SetNeedsBeginFrames(bool needs_begin_frames) OVERRIDE; |
| + virtual void FinishedFrame(size_t remaining_frames) OVERRIDE; |
| + |
| + // Tracing |
| + virtual void AsValueInto(base::debug::TracedValue* dict) const OVERRIDE; |
| + |
| + protected: |
| + explicit ThrottledBeginFrameSource(base::TimeDelta interval); |
| + |
| + base::TimeDelta minimum_interval_; |
| + BeginFrameSource* source_; |
| +}; |
| + |
| +/** |
| + * A frame source which sends a BeginFrame as soon as remaining frames reaches |
| + * zero. |
| + */ |
| +class CC_EXPORT BackToBackBeginFrameSource : public BeginFrameSource { |
| + public: |
| + static scoped_ptr<BackToBackBeginFrameSource> Create( |
| + base::SingleThreadTaskRunner* task_runner); |
| + virtual ~BackToBackBeginFrameSource(); |
| + |
| + virtual void SendBeginFrameArgs(); |
| + |
| + // BeginFrameSource |
| + virtual bool NeedsBeginFrames() OVERRIDE; |
| + virtual void SetNeedsBeginFrames(bool needs_begin_frames) OVERRIDE; |
| + virtual void FinishedFrame(size_t remaining_frames) OVERRIDE; |
| + |
| + // Tracing |
| + virtual void AsValueInto(base::debug::TracedValue* dict) const OVERRIDE; |
| + |
| + protected: |
| + explicit BackToBackBeginFrameSource( |
| + base::SingleThreadTaskRunner* task_runner); |
| + virtual base::TimeTicks Now(); // Now overridable for testing |
| + |
| + base::WeakPtrFactory<BackToBackBeginFrameSource> weak_factory_; |
| + base::SingleThreadTaskRunner* task_runner_; |
| + |
| + bool needs_begin_frames_; |
| + bool send_begin_frame_posted_; |
| + |
| + void ScheduleSendBeginFrameArgs(); |
| +}; |
| + |
| +/** |
| + * A frame source which is locked an external vsync source and generates |
| + * BeginFrameArgs for it. |
| + */ |
| +class CC_EXPORT SyntheticBeginFrameSource : public BeginFrameSource, |
| + public VSyncObserverImpl, |
| + public TimeSourceClient { |
| + public: |
| + static scoped_ptr<SyntheticBeginFrameSource> Create( |
| + base::SingleThreadTaskRunner* task_runner, |
| + base::TimeDelta initial_vsync_interval); |
| + virtual ~SyntheticBeginFrameSource(); |
| + |
| + // TimeSourceClient |
| + virtual void OnTimerTick() OVERRIDE; |
| + |
| + // BeginFrameSource |
| + virtual bool NeedsBeginFrames() OVERRIDE; |
| + virtual void SetNeedsBeginFrames(bool needs_begin_frames) OVERRIDE; |
| + virtual void FinishedFrame(size_t remaining_frames) OVERRIDE{}; |
| + |
| + // Tracing |
| + virtual void AsValueInto(base::debug::TracedValue* dict) const OVERRIDE; |
| + |
| + protected: |
| + SyntheticBeginFrameSource(scoped_refptr<DelayBasedTimeSource> time_source, |
| + base::TimeTicks initial_vsync_timebase, |
| + base::TimeDelta initial_vsync_interval); |
| + |
| + virtual void OnTimeBaseAndIntervalChange( |
| + const base::TimeTicks new_vsync_timebase, |
| + const base::TimeDelta new_vsync_interval) OVERRIDE; |
| + |
| + void SendBeginFrameFromTick(base::TimeTicks frame_time); |
| + |
| + scoped_refptr<DelayBasedTimeSource> time_source_; |
| +}; |
| + |
| +/** |
| + * A virtual frame source which lets you switch between multiple other frame |
| + * sources while making sure the BeginFrameArgs stays increasing (possibly |
| + * enforcing minimum boundry between BeginFrameArgs messages). |
| + */ |
| +class CC_EXPORT BeginFrameSourceMultiplexer : public ThrottledBeginFrameSource { |
| + public: |
| + static scoped_ptr<BeginFrameSourceMultiplexer> Create(); |
| + virtual ~BeginFrameSourceMultiplexer(); |
| + |
| + void SetActiveSource(BeginFrameSource* new_source); |
| + const BeginFrameSource* ActiveSource(); |
| + |
| + // ThrottledBeginFrameSource |
| + virtual void AddSource(BeginFrameSource* new_source) OVERRIDE; |
| + virtual void RemoveSource(BeginFrameSource* existing_source) OVERRIDE; |
| + |
| + // Tracing |
| + virtual void AsValueInto(base::debug::TracedValue* dict) const OVERRIDE; |
| + |
| + protected: |
| + BeginFrameSourceMultiplexer(); |
| + explicit BeginFrameSourceMultiplexer(base::TimeDelta minimum_interval); |
| + |
| + private: |
| + bool HasSource(BeginFrameSource* source); |
| + std::set<BeginFrameSource*> source_list_; |
| +}; |
| + |
| +} // namespace cc |
| + |
| +#endif // CC_SCHEDULER_FRAME_SOURCE_H_ |