Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(18)

Side by Side Diff: cc/scheduler/scheduler_unittest.cc

Issue 671653005: SetNeedsRedraw directly when updating a visible tile. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: pinchblurmerge-test: nits Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 #include "cc/scheduler/scheduler.h" 4 #include "cc/scheduler/scheduler.h"
5 5
6 #include <string> 6 #include <string>
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/debug/trace_event.h" 9 #include "base/debug/trace_event.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 base::MessageLoop::current()->RunUntilIdle(); 75 base::MessageLoop::current()->RunUntilIdle();
76 } 76 }
77 bool IsOnBatteryPowerImpl() override { return on_battery_power_impl_; } 77 bool IsOnBatteryPowerImpl() override { return on_battery_power_impl_; }
78 78
79 private: 79 private:
80 bool on_battery_power_impl_; 80 bool on_battery_power_impl_;
81 }; 81 };
82 82
83 FakeSchedulerClient() 83 FakeSchedulerClient()
84 : automatic_swap_ack_(true), 84 : automatic_swap_ack_(true),
85 swap_contains_incomplete_tile_(false),
86 redraw_will_happen_if_update_visible_tiles_happens_(false),
87 now_src_(TestNowSource::Create()), 85 now_src_(TestNowSource::Create()),
88 task_runner_(new OrderedSimpleTaskRunner(now_src_, true)), 86 task_runner_(new OrderedSimpleTaskRunner(now_src_, true)),
89 fake_frame_source_(this), 87 fake_frame_source_(this),
90 fake_power_monitor_source_(new FakePowerMonitorSource), 88 fake_power_monitor_source_(new FakePowerMonitorSource),
91 power_monitor_(make_scoped_ptr<base::PowerMonitorSource>( 89 power_monitor_(make_scoped_ptr<base::PowerMonitorSource>(
92 fake_power_monitor_source_)), 90 fake_power_monitor_source_)),
93 scheduler_(nullptr) { 91 scheduler_(nullptr) {
94 // A bunch of tests require Now() to be > BeginFrameArgs::DefaultInterval() 92 // A bunch of tests require Now() to be > BeginFrameArgs::DefaultInterval()
95 now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(100)); 93 now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(100));
96 // Fail if we need to run 100 tasks in a row. 94 // Fail if we need to run 100 tasks in a row.
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 OrderedSimpleTaskRunner& task_runner() { return *task_runner_; } 160 OrderedSimpleTaskRunner& task_runner() { return *task_runner_; }
163 TestNowSource* now_src() { return now_src_.get(); } 161 TestNowSource* now_src() { return now_src_.get(); }
164 162
165 int ActionIndex(const char* action) const { 163 int ActionIndex(const char* action) const {
166 for (size_t i = 0; i < actions_.size(); i++) 164 for (size_t i = 0; i < actions_.size(); i++)
167 if (!strcmp(actions_[i], action)) 165 if (!strcmp(actions_[i], action))
168 return i; 166 return i;
169 return -1; 167 return -1;
170 } 168 }
171 169
172 void SetSwapContainsIncompleteTile(bool contain) {
173 swap_contains_incomplete_tile_ = contain;
174 }
175
176 bool HasAction(const char* action) const { 170 bool HasAction(const char* action) const {
177 return ActionIndex(action) >= 0; 171 return ActionIndex(action) >= 0;
178 } 172 }
179 173
180 void SetDrawWillHappen(bool draw_will_happen) { 174 void SetDrawWillHappen(bool draw_will_happen) {
181 draw_will_happen_ = draw_will_happen; 175 draw_will_happen_ = draw_will_happen;
182 } 176 }
183 void SetSwapWillHappenIfDrawHappens(bool swap_will_happen_if_draw_happens) { 177 void SetSwapWillHappenIfDrawHappens(bool swap_will_happen_if_draw_happens) {
184 swap_will_happen_if_draw_happens_ = swap_will_happen_if_draw_happens; 178 swap_will_happen_if_draw_happens_ = swap_will_happen_if_draw_happens;
185 } 179 }
186 void SetAutomaticSwapAck(bool automatic_swap_ack) { 180 void SetAutomaticSwapAck(bool automatic_swap_ack) {
187 automatic_swap_ack_ = automatic_swap_ack; 181 automatic_swap_ack_ = automatic_swap_ack;
188 } 182 }
189 void SetRedrawWillHappenIfUpdateVisibleTilesHappens(bool redraw) {
190 redraw_will_happen_if_update_visible_tiles_happens_ = redraw;
191 }
192 // SchedulerClient implementation. 183 // SchedulerClient implementation.
193 void WillBeginImplFrame(const BeginFrameArgs& args) override { 184 void WillBeginImplFrame(const BeginFrameArgs& args) override {
194 actions_.push_back("WillBeginImplFrame"); 185 actions_.push_back("WillBeginImplFrame");
195 states_.push_back(scheduler_->AsValue()); 186 states_.push_back(scheduler_->AsValue());
196 } 187 }
197 void ScheduledActionSendBeginMainFrame() override { 188 void ScheduledActionSendBeginMainFrame() override {
198 actions_.push_back("ScheduledActionSendBeginMainFrame"); 189 actions_.push_back("ScheduledActionSendBeginMainFrame");
199 states_.push_back(scheduler_->AsValue()); 190 states_.push_back(scheduler_->AsValue());
200 } 191 }
201 void ScheduledActionAnimate() override { 192 void ScheduledActionAnimate() override {
202 actions_.push_back("ScheduledActionAnimate"); 193 actions_.push_back("ScheduledActionAnimate");
203 states_.push_back(scheduler_->AsValue()); 194 states_.push_back(scheduler_->AsValue());
204 } 195 }
205 DrawResult ScheduledActionDrawAndSwapIfPossible() override { 196 DrawResult ScheduledActionDrawAndSwapIfPossible() override {
206 actions_.push_back("ScheduledActionDrawAndSwapIfPossible"); 197 actions_.push_back("ScheduledActionDrawAndSwapIfPossible");
207 states_.push_back(scheduler_->AsValue()); 198 states_.push_back(scheduler_->AsValue());
208 num_draws_++; 199 num_draws_++;
209 DrawResult result = 200 DrawResult result =
210 draw_will_happen_ ? DRAW_SUCCESS : DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; 201 draw_will_happen_ ? DRAW_SUCCESS : DRAW_ABORTED_CHECKERBOARD_ANIMATIONS;
211 bool swap_will_happen = 202 bool swap_will_happen =
212 draw_will_happen_ && swap_will_happen_if_draw_happens_; 203 draw_will_happen_ && swap_will_happen_if_draw_happens_;
213 if (swap_will_happen) { 204 if (swap_will_happen) {
214 scheduler_->DidSwapBuffers(); 205 scheduler_->DidSwapBuffers();
215 if (swap_contains_incomplete_tile_) {
216 scheduler_->SetSwapUsedIncompleteTile(true);
217 swap_contains_incomplete_tile_ = false;
218 } else {
219 scheduler_->SetSwapUsedIncompleteTile(false);
220 }
221 206
222 if (automatic_swap_ack_) 207 if (automatic_swap_ack_)
223 scheduler_->DidSwapBuffersComplete(); 208 scheduler_->DidSwapBuffersComplete();
224 } 209 }
225 return result; 210 return result;
226 } 211 }
227 DrawResult ScheduledActionDrawAndSwapForced() override { 212 DrawResult ScheduledActionDrawAndSwapForced() override {
228 actions_.push_back("ScheduledActionDrawAndSwapForced"); 213 actions_.push_back("ScheduledActionDrawAndSwapForced");
229 states_.push_back(scheduler_->AsValue()); 214 states_.push_back(scheduler_->AsValue());
230 return DRAW_SUCCESS; 215 return DRAW_SUCCESS;
231 } 216 }
232 void ScheduledActionCommit() override { 217 void ScheduledActionCommit() override {
233 actions_.push_back("ScheduledActionCommit"); 218 actions_.push_back("ScheduledActionCommit");
234 states_.push_back(scheduler_->AsValue()); 219 states_.push_back(scheduler_->AsValue());
235 } 220 }
236 void ScheduledActionUpdateVisibleTiles() override {
237 actions_.push_back("ScheduledActionUpdateVisibleTiles");
238 states_.push_back(scheduler_->AsValue());
239 if (redraw_will_happen_if_update_visible_tiles_happens_)
240 scheduler_->SetNeedsRedraw();
241 }
242 void ScheduledActionActivateSyncTree() override { 221 void ScheduledActionActivateSyncTree() override {
243 actions_.push_back("ScheduledActionActivateSyncTree"); 222 actions_.push_back("ScheduledActionActivateSyncTree");
244 states_.push_back(scheduler_->AsValue()); 223 states_.push_back(scheduler_->AsValue());
245 } 224 }
246 void ScheduledActionBeginOutputSurfaceCreation() override { 225 void ScheduledActionBeginOutputSurfaceCreation() override {
247 actions_.push_back("ScheduledActionBeginOutputSurfaceCreation"); 226 actions_.push_back("ScheduledActionBeginOutputSurfaceCreation");
248 states_.push_back(scheduler_->AsValue()); 227 states_.push_back(scheduler_->AsValue());
249 } 228 }
250 void ScheduledActionManageTiles() override { 229 void ScheduledActionManageTiles() override {
251 actions_.push_back("ScheduledActionManageTiles"); 230 actions_.push_back("ScheduledActionManageTiles");
(...skipping 22 matching lines...) Expand all
274 protected: 253 protected:
275 bool ImplFrameDeadlinePendingCallback(bool state) { 254 bool ImplFrameDeadlinePendingCallback(bool state) {
276 return scheduler_->BeginImplFrameDeadlinePending() == state; 255 return scheduler_->BeginImplFrameDeadlinePending() == state;
277 } 256 }
278 257
279 bool draw_will_happen_; 258 bool draw_will_happen_;
280 bool swap_will_happen_if_draw_happens_; 259 bool swap_will_happen_if_draw_happens_;
281 bool automatic_swap_ack_; 260 bool automatic_swap_ack_;
282 int num_draws_; 261 int num_draws_;
283 bool log_anticipated_draw_time_change_; 262 bool log_anticipated_draw_time_change_;
284 bool swap_contains_incomplete_tile_;
285 bool redraw_will_happen_if_update_visible_tiles_happens_;
286 base::TimeTicks posted_begin_impl_frame_deadline_; 263 base::TimeTicks posted_begin_impl_frame_deadline_;
287 std::vector<const char*> actions_; 264 std::vector<const char*> actions_;
288 std::vector<scoped_refptr<base::debug::ConvertableToTraceFormat>> states_; 265 std::vector<scoped_refptr<base::debug::ConvertableToTraceFormat>> states_;
289 scoped_refptr<TestNowSource> now_src_; 266 scoped_refptr<TestNowSource> now_src_;
290 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; 267 scoped_refptr<OrderedSimpleTaskRunner> task_runner_;
291 FakeBeginFrameSourceForFakeSchedulerClient fake_frame_source_; 268 FakeBeginFrameSourceForFakeSchedulerClient fake_frame_source_;
292 FakePowerMonitorSource* fake_power_monitor_source_; 269 FakePowerMonitorSource* fake_power_monitor_source_;
293 base::PowerMonitor power_monitor_; 270 base::PowerMonitor power_monitor_;
294 scoped_ptr<TestScheduler> scheduler_; 271 scoped_ptr<TestScheduler> scheduler_;
295 }; 272 };
(...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after
975 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); 952 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
976 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); 953 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles"));
977 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), 954 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"),
978 client.ActionIndex("ScheduledActionManageTiles")); 955 client.ActionIndex("ScheduledActionManageTiles"));
979 EXPECT_FALSE(scheduler->RedrawPending()); 956 EXPECT_FALSE(scheduler->RedrawPending());
980 EXPECT_FALSE(scheduler->ManageTilesPending()); 957 EXPECT_FALSE(scheduler->ManageTilesPending());
981 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); 958 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
982 scheduler->DidManageTiles(); // Corresponds to ScheduledActionManageTiles 959 scheduler->DidManageTiles(); // Corresponds to ScheduledActionManageTiles
983 } 960 }
984 961
985 TEST(SchedulerTest, ShouldUpdateVisibleTiles) {
986 FakeSchedulerClient client;
987 SchedulerSettings scheduler_settings;
988 scheduler_settings.impl_side_painting = true;
989 TestScheduler* scheduler = client.CreateScheduler(scheduler_settings);
990 scheduler->SetCanStart();
991 scheduler->SetVisible(true);
992 scheduler->SetCanDraw(true);
993 InitializeOutputSurfaceAndFirstCommit(scheduler, &client);
994
995 client.SetRedrawWillHappenIfUpdateVisibleTilesHappens(true);
996
997 // SetNeedsCommit should begin the frame.
998 client.Reset();
999 scheduler->SetNeedsCommit();
1000 EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client);
1001
1002 client.Reset();
1003 client.AdvanceFrame();
1004 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2);
1005 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2);
1006 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
1007
1008 client.Reset();
1009 scheduler->NotifyBeginMainFrameStarted();
1010 scheduler->NotifyReadyToCommit();
1011 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client);
1012
1013 client.Reset();
1014 scheduler->NotifyReadyToActivate();
1015 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client);
1016
1017 client.Reset();
1018 client.SetSwapContainsIncompleteTile(true);
1019 client.task_runner().RunPendingTasks(); // Run posted deadline.
1020 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2);
1021 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2);
1022 EXPECT_FALSE(scheduler->RedrawPending());
1023
1024 client.Reset();
1025 client.AdvanceFrame();
1026 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
1027 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
1028
1029 client.Reset();
1030 client.task_runner().RunPendingTasks(); // Run posted deadline.
1031 EXPECT_ACTION("ScheduledActionUpdateVisibleTiles", client, 0, 3);
1032 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 3);
1033 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 2, 3);
1034
1035 client.Reset();
1036 client.AdvanceFrame();
1037 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
1038 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
1039
1040 // No more UpdateVisibleTiles().
1041 client.Reset();
1042 client.task_runner().RunPendingTasks(); // Run posted deadline.
1043 EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client);
1044 }
1045
1046 TEST(SchedulerTest, TriggerBeginFrameDeadlineEarly) { 962 TEST(SchedulerTest, TriggerBeginFrameDeadlineEarly) {
1047 SchedulerClientNeedsManageTilesInDraw client; 963 SchedulerClientNeedsManageTilesInDraw client;
1048 SchedulerSettings default_scheduler_settings; 964 SchedulerSettings default_scheduler_settings;
1049 TestScheduler* scheduler = client.CreateScheduler(default_scheduler_settings); 965 TestScheduler* scheduler = client.CreateScheduler(default_scheduler_settings);
1050 scheduler->SetCanStart(); 966 scheduler->SetCanStart();
1051 scheduler->SetVisible(true); 967 scheduler->SetVisible(true);
1052 scheduler->SetCanDraw(true); 968 scheduler->SetCanDraw(true);
1053 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); 969 InitializeOutputSurfaceAndFirstCommit(scheduler, &client);
1054 970
1055 client.Reset(); 971 client.Reset();
(...skipping 1080 matching lines...) Expand 10 before | Expand all | Expand 10 after
2136 2052
2137 // Deadline task is pending 2053 // Deadline task is pending
2138 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); 2054 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
2139 client.task_runner().RunPendingTasks(); 2055 client.task_runner().RunPendingTasks();
2140 // Deadline task runs immediately 2056 // Deadline task runs immediately
2141 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); 2057 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
2142 } 2058 }
2143 2059
2144 } // namespace 2060 } // namespace
2145 } // namespace cc 2061 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698