Chromium Code Reviews| 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 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 223 std::unique_ptr<DelayBasedTimeSource> time_source_; | 223 std::unique_ptr<DelayBasedTimeSource> time_source_; |
| 224 std::unordered_set<BeginFrameObserver*> observers_; | 224 std::unordered_set<BeginFrameObserver*> observers_; |
| 225 base::TimeTicks last_timebase_; | 225 base::TimeTicks last_timebase_; |
| 226 base::TimeDelta authoritative_interval_; | 226 base::TimeDelta authoritative_interval_; |
| 227 BeginFrameArgs current_begin_frame_args_; | 227 BeginFrameArgs current_begin_frame_args_; |
| 228 uint64_t next_sequence_number_; | 228 uint64_t next_sequence_number_; |
| 229 | 229 |
| 230 DISALLOW_COPY_AND_ASSIGN(DelayBasedBeginFrameSource); | 230 DISALLOW_COPY_AND_ASSIGN(DelayBasedBeginFrameSource); |
| 231 }; | 231 }; |
| 232 | 232 |
| 233 // Helper class that tracks outstanding acknowledgments from | |
| 234 // BeginFrameObservers. | |
| 235 class CC_EXPORT BeginFrameObserverAckTracker { | |
| 236 public: | |
| 237 BeginFrameObserverAckTracker(); | |
| 238 virtual ~BeginFrameObserverAckTracker(); | |
| 239 | |
| 240 // The BeginFrameSource uses these methods to notify us when a BeginFrame was | |
| 241 // started and sent to a specific observer, an observer finished a frame, or | |
| 242 // an observer was added/removed. | |
| 243 void OnBeginFrame(const BeginFrameArgs& args); | |
| 244 void OnObserverBeginFrame(BeginFrameObserver* obs, | |
| 245 const BeginFrameArgs& args); | |
| 246 void OnObserverFinishedFrame(BeginFrameObserver* obs, | |
| 247 const BeginFrameAck& ack); | |
| 248 void OnObserverAdded(BeginFrameObserver* obs); | |
| 249 void OnObserverRemoved(BeginFrameObserver* obs); | |
| 250 | |
| 251 // Returns |true| if all the source's observers completed the current frame. | |
| 252 bool AllObserversFinishedFrame() const; | |
| 253 | |
| 254 // Returns |true| if any observer had damage during the current frame. | |
| 255 bool AnyObserversHadDamage() const; | |
| 256 | |
| 257 // Return the sequence number of the latest frame that all active observers | |
| 258 // have confirmed. | |
| 259 uint64_t LatestConfirmedSequenceNumber() const; | |
| 260 | |
| 261 private: | |
| 262 void SourceChanged(const BeginFrameArgs& args); | |
| 263 | |
| 264 uint32_t current_source_id_; | |
| 265 uint64_t current_sequence_number_; | |
| 266 std::set<BeginFrameObserver*> observers_; | |
|
Sami
2017/02/10 14:14:28
nit: unordered_set for both of these?
edit: Ah, I
brianderson
2017/02/15 20:21:36
Probably would be good to add a comment explaining
enne (OOO)
2017/02/15 23:12:25
Maybe flat_set instead? (And SmallMap instead of u
Eric Seckler
2017/02/17 19:10:01
All of these collections are likely very small. Do
| |
| 267 std::set<BeginFrameObserver*> finished_observers_; | |
| 268 bool observers_had_damage_; | |
| 269 std::unordered_map<BeginFrameObserver*, uint64_t> | |
| 270 latest_confirmed_sequence_numbers_; | |
| 271 }; | |
| 272 | |
| 233 class CC_EXPORT ExternalBeginFrameSourceClient { | 273 class CC_EXPORT ExternalBeginFrameSourceClient { |
| 234 public: | 274 public: |
| 235 // Only called when changed. Assumed false by default. | 275 // Only called when changed. Assumed false by default. |
| 236 virtual void OnNeedsBeginFrames(bool needs_begin_frames) = 0; | 276 virtual void OnNeedsBeginFrames(bool needs_begin_frames) = 0; |
| 277 // Called when all observers have completed a frame. | |
| 278 virtual void OnDidFinishFrame(const BeginFrameAck& ack) = 0; | |
| 237 }; | 279 }; |
| 238 | 280 |
| 239 // A BeginFrameSource that is only ticked manually. Usually the endpoint | 281 // A BeginFrameSource that is only ticked manually. Usually the endpoint |
| 240 // of messages from some other thread/process that send OnBeginFrame and | 282 // of messages from some other thread/process that send OnBeginFrame and |
| 241 // receive SetNeedsBeginFrame messages. This turns such messages back into | 283 // receive SetNeedsBeginFrame messages. This turns such messages back into |
| 242 // an observable BeginFrameSource. | 284 // an observable BeginFrameSource. |
| 243 class CC_EXPORT ExternalBeginFrameSource : public BeginFrameSource { | 285 class CC_EXPORT ExternalBeginFrameSource : public BeginFrameSource { |
| 244 public: | 286 public: |
| 245 // Client lifetime must be preserved by owner past the lifetime of this class. | 287 // Client lifetime must be preserved by owner past the lifetime of this class. |
| 246 explicit ExternalBeginFrameSource(ExternalBeginFrameSourceClient* client); | 288 explicit ExternalBeginFrameSource(ExternalBeginFrameSourceClient* client); |
| 247 ~ExternalBeginFrameSource() override; | 289 ~ExternalBeginFrameSource() override; |
| 248 | 290 |
| 249 // BeginFrameSource implementation. | 291 // BeginFrameSource implementation. |
| 250 void AddObserver(BeginFrameObserver* obs) override; | 292 void AddObserver(BeginFrameObserver* obs) override; |
| 251 void RemoveObserver(BeginFrameObserver* obs) override; | 293 void RemoveObserver(BeginFrameObserver* obs) override; |
| 252 void DidFinishFrame(BeginFrameObserver* obs, | 294 void DidFinishFrame(BeginFrameObserver* obs, |
| 253 const BeginFrameAck& ack) override {} | 295 const BeginFrameAck& ack) override; |
| 254 bool IsThrottled() const override; | 296 bool IsThrottled() const override; |
| 255 | 297 |
| 256 void OnSetBeginFrameSourcePaused(bool paused); | 298 void OnSetBeginFrameSourcePaused(bool paused); |
| 257 void OnBeginFrame(const BeginFrameArgs& args); | 299 void OnBeginFrame(const BeginFrameArgs& args); |
| 258 | 300 |
| 259 protected: | 301 protected: |
| 302 void MaybeFinishFrame(); | |
| 303 void FinishFrame(); | |
| 304 | |
| 260 BeginFrameArgs missed_begin_frame_args_; | 305 BeginFrameArgs missed_begin_frame_args_; |
| 261 std::unordered_set<BeginFrameObserver*> observers_; | 306 std::unordered_set<BeginFrameObserver*> observers_; |
| 262 ExternalBeginFrameSourceClient* client_; | 307 ExternalBeginFrameSourceClient* client_; |
| 263 bool paused_ = false; | 308 bool paused_ = false; |
| 309 bool frame_active_ = false; | |
| 310 BeginFrameObserverAckTracker ack_tracker_; | |
|
brianderson
2017/02/15 20:21:36
Are there any instances of the ExternalBeginFrameS
| |
| 264 | 311 |
| 265 private: | 312 private: |
| 266 DISALLOW_COPY_AND_ASSIGN(ExternalBeginFrameSource); | 313 DISALLOW_COPY_AND_ASSIGN(ExternalBeginFrameSource); |
| 267 }; | 314 }; |
| 268 | 315 |
| 269 } // namespace cc | 316 } // namespace cc |
| 270 | 317 |
| 271 #endif // CC_SCHEDULER_BEGIN_FRAME_SOURCE_H_ | 318 #endif // CC_SCHEDULER_BEGIN_FRAME_SOURCE_H_ |
| OLD | NEW |