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..59978455fd6e736674d07d78011c0c739c3324a5 |
--- /dev/null |
+++ b/cc/scheduler/frame_source.h |
@@ -0,0 +1,202 @@ |
+// 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> |
+ |
+#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 FrameSink { |
brianderson
2014/05/07 17:20:16
Please rename this BeginFrameSink so we have consi
mithro-old
2014/05/07 23:42:28
Done.
|
+ public: |
+ virtual void BeginFrame(const BeginFrameArgs& args) = 0; |
+}; |
+ |
+class CC_EXPORT FrameSource { |
brianderson
2014/05/07 17:20:16
Please rename this BeginFrameSource.
mithro-old
2014/05/07 23:42:28
Done.
|
+ public: |
+ virtual void SetNeedsBeginFrame(bool needs_begin_frame) = 0; |
+ virtual void SetSink(FrameSink* sink) = 0; |
+ virtual void SetTimeBaseAndInterval(base::TimeTicks timebase, |
+ base::TimeDelta interval) = 0; |
+ |
+ virtual scoped_ptr<base::Value> FrameSourceAsValue() const = 0; |
+ virtual inline std::string FrameSourceType() const = 0; |
brianderson
2014/05/07 17:20:16
Is this for testing purposes? Can it be removed in
mithro-old
2014/05/07 22:02:32
Having which frame source is in use as part of the
|
+ virtual ~FrameSource() {} |
+}; |
+ |
+class CC_EXPORT BaseFrameSource : public FrameSource { |
brianderson
2014/05/07 17:20:16
I need to think about this a bit. But can you prov
mithro-old
2014/05/07 23:42:28
The code BaseFrameSource saves is a relatively sma
|
+ public: |
+ virtual void SetNeedsBeginFrame(bool needs_begin_frame) = 0; |
+ virtual void SetSink(FrameSink* sink) OVERRIDE; |
+ virtual void SetTimeBaseAndInterval(base::TimeTicks timebase, |
+ base::TimeDelta interval) OVERRIDE; |
+ virtual scoped_ptr<base::Value> FrameSourceAsValue() const OVERRIDE; |
+ |
+ virtual inline std::string FrameSourceType() const = 0; |
+ |
+ virtual ~BaseFrameSource() {} |
+ |
+ protected: |
+ base::TimeDelta interval_; |
+ |
+ scoped_ptr<base::DictionaryValue> BaseFrameSourceAsValue() const; |
+ virtual void SendBeginFrame(const BeginFrameArgs& args); |
+ |
+ explicit BaseFrameSource(FrameSink* sink); |
+ |
+ private: |
+ FrameSink* frame_sink_; |
+}; |
+ |
+/** |
+ * A frame source which proxies to / from a frame source we don't take |
+ * ownership of. |
+ */ |
+class CC_EXPORT ProxyFrameSource : public BaseFrameSource, public FrameSink { |
brianderson
2014/05/07 17:20:16
This is getting a bit confusing for me to follow.
mithro-old
2014/05/07 22:02:32
The sole reason that ProxyFrameSource exists at th
brianderson
2014/05/08 00:55:58
I feel like there must be a solution to this probl
mithro-old
2014/05/09 02:45:58
This seems like mostly a style question?
I guess
|
+ public: |
+ // FIXME(mithro): This should probably be a weakptr to the frame source |
+ // rather then a raw pointer. |
+ ProxyFrameSource(FrameSink* sink, FrameSource* source); |
+ |
+ // FrameSource |
+ virtual void SetNeedsBeginFrame(bool needs_begin_frame) OVERRIDE; |
+ virtual scoped_ptr<base::Value> FrameSourceAsValue() const OVERRIDE; |
+ virtual std::string FrameSourceType() const OVERRIDE; |
+ virtual void SetTimeBaseAndInterval(base::TimeTicks timebase, |
+ base::TimeDelta interval) OVERRIDE; |
+ |
+ // FrameSink |
+ virtual void BeginFrame(const BeginFrameArgs& args) OVERRIDE; |
+ |
+ private: |
+ FrameSource* source_; |
+}; |
+ |
+/** |
+ * A frame source which throttles down another begin frame source. |
+ */ |
+class CC_EXPORT ThrottledFrameSource : public BaseFrameSource, |
brianderson
2014/05/07 17:20:16
I was thinking about this more and think a wrapper
mithro-old
2014/05/07 23:42:28
I'm going to leave the ThrottledFrameSource here f
|
+ public FrameSink { |
+ public: |
+ ThrottledFrameSource(FrameSink* sink, |
+ scoped_ptr<FrameSource> source, |
+ base::TimeDelta interval); |
+ virtual ~ThrottledFrameSource(); |
+ |
+ // FrameSource |
+ virtual void SetNeedsBeginFrame(bool needs_begin_frame) OVERRIDE; |
+ virtual scoped_ptr<base::Value> FrameSourceAsValue() const OVERRIDE; |
+ virtual std::string FrameSourceType() const OVERRIDE; |
+ virtual void SetTimeBaseAndInterval(base::TimeTicks timebase, |
+ base::TimeDelta interval) OVERRIDE; |
+ |
+ // FrameSink |
+ virtual void BeginFrame(const BeginFrameArgs& args) OVERRIDE; |
+ |
+ private: |
+ BeginFrameArgs last_frame_args_; |
+ scoped_ptr<FrameSource> source_; |
+}; |
+ |
+/** |
+ * Frame source which needs a task runner object. |
+ */ |
+class CC_EXPORT TaskRunnerFrameSource : public BaseFrameSource { |
brianderson
2014/05/07 17:20:16
Does this extra level of inheritance buy us much?
mithro-old
2014/05/07 23:42:28
Not really - I thought there would be more shared
brianderson
2014/05/08 00:55:58
Please remove it unless you find there is a signif
mithro-old
2014/05/09 02:45:58
Done.
|
+ public: |
+ TaskRunnerFrameSource(FrameSink* sink, |
+ base::SingleThreadTaskRunner* task_runner); |
+ |
+ protected: |
+ base::SingleThreadTaskRunner* task_runner_; |
+}; |
+ |
+/** |
+ * A frame source which sends a BeginFrame as soon as SetNeedsBeginFrame is |
+ * requested. |
+ */ |
+class CC_EXPORT BackToBackFrameSource : public TaskRunnerFrameSource { |
+ public: |
+ BackToBackFrameSource(FrameSink* sink, |
+ base::SingleThreadTaskRunner* task_runner); |
+ |
+ // FrameSource |
+ virtual void SetNeedsBeginFrame(bool needs_begin_frame) OVERRIDE; |
+ virtual std::string FrameSourceType() const OVERRIDE; |
+ |
+ // --------------------------------------------------------------------- |
+ void PostBeginFrame(); |
+}; |
+ |
+/** |
+ * A frame source which is locked an external vsync source and generates |
+ * BeginFrameArgs for it. |
+ */ |
+class CC_EXPORT SyntheticFrameSource : public TaskRunnerFrameSource, |
+ public TimeSourceClient { |
+ public: |
+ SyntheticFrameSource(FrameSink* sink, |
+ base::SingleThreadTaskRunner* task_runner, |
+ base::TimeDelta interval); |
+ virtual ~SyntheticFrameSource(); |
+ |
+ // FrameSource |
+ virtual void SetNeedsBeginFrame(bool needs_begin_frame) OVERRIDE; |
+ virtual void SetTimeBaseAndInterval(base::TimeTicks timebase, |
+ base::TimeDelta interval) OVERRIDE; |
+ virtual scoped_ptr<base::Value> FrameSourceAsValue() const OVERRIDE; |
+ virtual std::string FrameSourceType() const OVERRIDE; |
+ |
+ // --------------------------------------------------------------------- |
+ |
+ virtual void OnTimerTick() OVERRIDE; |
+ |
+ private: |
+ scoped_refptr<TimeSource> time_source_; |
+ |
+ BeginFrameArgs CreateSyntheticBeginFrameArgs(base::TimeTicks frame_time); |
+}; |
+ |
+/** |
+ * A virtual frame source which lets you switch between two other frame sources |
+ * (making sure the BeginFrameArgs stays monotonic). |
+ */ |
+class CC_EXPORT DualFrameSource : public BaseFrameSource, public FrameSink { |
brianderson
2014/05/07 17:20:16
Tim and I talked offline comparing this solution f
mithro-old
2014/05/07 23:42:28
We are currently
|
+ public: |
+ DualFrameSource(FrameSink* sink, |
+ scoped_ptr<FrameSource> source_primary, |
+ scoped_ptr<FrameSource> source_secondary); |
+ virtual ~DualFrameSource(); |
+ |
+ // FrameSource |
brianderson
2014/05/07 17:20:16
I think DualFrameSource needs to override SetTimeb
mithro-old
2014/05/07 22:02:32
Yes it does.
At the moment I think we want to for
brianderson
2014/05/08 00:55:58
To the primary source only sounds good.
mithro-old
2014/05/09 02:45:58
Done.
How do we set / change the interval for the
|
+ virtual void SetNeedsBeginFrame(bool needs_begin_frame) OVERRIDE; |
+ virtual scoped_ptr<base::Value> FrameSourceAsValue() const OVERRIDE; |
+ virtual std::string FrameSourceType() const OVERRIDE; |
+ |
+ // FrameSink |
+ virtual void BeginFrame(const BeginFrameArgs& args) OVERRIDE; |
+ |
+ // --------------------------------------------------------------------- |
+ |
+ void SwitchSource(const FrameSource* new_source); |
+ const FrameSource* SourcePrimary() const; |
+ const FrameSource* SourceSecondary() const; |
brianderson
2014/05/07 17:20:16
Should we rename these to Foreground and Backgroun
mithro-old
2014/05/07 23:42:28
Done.
|
+ |
+ private: |
+ bool needs_begin_frame_; |
+ BeginFrameArgs last_frame_args_; |
+ FrameSource* active_source_; |
+ scoped_ptr<FrameSource> source_primary_; |
+ scoped_ptr<FrameSource> source_secondary_; |
+}; |
+ |
+} // namespace cc |
+ |
+#endif // CC_SCHEDULER_FRAME_SOURCE_H_ |