| Index: cc/scheduler/begin_frame_source.cc
|
| diff --git a/cc/scheduler/begin_frame_source.cc b/cc/scheduler/begin_frame_source.cc
|
| index 96bb92cf6c5b3516ce32601811f3109a927a545c..583f0f6a6c5849dec40da4b83faf41397a066748 100644
|
| --- a/cc/scheduler/begin_frame_source.cc
|
| +++ b/cc/scheduler/begin_frame_source.cc
|
| @@ -178,4 +178,60 @@ void DelayBasedBeginFrameSource::OnTimerTick() {
|
| }
|
| }
|
|
|
| +ExternalBeginFrameSource::ExternalBeginFrameSource(
|
| + ExternalBeginFrameSourceClient* client)
|
| + : client_(client) {
|
| + DCHECK(client_);
|
| +}
|
| +
|
| +ExternalBeginFrameSource::~ExternalBeginFrameSource() = default;
|
| +
|
| +void ExternalBeginFrameSource::AddObserver(BeginFrameObserver* obs) {
|
| + DCHECK(obs);
|
| + DCHECK(observers_.find(obs) == observers_.end());
|
| +
|
| + bool observers_was_empty = observers_.empty();
|
| + observers_.insert(obs);
|
| + obs->OnBeginFrameSourcePausedChanged(paused_);
|
| + if (observers_was_empty)
|
| + client_->OnNeedsBeginFrames(true);
|
| +
|
| + // Send a MISSED begin frame if necessary.
|
| + if (missed_begin_frame_args_.IsValid()) {
|
| + BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs();
|
| + if (!last_args.IsValid() ||
|
| + (missed_begin_frame_args_.frame_time > last_args.frame_time)) {
|
| + obs->OnBeginFrame(missed_begin_frame_args_);
|
| + }
|
| + }
|
| +}
|
| +
|
| +void ExternalBeginFrameSource::RemoveObserver(BeginFrameObserver* obs) {
|
| + DCHECK(obs);
|
| + DCHECK(observers_.find(obs) != observers_.end());
|
| +
|
| + observers_.erase(obs);
|
| + if (observers_.empty()) {
|
| + missed_begin_frame_args_ = BeginFrameArgs();
|
| + client_->OnNeedsBeginFrames(false);
|
| + }
|
| +}
|
| +
|
| +void ExternalBeginFrameSource::OnSetBeginFrameSourcePaused(bool paused) {
|
| + if (paused_ == paused)
|
| + return;
|
| + paused_ = paused;
|
| + std::unordered_set<BeginFrameObserver*> observers(observers_);
|
| + for (auto* obs : observers)
|
| + obs->OnBeginFrameSourcePausedChanged(paused_);
|
| +}
|
| +
|
| +void ExternalBeginFrameSource::OnBeginFrame(const BeginFrameArgs& args) {
|
| + missed_begin_frame_args_ = args;
|
| + missed_begin_frame_args_.type = BeginFrameArgs::MISSED;
|
| + std::unordered_set<BeginFrameObserver*> observers(observers_);
|
| + for (auto* obs : observers)
|
| + obs->OnBeginFrame(args);
|
| +}
|
| +
|
| } // namespace cc
|
|
|