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 |