Chromium Code Reviews| 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/logging.h" | 10 #include "base/logging.h" |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 42 statements; \ | 42 statements; \ |
| 43 } | 43 } |
| 44 | 44 |
| 45 namespace cc { | 45 namespace cc { |
| 46 namespace { | 46 namespace { |
| 47 | 47 |
| 48 class FakeSchedulerClient : public SchedulerClient { | 48 class FakeSchedulerClient : public SchedulerClient { |
| 49 public: | 49 public: |
| 50 FakeSchedulerClient() | 50 FakeSchedulerClient() |
| 51 : automatic_swap_ack_(true), | 51 : automatic_swap_ack_(true), |
| 52 begin_frame_is_sent_to_children_(false), | |
| 53 scheduler_(nullptr) { | 52 scheduler_(nullptr) { |
| 54 Reset(); | 53 Reset(); |
| 55 } | 54 } |
| 56 | 55 |
| 57 void Reset() { | 56 void Reset() { |
| 58 actions_.clear(); | 57 actions_.clear(); |
| 59 states_.clear(); | 58 states_.clear(); |
| 60 draw_will_happen_ = true; | 59 draw_will_happen_ = true; |
| 61 swap_will_happen_if_draw_happens_ = true; | 60 swap_will_happen_if_draw_happens_ = true; |
| 62 num_draws_ = 0; | 61 num_draws_ = 0; |
| 63 log_anticipated_draw_time_change_ = false; | 62 log_anticipated_draw_time_change_ = false; |
| 64 begin_frame_is_sent_to_children_ = false; | 63 begin_frame_args_sent_to_children_ = BeginFrameArgs(); |
| 65 } | 64 } |
| 66 | 65 |
| 67 void set_scheduler(TestScheduler* scheduler) { scheduler_ = scheduler; } | 66 void set_scheduler(TestScheduler* scheduler) { scheduler_ = scheduler; } |
| 68 | 67 |
| 69 // Most tests don't care about DidAnticipatedDrawTimeChange, so only record it | 68 // Most tests don't care about DidAnticipatedDrawTimeChange, so only record it |
| 70 // for tests that do. | 69 // for tests that do. |
| 71 void set_log_anticipated_draw_time_change(bool log) { | 70 void set_log_anticipated_draw_time_change(bool log) { |
| 72 log_anticipated_draw_time_change_ = log; | 71 log_anticipated_draw_time_change_ = log; |
| 73 } | 72 } |
| 74 bool needs_begin_frames() { | 73 bool needs_begin_frames() { |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 153 base::TimeDelta BeginMainFrameToCommitDurationEstimate() override { | 152 base::TimeDelta BeginMainFrameToCommitDurationEstimate() override { |
| 154 return base::TimeDelta(); | 153 return base::TimeDelta(); |
| 155 } | 154 } |
| 156 base::TimeDelta CommitToActivateDurationEstimate() override { | 155 base::TimeDelta CommitToActivateDurationEstimate() override { |
| 157 return base::TimeDelta(); | 156 return base::TimeDelta(); |
| 158 } | 157 } |
| 159 | 158 |
| 160 void DidBeginImplFrameDeadline() override {} | 159 void DidBeginImplFrameDeadline() override {} |
| 161 | 160 |
| 162 void SendBeginFramesToChildren(const BeginFrameArgs& args) override { | 161 void SendBeginFramesToChildren(const BeginFrameArgs& args) override { |
| 163 begin_frame_is_sent_to_children_ = true; | 162 begin_frame_args_sent_to_children_ = args; |
| 164 } | 163 } |
| 165 | 164 |
| 166 void SendBeginMainFrameNotExpectedSoon() override { | 165 void SendBeginMainFrameNotExpectedSoon() override { |
| 167 PushAction("SendBeginMainFrameNotExpectedSoon"); | 166 PushAction("SendBeginMainFrameNotExpectedSoon"); |
| 168 } | 167 } |
| 169 | 168 |
| 170 base::Callback<bool(void)> ImplFrameDeadlinePending(bool state) { | 169 base::Callback<bool(void)> ImplFrameDeadlinePending(bool state) { |
| 171 return base::Bind(&FakeSchedulerClient::ImplFrameDeadlinePendingCallback, | 170 return base::Bind(&FakeSchedulerClient::ImplFrameDeadlinePendingCallback, |
| 172 base::Unretained(this), | 171 base::Unretained(this), |
| 173 state); | 172 state); |
| 174 } | 173 } |
| 175 | 174 |
| 176 bool begin_frame_is_sent_to_children() const { | 175 bool begin_frame_is_sent_to_children() const { |
| 177 return begin_frame_is_sent_to_children_; | 176 return begin_frame_args_sent_to_children_.IsValid(); |
| 177 } | |
| 178 | |
| 179 const BeginFrameArgs& begin_frame_args_sent_to_children() const { | |
| 180 return begin_frame_args_sent_to_children_; | |
| 178 } | 181 } |
| 179 | 182 |
| 180 void PushAction(const char* description) { | 183 void PushAction(const char* description) { |
| 181 actions_.push_back(description); | 184 actions_.push_back(description); |
| 182 states_.push_back(scheduler_->AsValue()); | 185 states_.push_back(scheduler_->AsValue()); |
| 183 } | 186 } |
| 184 | 187 |
| 185 protected: | 188 protected: |
| 186 bool ImplFrameDeadlinePendingCallback(bool state) { | 189 bool ImplFrameDeadlinePendingCallback(bool state) { |
| 187 return scheduler_->BeginImplFrameDeadlinePending() == state; | 190 return scheduler_->BeginImplFrameDeadlinePending() == state; |
| 188 } | 191 } |
| 189 | 192 |
| 190 bool draw_will_happen_; | 193 bool draw_will_happen_; |
| 191 bool swap_will_happen_if_draw_happens_; | 194 bool swap_will_happen_if_draw_happens_; |
| 192 bool automatic_swap_ack_; | 195 bool automatic_swap_ack_; |
| 193 int num_draws_; | 196 int num_draws_; |
| 194 bool log_anticipated_draw_time_change_; | 197 bool log_anticipated_draw_time_change_; |
| 195 bool begin_frame_is_sent_to_children_; | 198 BeginFrameArgs begin_frame_args_sent_to_children_; |
| 196 base::TimeTicks posted_begin_impl_frame_deadline_; | 199 base::TimeTicks posted_begin_impl_frame_deadline_; |
| 197 std::vector<const char*> actions_; | 200 std::vector<const char*> actions_; |
| 198 std::vector<scoped_refptr<base::trace_event::ConvertableToTraceFormat>> | 201 std::vector<scoped_refptr<base::trace_event::ConvertableToTraceFormat>> |
| 199 states_; | 202 states_; |
| 200 TestScheduler* scheduler_; | 203 TestScheduler* scheduler_; |
| 201 }; | 204 }; |
| 202 | 205 |
| 203 class FakeExternalBeginFrameSource : public BeginFrameSourceMixIn { | 206 class FakeExternalBeginFrameSource : public BeginFrameSourceMixIn { |
| 204 public: | 207 public: |
| 205 explicit FakeExternalBeginFrameSource(FakeSchedulerClient* client) | 208 explicit FakeExternalBeginFrameSource(FakeSchedulerClient* client) |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 447 EXPECT_FALSE(client_->needs_begin_frames()); | 450 EXPECT_FALSE(client_->needs_begin_frames()); |
| 448 scheduler_->SetChildrenNeedBeginFrames(true); | 451 scheduler_->SetChildrenNeedBeginFrames(true); |
| 449 EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); | 452 EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); |
| 450 EXPECT_TRUE(client_->needs_begin_frames()); | 453 EXPECT_TRUE(client_->needs_begin_frames()); |
| 451 | 454 |
| 452 client_->Reset(); | 455 client_->Reset(); |
| 453 EXPECT_SCOPED(AdvanceFrame()); | 456 EXPECT_SCOPED(AdvanceFrame()); |
| 454 EXPECT_TRUE(client_->begin_frame_is_sent_to_children()); | 457 EXPECT_TRUE(client_->begin_frame_is_sent_to_children()); |
| 455 } | 458 } |
| 456 | 459 |
| 460 TEST_F(SchedulerTest, SendBeginFramesToChildrenDeadlineNotAdjusted) { | |
| 461 scheduler_settings_.use_external_begin_frame_source = true; | |
| 462 SetUpScheduler(true); | |
| 463 | |
| 464 EXPECT_FALSE(client_->needs_begin_frames()); | |
| 465 scheduler_->SetChildrenNeedBeginFrames(true); | |
| 466 EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); | |
| 467 EXPECT_TRUE(client_->needs_begin_frames()); | |
| 468 | |
| 469 client_->Reset(); | |
| 470 | |
| 471 BeginFrameArgs frame_args = | |
| 472 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src()); | |
| 473 fake_external_begin_frame_source()->TestOnBeginFrame(frame_args); | |
| 474 | |
| 475 EXPECT_TRUE(client_->begin_frame_is_sent_to_children()); | |
| 476 EXPECT_EQ(client_->begin_frame_args_sent_to_children().deadline, | |
|
sunnyps
2015/05/05 01:00:42
I don't think this is test works. This would hold
brianderson
2015/05/05 01:53:29
Good catch. It didn't fail without this patch. I c
| |
| 477 frame_args.deadline); | |
| 478 } | |
| 479 | |
| 457 TEST_F(SchedulerTest, VideoNeedsBeginFrames) { | 480 TEST_F(SchedulerTest, VideoNeedsBeginFrames) { |
| 458 scheduler_settings_.use_external_begin_frame_source = true; | 481 scheduler_settings_.use_external_begin_frame_source = true; |
| 459 SetUpScheduler(true); | 482 SetUpScheduler(true); |
| 460 | 483 |
| 461 scheduler_->SetVideoNeedsBeginFrames(true); | 484 scheduler_->SetVideoNeedsBeginFrames(true); |
| 462 EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); | 485 EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); |
| 463 EXPECT_TRUE(client_->needs_begin_frames()); | 486 EXPECT_TRUE(client_->needs_begin_frames()); |
| 464 | 487 |
| 465 client_->Reset(); | 488 client_->Reset(); |
| 466 EXPECT_SCOPED(AdvanceFrame()); | 489 EXPECT_SCOPED(AdvanceFrame()); |
| (...skipping 2143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2610 | 2633 |
| 2611 // At the next BeginFrame, authoritative interval is used instead of previous | 2634 // At the next BeginFrame, authoritative interval is used instead of previous |
| 2612 // interval. | 2635 // interval. |
| 2613 EXPECT_NE(initial_interval, scheduler_->begin_impl_frame_args().interval); | 2636 EXPECT_NE(initial_interval, scheduler_->begin_impl_frame_args().interval); |
| 2614 EXPECT_EQ(authoritative_interval, | 2637 EXPECT_EQ(authoritative_interval, |
| 2615 scheduler_->begin_impl_frame_args().interval); | 2638 scheduler_->begin_impl_frame_args().interval); |
| 2616 } | 2639 } |
| 2617 | 2640 |
| 2618 } // namespace | 2641 } // namespace |
| 2619 } // namespace cc | 2642 } // namespace cc |
| OLD | NEW |