| 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 #include "cc/scheduler/scheduler.h" | 4 #include "cc/scheduler/scheduler.h" |
| 5 | 5 |
| 6 #include <string> | 6 #include <string> |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 namespace cc { | 40 namespace cc { |
| 41 namespace { | 41 namespace { |
| 42 | 42 |
| 43 class FakeSchedulerClient; | 43 class FakeSchedulerClient; |
| 44 | 44 |
| 45 void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler, | 45 void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler, |
| 46 FakeSchedulerClient* client); | 46 FakeSchedulerClient* client); |
| 47 | 47 |
| 48 class FakeSchedulerClient : public SchedulerClient { | 48 class FakeSchedulerClient : public SchedulerClient { |
| 49 public: | 49 public: |
| 50 struct FakeBeginFrameSourceForFakeSchedulerClient | 50 class FakeExternalBeginFrameSource : public BeginFrameSourceMixIn { |
| 51 : public FakeBeginFrameSource { | 51 public: |
| 52 FakeSchedulerClient* client_; | 52 explicit FakeExternalBeginFrameSource(FakeSchedulerClient* client) |
| 53 | |
| 54 explicit FakeBeginFrameSourceForFakeSchedulerClient( | |
| 55 FakeSchedulerClient* client) | |
| 56 : client_(client) {} | 53 : client_(client) {} |
| 54 virtual ~FakeExternalBeginFrameSource() {} |
| 57 | 55 |
| 58 void OnNeedsBeginFramesChange(bool needs_begin_frames) override { | 56 void OnNeedsBeginFramesChange(bool needs_begin_frames) override { |
| 59 if (needs_begin_frames) { | 57 if (needs_begin_frames) { |
| 60 client_->actions_.push_back("SetNeedsBeginFrames(true)"); | 58 client_->actions_.push_back("SetNeedsBeginFrames(true)"); |
| 61 } else { | 59 } else { |
| 62 client_->actions_.push_back("SetNeedsBeginFrames(false)"); | 60 client_->actions_.push_back("SetNeedsBeginFrames(false)"); |
| 63 } | 61 } |
| 64 client_->states_.push_back(client_->scheduler_->AsValue()); | 62 client_->states_.push_back(client_->scheduler_->AsValue()); |
| 65 } | 63 } |
| 64 |
| 65 void TestOnBeginFrame(const BeginFrameArgs& args) { |
| 66 return CallOnBeginFrame(args); |
| 67 } |
| 68 |
| 69 private: |
| 70 FakeSchedulerClient* client_; |
| 66 }; | 71 }; |
| 67 | 72 |
| 68 class FakePowerMonitorSource : public base::PowerMonitorSource { | 73 class FakePowerMonitorSource : public base::PowerMonitorSource { |
| 69 public: | 74 public: |
| 70 FakePowerMonitorSource() {} | 75 FakePowerMonitorSource() {} |
| 71 ~FakePowerMonitorSource() override {} | 76 ~FakePowerMonitorSource() override {} |
| 72 void GeneratePowerStateEvent(bool on_battery_power) { | 77 void GeneratePowerStateEvent(bool on_battery_power) { |
| 73 on_battery_power_impl_ = on_battery_power; | 78 on_battery_power_impl_ = on_battery_power; |
| 74 ProcessPowerEvent(POWER_STATE_EVENT); | 79 ProcessPowerEvent(POWER_STATE_EVENT); |
| 75 base::MessageLoop::current()->RunUntilIdle(); | 80 base::MessageLoop::current()->RunUntilIdle(); |
| 76 } | 81 } |
| 77 bool IsOnBatteryPowerImpl() override { return on_battery_power_impl_; } | 82 bool IsOnBatteryPowerImpl() override { return on_battery_power_impl_; } |
| 78 | 83 |
| 79 private: | 84 private: |
| 80 bool on_battery_power_impl_; | 85 bool on_battery_power_impl_; |
| 81 }; | 86 }; |
| 82 | 87 |
| 83 FakeSchedulerClient() | 88 FakeSchedulerClient() |
| 84 : automatic_swap_ack_(true), | 89 : automatic_swap_ack_(true), |
| 85 swap_contains_incomplete_tile_(false), | 90 swap_contains_incomplete_tile_(false), |
| 86 redraw_will_happen_if_update_visible_tiles_happens_(false), | 91 redraw_will_happen_if_update_visible_tiles_happens_(false), |
| 87 now_src_(TestNowSource::Create()), | 92 now_src_(TestNowSource::Create()), |
| 88 task_runner_(new OrderedSimpleTaskRunner(now_src_, true)), | 93 task_runner_(new OrderedSimpleTaskRunner(now_src_, true)), |
| 89 fake_frame_source_(this), | 94 fake_external_begin_frame_source_(nullptr), |
| 90 fake_power_monitor_source_(new FakePowerMonitorSource), | 95 fake_power_monitor_source_(new FakePowerMonitorSource), |
| 91 power_monitor_(make_scoped_ptr<base::PowerMonitorSource>( | 96 power_monitor_(make_scoped_ptr<base::PowerMonitorSource>( |
| 92 fake_power_monitor_source_)), | 97 fake_power_monitor_source_)), |
| 93 scheduler_(nullptr) { | 98 scheduler_(nullptr) { |
| 94 // A bunch of tests require Now() to be > BeginFrameArgs::DefaultInterval() | 99 // A bunch of tests require Now() to be > BeginFrameArgs::DefaultInterval() |
| 95 now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(100)); | 100 now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(100)); |
| 96 // Fail if we need to run 100 tasks in a row. | 101 // Fail if we need to run 100 tasks in a row. |
| 97 task_runner_->SetRunTaskLimit(100); | 102 task_runner_->SetRunTaskLimit(100); |
| 98 Reset(); | 103 Reset(); |
| 99 } | 104 } |
| 100 | 105 |
| 101 void Reset() { | 106 void Reset() { |
| 102 actions_.clear(); | 107 actions_.clear(); |
| 103 states_.clear(); | 108 states_.clear(); |
| 104 draw_will_happen_ = true; | 109 draw_will_happen_ = true; |
| 105 swap_will_happen_if_draw_happens_ = true; | 110 swap_will_happen_if_draw_happens_ = true; |
| 106 num_draws_ = 0; | 111 num_draws_ = 0; |
| 107 log_anticipated_draw_time_change_ = false; | 112 log_anticipated_draw_time_change_ = false; |
| 108 } | 113 } |
| 109 | 114 |
| 110 TestScheduler* CreateScheduler(const SchedulerSettings& settings) { | 115 TestScheduler* CreateScheduler(const SchedulerSettings& settings) { |
| 111 scheduler_ = TestScheduler::Create( | 116 scoped_ptr<FakeExternalBeginFrameSource> fake_external_begin_frame_source; |
| 112 now_src_, this, settings, 0, task_runner_, &power_monitor_); | 117 if (settings.begin_frame_scheduling_enabled && |
| 118 settings.throttle_frame_production) { |
| 119 fake_external_begin_frame_source.reset( |
| 120 new FakeExternalBeginFrameSource(this)); |
| 121 fake_external_begin_frame_source_ = |
| 122 fake_external_begin_frame_source.get(); |
| 123 } |
| 124 scheduler_ = TestScheduler::Create(now_src_, |
| 125 this, |
| 126 settings, |
| 127 0, |
| 128 task_runner_, |
| 129 &power_monitor_, |
| 130 fake_external_begin_frame_source.Pass()); |
| 113 DCHECK(scheduler_); | 131 DCHECK(scheduler_); |
| 114 return scheduler_.get(); | 132 return scheduler_.get(); |
| 115 } | 133 } |
| 116 | 134 |
| 117 // Most tests don't care about DidAnticipatedDrawTimeChange, so only record it | 135 // Most tests don't care about DidAnticipatedDrawTimeChange, so only record it |
| 118 // for tests that do. | 136 // for tests that do. |
| 119 void set_log_anticipated_draw_time_change(bool log) { | 137 void set_log_anticipated_draw_time_change(bool log) { |
| 120 log_anticipated_draw_time_change_ = log; | 138 log_anticipated_draw_time_change_ = log; |
| 121 } | 139 } |
| 122 bool needs_begin_frames() { return fake_frame_source_.NeedsBeginFrames(); } | 140 bool needs_begin_frames() { |
| 141 DCHECK(ExternalBeginFrame()); |
| 142 return fake_external_begin_frame_source_->NeedsBeginFrames(); |
| 143 } |
| 123 int num_draws() const { return num_draws_; } | 144 int num_draws() const { return num_draws_; } |
| 124 int num_actions_() const { return static_cast<int>(actions_.size()); } | 145 int num_actions_() const { return static_cast<int>(actions_.size()); } |
| 125 const char* Action(int i) const { return actions_[i]; } | 146 const char* Action(int i) const { return actions_[i]; } |
| 126 std::string StateForAction(int i) const { return states_[i]->ToString(); } | 147 std::string StateForAction(int i) const { return states_[i]->ToString(); } |
| 127 base::TimeTicks posted_begin_impl_frame_deadline() const { | 148 base::TimeTicks posted_begin_impl_frame_deadline() const { |
| 128 return posted_begin_impl_frame_deadline_; | 149 return posted_begin_impl_frame_deadline_; |
| 129 } | 150 } |
| 130 | 151 |
| 131 bool ExternalBeginFrame() { | 152 bool ExternalBeginFrame() { |
| 132 return scheduler_->settings().begin_frame_scheduling_enabled && | 153 return scheduler_->settings().begin_frame_scheduling_enabled && |
| 133 scheduler_->settings().throttle_frame_production; | 154 scheduler_->settings().throttle_frame_production; |
| 134 } | 155 } |
| 135 FakeBeginFrameSource* ExternalBeginFrameSource() override { | 156 |
| 136 return &fake_frame_source_; | 157 FakeExternalBeginFrameSource* fake_external_begin_frame_source() const { |
| 158 return fake_external_begin_frame_source_; |
| 137 } | 159 } |
| 138 | 160 |
| 139 base::PowerMonitor* PowerMonitor() { return &power_monitor_; } | 161 base::PowerMonitor* PowerMonitor() { return &power_monitor_; } |
| 140 | 162 |
| 141 FakePowerMonitorSource* PowerMonitorSource() { | 163 FakePowerMonitorSource* PowerMonitorSource() { |
| 142 return fake_power_monitor_source_; | 164 return fake_power_monitor_source_; |
| 143 } | 165 } |
| 144 | 166 |
| 145 void AdvanceFrame() { | 167 void AdvanceFrame() { |
| 146 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler.frames"), | 168 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler.frames"), |
| 147 "FakeSchedulerClient::AdvanceFrame"); | 169 "FakeSchedulerClient::AdvanceFrame"); |
| 148 // EXPECT_TRUE(needs_begin_frames()); | |
| 149 if (ExternalBeginFrame()) { | 170 if (ExternalBeginFrame()) { |
| 150 // Creep the time forward so that any BeginFrameArgs is not equal to the | 171 // Creep the time forward so that any BeginFrameArgs is not equal to the |
| 151 // last one otherwise we violate the BeginFrameSource contract. | 172 // last one otherwise we violate the BeginFrameSource contract. |
| 152 now_src_->AdvanceNowMicroseconds(1); | 173 now_src_->AdvanceNowMicroseconds(1); |
| 153 fake_frame_source_.TestOnBeginFrame( | 174 fake_external_begin_frame_source_->TestOnBeginFrame( |
| 154 CreateBeginFrameArgsForTesting(now_src_)); | 175 CreateBeginFrameArgsForTesting(now_src_)); |
| 155 EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); | 176 EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| 156 } | 177 } |
| 157 | 178 |
| 158 EXPECT_TRUE(task_runner().RunTasksWhile(ImplFrameDeadlinePending(false))); | 179 EXPECT_TRUE(task_runner().RunTasksWhile(ImplFrameDeadlinePending(false))); |
| 159 EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); | 180 EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| 160 } | 181 } |
| 161 | 182 |
| 162 OrderedSimpleTaskRunner& task_runner() { return *task_runner_; } | 183 OrderedSimpleTaskRunner& task_runner() { return *task_runner_; } |
| 163 TestNowSource* now_src() { return now_src_.get(); } | 184 TestNowSource* now_src() { return now_src_.get(); } |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 bool automatic_swap_ack_; | 302 bool automatic_swap_ack_; |
| 282 int num_draws_; | 303 int num_draws_; |
| 283 bool log_anticipated_draw_time_change_; | 304 bool log_anticipated_draw_time_change_; |
| 284 bool swap_contains_incomplete_tile_; | 305 bool swap_contains_incomplete_tile_; |
| 285 bool redraw_will_happen_if_update_visible_tiles_happens_; | 306 bool redraw_will_happen_if_update_visible_tiles_happens_; |
| 286 base::TimeTicks posted_begin_impl_frame_deadline_; | 307 base::TimeTicks posted_begin_impl_frame_deadline_; |
| 287 std::vector<const char*> actions_; | 308 std::vector<const char*> actions_; |
| 288 std::vector<scoped_refptr<base::debug::ConvertableToTraceFormat>> states_; | 309 std::vector<scoped_refptr<base::debug::ConvertableToTraceFormat>> states_; |
| 289 scoped_refptr<TestNowSource> now_src_; | 310 scoped_refptr<TestNowSource> now_src_; |
| 290 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; | 311 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; |
| 291 FakeBeginFrameSourceForFakeSchedulerClient fake_frame_source_; | 312 FakeExternalBeginFrameSource* fake_external_begin_frame_source_; |
| 292 FakePowerMonitorSource* fake_power_monitor_source_; | 313 FakePowerMonitorSource* fake_power_monitor_source_; |
| 293 base::PowerMonitor power_monitor_; | 314 base::PowerMonitor power_monitor_; |
| 294 scoped_ptr<TestScheduler> scheduler_; | 315 scoped_ptr<TestScheduler> scheduler_; |
| 295 }; | 316 }; |
| 296 | 317 |
| 297 void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler, | 318 void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler, |
| 298 FakeSchedulerClient* client) { | 319 FakeSchedulerClient* client) { |
| 299 TRACE_EVENT0("cc", | 320 TRACE_EVENT0("cc", |
| 300 "SchedulerUnitTest::InitializeOutputSurfaceAndFirstCommit"); | 321 "SchedulerUnitTest::InitializeOutputSurfaceAndFirstCommit"); |
| 301 | 322 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 320 SCOPED_TRACE( | 341 SCOPED_TRACE( |
| 321 "We need another BeginImplFrame so Scheduler calls " | 342 "We need another BeginImplFrame so Scheduler calls " |
| 322 "SetNeedsBeginFrame(false)."); | 343 "SetNeedsBeginFrame(false)."); |
| 323 client->AdvanceFrame(); | 344 client->AdvanceFrame(); |
| 324 } | 345 } |
| 325 | 346 |
| 326 // Run the posted deadline task. | 347 // Run the posted deadline task. |
| 327 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 348 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 328 client->task_runner().RunTasksWhile(client->ImplFrameDeadlinePending(true)); | 349 client->task_runner().RunTasksWhile(client->ImplFrameDeadlinePending(true)); |
| 329 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 350 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 330 | |
| 331 // EXPECT_FALSE(client->needs_begin_frames()); | |
| 332 } | 351 } |
| 333 | 352 |
| 334 TEST(SchedulerTest, InitializeOutputSurfaceDoesNotBeginImplFrame) { | 353 TEST(SchedulerTest, InitializeOutputSurfaceDoesNotBeginImplFrame) { |
| 335 FakeSchedulerClient client; | 354 FakeSchedulerClient client; |
| 336 SchedulerSettings default_scheduler_settings; | 355 SchedulerSettings default_scheduler_settings; |
| 337 TestScheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 356 TestScheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
| 338 scheduler->SetCanStart(); | 357 scheduler->SetCanStart(); |
| 339 scheduler->SetVisible(true); | 358 scheduler->SetVisible(true); |
| 340 scheduler->SetCanDraw(true); | 359 scheduler->SetCanDraw(true); |
| 341 | 360 |
| (...skipping 830 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1172 scheduler->DidCreateAndInitializeOutputSurface(); | 1191 scheduler->DidCreateAndInitializeOutputSurface(); |
| 1173 | 1192 |
| 1174 scheduler->SetNeedsCommit(); | 1193 scheduler->SetNeedsCommit(); |
| 1175 EXPECT_TRUE(scheduler->CommitPending()); | 1194 EXPECT_TRUE(scheduler->CommitPending()); |
| 1176 scheduler->NotifyBeginMainFrameStarted(); | 1195 scheduler->NotifyBeginMainFrameStarted(); |
| 1177 scheduler->NotifyReadyToCommit(); | 1196 scheduler->NotifyReadyToCommit(); |
| 1178 scheduler->SetNeedsRedraw(); | 1197 scheduler->SetNeedsRedraw(); |
| 1179 | 1198 |
| 1180 BeginFrameArgs frame_args = CreateBeginFrameArgsForTesting(client.now_src()); | 1199 BeginFrameArgs frame_args = CreateBeginFrameArgsForTesting(client.now_src()); |
| 1181 frame_args.interval = base::TimeDelta::FromMilliseconds(1000); | 1200 frame_args.interval = base::TimeDelta::FromMilliseconds(1000); |
| 1182 client.ExternalBeginFrameSource()->TestOnBeginFrame(frame_args); | 1201 client.fake_external_begin_frame_source()->TestOnBeginFrame(frame_args); |
| 1183 | 1202 |
| 1184 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1203 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1185 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1204 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1186 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1205 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 1187 | 1206 |
| 1188 scheduler->DidSwapBuffers(); | 1207 scheduler->DidSwapBuffers(); |
| 1189 scheduler->DidSwapBuffersComplete(); | 1208 scheduler->DidSwapBuffersComplete(); |
| 1190 | 1209 |
| 1191 // At this point, we've drawn a frame. Start another commit, but hold off on | 1210 // At this point, we've drawn a frame. Start another commit, but hold off on |
| 1192 // the NotifyReadyToCommit for now. | 1211 // the NotifyReadyToCommit for now. |
| 1193 EXPECT_FALSE(scheduler->CommitPending()); | 1212 EXPECT_FALSE(scheduler->CommitPending()); |
| 1194 scheduler->SetNeedsCommit(); | 1213 scheduler->SetNeedsCommit(); |
| 1195 client.ExternalBeginFrameSource()->TestOnBeginFrame(frame_args); | 1214 client.fake_external_begin_frame_source()->TestOnBeginFrame(frame_args); |
| 1196 EXPECT_TRUE(scheduler->CommitPending()); | 1215 EXPECT_TRUE(scheduler->CommitPending()); |
| 1197 | 1216 |
| 1198 // Draw and swap the frame, but don't ack the swap to simulate the Browser | 1217 // Draw and swap the frame, but don't ack the swap to simulate the Browser |
| 1199 // blocking on the renderer. | 1218 // blocking on the renderer. |
| 1200 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1219 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1201 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1220 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1202 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1221 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 1203 scheduler->DidSwapBuffers(); | 1222 scheduler->DidSwapBuffers(); |
| 1204 | 1223 |
| 1205 // Spin the event loop a few times and make sure we get more | 1224 // Spin the event loop a few times and make sure we get more |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1244 // SetNeedsCommit should begin the frame on the next BeginImplFrame. | 1263 // SetNeedsCommit should begin the frame on the next BeginImplFrame. |
| 1245 client.Reset(); | 1264 client.Reset(); |
| 1246 scheduler->SetNeedsCommit(); | 1265 scheduler->SetNeedsCommit(); |
| 1247 EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); | 1266 EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
| 1248 client.Reset(); | 1267 client.Reset(); |
| 1249 | 1268 |
| 1250 // Create a BeginFrame with a long deadline to avoid race conditions. | 1269 // Create a BeginFrame with a long deadline to avoid race conditions. |
| 1251 // This is the first BeginFrame, which will be handled immediately. | 1270 // This is the first BeginFrame, which will be handled immediately. |
| 1252 BeginFrameArgs args = CreateBeginFrameArgsForTesting(client.now_src()); | 1271 BeginFrameArgs args = CreateBeginFrameArgsForTesting(client.now_src()); |
| 1253 args.deadline += base::TimeDelta::FromHours(1); | 1272 args.deadline += base::TimeDelta::FromHours(1); |
| 1254 client.ExternalBeginFrameSource()->TestOnBeginFrame(args); | 1273 client.fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| 1255 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 1274 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 1256 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); | 1275 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| 1257 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1276 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1258 EXPECT_TRUE(client.needs_begin_frames()); | 1277 EXPECT_TRUE(client.needs_begin_frames()); |
| 1259 client.Reset(); | 1278 client.Reset(); |
| 1260 | 1279 |
| 1261 // Queue BeginFrames while we are still handling the previous BeginFrame. | 1280 // Queue BeginFrames while we are still handling the previous BeginFrame. |
| 1262 args.frame_time += base::TimeDelta::FromSeconds(1); | 1281 args.frame_time += base::TimeDelta::FromSeconds(1); |
| 1263 client.ExternalBeginFrameSource()->TestOnBeginFrame(args); | 1282 client.fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| 1264 args.frame_time += base::TimeDelta::FromSeconds(1); | 1283 args.frame_time += base::TimeDelta::FromSeconds(1); |
| 1265 client.ExternalBeginFrameSource()->TestOnBeginFrame(args); | 1284 client.fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| 1266 | 1285 |
| 1267 // If we don't swap on the deadline, we wait for the next BeginImplFrame. | 1286 // If we don't swap on the deadline, we wait for the next BeginImplFrame. |
| 1268 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1287 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1269 EXPECT_NO_ACTION(client); | 1288 EXPECT_NO_ACTION(client); |
| 1270 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1289 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 1271 EXPECT_TRUE(client.needs_begin_frames()); | 1290 EXPECT_TRUE(client.needs_begin_frames()); |
| 1272 client.Reset(); | 1291 client.Reset(); |
| 1273 | 1292 |
| 1274 // NotifyReadyToCommit should trigger the commit. | 1293 // NotifyReadyToCommit should trigger the commit. |
| 1275 scheduler->NotifyBeginMainFrameStarted(); | 1294 scheduler->NotifyBeginMainFrameStarted(); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1321 // SetNeedsCommit should begin the frame on the next BeginImplFrame. | 1340 // SetNeedsCommit should begin the frame on the next BeginImplFrame. |
| 1322 client.Reset(); | 1341 client.Reset(); |
| 1323 scheduler->SetNeedsCommit(); | 1342 scheduler->SetNeedsCommit(); |
| 1324 EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); | 1343 EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
| 1325 client.Reset(); | 1344 client.Reset(); |
| 1326 | 1345 |
| 1327 // Create a BeginFrame with a long deadline to avoid race conditions. | 1346 // Create a BeginFrame with a long deadline to avoid race conditions. |
| 1328 // This is the first BeginFrame, which will be handled immediately. | 1347 // This is the first BeginFrame, which will be handled immediately. |
| 1329 BeginFrameArgs args = CreateBeginFrameArgsForTesting(client.now_src()); | 1348 BeginFrameArgs args = CreateBeginFrameArgsForTesting(client.now_src()); |
| 1330 args.deadline += base::TimeDelta::FromHours(1); | 1349 args.deadline += base::TimeDelta::FromHours(1); |
| 1331 client.ExternalBeginFrameSource()->TestOnBeginFrame(args); | 1350 client.fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| 1332 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 1351 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 1333 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); | 1352 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| 1334 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1353 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1335 EXPECT_TRUE(client.needs_begin_frames()); | 1354 EXPECT_TRUE(client.needs_begin_frames()); |
| 1336 client.Reset(); | 1355 client.Reset(); |
| 1337 | 1356 |
| 1338 // Queue BeginFrame while we are still handling the previous BeginFrame. | 1357 // Queue BeginFrame while we are still handling the previous BeginFrame. |
| 1339 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1358 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1340 args.frame_time += base::TimeDelta::FromSeconds(1); | 1359 args.frame_time += base::TimeDelta::FromSeconds(1); |
| 1341 client.ExternalBeginFrameSource()->TestOnBeginFrame(args); | 1360 client.fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| 1342 EXPECT_NO_ACTION(client); | 1361 EXPECT_NO_ACTION(client); |
| 1343 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1362 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1344 client.Reset(); | 1363 client.Reset(); |
| 1345 | 1364 |
| 1346 // NotifyReadyToCommit should trigger the pending commit and draw. | 1365 // NotifyReadyToCommit should trigger the pending commit and draw. |
| 1347 scheduler->NotifyBeginMainFrameStarted(); | 1366 scheduler->NotifyBeginMainFrameStarted(); |
| 1348 scheduler->NotifyReadyToCommit(); | 1367 scheduler->NotifyReadyToCommit(); |
| 1349 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 1368 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| 1350 EXPECT_TRUE(client.needs_begin_frames()); | 1369 EXPECT_TRUE(client.needs_begin_frames()); |
| 1351 client.Reset(); | 1370 client.Reset(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1362 // but not a BeginMainFrame or draw. | 1381 // but not a BeginMainFrame or draw. |
| 1363 scheduler->SetNeedsCommit(); | 1382 scheduler->SetNeedsCommit(); |
| 1364 client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. | 1383 client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. |
| 1365 EXPECT_ACTION("WillBeginImplFrame", client, 0, 1); | 1384 EXPECT_ACTION("WillBeginImplFrame", client, 0, 1); |
| 1366 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1385 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1367 EXPECT_TRUE(client.needs_begin_frames()); | 1386 EXPECT_TRUE(client.needs_begin_frames()); |
| 1368 client.Reset(); | 1387 client.Reset(); |
| 1369 | 1388 |
| 1370 // Queue BeginFrame while we are still handling the previous BeginFrame. | 1389 // Queue BeginFrame while we are still handling the previous BeginFrame. |
| 1371 args.frame_time += base::TimeDelta::FromSeconds(1); | 1390 args.frame_time += base::TimeDelta::FromSeconds(1); |
| 1372 client.ExternalBeginFrameSource()->TestOnBeginFrame(args); | 1391 client.fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| 1373 EXPECT_NO_ACTION(client); | 1392 EXPECT_NO_ACTION(client); |
| 1374 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1393 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1375 EXPECT_TRUE(client.needs_begin_frames()); | 1394 EXPECT_TRUE(client.needs_begin_frames()); |
| 1376 client.Reset(); | 1395 client.Reset(); |
| 1377 | 1396 |
| 1378 // Take us out of a swap throttled state. | 1397 // Take us out of a swap throttled state. |
| 1379 scheduler->DidSwapBuffersComplete(); | 1398 scheduler->DidSwapBuffersComplete(); |
| 1380 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 1); | 1399 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 1); |
| 1381 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1400 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1382 EXPECT_TRUE(client.needs_begin_frames()); | 1401 EXPECT_TRUE(client.needs_begin_frames()); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1401 SchedulerSettings scheduler_settings; | 1420 SchedulerSettings scheduler_settings; |
| 1402 scheduler_settings.begin_frame_scheduling_enabled = | 1421 scheduler_settings.begin_frame_scheduling_enabled = |
| 1403 begin_frame_scheduling_enabled; | 1422 begin_frame_scheduling_enabled; |
| 1404 scheduler_settings.throttle_frame_production = throttle_frame_production; | 1423 scheduler_settings.throttle_frame_production = throttle_frame_production; |
| 1405 TestScheduler* scheduler = client.CreateScheduler(scheduler_settings); | 1424 TestScheduler* scheduler = client.CreateScheduler(scheduler_settings); |
| 1406 scheduler->SetCanStart(); | 1425 scheduler->SetCanStart(); |
| 1407 scheduler->SetVisible(true); | 1426 scheduler->SetVisible(true); |
| 1408 scheduler->SetCanDraw(true); | 1427 scheduler->SetCanDraw(true); |
| 1409 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 1428 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
| 1410 | 1429 |
| 1430 DCHECK(!client.fake_external_begin_frame_source()); |
| 1431 |
| 1411 // SetNeedsCommit should begin the frame on the next BeginImplFrame | 1432 // SetNeedsCommit should begin the frame on the next BeginImplFrame |
| 1412 // without calling SetNeedsBeginFrame. | 1433 // without calling SetNeedsBeginFrame. |
| 1413 client.Reset(); | 1434 client.Reset(); |
| 1414 scheduler->SetNeedsCommit(); | 1435 scheduler->SetNeedsCommit(); |
| 1415 EXPECT_FALSE(client.needs_begin_frames()); | |
| 1416 EXPECT_NO_ACTION(client); | 1436 EXPECT_NO_ACTION(client); |
| 1417 client.Reset(); | 1437 client.Reset(); |
| 1418 | 1438 |
| 1419 // When the client-driven BeginFrame are disabled, the scheduler posts it's | 1439 // When the client-driven BeginFrame are disabled, the scheduler posts it's |
| 1420 // own BeginFrame tasks. | 1440 // own BeginFrame tasks. |
| 1421 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. | 1441 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| 1422 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 1442 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 1423 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); | 1443 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| 1424 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1444 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1425 EXPECT_FALSE(client.needs_begin_frames()); | |
| 1426 client.Reset(); | 1445 client.Reset(); |
| 1427 | 1446 |
| 1428 // If we don't swap on the deadline, we wait for the next BeginFrame. | 1447 // If we don't swap on the deadline, we wait for the next BeginFrame. |
| 1429 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1448 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1430 EXPECT_NO_ACTION(client); | 1449 EXPECT_NO_ACTION(client); |
| 1431 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1450 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 1432 EXPECT_FALSE(client.needs_begin_frames()); | |
| 1433 client.Reset(); | 1451 client.Reset(); |
| 1434 | 1452 |
| 1435 // NotifyReadyToCommit should trigger the commit. | 1453 // NotifyReadyToCommit should trigger the commit. |
| 1436 scheduler->NotifyBeginMainFrameStarted(); | 1454 scheduler->NotifyBeginMainFrameStarted(); |
| 1437 scheduler->NotifyReadyToCommit(); | 1455 scheduler->NotifyReadyToCommit(); |
| 1438 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 1456 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| 1439 EXPECT_FALSE(client.needs_begin_frames()); | |
| 1440 client.Reset(); | 1457 client.Reset(); |
| 1441 | 1458 |
| 1442 // BeginImplFrame should prepare the draw. | 1459 // BeginImplFrame should prepare the draw. |
| 1443 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. | 1460 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| 1444 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 1461 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 1445 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); | 1462 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| 1446 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1463 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1447 EXPECT_FALSE(client.needs_begin_frames()); | |
| 1448 client.Reset(); | 1464 client.Reset(); |
| 1449 | 1465 |
| 1450 // BeginImplFrame deadline should draw. | 1466 // BeginImplFrame deadline should draw. |
| 1451 client.task_runner().RunTasksWhile(client.ImplFrameDeadlinePending(true)); | 1467 client.task_runner().RunTasksWhile(client.ImplFrameDeadlinePending(true)); |
| 1452 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); | 1468 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
| 1453 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1469 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 1454 EXPECT_FALSE(client.needs_begin_frames()); | |
| 1455 client.Reset(); | 1470 client.Reset(); |
| 1456 | 1471 |
| 1457 // The following BeginImplFrame deadline should SetNeedsBeginFrame(false) | 1472 // The following BeginImplFrame deadline should SetNeedsBeginFrame(false) |
| 1458 // to avoid excessive toggles. | 1473 // to avoid excessive toggles. |
| 1459 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. | 1474 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| 1460 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | 1475 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
| 1461 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1476 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1462 client.Reset(); | 1477 client.Reset(); |
| 1463 | 1478 |
| 1464 // Make sure SetNeedsBeginFrame isn't called on the client | 1479 // Make sure SetNeedsBeginFrame isn't called on the client |
| 1465 // when the BeginFrame is no longer needed. | 1480 // when the BeginFrame is no longer needed. |
| 1466 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1481 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1467 EXPECT_NO_ACTION(client); | 1482 EXPECT_NO_ACTION(client); |
| 1468 EXPECT_FALSE(client.needs_begin_frames()); | |
| 1469 client.Reset(); | 1483 client.Reset(); |
| 1470 } | 1484 } |
| 1471 | 1485 |
| 1472 TEST(SchedulerTest, SyntheticBeginFrames) { | 1486 TEST(SchedulerTest, SyntheticBeginFrames) { |
| 1473 bool begin_frame_scheduling_enabled = false; | 1487 bool begin_frame_scheduling_enabled = false; |
| 1474 bool throttle_frame_production = true; | 1488 bool throttle_frame_production = true; |
| 1475 BeginFramesNotFromClient(begin_frame_scheduling_enabled, | 1489 BeginFramesNotFromClient(begin_frame_scheduling_enabled, |
| 1476 throttle_frame_production); | 1490 throttle_frame_production); |
| 1477 } | 1491 } |
| 1478 | 1492 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1496 SchedulerSettings scheduler_settings; | 1510 SchedulerSettings scheduler_settings; |
| 1497 scheduler_settings.begin_frame_scheduling_enabled = | 1511 scheduler_settings.begin_frame_scheduling_enabled = |
| 1498 begin_frame_scheduling_enabled; | 1512 begin_frame_scheduling_enabled; |
| 1499 scheduler_settings.throttle_frame_production = throttle_frame_production; | 1513 scheduler_settings.throttle_frame_production = throttle_frame_production; |
| 1500 TestScheduler* scheduler = client.CreateScheduler(scheduler_settings); | 1514 TestScheduler* scheduler = client.CreateScheduler(scheduler_settings); |
| 1501 scheduler->SetCanStart(); | 1515 scheduler->SetCanStart(); |
| 1502 scheduler->SetVisible(true); | 1516 scheduler->SetVisible(true); |
| 1503 scheduler->SetCanDraw(true); | 1517 scheduler->SetCanDraw(true); |
| 1504 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 1518 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
| 1505 | 1519 |
| 1520 DCHECK(!client.fake_external_begin_frame_source()); |
| 1521 |
| 1506 // To test swap ack throttling, this test disables automatic swap acks. | 1522 // To test swap ack throttling, this test disables automatic swap acks. |
| 1507 scheduler->SetMaxSwapsPending(1); | 1523 scheduler->SetMaxSwapsPending(1); |
| 1508 client.SetAutomaticSwapAck(false); | 1524 client.SetAutomaticSwapAck(false); |
| 1509 | 1525 |
| 1510 // SetNeedsCommit should begin the frame on the next BeginImplFrame. | 1526 // SetNeedsCommit should begin the frame on the next BeginImplFrame. |
| 1511 client.Reset(); | 1527 client.Reset(); |
| 1512 scheduler->SetNeedsCommit(); | 1528 scheduler->SetNeedsCommit(); |
| 1513 EXPECT_FALSE(client.needs_begin_frames()); | |
| 1514 EXPECT_NO_ACTION(client); | 1529 EXPECT_NO_ACTION(client); |
| 1515 client.Reset(); | 1530 client.Reset(); |
| 1516 | 1531 |
| 1517 // Trigger the first BeginImplFrame and BeginMainFrame | 1532 // Trigger the first BeginImplFrame and BeginMainFrame |
| 1518 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. | 1533 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| 1519 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 1534 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 1520 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); | 1535 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| 1521 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1536 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1522 EXPECT_FALSE(client.needs_begin_frames()); | |
| 1523 client.Reset(); | 1537 client.Reset(); |
| 1524 | 1538 |
| 1525 // NotifyReadyToCommit should trigger the pending commit and draw. | 1539 // NotifyReadyToCommit should trigger the pending commit and draw. |
| 1526 scheduler->NotifyBeginMainFrameStarted(); | 1540 scheduler->NotifyBeginMainFrameStarted(); |
| 1527 scheduler->NotifyReadyToCommit(); | 1541 scheduler->NotifyReadyToCommit(); |
| 1528 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 1542 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| 1529 EXPECT_FALSE(client.needs_begin_frames()); | |
| 1530 client.Reset(); | 1543 client.Reset(); |
| 1531 | 1544 |
| 1532 // Swapping will put us into a swap throttled state. | 1545 // Swapping will put us into a swap throttled state. |
| 1533 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1546 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1534 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); | 1547 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); |
| 1535 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); | 1548 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
| 1536 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1549 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 1537 EXPECT_FALSE(client.needs_begin_frames()); | |
| 1538 client.Reset(); | 1550 client.Reset(); |
| 1539 | 1551 |
| 1540 // While swap throttled, BeginFrames should trigger BeginImplFrames, | 1552 // While swap throttled, BeginFrames should trigger BeginImplFrames, |
| 1541 // but not a BeginMainFrame or draw. | 1553 // but not a BeginMainFrame or draw. |
| 1542 scheduler->SetNeedsCommit(); | 1554 scheduler->SetNeedsCommit(); |
| 1543 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. | 1555 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| 1544 EXPECT_ACTION("WillBeginImplFrame", client, 0, 1); | 1556 EXPECT_ACTION("WillBeginImplFrame", client, 0, 1); |
| 1545 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1557 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1546 EXPECT_FALSE(client.needs_begin_frames()); | |
| 1547 client.Reset(); | 1558 client.Reset(); |
| 1548 | 1559 |
| 1549 // Take us out of a swap throttled state. | 1560 // Take us out of a swap throttled state. |
| 1550 scheduler->DidSwapBuffersComplete(); | 1561 scheduler->DidSwapBuffersComplete(); |
| 1551 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 1); | 1562 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 1); |
| 1552 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1563 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1553 EXPECT_FALSE(client.needs_begin_frames()); | |
| 1554 client.Reset(); | 1564 client.Reset(); |
| 1555 | 1565 |
| 1556 // BeginImplFrame deadline should draw. | 1566 // BeginImplFrame deadline should draw. |
| 1557 scheduler->SetNeedsRedraw(); | 1567 scheduler->SetNeedsRedraw(); |
| 1558 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1568 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1559 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); | 1569 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); |
| 1560 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); | 1570 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
| 1561 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1571 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 1562 EXPECT_FALSE(client.needs_begin_frames()); | |
| 1563 client.Reset(); | 1572 client.Reset(); |
| 1564 } | 1573 } |
| 1565 | 1574 |
| 1566 TEST(SchedulerTest, SyntheticBeginFrames_SwapThrottled) { | 1575 TEST(SchedulerTest, SyntheticBeginFrames_SwapThrottled) { |
| 1567 bool begin_frame_scheduling_enabled = false; | 1576 bool begin_frame_scheduling_enabled = false; |
| 1568 bool throttle_frame_production = true; | 1577 bool throttle_frame_production = true; |
| 1569 BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, | 1578 BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, |
| 1570 throttle_frame_production); | 1579 throttle_frame_production); |
| 1571 } | 1580 } |
| 1572 | 1581 |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1799 // SetNeedsCommit should begin the frame on the next BeginImplFrame. | 1808 // SetNeedsCommit should begin the frame on the next BeginImplFrame. |
| 1800 client.Reset(); | 1809 client.Reset(); |
| 1801 scheduler->SetNeedsCommit(); | 1810 scheduler->SetNeedsCommit(); |
| 1802 EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); | 1811 EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
| 1803 | 1812 |
| 1804 // Create a BeginFrame with a long deadline to avoid race conditions. | 1813 // Create a BeginFrame with a long deadline to avoid race conditions. |
| 1805 // This is the first BeginFrame, which will be handled immediately. | 1814 // This is the first BeginFrame, which will be handled immediately. |
| 1806 client.Reset(); | 1815 client.Reset(); |
| 1807 BeginFrameArgs args = CreateBeginFrameArgsForTesting(client.now_src()); | 1816 BeginFrameArgs args = CreateBeginFrameArgsForTesting(client.now_src()); |
| 1808 args.deadline += base::TimeDelta::FromHours(1); | 1817 args.deadline += base::TimeDelta::FromHours(1); |
| 1809 client.ExternalBeginFrameSource()->TestOnBeginFrame(args); | 1818 client.fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| 1810 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 1819 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 1811 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); | 1820 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| 1812 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1821 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1813 EXPECT_TRUE(client.needs_begin_frames()); | 1822 EXPECT_TRUE(client.needs_begin_frames()); |
| 1814 | 1823 |
| 1815 // Queue BeginFrames while we are still handling the previous BeginFrame. | 1824 // Queue BeginFrames while we are still handling the previous BeginFrame. |
| 1816 args.frame_time += base::TimeDelta::FromSeconds(1); | 1825 args.frame_time += base::TimeDelta::FromSeconds(1); |
| 1817 client.ExternalBeginFrameSource()->TestOnBeginFrame(args); | 1826 client.fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| 1818 args.frame_time += base::TimeDelta::FromSeconds(1); | 1827 args.frame_time += base::TimeDelta::FromSeconds(1); |
| 1819 client.ExternalBeginFrameSource()->TestOnBeginFrame(args); | 1828 client.fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| 1820 | 1829 |
| 1821 // If we don't swap on the deadline, we wait for the next BeginImplFrame. | 1830 // If we don't swap on the deadline, we wait for the next BeginImplFrame. |
| 1822 client.Reset(); | 1831 client.Reset(); |
| 1823 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1832 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1824 EXPECT_NO_ACTION(client); | 1833 EXPECT_NO_ACTION(client); |
| 1825 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1834 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 1826 EXPECT_TRUE(client.needs_begin_frames()); | 1835 EXPECT_TRUE(client.needs_begin_frames()); |
| 1827 | 1836 |
| 1828 // NotifyReadyToCommit should trigger the commit. | 1837 // NotifyReadyToCommit should trigger the commit. |
| 1829 client.Reset(); | 1838 client.Reset(); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1857 // SetNeedsCommit should begin the frame on the next BeginImplFrame. | 1866 // SetNeedsCommit should begin the frame on the next BeginImplFrame. |
| 1858 client.Reset(); | 1867 client.Reset(); |
| 1859 scheduler->SetNeedsCommit(); | 1868 scheduler->SetNeedsCommit(); |
| 1860 EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); | 1869 EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
| 1861 | 1870 |
| 1862 // Create a BeginFrame with a long deadline to avoid race conditions. | 1871 // Create a BeginFrame with a long deadline to avoid race conditions. |
| 1863 // This is the first BeginFrame, which will be handled immediately. | 1872 // This is the first BeginFrame, which will be handled immediately. |
| 1864 client.Reset(); | 1873 client.Reset(); |
| 1865 BeginFrameArgs args = CreateBeginFrameArgsForTesting(client.now_src()); | 1874 BeginFrameArgs args = CreateBeginFrameArgsForTesting(client.now_src()); |
| 1866 args.deadline += base::TimeDelta::FromHours(1); | 1875 args.deadline += base::TimeDelta::FromHours(1); |
| 1867 client.ExternalBeginFrameSource()->TestOnBeginFrame(args); | 1876 client.fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| 1868 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 1877 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 1869 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); | 1878 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| 1870 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1879 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1871 EXPECT_TRUE(client.needs_begin_frames()); | 1880 EXPECT_TRUE(client.needs_begin_frames()); |
| 1872 | 1881 |
| 1873 // Queue BeginFrames while we are still handling the previous BeginFrame. | 1882 // Queue BeginFrames while we are still handling the previous BeginFrame. |
| 1874 args.frame_time += base::TimeDelta::FromSeconds(1); | 1883 args.frame_time += base::TimeDelta::FromSeconds(1); |
| 1875 client.ExternalBeginFrameSource()->TestOnBeginFrame(args); | 1884 client.fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| 1876 args.frame_time += base::TimeDelta::FromSeconds(1); | 1885 args.frame_time += base::TimeDelta::FromSeconds(1); |
| 1877 client.ExternalBeginFrameSource()->TestOnBeginFrame(args); | 1886 client.fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| 1878 | 1887 |
| 1879 // If we don't swap on the deadline, we wait for the next BeginImplFrame. | 1888 // If we don't swap on the deadline, we wait for the next BeginImplFrame. |
| 1880 client.Reset(); | 1889 client.Reset(); |
| 1881 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1890 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1882 EXPECT_NO_ACTION(client); | 1891 EXPECT_NO_ACTION(client); |
| 1883 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1892 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 1884 EXPECT_TRUE(client.needs_begin_frames()); | 1893 EXPECT_TRUE(client.needs_begin_frames()); |
| 1885 | 1894 |
| 1886 // NotifyReadyToCommit should trigger the commit. | 1895 // NotifyReadyToCommit should trigger the commit. |
| 1887 client.Reset(); | 1896 client.Reset(); |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2136 | 2145 |
| 2137 // Deadline task is pending | 2146 // Deadline task is pending |
| 2138 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 2147 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 2139 client.task_runner().RunPendingTasks(); | 2148 client.task_runner().RunPendingTasks(); |
| 2140 // Deadline task runs immediately | 2149 // Deadline task runs immediately |
| 2141 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 2150 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 2142 } | 2151 } |
| 2143 | 2152 |
| 2144 } // namespace | 2153 } // namespace |
| 2145 } // namespace cc | 2154 } // namespace cc |
| OLD | NEW |