Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(534)

Unified Diff: cc/scheduler/begin_frame_source.cc

Issue 2281143002: Refactor external begin frame source into a base class (Closed)
Patch Set: danakj review Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/scheduler/begin_frame_source.h ('k') | content/renderer/gpu/compositor_external_begin_frame_source.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « cc/scheduler/begin_frame_source.h ('k') | content/renderer/gpu/compositor_external_begin_frame_source.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698