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

Side by Side Diff: cc/scheduler/begin_frame_source.cc

Issue 2281143002: Refactor external begin frame source into a base class (Closed)
Patch Set: Use client interfaces instead GOSH Created 4 years, 3 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 unified diff | Download patch
OLDNEW
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 #include "cc/scheduler/begin_frame_source.h" 5 #include "cc/scheduler/begin_frame_source.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include "base/auto_reset.h" 9 #include "base/auto_reset.h"
10 #include "base/location.h" 10 #include "base/location.h"
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
171 std::unordered_set<BeginFrameObserver*> observers(observers_); 171 std::unordered_set<BeginFrameObserver*> observers(observers_);
172 for (auto* obs : observers) { 172 for (auto* obs : observers) {
173 BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs(); 173 BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs();
174 if (!last_args.IsValid() || 174 if (!last_args.IsValid() ||
175 (args.frame_time > 175 (args.frame_time >
176 last_args.frame_time + args.interval / kDoubleTickDivisor)) 176 last_args.frame_time + args.interval / kDoubleTickDivisor))
177 obs->OnBeginFrame(args); 177 obs->OnBeginFrame(args);
178 } 178 }
179 } 179 }
180 180
181 ExternalBeginFrameSource::ExternalBeginFrameSource(
182 ExternalBeginFrameSourceClient* client)
183 : client_(client) {
184 DCHECK(client_);
185 }
186
187 ExternalBeginFrameSource::~ExternalBeginFrameSource() {}
danakj 2016/08/26 22:39:13 = default
188
189 void ExternalBeginFrameSource::AddObserver(BeginFrameObserver* obs) {
190 DCHECK(obs);
191 DCHECK(observers_.find(obs) == observers_.end());
192
193 bool observers_was_empty = observers_.empty();
194 observers_.insert(obs);
195 obs->OnBeginFrameSourcePausedChanged(paused_);
196 if (observers_was_empty)
197 client_->OnNeedsBeginFrames(true);
198
199 // Send a MISSED begin frame if necessary.
200 if (missed_begin_frame_args_.IsValid()) {
201 BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs();
202 if (!last_args.IsValid() ||
203 (missed_begin_frame_args_.frame_time > last_args.frame_time)) {
204 obs->OnBeginFrame(missed_begin_frame_args_);
205 }
206 }
207 }
208
209 void ExternalBeginFrameSource::RemoveObserver(BeginFrameObserver* obs) {
210 DCHECK(obs);
211 DCHECK(observers_.find(obs) != observers_.end());
212
213 observers_.erase(obs);
214 if (observers_.empty()) {
215 missed_begin_frame_args_ = BeginFrameArgs();
216 client_->OnNeedsBeginFrames(false);
217 }
218 }
219
220 void ExternalBeginFrameSource::OnSetBeginFrameSourcePaused(bool paused) {
221 if (paused_ == paused)
222 return;
223 paused_ = paused;
224 std::unordered_set<BeginFrameObserver*> observers(observers_);
225 for (auto* obs : observers)
226 obs->OnBeginFrameSourcePausedChanged(paused_);
227 }
228
229 void ExternalBeginFrameSource::OnBeginFrame(const BeginFrameArgs& args) {
230 missed_begin_frame_args_ = args;
231 missed_begin_frame_args_.type = BeginFrameArgs::MISSED;
232 std::unordered_set<BeginFrameObserver*> observers(observers_);
233 for (auto* obs : observers)
234 obs->OnBeginFrame(args);
235 }
236
181 } // namespace cc 237 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698