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 |