Chromium Code Reviews| Index: cc/scheduler/begin_frame_source.h |
| diff --git a/cc/scheduler/begin_frame_source.h b/cc/scheduler/begin_frame_source.h |
| index 58ee480d01138cc235f49ec13456019bb97b23f1..60b099c837fea21280b79f033bd4757611ef2e5b 100644 |
| --- a/cc/scheduler/begin_frame_source.h |
| +++ b/cc/scheduler/begin_frame_source.h |
| @@ -230,10 +230,52 @@ class CC_EXPORT DelayBasedBeginFrameSource : public SyntheticBeginFrameSource, |
| DISALLOW_COPY_AND_ASSIGN(DelayBasedBeginFrameSource); |
| }; |
| +// Helper class that tracks outstanding acknowledgments from |
| +// BeginFrameObservers. |
| +class CC_EXPORT BeginFrameObserverAckTracker { |
| + public: |
| + BeginFrameObserverAckTracker(); |
| + virtual ~BeginFrameObserverAckTracker(); |
| + |
| + // The BeginFrameSource uses these methods to notify us when a BeginFrame was |
| + // started and sent to a specific observer, an observer finished a frame, or |
| + // an observer was added/removed. |
| + void OnBeginFrame(const BeginFrameArgs& args); |
| + void OnObserverBeginFrame(BeginFrameObserver* obs, |
| + const BeginFrameArgs& args); |
| + void OnObserverFinishedFrame(BeginFrameObserver* obs, |
| + const BeginFrameAck& ack); |
| + void OnObserverAdded(BeginFrameObserver* obs); |
| + void OnObserverRemoved(BeginFrameObserver* obs); |
| + |
| + // Returns |true| if all the source's observers completed the current frame. |
| + bool AllObserversFinishedFrame() const; |
| + |
| + // Returns |true| if any observer had damage during the current frame. |
| + bool AnyObserversHadDamage() const; |
| + |
| + // Return the sequence number of the latest frame that all active observers |
| + // have confirmed. |
| + uint64_t LatestConfirmedSequenceNumber() const; |
| + |
| + private: |
| + void SourceChanged(const BeginFrameArgs& args); |
| + |
| + uint32_t current_source_id_; |
| + uint64_t current_sequence_number_; |
| + 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
|
| + std::set<BeginFrameObserver*> finished_observers_; |
| + bool observers_had_damage_; |
| + std::unordered_map<BeginFrameObserver*, uint64_t> |
| + latest_confirmed_sequence_numbers_; |
| +}; |
| + |
| class CC_EXPORT ExternalBeginFrameSourceClient { |
| public: |
| // Only called when changed. Assumed false by default. |
| virtual void OnNeedsBeginFrames(bool needs_begin_frames) = 0; |
| + // Called when all observers have completed a frame. |
| + virtual void OnDidFinishFrame(const BeginFrameAck& ack) = 0; |
| }; |
| // A BeginFrameSource that is only ticked manually. Usually the endpoint |
| @@ -250,17 +292,22 @@ class CC_EXPORT ExternalBeginFrameSource : public BeginFrameSource { |
| void AddObserver(BeginFrameObserver* obs) override; |
| void RemoveObserver(BeginFrameObserver* obs) override; |
| void DidFinishFrame(BeginFrameObserver* obs, |
| - const BeginFrameAck& ack) override {} |
| + const BeginFrameAck& ack) override; |
| bool IsThrottled() const override; |
| void OnSetBeginFrameSourcePaused(bool paused); |
| void OnBeginFrame(const BeginFrameArgs& args); |
| protected: |
| + void MaybeFinishFrame(); |
| + void FinishFrame(); |
| + |
| BeginFrameArgs missed_begin_frame_args_; |
| std::unordered_set<BeginFrameObserver*> observers_; |
| ExternalBeginFrameSourceClient* client_; |
| bool paused_ = false; |
| + bool frame_active_ = false; |
| + BeginFrameObserverAckTracker ack_tracker_; |
|
brianderson
2017/02/15 20:21:36
Are there any instances of the ExternalBeginFrameS
|
| private: |
| DISALLOW_COPY_AND_ASSIGN(ExternalBeginFrameSource); |