Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1329)

Unified Diff: cc/scheduler/frame_source.h

Issue 267783004: Refactoring the way begin frame sources inside scheduler work. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Scheduler now uses frame sources, working on scheduler_unittests. Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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_

Powered by Google App Engine
This is Rietveld 408576698