| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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/frame_rate_controller.h" | 5 #include "cc/scheduler/frame_rate_controller.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
| 9 #include "base/location.h" | 9 #include "base/location.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 }; | 37 }; |
| 38 | 38 |
| 39 FrameRateController::FrameRateController(scoped_refptr<TimeSource> timer) | 39 FrameRateController::FrameRateController(scoped_refptr<TimeSource> timer) |
| 40 : client_(NULL), | 40 : client_(NULL), |
| 41 num_frames_pending_(0), | 41 num_frames_pending_(0), |
| 42 max_swaps_pending_(0), | 42 max_swaps_pending_(0), |
| 43 interval_(BeginFrameArgs::DefaultInterval()), | 43 interval_(BeginFrameArgs::DefaultInterval()), |
| 44 time_source_(timer), | 44 time_source_(timer), |
| 45 active_(false), | 45 active_(false), |
| 46 is_time_source_throttling_(true), | 46 is_time_source_throttling_(true), |
| 47 manual_tick_pending_(false), |
| 47 task_runner_(NULL), | 48 task_runner_(NULL), |
| 48 weak_factory_(this) { | 49 weak_factory_(this) { |
| 49 time_source_client_adapter_ = | 50 time_source_client_adapter_ = |
| 50 FrameRateControllerTimeSourceAdapter::Create(this); | 51 FrameRateControllerTimeSourceAdapter::Create(this); |
| 51 time_source_->SetClient(time_source_client_adapter_.get()); | 52 time_source_->SetClient(time_source_client_adapter_.get()); |
| 52 } | 53 } |
| 53 | 54 |
| 54 FrameRateController::FrameRateController( | 55 FrameRateController::FrameRateController( |
| 55 base::SingleThreadTaskRunner* task_runner) | 56 base::SingleThreadTaskRunner* task_runner) |
| 56 : client_(NULL), | 57 : client_(NULL), |
| 57 num_frames_pending_(0), | 58 num_frames_pending_(0), |
| 58 max_swaps_pending_(0), | 59 max_swaps_pending_(0), |
| 59 interval_(BeginFrameArgs::DefaultInterval()), | 60 interval_(BeginFrameArgs::DefaultInterval()), |
| 60 active_(false), | 61 active_(false), |
| 61 is_time_source_throttling_(false), | 62 is_time_source_throttling_(false), |
| 63 manual_tick_pending_(false), |
| 62 task_runner_(task_runner), | 64 task_runner_(task_runner), |
| 63 weak_factory_(this) {} | 65 weak_factory_(this) {} |
| 64 | 66 |
| 65 FrameRateController::~FrameRateController() { | 67 FrameRateController::~FrameRateController() { |
| 66 if (is_time_source_throttling_) | 68 if (is_time_source_throttling_) |
| 67 time_source_->SetActive(false); | 69 time_source_->SetActive(false); |
| 68 } | 70 } |
| 69 | 71 |
| 70 BeginFrameArgs FrameRateController::SetActive(bool active) { | 72 BeginFrameArgs FrameRateController::SetActive(bool active) { |
| 71 if (active_ == active) | 73 if (active_ == active) |
| 72 return BeginFrameArgs(); | 74 return BeginFrameArgs(); |
| 73 TRACE_EVENT1("cc", "FrameRateController::SetActive", "active", active); | 75 TRACE_EVENT1("cc", "FrameRateController::SetActive", "active", active); |
| 74 active_ = active; | 76 active_ = active; |
| 75 | 77 |
| 76 if (is_time_source_throttling_) { | 78 if (is_time_source_throttling_) { |
| 77 base::TimeTicks missed_tick_time = time_source_->SetActive(active); | 79 base::TimeTicks missed_tick_time = time_source_->SetActive(active); |
| 78 if (!missed_tick_time.is_null()) { | 80 if (!missed_tick_time.is_null()) { |
| 79 base::TimeTicks deadline = NextTickTime(); | 81 base::TimeTicks deadline = NextTickTime(); |
| 80 return BeginFrameArgs::Create( | 82 return BeginFrameArgs::Create( |
| 81 missed_tick_time, deadline + deadline_adjustment_, interval_); | 83 missed_tick_time, deadline + deadline_adjustment_, interval_); |
| 82 } | 84 } |
| 83 } else { | 85 } else { |
| 84 if (active) | 86 if (active) { |
| 85 PostManualTick(); | 87 PostManualTick(); |
| 86 else | 88 } else { |
| 87 weak_factory_.InvalidateWeakPtrs(); | 89 weak_factory_.InvalidateWeakPtrs(); |
| 90 manual_tick_pending_ = false; |
| 91 } |
| 88 } | 92 } |
| 89 | 93 |
| 90 return BeginFrameArgs(); | 94 return BeginFrameArgs(); |
| 91 } | 95 } |
| 92 | 96 |
| 93 void FrameRateController::SetMaxSwapsPending(int max_swaps_pending) { | 97 void FrameRateController::SetMaxSwapsPending(int max_swaps_pending) { |
| 94 DCHECK_GE(max_swaps_pending, 0); | 98 DCHECK_GE(max_swaps_pending, 0); |
| 95 max_swaps_pending_ = max_swaps_pending; | 99 max_swaps_pending_ = max_swaps_pending; |
| 96 } | 100 } |
| 97 | 101 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 122 BeginFrameArgs args = BeginFrameArgs::Create( | 126 BeginFrameArgs args = BeginFrameArgs::Create( |
| 123 frame_time, deadline + deadline_adjustment_, interval_); | 127 frame_time, deadline + deadline_adjustment_, interval_); |
| 124 client_->FrameRateControllerTick(throttled, args); | 128 client_->FrameRateControllerTick(throttled, args); |
| 125 } | 129 } |
| 126 | 130 |
| 127 if (!is_time_source_throttling_ && !throttled) | 131 if (!is_time_source_throttling_ && !throttled) |
| 128 PostManualTick(); | 132 PostManualTick(); |
| 129 } | 133 } |
| 130 | 134 |
| 131 void FrameRateController::PostManualTick() { | 135 void FrameRateController::PostManualTick() { |
| 132 if (active_) { | 136 if (active_ && !manual_tick_pending_) { |
| 137 manual_tick_pending_ = true; |
| 133 task_runner_->PostTask(FROM_HERE, | 138 task_runner_->PostTask(FROM_HERE, |
| 134 base::Bind(&FrameRateController::ManualTick, | 139 base::Bind(&FrameRateController::ManualTick, |
| 135 weak_factory_.GetWeakPtr())); | 140 weak_factory_.GetWeakPtr())); |
| 136 } | 141 } |
| 137 } | 142 } |
| 138 | 143 |
| 139 void FrameRateController::ManualTick() { | 144 void FrameRateController::ManualTick() { |
| 145 manual_tick_pending_ = false; |
| 140 OnTimerTick(); | 146 OnTimerTick(); |
| 141 } | 147 } |
| 142 | 148 |
| 143 void FrameRateController::DidSwapBuffers() { | 149 void FrameRateController::DidSwapBuffers() { |
| 144 num_frames_pending_++; | 150 num_frames_pending_++; |
| 145 } | 151 } |
| 146 | 152 |
| 147 void FrameRateController::DidSwapBuffersComplete() { | 153 void FrameRateController::DidSwapBuffersComplete() { |
| 148 DCHECK_GT(num_frames_pending_, 0); | 154 DCHECK_GT(num_frames_pending_, 0); |
| 149 num_frames_pending_--; | 155 num_frames_pending_--; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 163 } | 169 } |
| 164 | 170 |
| 165 base::TimeTicks FrameRateController::LastTickTime() { | 171 base::TimeTicks FrameRateController::LastTickTime() { |
| 166 if (is_time_source_throttling_) | 172 if (is_time_source_throttling_) |
| 167 return time_source_->LastTickTime(); | 173 return time_source_->LastTickTime(); |
| 168 | 174 |
| 169 return gfx::FrameTime::Now(); | 175 return gfx::FrameTime::Now(); |
| 170 } | 176 } |
| 171 | 177 |
| 172 } // namespace cc | 178 } // namespace cc |
| OLD | NEW |