| 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/scheduler.h" | 5 #include "cc/scheduler/scheduler.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 bool IsOnBatteryPowerImpl() override { return on_battery_power_impl_; } | 83 bool IsOnBatteryPowerImpl() override { return on_battery_power_impl_; } |
| 84 | 84 |
| 85 private: | 85 private: |
| 86 bool on_battery_power_impl_; | 86 bool on_battery_power_impl_; |
| 87 }; | 87 }; |
| 88 | 88 |
| 89 FakeSchedulerClient() | 89 FakeSchedulerClient() |
| 90 : automatic_swap_ack_(true), | 90 : automatic_swap_ack_(true), |
| 91 swap_contains_incomplete_tile_(false), | 91 swap_contains_incomplete_tile_(false), |
| 92 redraw_will_happen_if_update_visible_tiles_happens_(false), | 92 redraw_will_happen_if_update_visible_tiles_happens_(false), |
| 93 begin_frame_is_sent_to_children_(false), |
| 93 now_src_(TestNowSource::Create()), | 94 now_src_(TestNowSource::Create()), |
| 94 task_runner_(new OrderedSimpleTaskRunner(now_src_, true)), | 95 task_runner_(new OrderedSimpleTaskRunner(now_src_, true)), |
| 95 fake_external_begin_frame_source_(nullptr), | 96 fake_external_begin_frame_source_(nullptr), |
| 96 fake_power_monitor_source_(new FakePowerMonitorSource), | 97 fake_power_monitor_source_(new FakePowerMonitorSource), |
| 97 power_monitor_(make_scoped_ptr<base::PowerMonitorSource>( | 98 power_monitor_(make_scoped_ptr<base::PowerMonitorSource>( |
| 98 fake_power_monitor_source_)), | 99 fake_power_monitor_source_)), |
| 99 scheduler_(nullptr) { | 100 scheduler_(nullptr) { |
| 100 // A bunch of tests require Now() to be > BeginFrameArgs::DefaultInterval() | 101 // A bunch of tests require Now() to be > BeginFrameArgs::DefaultInterval() |
| 101 now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(100)); | 102 now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(100)); |
| 102 // Fail if we need to run 100 tasks in a row. | 103 // Fail if we need to run 100 tasks in a row. |
| 103 task_runner_->SetRunTaskLimit(100); | 104 task_runner_->SetRunTaskLimit(100); |
| 104 Reset(); | 105 Reset(); |
| 105 } | 106 } |
| 106 | 107 |
| 107 void Reset() { | 108 void Reset() { |
| 108 actions_.clear(); | 109 actions_.clear(); |
| 109 states_.clear(); | 110 states_.clear(); |
| 110 draw_will_happen_ = true; | 111 draw_will_happen_ = true; |
| 111 swap_will_happen_if_draw_happens_ = true; | 112 swap_will_happen_if_draw_happens_ = true; |
| 112 num_draws_ = 0; | 113 num_draws_ = 0; |
| 113 log_anticipated_draw_time_change_ = false; | 114 log_anticipated_draw_time_change_ = false; |
| 115 begin_frame_is_sent_to_children_ = false; |
| 114 } | 116 } |
| 115 | 117 |
| 116 TestScheduler* CreateScheduler(const SchedulerSettings& settings) { | 118 TestScheduler* CreateScheduler(const SchedulerSettings& settings) { |
| 117 scoped_ptr<FakeExternalBeginFrameSource> fake_external_begin_frame_source; | 119 scoped_ptr<FakeExternalBeginFrameSource> fake_external_begin_frame_source; |
| 118 if (settings.use_external_begin_frame_source && | 120 if (settings.use_external_begin_frame_source && |
| 119 settings.throttle_frame_production) { | 121 settings.throttle_frame_production) { |
| 120 fake_external_begin_frame_source.reset( | 122 fake_external_begin_frame_source.reset( |
| 121 new FakeExternalBeginFrameSource(this)); | 123 new FakeExternalBeginFrameSource(this)); |
| 122 fake_external_begin_frame_source_ = | 124 fake_external_begin_frame_source_ = |
| 123 fake_external_begin_frame_source.get(); | 125 fake_external_begin_frame_source.get(); |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 base::TimeDelta DrawDurationEstimate() override { return base::TimeDelta(); } | 282 base::TimeDelta DrawDurationEstimate() override { return base::TimeDelta(); } |
| 281 base::TimeDelta BeginMainFrameToCommitDurationEstimate() override { | 283 base::TimeDelta BeginMainFrameToCommitDurationEstimate() override { |
| 282 return base::TimeDelta(); | 284 return base::TimeDelta(); |
| 283 } | 285 } |
| 284 base::TimeDelta CommitToActivateDurationEstimate() override { | 286 base::TimeDelta CommitToActivateDurationEstimate() override { |
| 285 return base::TimeDelta(); | 287 return base::TimeDelta(); |
| 286 } | 288 } |
| 287 | 289 |
| 288 void DidBeginImplFrameDeadline() override {} | 290 void DidBeginImplFrameDeadline() override {} |
| 289 | 291 |
| 292 void SendBeginFramesToChildren(const BeginFrameArgs& args) override { |
| 293 begin_frame_is_sent_to_children_ = true; |
| 294 } |
| 295 |
| 290 base::Callback<bool(void)> ImplFrameDeadlinePending(bool state) { | 296 base::Callback<bool(void)> ImplFrameDeadlinePending(bool state) { |
| 291 return base::Bind(&FakeSchedulerClient::ImplFrameDeadlinePendingCallback, | 297 return base::Bind(&FakeSchedulerClient::ImplFrameDeadlinePendingCallback, |
| 292 base::Unretained(this), | 298 base::Unretained(this), |
| 293 state); | 299 state); |
| 294 } | 300 } |
| 295 | 301 |
| 302 bool begin_frame_is_sent_to_children() const { |
| 303 return begin_frame_is_sent_to_children_; |
| 304 } |
| 305 |
| 296 protected: | 306 protected: |
| 297 bool ImplFrameDeadlinePendingCallback(bool state) { | 307 bool ImplFrameDeadlinePendingCallback(bool state) { |
| 298 return scheduler_->BeginImplFrameDeadlinePending() == state; | 308 return scheduler_->BeginImplFrameDeadlinePending() == state; |
| 299 } | 309 } |
| 300 | 310 |
| 301 bool draw_will_happen_; | 311 bool draw_will_happen_; |
| 302 bool swap_will_happen_if_draw_happens_; | 312 bool swap_will_happen_if_draw_happens_; |
| 303 bool automatic_swap_ack_; | 313 bool automatic_swap_ack_; |
| 304 int num_draws_; | 314 int num_draws_; |
| 305 bool log_anticipated_draw_time_change_; | 315 bool log_anticipated_draw_time_change_; |
| 306 bool swap_contains_incomplete_tile_; | 316 bool swap_contains_incomplete_tile_; |
| 307 bool redraw_will_happen_if_update_visible_tiles_happens_; | 317 bool redraw_will_happen_if_update_visible_tiles_happens_; |
| 318 bool begin_frame_is_sent_to_children_; |
| 308 base::TimeTicks posted_begin_impl_frame_deadline_; | 319 base::TimeTicks posted_begin_impl_frame_deadline_; |
| 309 std::vector<const char*> actions_; | 320 std::vector<const char*> actions_; |
| 310 std::vector<scoped_refptr<base::debug::ConvertableToTraceFormat>> states_; | 321 std::vector<scoped_refptr<base::debug::ConvertableToTraceFormat>> states_; |
| 311 scoped_refptr<TestNowSource> now_src_; | 322 scoped_refptr<TestNowSource> now_src_; |
| 312 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; | 323 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; |
| 313 FakeExternalBeginFrameSource* fake_external_begin_frame_source_; | 324 FakeExternalBeginFrameSource* fake_external_begin_frame_source_; |
| 314 FakePowerMonitorSource* fake_power_monitor_source_; | 325 FakePowerMonitorSource* fake_power_monitor_source_; |
| 315 base::PowerMonitor power_monitor_; | 326 base::PowerMonitor power_monitor_; |
| 316 scoped_ptr<TestScheduler> scheduler_; | 327 scoped_ptr<TestScheduler> scheduler_; |
| 317 }; | 328 }; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 359 scheduler->SetCanStart(); | 370 scheduler->SetCanStart(); |
| 360 scheduler->SetVisible(true); | 371 scheduler->SetVisible(true); |
| 361 scheduler->SetCanDraw(true); | 372 scheduler->SetCanDraw(true); |
| 362 | 373 |
| 363 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); | 374 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
| 364 client.Reset(); | 375 client.Reset(); |
| 365 scheduler->DidCreateAndInitializeOutputSurface(); | 376 scheduler->DidCreateAndInitializeOutputSurface(); |
| 366 EXPECT_NO_ACTION(client); | 377 EXPECT_NO_ACTION(client); |
| 367 } | 378 } |
| 368 | 379 |
| 380 TEST(SchedulerTest, SendBeginFramesToChildren) { |
| 381 FakeSchedulerClient client; |
| 382 SchedulerSettings scheduler_settings; |
| 383 scheduler_settings.use_external_begin_frame_source = true; |
| 384 scheduler_settings.forward_begin_frames_to_children = true; |
| 385 TestScheduler* scheduler = client.CreateScheduler(scheduler_settings); |
| 386 scheduler->SetCanStart(); |
| 387 scheduler->SetVisible(true); |
| 388 scheduler->SetCanDraw(true); |
| 389 |
| 390 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
| 391 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
| 392 |
| 393 client.Reset(); |
| 394 EXPECT_FALSE(client.begin_frame_is_sent_to_children()); |
| 395 scheduler->SetNeedsCommit(); |
| 396 EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
| 397 client.Reset(); |
| 398 |
| 399 scheduler->SetChildrenNeedBeginFrames(true); |
| 400 |
| 401 client.AdvanceFrame(); |
| 402 EXPECT_TRUE(client.begin_frame_is_sent_to_children()); |
| 403 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 404 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 405 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| 406 EXPECT_TRUE(client.needs_begin_frames()); |
| 407 client.Reset(); |
| 408 } |
| 409 |
| 369 TEST(SchedulerTest, RequestCommit) { | 410 TEST(SchedulerTest, RequestCommit) { |
| 370 FakeSchedulerClient client; | 411 FakeSchedulerClient client; |
| 371 SchedulerSettings scheduler_settings; | 412 SchedulerSettings scheduler_settings; |
| 372 scheduler_settings.use_external_begin_frame_source = true; | 413 scheduler_settings.use_external_begin_frame_source = true; |
| 373 TestScheduler* scheduler = client.CreateScheduler(scheduler_settings); | 414 TestScheduler* scheduler = client.CreateScheduler(scheduler_settings); |
| 374 scheduler->SetCanStart(); | 415 scheduler->SetCanStart(); |
| 375 scheduler->SetVisible(true); | 416 scheduler->SetVisible(true); |
| 376 scheduler->SetCanDraw(true); | 417 scheduler->SetCanDraw(true); |
| 377 | 418 |
| 378 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); | 419 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
| (...skipping 1793 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2172 | 2213 |
| 2173 // Deadline task is pending | 2214 // Deadline task is pending |
| 2174 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 2215 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 2175 client.task_runner().RunPendingTasks(); | 2216 client.task_runner().RunPendingTasks(); |
| 2176 // Deadline task runs immediately | 2217 // Deadline task runs immediately |
| 2177 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 2218 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 2178 } | 2219 } |
| 2179 | 2220 |
| 2180 } // namespace | 2221 } // namespace |
| 2181 } // namespace cc | 2222 } // namespace cc |
| OLD | NEW |