Chromium Code Reviews| Index: cc/scheduler/frame_source.h |
| diff --git a/cc/scheduler/frame_source.h b/cc/scheduler/frame_source.h |
| index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..770fcd8348016a087ebd1b9e8f43647196c069e8 100644 |
| --- a/cc/scheduler/frame_source.h |
| +++ b/cc/scheduler/frame_source.h |
| @@ -0,0 +1,220 @@ |
| +// 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 <string> |
|
brianderson
2014/06/17 06:24:43
Is this only needed for the TypeString? Can we jus
|
| + |
| +#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/gfx/frame_time.h" |
| + |
| +namespace cc { |
| + |
| +class CC_EXPORT BeginFrameSink { |
| + public: |
| + virtual void BeginFrame(const BeginFrameArgs& args) = 0; |
| +}; |
| + |
| +class CC_EXPORT BeginFrameSource { |
| + public: |
| + virtual void SetBeginFrameSink(BeginFrameSink* sink) = 0; |
| + virtual BeginFrameSink* GetBeginFrameSink() const = 0; |
|
brianderson
2014/06/17 06:24:43
Is GetBeginFrameSink needed for anything? Can we g
|
| + |
| + virtual void SetGenerateFrames(bool generate_frames) = 0; |
|
brianderson
2014/06/17 06:24:42
Good idea using the 's' to signify a level request
|
| + virtual bool IsGeneratingFrames() const = 0; |
| + // This method allows a more grandular frame sink to provide 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 PendingFrames(size_t count) = 0; |
|
brianderson
2014/06/17 06:24:42
I think the unthrottled BeginFrame source is reall
|
| + |
| + virtual void SetTimeBaseAndInterval(base::TimeTicks timebase, |
| + base::TimeDelta interval) = 0; |
| + virtual base::TimeTicks TimeBase() const = 0; |
| + virtual base::TimeDelta Interval() const = 0; |
|
brianderson
2014/06/17 06:24:42
Not all BeginFrameSources necessarily need a TimeB
|
| + |
| + virtual scoped_ptr<base::Value> BeginFrameSourceAsValue() const = 0; |
| + |
| + virtual ~BeginFrameSource() {} |
| +}; |
| + |
| +class CC_EXPORT BaseBeginFrameSource : public BeginFrameSource { |
|
brianderson
2014/06/17 06:24:42
This BaseBeginFrameSource makes understanding the
|
| + public: |
| + virtual void SetBeginFrameSink(BeginFrameSink* sink) OVERRIDE; |
| + virtual BeginFrameSink* GetBeginFrameSink() const OVERRIDE; |
| + |
| + virtual void SetGenerateFrames(bool generate_frames) OVERRIDE; |
| + virtual bool IsGeneratingFrames() const OVERRIDE; |
| + virtual void PendingFrames(size_t count) OVERRIDE; |
| + |
| + virtual void SetTimeBaseAndInterval(base::TimeTicks timebase, |
| + base::TimeDelta interval) OVERRIDE; |
| + virtual base::TimeTicks TimeBase() const OVERRIDE; |
| + virtual base::TimeDelta Interval() const OVERRIDE; |
| + |
| + virtual scoped_ptr<base::Value> BeginFrameSourceAsValue() const OVERRIDE; |
| + |
| + virtual ~BaseBeginFrameSource() {} |
| + |
| + protected: |
| + BeginFrameSink* frame_sink_; |
| + bool generate_frames_; |
| + base::TimeTicks timebase_; |
| + base::TimeDelta interval_; |
|
simonhong
2014/06/12 13:47:39
Variable declaration should be followed by Method
|
| + |
| + explicit BaseBeginFrameSource(BeginFrameSink* sink); |
| + |
| + virtual std::string TypeString() const = 0; |
| + virtual void ExtraAsValue(base::DictionaryValue* state) const {} |
| + virtual void OnGenerateChange(bool generate_frames) {} |
| + virtual void OnPendingFrames(size_t count) {} |
| + virtual void OnTimeBaseAndIntervalChange(const base::TimeTicks timebase, |
| + const base::TimeDelta interval) {} |
| +}; |
| + |
| +/** |
| + * A frame source which proxies to / from a frame source we don't take |
| + * ownership of. |
| + */ |
|
simonhong
2014/06/12 13:47:39
How about using // instead of /* */?
Style guide s
|
| +class CC_EXPORT ProxyBeginFrameSource : public BaseBeginFrameSource, |
|
brianderson
2014/06/17 06:24:43
I understand the desire to have the DualBeginFrame
|
| + public BeginFrameSink { |
| + public: |
| + // TODO(mithro): This should probably be a weakptr to the frame source |
| + // rather then a raw pointer. |
| + ProxyBeginFrameSource(BeginFrameSink* sink, BeginFrameSource* source); |
| + |
| + virtual void BeginFrame(const BeginFrameArgs& args) OVERRIDE; |
| + |
| + protected: |
| + BeginFrameSource* source_; |
| + |
| + // BaseBeginFrameSource |
| + virtual std::string TypeString() const OVERRIDE; |
| + virtual void ExtraAsValue(base::DictionaryValue* state) const OVERRIDE; |
| + virtual void OnGenerateChange(bool generate_frames) OVERRIDE; |
| + virtual void OnPendingFrames(size_t count) OVERRIDE; |
| + virtual void OnTimeBaseAndIntervalChange( |
| + const base::TimeTicks timebase, |
| + const base::TimeDelta interval) OVERRIDE; |
| +}; |
| + |
| +/** |
| + * A frame source which throttles down another begin frame source. |
| + */ |
| +class CC_EXPORT ThrottledBeginFrameSource : public ProxyBeginFrameSource { |
| + public: |
| + ThrottledBeginFrameSource(BeginFrameSink* sink, |
| + BeginFrameSource* source, |
| + base::TimeDelta interval); |
| + |
| + // BeginFrameSink |
| + virtual void BeginFrame(const BeginFrameArgs& args) OVERRIDE; |
| + |
| + private: |
| + BeginFrameArgs last_frame_args_; |
| + |
| + // BaseBeginFrameSource |
| + virtual std::string TypeString() const OVERRIDE; |
| + virtual void ExtraAsValue(base::DictionaryValue* state) const OVERRIDE; |
| +}; |
| + |
| +/** |
| + * A frame source which sends a BeginFrame as soon as pending frames reaches |
| + * zero. |
| + */ |
| +class CC_EXPORT BackToBackBeginFrameSource : public BaseBeginFrameSource { |
| + public: |
| + BackToBackBeginFrameSource(BeginFrameSink* sink, |
| + base::SingleThreadTaskRunner* task_runner); |
| + virtual ~BackToBackBeginFrameSource(); |
| + |
| + virtual void SendBeginFrameArgs(); |
| + |
| + protected: |
| + base::WeakPtrFactory<BackToBackBeginFrameSource> weak_factory_; |
| + base::SingleThreadTaskRunner* task_runner_; |
| + bool send_begin_frame_posted_; |
| + |
| + void ScheduleSendBeginFrameArgs(); |
| + |
| + // BaseBeginFrameSource |
| + virtual std::string TypeString() const OVERRIDE; |
| + virtual void ExtraAsValue(base::DictionaryValue* state) const OVERRIDE; |
| + virtual void OnGenerateChange(bool generate_frames) OVERRIDE; |
| + virtual void OnPendingFrames(size_t count) OVERRIDE; |
| +}; |
| + |
| +/** |
| + * A frame source which is locked an external vsync source and generates |
| + * BeginFrameArgs for it. |
| + */ |
| +class CC_EXPORT SyntheticBeginFrameSource : public BaseBeginFrameSource, |
| + public TimeSourceClient { |
| + public: |
| + SyntheticBeginFrameSource(BeginFrameSink* sink, |
| + base::SingleThreadTaskRunner* task_runner, |
| + base::TimeDelta interval); |
| + virtual ~SyntheticBeginFrameSource(); |
| + |
| + virtual void OnTimerTick() OVERRIDE; |
| + |
| + protected: |
| + base::SingleThreadTaskRunner* task_runner_; |
| + scoped_refptr<DelayBasedTimeSource> time_source_; |
| + |
| + BeginFrameArgs CreateBeginFrameArgs(base::TimeTicks frame_time); |
| + |
| + // BaseBeginFrameSource |
| + virtual std::string TypeString() const OVERRIDE; |
| + virtual void ExtraAsValue(base::DictionaryValue* state) const OVERRIDE; |
| + virtual void OnGenerateChange(bool generate_frames) OVERRIDE; |
| + virtual void OnTimeBaseAndIntervalChange( |
| + const base::TimeTicks timebase, |
| + const base::TimeDelta interval) OVERRIDE; |
| +}; |
| + |
| +/** |
| + * A virtual frame source which lets you switch between two other frame sources |
| + * (making sure the BeginFrameArgs stays monotonic). |
| + */ |
| +class CC_EXPORT DualBeginFrameSource : public BaseBeginFrameSource, |
|
brianderson
2014/06/17 06:24:43
Do we need this class anymore since the background
|
| + public BeginFrameSink { |
| + public: |
| + DualBeginFrameSource(BeginFrameSink* sink, |
| + scoped_ptr<BeginFrameSource> source_primary, |
| + scoped_ptr<BeginFrameSource> source_secondary); |
|
simonhong
2014/06/12 13:47:39
How about foreground_source and background_source?
|
| + virtual ~DualBeginFrameSource(); |
| + |
| + // BeginFrameSink |
| + virtual void BeginFrame(const BeginFrameArgs& args) OVERRIDE; |
| + |
| + // --------------------------------------------------------------------- |
| + |
| + void SwitchSource(const BeginFrameSource* new_source); |
| + const BeginFrameSource* SourceForeground() const; |
| + const BeginFrameSource* SourceBackground() const; |
|
simonhong
2014/06/12 13:47:39
How about ForegroundSource() and BackgroundSource(
|
| + |
| + private: |
| + BeginFrameArgs last_frame_args_; |
| + BeginFrameSource* active_source_; |
| + scoped_ptr<BeginFrameSource> source_foreground_; |
| + scoped_ptr<BeginFrameSource> source_background_; |
|
simonhong
2014/06/12 13:47:39
How about foreground_source_ and background_source
|
| + |
| + // BaseBeginFrameSource |
| + virtual std::string TypeString() const OVERRIDE; |
| + virtual void ExtraAsValue(base::DictionaryValue* state) const OVERRIDE; |
| + virtual void OnGenerateChange(bool generate_frames) OVERRIDE; |
| + virtual void OnPendingFrames(size_t count) OVERRIDE; |
| + virtual void OnTimeBaseAndIntervalChange( |
| + const base::TimeTicks timebase, |
| + const base::TimeDelta interval) OVERRIDE; |
| +}; |
| + |
| +} // namespace cc |
| + |
| +#endif // CC_SCHEDULER_FRAME_SOURCE_H_ |