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 #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/atomic_sequence_num.h" | 9 #include "base/atomic_sequence_num.h" |
| 10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 191 current_begin_frame_args_.interval == time_source_->Interval()) { | 191 current_begin_frame_args_.interval == time_source_->Interval()) { |
| 192 // Ensure that the args have the right type. | 192 // Ensure that the args have the right type. |
| 193 current_begin_frame_args_.type = BeginFrameArgs::MISSED; | 193 current_begin_frame_args_.type = BeginFrameArgs::MISSED; |
| 194 } else { | 194 } else { |
| 195 // The args are not up to date and we need to create new ones with the | 195 // The args are not up to date and we need to create new ones with the |
| 196 // missed tick's time and a new sequence number. | 196 // missed tick's time and a new sequence number. |
| 197 current_begin_frame_args_ = | 197 current_begin_frame_args_ = |
| 198 CreateBeginFrameArgs(last_or_missed_tick_time, BeginFrameArgs::MISSED); | 198 CreateBeginFrameArgs(last_or_missed_tick_time, BeginFrameArgs::MISSED); |
| 199 } | 199 } |
| 200 | 200 |
| 201 BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs(); | 201 // Avoid issuing missed BeginFrames with a past deadline. |
| 202 if (!last_args.IsValid() || | 202 if (current_begin_frame_args_.deadline > time_source_->Now()) { |
|
brianderson
2017/03/24 19:57:28
Can you swap the nested if's, which would avoid ma
Eric Seckler
2017/03/27 09:53:25
Actually, I think that DelayBasedBFS can't ever is
| |
| 203 (current_begin_frame_args_.frame_time > | 203 BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs(); |
| 204 last_args.frame_time + | 204 if (!last_args.IsValid() || |
| 205 current_begin_frame_args_.interval / kDoubleTickDivisor)) { | 205 (current_begin_frame_args_.frame_time > |
| 206 DCHECK(current_begin_frame_args_.sequence_number > | 206 last_args.frame_time + |
| 207 last_args.sequence_number || | 207 current_begin_frame_args_.interval / kDoubleTickDivisor)) { |
| 208 current_begin_frame_args_.source_id != last_args.source_id) | 208 DCHECK(current_begin_frame_args_.sequence_number > |
| 209 << "current " << current_begin_frame_args_.AsValue()->ToString() | 209 last_args.sequence_number || |
| 210 << ", last " << last_args.AsValue()->ToString(); | 210 current_begin_frame_args_.source_id != last_args.source_id) |
| 211 obs->OnBeginFrame(current_begin_frame_args_); | 211 << "current " << current_begin_frame_args_.AsValue()->ToString() |
| 212 << ", last " << last_args.AsValue()->ToString(); | |
| 213 obs->OnBeginFrame(current_begin_frame_args_); | |
| 214 } | |
| 212 } | 215 } |
| 213 } | 216 } |
| 214 | 217 |
| 215 void DelayBasedBeginFrameSource::RemoveObserver(BeginFrameObserver* obs) { | 218 void DelayBasedBeginFrameSource::RemoveObserver(BeginFrameObserver* obs) { |
| 216 DCHECK(obs); | 219 DCHECK(obs); |
| 217 DCHECK(observers_.find(obs) != observers_.end()); | 220 DCHECK(observers_.find(obs) != observers_.end()); |
| 218 | 221 |
| 219 observers_.erase(obs); | 222 observers_.erase(obs); |
| 220 if (observers_.empty()) | 223 if (observers_.empty()) |
| 221 time_source_->SetActive(false); | 224 time_source_->SetActive(false); |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 347 DCHECK(obs); | 350 DCHECK(obs); |
| 348 DCHECK(observers_.find(obs) == observers_.end()); | 351 DCHECK(observers_.find(obs) == observers_.end()); |
| 349 | 352 |
| 350 bool observers_was_empty = observers_.empty(); | 353 bool observers_was_empty = observers_.empty(); |
| 351 observers_.insert(obs); | 354 observers_.insert(obs); |
| 352 ack_tracker_.OnObserverAdded(obs); | 355 ack_tracker_.OnObserverAdded(obs); |
| 353 obs->OnBeginFrameSourcePausedChanged(paused_); | 356 obs->OnBeginFrameSourcePausedChanged(paused_); |
| 354 if (observers_was_empty) | 357 if (observers_was_empty) |
| 355 client_->OnNeedsBeginFrames(true); | 358 client_->OnNeedsBeginFrames(true); |
| 356 | 359 |
| 357 // Send a MISSED begin frame if necessary. | 360 // Send a MISSED begin frame if necessary, while avoiding issuing missed |
| 358 if (missed_begin_frame_args_.IsValid()) { | 361 // BeginFrames with a past deadline. |
| 362 if (missed_begin_frame_args_.IsValid() && | |
| 363 missed_begin_frame_args_.deadline > Now()) { | |
|
brianderson
2017/03/24 19:57:28
The changes in this file duplicate logic in Schedu
Eric Seckler
2017/03/27 09:53:25
I think it's fine to leave the logic in the cc::Sc
| |
| 359 const BeginFrameArgs& last_args = obs->LastUsedBeginFrameArgs(); | 364 const BeginFrameArgs& last_args = obs->LastUsedBeginFrameArgs(); |
| 360 if (!last_args.IsValid() || | 365 if (!last_args.IsValid() || |
| 361 (missed_begin_frame_args_.frame_time > last_args.frame_time)) { | 366 (missed_begin_frame_args_.frame_time > last_args.frame_time)) { |
| 362 DCHECK((missed_begin_frame_args_.source_id != last_args.source_id) || | 367 DCHECK((missed_begin_frame_args_.source_id != last_args.source_id) || |
| 363 (missed_begin_frame_args_.sequence_number > | 368 (missed_begin_frame_args_.sequence_number > |
| 364 last_args.sequence_number)) | 369 last_args.sequence_number)) |
| 365 << "current " << missed_begin_frame_args_.AsValue()->ToString() | 370 << "current " << missed_begin_frame_args_.AsValue()->ToString() |
| 366 << ", last " << last_args.AsValue()->ToString(); | 371 << ", last " << last_args.AsValue()->ToString(); |
| 367 obs->OnBeginFrame(missed_begin_frame_args_); | 372 obs->OnBeginFrame(missed_begin_frame_args_); |
| 368 } | 373 } |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 435 void ExternalBeginFrameSource::FinishFrame() { | 440 void ExternalBeginFrameSource::FinishFrame() { |
| 436 frame_active_ = false; | 441 frame_active_ = false; |
| 437 | 442 |
| 438 BeginFrameAck ack(missed_begin_frame_args_.source_id, | 443 BeginFrameAck ack(missed_begin_frame_args_.source_id, |
| 439 missed_begin_frame_args_.sequence_number, | 444 missed_begin_frame_args_.sequence_number, |
| 440 ack_tracker_.LatestConfirmedSequenceNumber(), 0, | 445 ack_tracker_.LatestConfirmedSequenceNumber(), 0, |
| 441 ack_tracker_.AnyObserversHadDamage()); | 446 ack_tracker_.AnyObserversHadDamage()); |
| 442 client_->OnDidFinishFrame(ack); | 447 client_->OnDidFinishFrame(ack); |
| 443 } | 448 } |
| 444 | 449 |
| 450 base::TimeTicks ExternalBeginFrameSource::Now() const { | |
| 451 return base::TimeTicks::Now(); | |
| 452 } | |
| 453 | |
| 445 } // namespace cc | 454 } // namespace cc |
| OLD | NEW |