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 |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
240 std::unique_ptr<DelayBasedTimeSource> time_source_; | 240 std::unique_ptr<DelayBasedTimeSource> time_source_; |
241 std::unordered_set<BeginFrameObserver*> observers_; | 241 std::unordered_set<BeginFrameObserver*> observers_; |
242 base::TimeTicks last_timebase_; | 242 base::TimeTicks last_timebase_; |
243 base::TimeDelta authoritative_interval_; | 243 base::TimeDelta authoritative_interval_; |
244 BeginFrameArgs current_begin_frame_args_; | 244 BeginFrameArgs current_begin_frame_args_; |
245 uint64_t next_sequence_number_; | 245 uint64_t next_sequence_number_; |
246 | 246 |
247 DISALLOW_COPY_AND_ASSIGN(DelayBasedBeginFrameSource); | 247 DISALLOW_COPY_AND_ASSIGN(DelayBasedBeginFrameSource); |
248 }; | 248 }; |
249 | 249 |
250 // Helper class that tracks outstanding acknowledgments from | |
251 // BeginFrameObservers. | |
252 class CC_EXPORT BeginFrameObserverAckTracker { | |
253 public: | |
254 BeginFrameObserverAckTracker(); | |
255 ~BeginFrameObserverAckTracker(); | |
256 | |
257 // The BeginFrameSource uses these methods to notify us when a BeginFrame was | |
258 // started, an observer finished a frame, or an observer was added/removed. | |
259 void OnBeginFrame(const BeginFrameArgs& args); | |
260 void OnObserverFinishedFrame(BeginFrameObserver* obs, | |
261 const BeginFrameAck& ack); | |
262 void OnObserverAdded(BeginFrameObserver* obs); | |
263 void OnObserverRemoved(BeginFrameObserver* obs); | |
264 | |
265 // Returns |true| if all the source's observers completed the current frame. | |
266 bool AllObserversFinishedFrame() const; | |
267 | |
268 // Returns |true| if any observer had damage during the current frame. | |
269 bool AnyObserversHadDamage() const; | |
270 | |
271 // Return the sequence number of the latest frame that all active observers | |
272 // have confirmed. | |
273 uint64_t LatestConfirmedSequenceNumber() const; | |
274 | |
275 void AsValueInto(base::trace_event::TracedValue* state) const; | |
276 | |
277 private: | |
278 void SourceChanged(const BeginFrameArgs& args); | |
279 | |
280 uint32_t current_source_id_ = 0; | |
281 uint64_t current_sequence_number_ = BeginFrameArgs::kStartingFrameNumber; | |
282 // Small sets, but order matters for intersection computation. | |
283 base::flat_set<BeginFrameObserver*> observers_; | |
284 base::flat_set<BeginFrameObserver*> finished_observers_; | |
285 bool observers_had_damage_ = false; | |
286 base::flat_map<BeginFrameObserver*, uint64_t> | |
287 latest_confirmed_sequence_numbers_; | |
288 | |
289 DISALLOW_COPY_AND_ASSIGN(BeginFrameObserverAckTracker); | |
290 }; | |
291 | |
292 class CC_EXPORT ExternalBeginFrameSourceClient { | 250 class CC_EXPORT ExternalBeginFrameSourceClient { |
293 public: | 251 public: |
294 // Only called when changed. Assumed false by default. | 252 // Only called when changed. Assumed false by default. |
295 virtual void OnNeedsBeginFrames(bool needs_begin_frames) = 0; | 253 virtual void OnNeedsBeginFrames(bool needs_begin_frames) = 0; |
296 // Called when all observers have completed a frame. | |
297 virtual void OnDidFinishFrame(const BeginFrameAck& ack) = 0; | |
298 }; | 254 }; |
299 | 255 |
300 // A BeginFrameSource that is only ticked manually. Usually the endpoint | 256 // A BeginFrameSource that is only ticked manually. Usually the endpoint |
301 // of messages from some other thread/process that send OnBeginFrame and | 257 // of messages from some other thread/process that send OnBeginFrame and |
302 // receive SetNeedsBeginFrame messages. This turns such messages back into | 258 // receive SetNeedsBeginFrame messages. This turns such messages back into |
303 // an observable BeginFrameSource. | 259 // an observable BeginFrameSource. |
304 class CC_EXPORT ExternalBeginFrameSource : public BeginFrameSource { | 260 class CC_EXPORT ExternalBeginFrameSource : public BeginFrameSource { |
305 public: | 261 public: |
306 // Client lifetime must be preserved by owner past the lifetime of this class. | 262 // Client lifetime must be preserved by owner past the lifetime of this class. |
307 explicit ExternalBeginFrameSource(ExternalBeginFrameSourceClient* client); | 263 explicit ExternalBeginFrameSource(ExternalBeginFrameSourceClient* client); |
308 ~ExternalBeginFrameSource() override; | 264 ~ExternalBeginFrameSource() override; |
309 | 265 |
310 // BeginFrameSource implementation. | 266 // BeginFrameSource implementation. |
311 void AddObserver(BeginFrameObserver* obs) override; | 267 void AddObserver(BeginFrameObserver* obs) override; |
312 void RemoveObserver(BeginFrameObserver* obs) override; | 268 void RemoveObserver(BeginFrameObserver* obs) override; |
313 void DidFinishFrame(BeginFrameObserver* obs, | 269 void DidFinishFrame(BeginFrameObserver* obs, |
314 const BeginFrameAck& ack) override; | 270 const BeginFrameAck& ack) override; |
315 bool IsThrottled() const override; | 271 bool IsThrottled() const override; |
316 void AsValueInto(base::trace_event::TracedValue* state) const override; | 272 void AsValueInto(base::trace_event::TracedValue* state) const override; |
317 | 273 |
318 void OnSetBeginFrameSourcePaused(bool paused); | 274 void OnSetBeginFrameSourcePaused(bool paused); |
319 void OnBeginFrame(const BeginFrameArgs& args); | 275 void OnBeginFrame(const BeginFrameArgs& args); |
320 | 276 |
321 protected: | 277 protected: |
322 void MaybeFinishFrame(); | |
323 void FinishFrame(); | |
324 | |
325 BeginFrameArgs last_begin_frame_args_; | 278 BeginFrameArgs last_begin_frame_args_; |
326 std::unordered_set<BeginFrameObserver*> observers_; | 279 std::unordered_set<BeginFrameObserver*> observers_; |
327 ExternalBeginFrameSourceClient* client_; | 280 ExternalBeginFrameSourceClient* client_; |
328 bool paused_ = false; | 281 bool paused_ = false; |
329 bool frame_active_ = false; | |
330 BeginFrameObserverAckTracker ack_tracker_; | |
331 | 282 |
332 private: | 283 private: |
333 DISALLOW_COPY_AND_ASSIGN(ExternalBeginFrameSource); | 284 DISALLOW_COPY_AND_ASSIGN(ExternalBeginFrameSource); |
334 }; | 285 }; |
335 | 286 |
336 } // namespace cc | 287 } // namespace cc |
337 | 288 |
338 #endif // CC_SCHEDULER_BEGIN_FRAME_SOURCE_H_ | 289 #endif // CC_SCHEDULER_BEGIN_FRAME_SOURCE_H_ |
OLD | NEW |