| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef CC_SCHEDULER_BEGIN_FRAME_SOURCE_H_ | 5 #ifndef CC_SCHEDULER_BEGIN_FRAME_SOURCE_H_ |
| 6 #define CC_SCHEDULER_BEGIN_FRAME_SOURCE_H_ | 6 #define CC_SCHEDULER_BEGIN_FRAME_SOURCE_H_ |
| 7 | 7 |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 #include <stdint.h> | 9 #include <stdint.h> |
| 10 | 10 |
| 11 #include <set> | 11 #include <set> |
| 12 #include <string> | 12 #include <string> |
| 13 | 13 |
| 14 #include "base/logging.h" | 14 #include "base/logging.h" |
| 15 #include "base/macros.h" | 15 #include "base/macros.h" |
| 16 #include "base/trace_event/trace_event.h" | 16 #include "base/trace_event/trace_event.h" |
| 17 #include "cc/output/begin_frame_args.h" | 17 #include "cc/output/begin_frame_args.h" |
| 18 #include "cc/scheduler/delay_based_time_source.h" | 18 #include "cc/scheduler/delay_based_time_source.h" |
| 19 | 19 |
| 20 #ifdef NDEBUG | |
| 21 #define DEBUG_FRAMES(...) | |
| 22 #else | |
| 23 #define DEBUG_FRAMES(name, arg1_name, arg1_val, arg2_name, arg2_val) \ | |
| 24 TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler.frames"), name, \ | |
| 25 arg1_name, arg1_val, arg2_name, arg2_val); | |
| 26 #endif | |
| 27 | |
| 28 namespace cc { | 20 namespace cc { |
| 29 | 21 |
| 30 // (Pure) Interface for observing BeginFrame messages from BeginFrameSource | 22 // (Pure) Interface for observing BeginFrame messages from BeginFrameSource |
| 31 // objects. | 23 // objects. |
| 32 class CC_EXPORT BeginFrameObserver { | 24 class CC_EXPORT BeginFrameObserver { |
| 33 public: | 25 public: |
| 34 virtual ~BeginFrameObserver() {} | 26 virtual ~BeginFrameObserver() {} |
| 35 | 27 |
| 36 // The |args| given to OnBeginFrame is guaranteed to have | 28 // The |args| given to OnBeginFrame is guaranteed to have |
| 37 // |args|.IsValid()==true and have |args|.frame_time | 29 // |args|.IsValid()==true and have |args|.frame_time |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 115 // is pending at a time. | 107 // is pending at a time. |
| 116 virtual void DidFinishFrame(BeginFrameObserver* obs, | 108 virtual void DidFinishFrame(BeginFrameObserver* obs, |
| 117 size_t remaining_frames) = 0; | 109 size_t remaining_frames) = 0; |
| 118 | 110 |
| 119 // Add/Remove an observer from the source. When no observers are added the BFS | 111 // Add/Remove an observer from the source. When no observers are added the BFS |
| 120 // should shut down its timers, disable vsync, etc. | 112 // should shut down its timers, disable vsync, etc. |
| 121 virtual void AddObserver(BeginFrameObserver* obs) = 0; | 113 virtual void AddObserver(BeginFrameObserver* obs) = 0; |
| 122 virtual void RemoveObserver(BeginFrameObserver* obs) = 0; | 114 virtual void RemoveObserver(BeginFrameObserver* obs) = 0; |
| 123 }; | 115 }; |
| 124 | 116 |
| 125 // Simple base class which implements a BeginFrameSource. | 117 // A frame source which ticks itself independently. |
| 126 // Implementation classes should: | 118 class CC_EXPORT SyntheticBeginFrameSource : public BeginFrameSource { |
| 127 // - Implement the pure virtual (Set)NeedsBeginFrames methods from | |
| 128 // BeginFrameSource. | |
| 129 // - Use the CallOnBeginFrame method to call to the observer(s). | |
| 130 class CC_EXPORT BeginFrameSourceBase : public BeginFrameSource { | |
| 131 public: | 119 public: |
| 132 ~BeginFrameSourceBase() override; | 120 ~SyntheticBeginFrameSource() override; |
| 133 | 121 |
| 134 // BeginFrameSource | 122 virtual void OnUpdateVSyncParameters(base::TimeTicks timebase, |
| 135 void DidFinishFrame(BeginFrameObserver* obs, | 123 base::TimeDelta interval) = 0; |
| 136 size_t remaining_frames) override {} | 124 // This overrides any past or future interval from updating vsync parameters. |
| 137 void AddObserver(BeginFrameObserver* obs) override; | 125 virtual void SetAuthoritativeVSyncInterval(base::TimeDelta interval) = 0; |
| 138 void RemoveObserver(BeginFrameObserver* obs) override; | |
| 139 | |
| 140 protected: | |
| 141 BeginFrameSourceBase(); | |
| 142 | |
| 143 // These methods should be used by subclasses to make the call to the | |
| 144 // observers. | |
| 145 void CallOnBeginFrame(const BeginFrameArgs& args); | |
| 146 void SetBeginFrameSourcePaused(bool paused); | |
| 147 | |
| 148 // This notifies that the subclass that it must turn on or off its mechnanism | |
| 149 // for producing BeginFrames. | |
| 150 virtual void OnNeedsBeginFramesChanged(bool needs_begin_frames) {} | |
| 151 | |
| 152 bool needs_begin_frames() const { return !observers_.empty(); } | |
| 153 | |
| 154 std::set<BeginFrameObserver*> observers_; | |
| 155 bool paused_; | |
| 156 | |
| 157 private: | |
| 158 DISALLOW_COPY_AND_ASSIGN(BeginFrameSourceBase); | |
| 159 }; | 126 }; |
| 160 | 127 |
| 161 // A frame source which calls BeginFrame (at the next possible time) as soon as | 128 // A frame source which calls BeginFrame (at the next possible time) as soon as |
| 162 // remaining frames reaches zero. | 129 // remaining frames reaches zero. |
| 163 class CC_EXPORT BackToBackBeginFrameSource : public BeginFrameSourceBase { | 130 class CC_EXPORT BackToBackBeginFrameSource : public SyntheticBeginFrameSource, |
| 131 public DelayBasedTimeSourceClient { |
| 164 public: | 132 public: |
| 165 explicit BackToBackBeginFrameSource( | 133 explicit BackToBackBeginFrameSource( |
| 166 base::SingleThreadTaskRunner* task_runner); | 134 std::unique_ptr<DelayBasedTimeSource> time_source); |
| 167 ~BackToBackBeginFrameSource() override; | 135 ~BackToBackBeginFrameSource() override; |
| 168 | 136 |
| 169 // BeginFrameSource | 137 // BeginFrameSource implementation. |
| 170 void AddObserver(BeginFrameObserver* obs) override; | 138 void AddObserver(BeginFrameObserver* obs) override; |
| 171 void RemoveObserver(BeginFrameObserver* obs) override; | 139 void RemoveObserver(BeginFrameObserver* obs) override; |
| 172 void DidFinishFrame(BeginFrameObserver* obs, | 140 void DidFinishFrame(BeginFrameObserver* obs, |
| 173 size_t remaining_frames) override; | 141 size_t remaining_frames) override; |
| 174 | 142 |
| 175 protected: | 143 // SyntheticBeginFrameSource implementation. |
| 176 virtual base::TimeTicks Now(); // Now overridable for testing | 144 void OnUpdateVSyncParameters(base::TimeTicks timebase, |
| 145 base::TimeDelta interval) override {} |
| 146 void SetAuthoritativeVSyncInterval(base::TimeDelta interval) override {} |
| 177 | 147 |
| 178 base::SingleThreadTaskRunner* task_runner_; | 148 // DelayBasedTimeSourceClient implementation. |
| 179 base::CancelableClosure begin_frame_task_; | 149 void OnTimerTick() override; |
| 180 std::set<BeginFrameObserver*> pending_begin_frame_observers_; | |
| 181 | |
| 182 void PostPendingBeginFramesTask(); | |
| 183 void SendPendingBeginFrames(); | |
| 184 | 150 |
| 185 private: | 151 private: |
| 152 std::unique_ptr<DelayBasedTimeSource> time_source_; |
| 153 std::unordered_set<BeginFrameObserver*> observers_; |
| 154 std::unordered_set<BeginFrameObserver*> pending_begin_frame_observers_; |
| 186 base::WeakPtrFactory<BackToBackBeginFrameSource> weak_factory_; | 155 base::WeakPtrFactory<BackToBackBeginFrameSource> weak_factory_; |
| 187 | 156 |
| 188 DISALLOW_COPY_AND_ASSIGN(BackToBackBeginFrameSource); | 157 DISALLOW_COPY_AND_ASSIGN(BackToBackBeginFrameSource); |
| 189 }; | 158 }; |
| 190 | 159 |
| 191 // A frame source which is locked to an external parameters provides from a | 160 // A frame source which is locked to an external parameters provides from a |
| 192 // vsync source and generates BeginFrameArgs for it. | 161 // vsync source and generates BeginFrameArgs for it. |
| 193 class CC_EXPORT SyntheticBeginFrameSource : public BeginFrameSourceBase, | 162 class CC_EXPORT DelayBasedBeginFrameSource : public SyntheticBeginFrameSource, |
| 194 public DelayBasedTimeSourceClient { | 163 public DelayBasedTimeSourceClient { |
| 195 public: | 164 public: |
| 196 explicit SyntheticBeginFrameSource(base::SingleThreadTaskRunner* task_runner, | 165 explicit DelayBasedBeginFrameSource( |
| 197 base::TimeDelta initial_vsync_interval); | |
| 198 explicit SyntheticBeginFrameSource( | |
| 199 std::unique_ptr<DelayBasedTimeSource> time_source); | 166 std::unique_ptr<DelayBasedTimeSource> time_source); |
| 200 ~SyntheticBeginFrameSource() override; | 167 ~DelayBasedBeginFrameSource() override; |
| 201 | 168 |
| 169 // BeginFrameSource implementation. |
| 170 void AddObserver(BeginFrameObserver* obs) override; |
| 171 void RemoveObserver(BeginFrameObserver* obs) override; |
| 172 void DidFinishFrame(BeginFrameObserver* obs, |
| 173 size_t remaining_frames) override {} |
| 174 |
| 175 // SyntheticBeginFrameSource implementation. |
| 202 void OnUpdateVSyncParameters(base::TimeTicks timebase, | 176 void OnUpdateVSyncParameters(base::TimeTicks timebase, |
| 203 base::TimeDelta interval); | 177 base::TimeDelta interval) override; |
| 204 // This overrides any past or future interval from updating vsync parameters. | 178 void SetAuthoritativeVSyncInterval(base::TimeDelta interval) override; |
| 205 void SetAuthoritativeVSyncInterval(base::TimeDelta interval); | |
| 206 | 179 |
| 207 // BeginFrameSourceBase | 180 // DelayBasedTimeSourceClient implementation. |
| 208 void AddObserver(BeginFrameObserver* obs) override; | |
| 209 void OnNeedsBeginFramesChanged(bool needs_begin_frames) override; | |
| 210 | |
| 211 // DelayBasedTimeSourceClient | |
| 212 void OnTimerTick() override; | 181 void OnTimerTick() override; |
| 213 | 182 |
| 214 protected: | 183 private: |
| 215 BeginFrameArgs CreateBeginFrameArgs(base::TimeTicks frame_time, | 184 BeginFrameArgs CreateBeginFrameArgs(base::TimeTicks frame_time, |
| 216 BeginFrameArgs::BeginFrameArgsType type); | 185 BeginFrameArgs::BeginFrameArgsType type); |
| 217 | 186 |
| 218 std::unique_ptr<DelayBasedTimeSource> time_source_; | 187 std::unique_ptr<DelayBasedTimeSource> time_source_; |
| 188 std::unordered_set<BeginFrameObserver*> observers_; |
| 219 base::TimeTicks last_timebase_; | 189 base::TimeTicks last_timebase_; |
| 220 base::TimeDelta authoritative_interval_; | 190 base::TimeDelta authoritative_interval_; |
| 221 | 191 |
| 222 private: | 192 DISALLOW_COPY_AND_ASSIGN(DelayBasedBeginFrameSource); |
| 223 DISALLOW_COPY_AND_ASSIGN(SyntheticBeginFrameSource); | |
| 224 }; | 193 }; |
| 225 | 194 |
| 226 } // namespace cc | 195 } // namespace cc |
| 227 | 196 |
| 228 #endif // CC_SCHEDULER_BEGIN_FRAME_SOURCE_H_ | 197 #endif // CC_SCHEDULER_BEGIN_FRAME_SOURCE_H_ |
| OLD | NEW |