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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 base::MessageLoop::current()->RunUntilIdle(); | 81 base::MessageLoop::current()->RunUntilIdle(); |
82 } | 82 } |
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), | |
92 redraw_will_happen_if_update_visible_tiles_happens_(false), | |
93 now_src_(TestNowSource::Create()), | 91 now_src_(TestNowSource::Create()), |
94 task_runner_(new OrderedSimpleTaskRunner(now_src_, true)), | 92 task_runner_(new OrderedSimpleTaskRunner(now_src_, true)), |
95 fake_external_begin_frame_source_(nullptr), | 93 fake_external_begin_frame_source_(nullptr), |
96 fake_power_monitor_source_(new FakePowerMonitorSource), | 94 fake_power_monitor_source_(new FakePowerMonitorSource), |
97 power_monitor_(make_scoped_ptr<base::PowerMonitorSource>( | 95 power_monitor_(make_scoped_ptr<base::PowerMonitorSource>( |
98 fake_power_monitor_source_)), | 96 fake_power_monitor_source_)), |
99 scheduler_(nullptr) { | 97 scheduler_(nullptr) { |
100 // A bunch of tests require Now() to be > BeginFrameArgs::DefaultInterval() | 98 // A bunch of tests require Now() to be > BeginFrameArgs::DefaultInterval() |
101 now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(100)); | 99 now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(100)); |
102 // Fail if we need to run 100 tasks in a row. | 100 // Fail if we need to run 100 tasks in a row. |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 OrderedSimpleTaskRunner& task_runner() { return *task_runner_; } | 182 OrderedSimpleTaskRunner& task_runner() { return *task_runner_; } |
185 TestNowSource* now_src() { return now_src_.get(); } | 183 TestNowSource* now_src() { return now_src_.get(); } |
186 | 184 |
187 int ActionIndex(const char* action) const { | 185 int ActionIndex(const char* action) const { |
188 for (size_t i = 0; i < actions_.size(); i++) | 186 for (size_t i = 0; i < actions_.size(); i++) |
189 if (!strcmp(actions_[i], action)) | 187 if (!strcmp(actions_[i], action)) |
190 return i; | 188 return i; |
191 return -1; | 189 return -1; |
192 } | 190 } |
193 | 191 |
194 void SetSwapContainsIncompleteTile(bool contain) { | |
195 swap_contains_incomplete_tile_ = contain; | |
196 } | |
197 | |
198 bool HasAction(const char* action) const { | 192 bool HasAction(const char* action) const { |
199 return ActionIndex(action) >= 0; | 193 return ActionIndex(action) >= 0; |
200 } | 194 } |
201 | 195 |
202 void SetDrawWillHappen(bool draw_will_happen) { | 196 void SetDrawWillHappen(bool draw_will_happen) { |
203 draw_will_happen_ = draw_will_happen; | 197 draw_will_happen_ = draw_will_happen; |
204 } | 198 } |
205 void SetSwapWillHappenIfDrawHappens(bool swap_will_happen_if_draw_happens) { | 199 void SetSwapWillHappenIfDrawHappens(bool swap_will_happen_if_draw_happens) { |
206 swap_will_happen_if_draw_happens_ = swap_will_happen_if_draw_happens; | 200 swap_will_happen_if_draw_happens_ = swap_will_happen_if_draw_happens; |
207 } | 201 } |
208 void SetAutomaticSwapAck(bool automatic_swap_ack) { | 202 void SetAutomaticSwapAck(bool automatic_swap_ack) { |
209 automatic_swap_ack_ = automatic_swap_ack; | 203 automatic_swap_ack_ = automatic_swap_ack; |
210 } | 204 } |
211 void SetRedrawWillHappenIfUpdateVisibleTilesHappens(bool redraw) { | |
212 redraw_will_happen_if_update_visible_tiles_happens_ = redraw; | |
213 } | |
214 // SchedulerClient implementation. | 205 // SchedulerClient implementation. |
215 void WillBeginImplFrame(const BeginFrameArgs& args) override { | 206 void WillBeginImplFrame(const BeginFrameArgs& args) override { |
216 actions_.push_back("WillBeginImplFrame"); | 207 actions_.push_back("WillBeginImplFrame"); |
217 states_.push_back(scheduler_->AsValue()); | 208 states_.push_back(scheduler_->AsValue()); |
218 } | 209 } |
219 void ScheduledActionSendBeginMainFrame() override { | 210 void ScheduledActionSendBeginMainFrame() override { |
220 actions_.push_back("ScheduledActionSendBeginMainFrame"); | 211 actions_.push_back("ScheduledActionSendBeginMainFrame"); |
221 states_.push_back(scheduler_->AsValue()); | 212 states_.push_back(scheduler_->AsValue()); |
222 } | 213 } |
223 void ScheduledActionAnimate() override { | 214 void ScheduledActionAnimate() override { |
224 actions_.push_back("ScheduledActionAnimate"); | 215 actions_.push_back("ScheduledActionAnimate"); |
225 states_.push_back(scheduler_->AsValue()); | 216 states_.push_back(scheduler_->AsValue()); |
226 } | 217 } |
227 DrawResult ScheduledActionDrawAndSwapIfPossible() override { | 218 DrawResult ScheduledActionDrawAndSwapIfPossible() override { |
228 actions_.push_back("ScheduledActionDrawAndSwapIfPossible"); | 219 actions_.push_back("ScheduledActionDrawAndSwapIfPossible"); |
229 states_.push_back(scheduler_->AsValue()); | 220 states_.push_back(scheduler_->AsValue()); |
230 num_draws_++; | 221 num_draws_++; |
231 DrawResult result = | 222 DrawResult result = |
232 draw_will_happen_ ? DRAW_SUCCESS : DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; | 223 draw_will_happen_ ? DRAW_SUCCESS : DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; |
233 bool swap_will_happen = | 224 bool swap_will_happen = |
234 draw_will_happen_ && swap_will_happen_if_draw_happens_; | 225 draw_will_happen_ && swap_will_happen_if_draw_happens_; |
235 if (swap_will_happen) { | 226 if (swap_will_happen) { |
236 scheduler_->DidSwapBuffers(); | 227 scheduler_->DidSwapBuffers(); |
237 if (swap_contains_incomplete_tile_) { | |
238 scheduler_->SetSwapUsedIncompleteTile(true); | |
239 swap_contains_incomplete_tile_ = false; | |
240 } else { | |
241 scheduler_->SetSwapUsedIncompleteTile(false); | |
242 } | |
243 | 228 |
244 if (automatic_swap_ack_) | 229 if (automatic_swap_ack_) |
245 scheduler_->DidSwapBuffersComplete(); | 230 scheduler_->DidSwapBuffersComplete(); |
246 } | 231 } |
247 return result; | 232 return result; |
248 } | 233 } |
249 DrawResult ScheduledActionDrawAndSwapForced() override { | 234 DrawResult ScheduledActionDrawAndSwapForced() override { |
250 actions_.push_back("ScheduledActionDrawAndSwapForced"); | 235 actions_.push_back("ScheduledActionDrawAndSwapForced"); |
251 states_.push_back(scheduler_->AsValue()); | 236 states_.push_back(scheduler_->AsValue()); |
252 return DRAW_SUCCESS; | 237 return DRAW_SUCCESS; |
253 } | 238 } |
254 void ScheduledActionCommit() override { | 239 void ScheduledActionCommit() override { |
255 actions_.push_back("ScheduledActionCommit"); | 240 actions_.push_back("ScheduledActionCommit"); |
256 states_.push_back(scheduler_->AsValue()); | 241 states_.push_back(scheduler_->AsValue()); |
257 } | 242 } |
258 void ScheduledActionUpdateVisibleTiles() override { | |
259 actions_.push_back("ScheduledActionUpdateVisibleTiles"); | |
260 states_.push_back(scheduler_->AsValue()); | |
261 if (redraw_will_happen_if_update_visible_tiles_happens_) | |
262 scheduler_->SetNeedsRedraw(); | |
263 } | |
264 void ScheduledActionActivateSyncTree() override { | 243 void ScheduledActionActivateSyncTree() override { |
265 actions_.push_back("ScheduledActionActivateSyncTree"); | 244 actions_.push_back("ScheduledActionActivateSyncTree"); |
266 states_.push_back(scheduler_->AsValue()); | 245 states_.push_back(scheduler_->AsValue()); |
267 } | 246 } |
268 void ScheduledActionBeginOutputSurfaceCreation() override { | 247 void ScheduledActionBeginOutputSurfaceCreation() override { |
269 actions_.push_back("ScheduledActionBeginOutputSurfaceCreation"); | 248 actions_.push_back("ScheduledActionBeginOutputSurfaceCreation"); |
270 states_.push_back(scheduler_->AsValue()); | 249 states_.push_back(scheduler_->AsValue()); |
271 } | 250 } |
272 void ScheduledActionManageTiles() override { | 251 void ScheduledActionManageTiles() override { |
273 actions_.push_back("ScheduledActionManageTiles"); | 252 actions_.push_back("ScheduledActionManageTiles"); |
(...skipping 22 matching lines...) Expand all Loading... |
296 protected: | 275 protected: |
297 bool ImplFrameDeadlinePendingCallback(bool state) { | 276 bool ImplFrameDeadlinePendingCallback(bool state) { |
298 return scheduler_->BeginImplFrameDeadlinePending() == state; | 277 return scheduler_->BeginImplFrameDeadlinePending() == state; |
299 } | 278 } |
300 | 279 |
301 bool draw_will_happen_; | 280 bool draw_will_happen_; |
302 bool swap_will_happen_if_draw_happens_; | 281 bool swap_will_happen_if_draw_happens_; |
303 bool automatic_swap_ack_; | 282 bool automatic_swap_ack_; |
304 int num_draws_; | 283 int num_draws_; |
305 bool log_anticipated_draw_time_change_; | 284 bool log_anticipated_draw_time_change_; |
306 bool swap_contains_incomplete_tile_; | |
307 bool redraw_will_happen_if_update_visible_tiles_happens_; | |
308 base::TimeTicks posted_begin_impl_frame_deadline_; | 285 base::TimeTicks posted_begin_impl_frame_deadline_; |
309 std::vector<const char*> actions_; | 286 std::vector<const char*> actions_; |
310 std::vector<scoped_refptr<base::debug::ConvertableToTraceFormat>> states_; | 287 std::vector<scoped_refptr<base::debug::ConvertableToTraceFormat>> states_; |
311 scoped_refptr<TestNowSource> now_src_; | 288 scoped_refptr<TestNowSource> now_src_; |
312 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; | 289 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; |
313 FakeExternalBeginFrameSource* fake_external_begin_frame_source_; | 290 FakeExternalBeginFrameSource* fake_external_begin_frame_source_; |
314 FakePowerMonitorSource* fake_power_monitor_source_; | 291 FakePowerMonitorSource* fake_power_monitor_source_; |
315 base::PowerMonitor power_monitor_; | 292 base::PowerMonitor power_monitor_; |
316 scoped_ptr<TestScheduler> scheduler_; | 293 scoped_ptr<TestScheduler> scheduler_; |
317 }; | 294 }; |
(...skipping 687 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1005 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); | 982 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
1006 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); | 983 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); |
1007 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), | 984 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), |
1008 client.ActionIndex("ScheduledActionManageTiles")); | 985 client.ActionIndex("ScheduledActionManageTiles")); |
1009 EXPECT_FALSE(scheduler->RedrawPending()); | 986 EXPECT_FALSE(scheduler->RedrawPending()); |
1010 EXPECT_FALSE(scheduler->ManageTilesPending()); | 987 EXPECT_FALSE(scheduler->ManageTilesPending()); |
1011 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 988 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
1012 scheduler->DidManageTiles(); // Corresponds to ScheduledActionManageTiles | 989 scheduler->DidManageTiles(); // Corresponds to ScheduledActionManageTiles |
1013 } | 990 } |
1014 | 991 |
1015 TEST(SchedulerTest, ShouldUpdateVisibleTiles) { | |
1016 FakeSchedulerClient client; | |
1017 SchedulerSettings scheduler_settings; | |
1018 scheduler_settings.impl_side_painting = true; | |
1019 scheduler_settings.use_external_begin_frame_source = true; | |
1020 TestScheduler* scheduler = client.CreateScheduler(scheduler_settings); | |
1021 scheduler->SetCanStart(); | |
1022 scheduler->SetVisible(true); | |
1023 scheduler->SetCanDraw(true); | |
1024 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | |
1025 | |
1026 client.SetRedrawWillHappenIfUpdateVisibleTilesHappens(true); | |
1027 | |
1028 // SetNeedsCommit should begin the frame. | |
1029 client.Reset(); | |
1030 scheduler->SetNeedsCommit(); | |
1031 EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); | |
1032 | |
1033 client.Reset(); | |
1034 client.AdvanceFrame(); | |
1035 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | |
1036 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); | |
1037 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | |
1038 | |
1039 client.Reset(); | |
1040 scheduler->NotifyBeginMainFrameStarted(); | |
1041 scheduler->NotifyReadyToCommit(); | |
1042 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | |
1043 | |
1044 client.Reset(); | |
1045 scheduler->NotifyReadyToActivate(); | |
1046 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client); | |
1047 | |
1048 client.Reset(); | |
1049 client.SetSwapContainsIncompleteTile(true); | |
1050 client.task_runner().RunPendingTasks(); // Run posted deadline. | |
1051 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); | |
1052 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); | |
1053 EXPECT_FALSE(scheduler->RedrawPending()); | |
1054 | |
1055 client.Reset(); | |
1056 client.AdvanceFrame(); | |
1057 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | |
1058 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | |
1059 | |
1060 client.Reset(); | |
1061 client.task_runner().RunPendingTasks(); // Run posted deadline. | |
1062 EXPECT_ACTION("ScheduledActionUpdateVisibleTiles", client, 0, 3); | |
1063 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 3); | |
1064 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 2, 3); | |
1065 | |
1066 client.Reset(); | |
1067 client.AdvanceFrame(); | |
1068 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | |
1069 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | |
1070 | |
1071 // No more UpdateVisibleTiles(). | |
1072 client.Reset(); | |
1073 client.task_runner().RunPendingTasks(); // Run posted deadline. | |
1074 EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client); | |
1075 } | |
1076 | |
1077 TEST(SchedulerTest, TriggerBeginFrameDeadlineEarly) { | 992 TEST(SchedulerTest, TriggerBeginFrameDeadlineEarly) { |
1078 SchedulerClientNeedsManageTilesInDraw client; | 993 SchedulerClientNeedsManageTilesInDraw client; |
1079 SchedulerSettings scheduler_settings; | 994 SchedulerSettings scheduler_settings; |
1080 scheduler_settings.use_external_begin_frame_source = true; | 995 scheduler_settings.use_external_begin_frame_source = true; |
1081 TestScheduler* scheduler = client.CreateScheduler(scheduler_settings); | 996 TestScheduler* scheduler = client.CreateScheduler(scheduler_settings); |
1082 scheduler->SetCanStart(); | 997 scheduler->SetCanStart(); |
1083 scheduler->SetVisible(true); | 998 scheduler->SetVisible(true); |
1084 scheduler->SetCanDraw(true); | 999 scheduler->SetCanDraw(true); |
1085 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 1000 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
1086 | 1001 |
(...skipping 1085 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2172 | 2087 |
2173 // Deadline task is pending | 2088 // Deadline task is pending |
2174 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 2089 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
2175 client.task_runner().RunPendingTasks(); | 2090 client.task_runner().RunPendingTasks(); |
2176 // Deadline task runs immediately | 2091 // Deadline task runs immediately |
2177 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 2092 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
2178 } | 2093 } |
2179 | 2094 |
2180 } // namespace | 2095 } // namespace |
2181 } // namespace cc | 2096 } // namespace cc |
OLD | NEW |