fake_external_begin_frame_source.cc 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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
  3. // found in the LICENSE file.
  4. #include "components/viz/test/fake_external_begin_frame_source.h"
  5. #include "base/bind.h"
  6. #include "base/location.h"
  7. #include "base/task/single_thread_task_runner.h"
  8. #include "base/threading/thread_task_runner_handle.h"
  9. #include "base/time/time.h"
  10. #include "components/viz/test/begin_frame_args_test.h"
  11. namespace viz {
  12. FakeExternalBeginFrameSource::FakeExternalBeginFrameSource(
  13. double refresh_rate,
  14. bool tick_automatically)
  15. : BeginFrameSource(kNotRestartableId),
  16. tick_automatically_(tick_automatically),
  17. milliseconds_per_frame_(1000.0 / refresh_rate) {
  18. DETACH_FROM_SEQUENCE(sequence_checker_);
  19. }
  20. FakeExternalBeginFrameSource::~FakeExternalBeginFrameSource() {
  21. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  22. }
  23. void FakeExternalBeginFrameSource::SetPaused(bool paused) {
  24. if (paused != paused_) {
  25. paused_ = paused;
  26. std::set<BeginFrameObserver*> observers(observers_);
  27. for (auto* obs : observers)
  28. obs->OnBeginFrameSourcePausedChanged(paused_);
  29. }
  30. }
  31. void FakeExternalBeginFrameSource::AddObserver(BeginFrameObserver* obs) {
  32. DCHECK(obs);
  33. DCHECK(observers_.find(obs) == observers_.end());
  34. bool observers_was_empty = observers_.empty();
  35. observers_.insert(obs);
  36. obs->OnBeginFrameSourcePausedChanged(paused_);
  37. if (observers_was_empty && tick_automatically_) {
  38. PostTestOnBeginFrame();
  39. } else if (current_args_.IsValid()) {
  40. const BeginFrameArgs& last_args = obs->LastUsedBeginFrameArgs();
  41. if (!last_args.IsValid() ||
  42. last_args.frame_time < current_args_.frame_time) {
  43. current_args_.type = BeginFrameArgs::MISSED;
  44. obs->OnBeginFrame(current_args_);
  45. }
  46. }
  47. if (client_)
  48. client_->OnAddObserver(obs);
  49. }
  50. void FakeExternalBeginFrameSource::RemoveObserver(BeginFrameObserver* obs) {
  51. DCHECK(obs);
  52. DCHECK(observers_.find(obs) != observers_.end());
  53. observers_.erase(obs);
  54. if (observers_.empty())
  55. begin_frame_task_.Cancel();
  56. if (client_)
  57. client_->OnRemoveObserver(obs);
  58. }
  59. void FakeExternalBeginFrameSource::DidFinishFrame(BeginFrameObserver* obs) {}
  60. void FakeExternalBeginFrameSource::SetDynamicBeginFrameDeadlineOffsetSource(
  61. DynamicBeginFrameDeadlineOffsetSource*
  62. dynamic_begin_frame_deadline_offset_source) {
  63. begin_frame_args_generator_.set_dynamic_begin_frame_deadline_offset_source(
  64. dynamic_begin_frame_deadline_offset_source);
  65. }
  66. BeginFrameArgs FakeExternalBeginFrameSource::CreateBeginFrameArgs(
  67. BeginFrameArgs::CreationLocation location,
  68. const base::TickClock* now_src) {
  69. return CreateBeginFrameArgsForTesting(location, source_id(),
  70. next_begin_frame_number_++, now_src);
  71. }
  72. BeginFrameArgs FakeExternalBeginFrameSource::CreateBeginFrameArgs(
  73. BeginFrameArgs::CreationLocation location) {
  74. return CreateBeginFrameArgsForTesting(location, source_id(),
  75. next_begin_frame_number_++);
  76. }
  77. BeginFrameArgs FakeExternalBeginFrameSource::CreateBeginFrameArgsWithGenerator(
  78. base::TimeTicks frame_time,
  79. base::TimeTicks next_frame_time,
  80. base::TimeDelta vsync_interval) {
  81. return begin_frame_args_generator_.GenerateBeginFrameArgs(
  82. source_id(), frame_time, next_frame_time, vsync_interval);
  83. }
  84. void FakeExternalBeginFrameSource::TestOnBeginFrame(
  85. const BeginFrameArgs& args) {
  86. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  87. current_args_ = args;
  88. std::set<BeginFrameObserver*> observers(observers_);
  89. for (auto* obs : observers)
  90. obs->OnBeginFrame(current_args_);
  91. if (tick_automatically_)
  92. PostTestOnBeginFrame();
  93. }
  94. void FakeExternalBeginFrameSource::PostTestOnBeginFrame() {
  95. begin_frame_task_.Reset(
  96. base::BindOnce(&FakeExternalBeginFrameSource::TestOnBeginFrame,
  97. weak_ptr_factory_.GetWeakPtr(),
  98. CreateBeginFrameArgs(BEGINFRAME_FROM_HERE)));
  99. base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
  100. FROM_HERE, begin_frame_task_.callback(),
  101. base::Milliseconds(milliseconds_per_frame_));
  102. next_begin_frame_number_++;
  103. }
  104. } // namespace viz