| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 59 } | 59 } |
| 60 | 60 |
| 61 void Reset() { | 61 void Reset() { |
| 62 actions_.clear(); | 62 actions_.clear(); |
| 63 states_.clear(); | 63 states_.clear(); |
| 64 will_begin_impl_frame_causes_redraw_ = false; | 64 will_begin_impl_frame_causes_redraw_ = false; |
| 65 will_begin_impl_frame_requests_one_begin_impl_frame_ = false; | 65 will_begin_impl_frame_requests_one_begin_impl_frame_ = false; |
| 66 draw_will_happen_ = true; | 66 draw_will_happen_ = true; |
| 67 swap_will_happen_if_draw_happens_ = true; | 67 swap_will_happen_if_draw_happens_ = true; |
| 68 num_draws_ = 0; | 68 num_draws_ = 0; |
| 69 begin_frame_args_sent_to_children_ = BeginFrameArgs(); | |
| 70 last_begin_main_frame_args_ = BeginFrameArgs(); | 69 last_begin_main_frame_args_ = BeginFrameArgs(); |
| 71 } | 70 } |
| 72 | 71 |
| 73 void set_scheduler(TestScheduler* scheduler) { scheduler_ = scheduler; } | 72 void set_scheduler(TestScheduler* scheduler) { scheduler_ = scheduler; } |
| 74 | 73 |
| 75 bool needs_begin_frames() { return scheduler_->begin_frames_expected(); } | 74 bool needs_begin_frames() { return scheduler_->begin_frames_expected(); } |
| 76 int num_draws() const { return num_draws_; } | 75 int num_draws() const { return num_draws_; } |
| 77 int num_actions_() const { return static_cast<int>(actions_.size()); } | 76 int num_actions_() const { return static_cast<int>(actions_.size()); } |
| 78 const char* Action(int i) const { return actions_[i]; } | 77 const char* Action(int i) const { return actions_[i]; } |
| 79 std::string StateForAction(int i) const { return states_[i]->ToString(); } | 78 std::string StateForAction(int i) const { return states_[i]->ToString(); } |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 void ScheduledActionPrepareTiles() override { | 157 void ScheduledActionPrepareTiles() override { |
| 159 PushAction("ScheduledActionPrepareTiles"); | 158 PushAction("ScheduledActionPrepareTiles"); |
| 160 scheduler_->WillPrepareTiles(); | 159 scheduler_->WillPrepareTiles(); |
| 161 scheduler_->DidPrepareTiles(); | 160 scheduler_->DidPrepareTiles(); |
| 162 } | 161 } |
| 163 void ScheduledActionInvalidateOutputSurface() override { | 162 void ScheduledActionInvalidateOutputSurface() override { |
| 164 actions_.push_back("ScheduledActionInvalidateOutputSurface"); | 163 actions_.push_back("ScheduledActionInvalidateOutputSurface"); |
| 165 states_.push_back(scheduler_->AsValue()); | 164 states_.push_back(scheduler_->AsValue()); |
| 166 } | 165 } |
| 167 | 166 |
| 168 void SendBeginFramesToChildren(const BeginFrameArgs& args) override { | |
| 169 begin_frame_args_sent_to_children_ = args; | |
| 170 } | |
| 171 | |
| 172 void SendBeginMainFrameNotExpectedSoon() override { | 167 void SendBeginMainFrameNotExpectedSoon() override { |
| 173 PushAction("SendBeginMainFrameNotExpectedSoon"); | 168 PushAction("SendBeginMainFrameNotExpectedSoon"); |
| 174 } | 169 } |
| 175 | 170 |
| 176 base::Callback<bool(void)> ImplFrameDeadlinePending(bool state) { | 171 base::Callback<bool(void)> ImplFrameDeadlinePending(bool state) { |
| 177 return base::Bind(&FakeSchedulerClient::ImplFrameDeadlinePendingCallback, | 172 return base::Bind(&FakeSchedulerClient::ImplFrameDeadlinePendingCallback, |
| 178 base::Unretained(this), | 173 base::Unretained(this), |
| 179 state); | 174 state); |
| 180 } | 175 } |
| 181 | 176 |
| 182 bool begin_frame_is_sent_to_children() const { | |
| 183 return begin_frame_args_sent_to_children_.IsValid(); | |
| 184 } | |
| 185 | |
| 186 const BeginFrameArgs& begin_frame_args_sent_to_children() const { | |
| 187 return begin_frame_args_sent_to_children_; | |
| 188 } | |
| 189 | |
| 190 void PushAction(const char* description) { | 177 void PushAction(const char* description) { |
| 191 actions_.push_back(description); | 178 actions_.push_back(description); |
| 192 states_.push_back(scheduler_->AsValue()); | 179 states_.push_back(scheduler_->AsValue()); |
| 193 } | 180 } |
| 194 | 181 |
| 195 protected: | 182 protected: |
| 196 bool ImplFrameDeadlinePendingCallback(bool state) { | 183 bool ImplFrameDeadlinePendingCallback(bool state) { |
| 197 return scheduler_->BeginImplFrameDeadlinePending() == state; | 184 return scheduler_->BeginImplFrameDeadlinePending() == state; |
| 198 } | 185 } |
| 199 | 186 |
| 200 bool will_begin_impl_frame_causes_redraw_; | 187 bool will_begin_impl_frame_causes_redraw_; |
| 201 bool will_begin_impl_frame_requests_one_begin_impl_frame_; | 188 bool will_begin_impl_frame_requests_one_begin_impl_frame_; |
| 202 bool draw_will_happen_; | 189 bool draw_will_happen_; |
| 203 bool swap_will_happen_if_draw_happens_; | 190 bool swap_will_happen_if_draw_happens_; |
| 204 bool automatic_swap_ack_; | 191 bool automatic_swap_ack_; |
| 205 int num_draws_; | 192 int num_draws_; |
| 206 BeginFrameArgs begin_frame_args_sent_to_children_; | |
| 207 BeginFrameArgs last_begin_main_frame_args_; | 193 BeginFrameArgs last_begin_main_frame_args_; |
| 208 base::TimeTicks posted_begin_impl_frame_deadline_; | 194 base::TimeTicks posted_begin_impl_frame_deadline_; |
| 209 std::vector<const char*> actions_; | 195 std::vector<const char*> actions_; |
| 210 std::vector<scoped_ptr<base::trace_event::ConvertableToTraceFormat>> states_; | 196 std::vector<scoped_ptr<base::trace_event::ConvertableToTraceFormat>> states_; |
| 211 TestScheduler* scheduler_; | 197 TestScheduler* scheduler_; |
| 212 }; | 198 }; |
| 213 | 199 |
| 214 class FakeExternalBeginFrameSource : public BeginFrameSourceBase { | 200 class FakeExternalBeginFrameSource : public BeginFrameSourceBase { |
| 215 public: | 201 public: |
| 216 explicit FakeExternalBeginFrameSource(FakeSchedulerClient* client) | 202 explicit FakeExternalBeginFrameSource(FakeSchedulerClient* client) |
| (...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 453 SetUpScheduler(false); | 439 SetUpScheduler(false); |
| 454 scheduler_->SetVisible(true); | 440 scheduler_->SetVisible(true); |
| 455 scheduler_->SetCanDraw(true); | 441 scheduler_->SetCanDraw(true); |
| 456 | 442 |
| 457 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_); | 443 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_); |
| 458 client_->Reset(); | 444 client_->Reset(); |
| 459 scheduler_->DidCreateAndInitializeOutputSurface(); | 445 scheduler_->DidCreateAndInitializeOutputSurface(); |
| 460 EXPECT_NO_ACTION(client_); | 446 EXPECT_NO_ACTION(client_); |
| 461 } | 447 } |
| 462 | 448 |
| 463 TEST_F(SchedulerTest, SendBeginFramesToChildren) { | |
| 464 scheduler_settings_.use_external_begin_frame_source = true; | |
| 465 SetUpScheduler(true); | |
| 466 | |
| 467 EXPECT_FALSE(client_->begin_frame_is_sent_to_children()); | |
| 468 scheduler_->SetNeedsBeginMainFrame(); | |
| 469 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); | |
| 470 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
| 471 | |
| 472 scheduler_->SetChildrenNeedBeginFrames(true); | |
| 473 | |
| 474 client_->Reset(); | |
| 475 EXPECT_SCOPED(AdvanceFrame()); | |
| 476 EXPECT_TRUE(client_->begin_frame_is_sent_to_children()); | |
| 477 EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); | |
| 478 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); | |
| 479 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); | |
| 480 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
| 481 } | |
| 482 | |
| 483 TEST_F(SchedulerTest, SendBeginFramesToChildrenWithoutCommit) { | |
| 484 scheduler_settings_.use_external_begin_frame_source = true; | |
| 485 SetUpScheduler(true); | |
| 486 | |
| 487 EXPECT_FALSE(scheduler_->begin_frames_expected()); | |
| 488 scheduler_->SetChildrenNeedBeginFrames(true); | |
| 489 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); | |
| 490 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
| 491 | |
| 492 client_->Reset(); | |
| 493 EXPECT_SCOPED(AdvanceFrame()); | |
| 494 EXPECT_TRUE(client_->begin_frame_is_sent_to_children()); | |
| 495 } | |
| 496 | |
| 497 TEST_F(SchedulerTest, SendBeginFramesToChildrenDeadlineNotAdjusted) { | |
| 498 // Set up client with specified estimates. | |
| 499 scheduler_settings_.use_external_begin_frame_source = true; | |
| 500 SetUpScheduler(true); | |
| 501 | |
| 502 fake_compositor_timing_history_ | |
| 503 ->SetBeginMainFrameStartToCommitDurationEstimate( | |
| 504 base::TimeDelta::FromMilliseconds(2)); | |
| 505 fake_compositor_timing_history_->SetCommitToReadyToActivateDurationEstimate( | |
| 506 base::TimeDelta::FromMilliseconds(4)); | |
| 507 fake_compositor_timing_history_->SetDrawDurationEstimate( | |
| 508 base::TimeDelta::FromMilliseconds(1)); | |
| 509 | |
| 510 EXPECT_FALSE(scheduler_->begin_frames_expected()); | |
| 511 scheduler_->SetChildrenNeedBeginFrames(true); | |
| 512 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); | |
| 513 EXPECT_TRUE(scheduler_->begin_frames_expected()); | |
| 514 | |
| 515 client_->Reset(); | |
| 516 | |
| 517 BeginFrameArgs frame_args = | |
| 518 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src()); | |
| 519 fake_external_begin_frame_source()->TestOnBeginFrame(frame_args); | |
| 520 | |
| 521 EXPECT_TRUE(client_->begin_frame_is_sent_to_children()); | |
| 522 EXPECT_EQ(client_->begin_frame_args_sent_to_children().deadline, | |
| 523 frame_args.deadline); | |
| 524 } | |
| 525 | |
| 526 TEST_F(SchedulerTest, VideoNeedsBeginFrames) { | 449 TEST_F(SchedulerTest, VideoNeedsBeginFrames) { |
| 527 scheduler_settings_.use_external_begin_frame_source = true; | 450 scheduler_settings_.use_external_begin_frame_source = true; |
| 528 SetUpScheduler(true); | 451 SetUpScheduler(true); |
| 529 | 452 |
| 530 scheduler_->SetVideoNeedsBeginFrames(true); | 453 scheduler_->SetVideoNeedsBeginFrames(true); |
| 531 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); | 454 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); |
| 532 EXPECT_TRUE(scheduler_->begin_frames_expected()); | 455 EXPECT_TRUE(scheduler_->begin_frames_expected()); |
| 533 | 456 |
| 534 client_->Reset(); | 457 client_->Reset(); |
| 535 EXPECT_SCOPED(AdvanceFrame()); | 458 EXPECT_SCOPED(AdvanceFrame()); |
| (...skipping 3314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3850 } | 3773 } |
| 3851 | 3774 |
| 3852 TEST_F(SchedulerTest, BeginMainFrameOnCriticalPath_AHS) { | 3775 TEST_F(SchedulerTest, BeginMainFrameOnCriticalPath_AHS) { |
| 3853 EXPECT_FALSE(BeginMainFrameOnCriticalPath( | 3776 EXPECT_FALSE(BeginMainFrameOnCriticalPath( |
| 3854 SMOOTHNESS_TAKES_PRIORITY, | 3777 SMOOTHNESS_TAKES_PRIORITY, |
| 3855 ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, kSlowDuration)); | 3778 ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, kSlowDuration)); |
| 3856 } | 3779 } |
| 3857 | 3780 |
| 3858 } // namespace | 3781 } // namespace |
| 3859 } // namespace cc | 3782 } // namespace cc |
| OLD | NEW |