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

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

Issue 2632563003: [cc] Calculate the correct latest_confirmed_sequence_number in cc::Scheduler. (Closed)
Patch Set: Add tests, fix DRAW_ABORT and sync renderer compositor. Created 3 years, 10 months 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 4
5 #include "cc/scheduler/scheduler_state_machine.h" 5 #include "cc/scheduler/scheduler_state_machine.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include "base/trace_event/trace_event.h" 9 #include "base/trace_event/trace_event.h"
10 #include "cc/output/begin_frame_args.h"
10 #include "cc/scheduler/scheduler.h" 11 #include "cc/scheduler/scheduler.h"
11 #include "cc/test/begin_frame_args_test.h" 12 #include "cc/test/begin_frame_args_test.h"
12 #include "testing/gtest/include/gtest/gtest.h" 13 #include "testing/gtest/include/gtest/gtest.h"
13 14
14 // Macro to compare two enum values and get nice output. 15 // Macro to compare two enum values and get nice output.
15 // Without: 16 // Without:
16 // Value of: actual() Actual: 7 17 // Value of: actual() Actual: 7
17 // Expected: expected() Which is: 0 18 // Expected: expected() Which is: 0
18 // With: 19 // With:
19 // Value of: actual() Actual: "ACTION_DRAW" 20 // Value of: actual() Actual: "ACTION_DRAW"
20 // Expected: expected() Which is: "ACTION_NONE" 21 // Expected: expected() Which is: "ACTION_NONE"
21 #define EXPECT_ENUM_EQ(enum_tostring, expected, actual) \ 22 #define EXPECT_ENUM_EQ(enum_tostring, expected, actual) \
22 EXPECT_STREQ(SchedulerStateMachine::enum_tostring(expected), \ 23 EXPECT_STREQ(SchedulerStateMachine::enum_tostring(expected), \
23 SchedulerStateMachine::enum_tostring(actual)) 24 SchedulerStateMachine::enum_tostring(actual))
24 25
26 #define EXPECT_SEQUENCE_NUMBERS(current, main_frame, pending_tree, \
27 active_tree, compositor_frame) \
28 EXPECT_EQ(current, state.begin_frame_sequence_number()); \
29 EXPECT_EQ(main_frame, \
30 state.last_begin_frame_sequence_number_begin_main_frame_sent()); \
31 EXPECT_EQ(pending_tree, \
32 state.last_begin_frame_sequence_number_pending_tree_was_fresh()); \
33 EXPECT_EQ(active_tree, \
34 state.last_begin_frame_sequence_number_active_tree_was_fresh()); \
35 EXPECT_EQ( \
36 compositor_frame, \
37 state.last_begin_frame_sequence_number_compositor_frame_was_fresh())
38
25 #define EXPECT_IMPL_FRAME_STATE(expected) \ 39 #define EXPECT_IMPL_FRAME_STATE(expected) \
26 EXPECT_ENUM_EQ(BeginImplFrameStateToString, expected, \ 40 EXPECT_ENUM_EQ(BeginImplFrameStateToString, expected, \
27 state.begin_impl_frame_state()) \ 41 state.begin_impl_frame_state()) \
28 << state.AsValue()->ToString() 42 << state.AsValue()->ToString()
29 43
30 #define EXPECT_MAIN_FRAME_STATE(expected) \ 44 #define EXPECT_MAIN_FRAME_STATE(expected) \
31 EXPECT_ENUM_EQ(BeginMainFrameStateToString, expected, \ 45 EXPECT_ENUM_EQ(BeginMainFrameStateToString, expected, \
32 state.BeginMainFrameState()) 46 state.BeginMainFrameState())
33 47
34 #define EXPECT_ACTION(expected) \ 48 #define EXPECT_ACTION(expected) \
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 public: 93 public:
80 explicit StateMachine(const SchedulerSettings& scheduler_settings) 94 explicit StateMachine(const SchedulerSettings& scheduler_settings)
81 : SchedulerStateMachine(scheduler_settings), 95 : SchedulerStateMachine(scheduler_settings),
82 draw_result_for_test_(DRAW_SUCCESS) {} 96 draw_result_for_test_(DRAW_SUCCESS) {}
83 97
84 void CreateAndInitializeCompositorFrameSinkWithActivatedCommit() { 98 void CreateAndInitializeCompositorFrameSinkWithActivatedCommit() {
85 DidCreateAndInitializeCompositorFrameSink(); 99 DidCreateAndInitializeCompositorFrameSink();
86 compositor_frame_sink_state_ = COMPOSITOR_FRAME_SINK_ACTIVE; 100 compositor_frame_sink_state_ = COMPOSITOR_FRAME_SINK_ACTIVE;
87 } 101 }
88 102
103 void IssueNextBeginImplFrame() {
104 OnBeginImplFrame(0, next_begin_frame_number_++);
105 }
106
89 void SetBeginMainFrameState(BeginMainFrameState cs) { 107 void SetBeginMainFrameState(BeginMainFrameState cs) {
90 begin_main_frame_state_ = cs; 108 begin_main_frame_state_ = cs;
91 } 109 }
92 BeginMainFrameState BeginMainFrameState() const { 110 BeginMainFrameState BeginMainFrameState() const {
93 return begin_main_frame_state_; 111 return begin_main_frame_state_;
94 } 112 }
95 113
96 ForcedRedrawOnTimeoutState ForcedRedrawState() const { 114 ForcedRedrawOnTimeoutState ForcedRedrawState() const {
97 return forced_redraw_state_; 115 return forced_redraw_state_;
98 } 116 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 161
144 bool PendingActivationsShouldBeForced() const { 162 bool PendingActivationsShouldBeForced() const {
145 return SchedulerStateMachine::PendingActivationsShouldBeForced(); 163 return SchedulerStateMachine::PendingActivationsShouldBeForced();
146 } 164 }
147 165
148 bool has_pending_tree() const { return has_pending_tree_; } 166 bool has_pending_tree() const { return has_pending_tree_; }
149 void SetHasPendingTree(bool has_pending_tree) { 167 void SetHasPendingTree(bool has_pending_tree) {
150 has_pending_tree_ = has_pending_tree; 168 has_pending_tree_ = has_pending_tree;
151 } 169 }
152 170
171 uint64_t begin_frame_sequence_number() const {
172 return begin_frame_sequence_number_;
173 }
174 uint64_t last_begin_frame_sequence_number_begin_main_frame_sent() const {
175 return last_begin_frame_sequence_number_begin_main_frame_sent_;
176 }
177 uint64_t last_begin_frame_sequence_number_pending_tree_was_fresh() const {
178 return last_begin_frame_sequence_number_pending_tree_was_fresh_;
179 }
180 uint64_t last_begin_frame_sequence_number_active_tree_was_fresh() const {
181 return last_begin_frame_sequence_number_active_tree_was_fresh_;
182 }
183
153 using SchedulerStateMachine::ShouldTriggerBeginImplFrameDeadlineImmediately; 184 using SchedulerStateMachine::ShouldTriggerBeginImplFrameDeadlineImmediately;
154 using SchedulerStateMachine::ProactiveBeginFrameWanted; 185 using SchedulerStateMachine::ProactiveBeginFrameWanted;
155 using SchedulerStateMachine::WillCommit; 186 using SchedulerStateMachine::WillCommit;
156 187
157 protected: 188 protected:
158 DrawResult draw_result_for_test_; 189 DrawResult draw_result_for_test_;
190 uint64_t next_begin_frame_number_ = BeginFrameArgs::kStartingFrameNumber;
159 }; 191 };
160 192
161 void PerformAction(StateMachine* sm, SchedulerStateMachine::Action action) { 193 void PerformAction(StateMachine* sm, SchedulerStateMachine::Action action) {
162 switch (action) { 194 switch (action) {
163 case SchedulerStateMachine::ACTION_NONE: 195 case SchedulerStateMachine::ACTION_NONE:
164 return; 196 return;
165 197
166 case SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE: 198 case SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE:
167 sm->WillActivate(); 199 sm->WillActivate();
168 return; 200 return;
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
264 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); 296 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION);
265 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 297 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
266 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); 298 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit();
267 state.SetBeginMainFrameState( 299 state.SetBeginMainFrameState(
268 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); 300 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE);
269 state.SetNeedsRedraw(false); 301 state.SetNeedsRedraw(false);
270 302
271 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 303 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
272 EXPECT_FALSE(state.NeedsCommit()); 304 EXPECT_FALSE(state.NeedsCommit());
273 305
274 state.OnBeginImplFrame(); 306 state.IssueNextBeginImplFrame();
275 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 307 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
276 308
277 state.OnBeginImplFrameDeadline(); 309 state.OnBeginImplFrameDeadline();
278 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 310 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
279 EXPECT_FALSE(state.NeedsCommit()); 311 EXPECT_FALSE(state.NeedsCommit());
280 } 312 }
281 313
282 // If commit requested but not visible yet, do nothing. 314 // If commit requested but not visible yet, do nothing.
283 { 315 {
284 StateMachine state(default_scheduler_settings); 316 StateMachine state(default_scheduler_settings);
285 state.SetBeginMainFrameState( 317 state.SetBeginMainFrameState(
286 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); 318 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE);
287 state.SetNeedsRedraw(false); 319 state.SetNeedsRedraw(false);
288 state.SetNeedsBeginMainFrame(); 320 state.SetNeedsBeginMainFrame();
289 321
290 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 322 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
291 EXPECT_TRUE(state.NeedsCommit()); 323 EXPECT_TRUE(state.NeedsCommit());
292 324
293 state.OnBeginImplFrame(); 325 state.IssueNextBeginImplFrame();
294 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 326 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
295 327
296 state.OnBeginImplFrameDeadline(); 328 state.OnBeginImplFrameDeadline();
297 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 329 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
298 EXPECT_TRUE(state.NeedsCommit()); 330 EXPECT_TRUE(state.NeedsCommit());
299 } 331 }
300 332
301 // If commit requested, begin a main frame. 333 // If commit requested, begin a main frame.
302 { 334 {
303 StateMachine state(default_scheduler_settings); 335 StateMachine state(default_scheduler_settings);
304 state.SetBeginMainFrameState( 336 state.SetBeginMainFrameState(
305 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); 337 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE);
306 state.SetVisible(true); 338 state.SetVisible(true);
307 EXPECT_ACTION_UPDATE_STATE( 339 EXPECT_ACTION_UPDATE_STATE(
308 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); 340 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION);
309 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 341 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
310 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); 342 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit();
311 state.SetNeedsRedraw(false); 343 state.SetNeedsRedraw(false);
312 state.SetNeedsBeginMainFrame(); 344 state.SetNeedsBeginMainFrame();
313 345
314 // Expect nothing to happen until after OnBeginImplFrame. 346 // Expect nothing to happen until after OnBeginImplFrame.
315 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 347 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
316 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); 348 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE);
317 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); 349 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE);
318 EXPECT_TRUE(state.NeedsCommit()); 350 EXPECT_TRUE(state.NeedsCommit());
319 EXPECT_TRUE(state.BeginFrameNeeded()); 351 EXPECT_TRUE(state.BeginFrameNeeded());
320 352
321 state.OnBeginImplFrame(); 353 state.IssueNextBeginImplFrame();
322 EXPECT_ACTION_UPDATE_STATE( 354 EXPECT_ACTION_UPDATE_STATE(
323 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 355 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
324 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); 356 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT);
325 EXPECT_FALSE(state.NeedsCommit()); 357 EXPECT_FALSE(state.NeedsCommit());
326 } 358 }
327 359
328 // If commit requested and can't draw, still begin a main frame. 360 // If commit requested and can't draw, still begin a main frame.
329 { 361 {
330 StateMachine state(default_scheduler_settings); 362 StateMachine state(default_scheduler_settings);
331 state.SetBeginMainFrameState( 363 state.SetBeginMainFrameState(
332 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); 364 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE);
333 state.SetVisible(true); 365 state.SetVisible(true);
334 EXPECT_ACTION_UPDATE_STATE( 366 EXPECT_ACTION_UPDATE_STATE(
335 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); 367 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION);
336 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 368 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
337 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); 369 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit();
338 state.SetNeedsRedraw(false); 370 state.SetNeedsRedraw(false);
339 state.SetNeedsBeginMainFrame(); 371 state.SetNeedsBeginMainFrame();
340 state.SetCanDraw(false); 372 state.SetCanDraw(false);
341 373
342 // Expect nothing to happen until after OnBeginImplFrame. 374 // Expect nothing to happen until after OnBeginImplFrame.
343 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 375 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
344 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); 376 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE);
345 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); 377 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE);
346 EXPECT_TRUE(state.BeginFrameNeeded()); 378 EXPECT_TRUE(state.BeginFrameNeeded());
347 379
348 state.OnBeginImplFrame(); 380 state.IssueNextBeginImplFrame();
349 EXPECT_ACTION_UPDATE_STATE( 381 EXPECT_ACTION_UPDATE_STATE(
350 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 382 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
351 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); 383 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT);
352 EXPECT_FALSE(state.NeedsCommit()); 384 EXPECT_FALSE(state.NeedsCommit());
353 } 385 }
354 } 386 }
355 387
356 // Explicitly test main_frame_before_activation_enabled = true 388 // Explicitly test main_frame_before_activation_enabled = true
357 TEST(SchedulerStateMachineTest, MainFrameBeforeActivationEnabled) { 389 TEST(SchedulerStateMachineTest, MainFrameBeforeActivationEnabled) {
358 SchedulerSettings scheduler_settings; 390 SchedulerSettings scheduler_settings;
359 scheduler_settings.main_frame_before_activation_enabled = true; 391 scheduler_settings.main_frame_before_activation_enabled = true;
360 StateMachine state(scheduler_settings); 392 StateMachine state(scheduler_settings);
361 state.SetBeginMainFrameState( 393 state.SetBeginMainFrameState(
362 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); 394 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE);
363 SET_UP_STATE(state) 395 SET_UP_STATE(state)
364 state.SetNeedsRedraw(false); 396 state.SetNeedsRedraw(false);
365 state.SetNeedsBeginMainFrame(); 397 state.SetNeedsBeginMainFrame();
366 398
367 EXPECT_TRUE(state.BeginFrameNeeded()); 399 EXPECT_TRUE(state.BeginFrameNeeded());
368 400
369 // Commit to the pending tree. 401 // Commit to the pending tree.
370 state.OnBeginImplFrame(); 402 state.IssueNextBeginImplFrame();
371 EXPECT_ACTION_UPDATE_STATE( 403 EXPECT_ACTION_UPDATE_STATE(
372 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 404 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
373 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 405 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
374 406
375 state.NotifyBeginMainFrameStarted(); 407 state.NotifyBeginMainFrameStarted();
376 state.NotifyReadyToCommit(); 408 state.NotifyReadyToCommit();
377 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 409 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
378 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 410 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
379 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); 411 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE);
380 412
381 state.OnBeginImplFrameDeadline(); 413 state.OnBeginImplFrameDeadline();
382 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 414 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
383 415
384 // Verify that the next commit starts while there is still a pending tree. 416 // Verify that the next commit starts while there is still a pending tree.
385 state.SetNeedsBeginMainFrame(); 417 state.SetNeedsBeginMainFrame();
386 state.OnBeginImplFrame(); 418 state.IssueNextBeginImplFrame();
387 EXPECT_ACTION_UPDATE_STATE( 419 EXPECT_ACTION_UPDATE_STATE(
388 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 420 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
389 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 421 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
390 422
391 // Verify the pending commit doesn't overwrite the pending 423 // Verify the pending commit doesn't overwrite the pending
392 // tree until the pending tree has been activated. 424 // tree until the pending tree has been activated.
393 state.NotifyBeginMainFrameStarted(); 425 state.NotifyBeginMainFrameStarted();
394 state.NotifyReadyToCommit(); 426 state.NotifyReadyToCommit();
395 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 427 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
396 428
(...skipping 16 matching lines...) Expand all
413 TEST(SchedulerStateMachineTest, 445 TEST(SchedulerStateMachineTest,
414 FailedDrawForAnimationCheckerboardSetsNeedsCommitAndRetriesDraw) { 446 FailedDrawForAnimationCheckerboardSetsNeedsCommitAndRetriesDraw) {
415 SchedulerSettings default_scheduler_settings; 447 SchedulerSettings default_scheduler_settings;
416 StateMachine state(default_scheduler_settings); 448 StateMachine state(default_scheduler_settings);
417 SET_UP_STATE(state) 449 SET_UP_STATE(state)
418 state.SetNeedsRedraw(true); 450 state.SetNeedsRedraw(true);
419 EXPECT_TRUE(state.RedrawPending()); 451 EXPECT_TRUE(state.RedrawPending());
420 EXPECT_TRUE(state.BeginFrameNeeded()); 452 EXPECT_TRUE(state.BeginFrameNeeded());
421 453
422 // Start a frame. 454 // Start a frame.
423 state.OnBeginImplFrame(); 455 state.IssueNextBeginImplFrame();
424 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 456 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
425 EXPECT_FALSE(state.CommitPending()); 457 EXPECT_FALSE(state.CommitPending());
426 458
427 // Failing a draw triggers request for a new BeginMainFrame. 459 // Failing a draw triggers request for a new BeginMainFrame.
428 state.OnBeginImplFrameDeadline(); 460 state.OnBeginImplFrameDeadline();
429 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); 461 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
430 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 462 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
431 EXPECT_ACTION_UPDATE_STATE( 463 EXPECT_ACTION_UPDATE_STATE(
432 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 464 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
433 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 465 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
434 state.OnBeginImplFrameIdle(); 466 state.OnBeginImplFrameIdle();
435 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 467 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
436 468
437 // It's okay to attempt more draws just in case additional raster 469 // It's okay to attempt more draws just in case additional raster
438 // finishes and the requested commit wasn't actually necessary. 470 // finishes and the requested commit wasn't actually necessary.
439 EXPECT_TRUE(state.CommitPending()); 471 EXPECT_TRUE(state.CommitPending());
440 EXPECT_TRUE(state.RedrawPending()); 472 EXPECT_TRUE(state.RedrawPending());
441 state.OnBeginImplFrame(); 473 state.IssueNextBeginImplFrame();
442 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 474 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
443 state.OnBeginImplFrameDeadline(); 475 state.OnBeginImplFrameDeadline();
444 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); 476 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
445 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 477 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
446 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 478 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
447 state.OnBeginImplFrameIdle(); 479 state.OnBeginImplFrameIdle();
448 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 480 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
449 } 481 }
450 482
451 TEST(SchedulerStateMachineTest, FailedDrawForMissingHighResNeedsCommit) { 483 TEST(SchedulerStateMachineTest, FailedDrawForMissingHighResNeedsCommit) {
452 SchedulerSettings default_scheduler_settings; 484 SchedulerSettings default_scheduler_settings;
453 StateMachine state(default_scheduler_settings); 485 StateMachine state(default_scheduler_settings);
454 SET_UP_STATE(state) 486 SET_UP_STATE(state)
455 state.SetNeedsRedraw(true); 487 state.SetNeedsRedraw(true);
456 EXPECT_TRUE(state.RedrawPending()); 488 EXPECT_TRUE(state.RedrawPending());
457 EXPECT_TRUE(state.BeginFrameNeeded()); 489 EXPECT_TRUE(state.BeginFrameNeeded());
458 490
459 // Start a frame. 491 // Start a frame.
460 state.OnBeginImplFrame(); 492 state.IssueNextBeginImplFrame();
461 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 493 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
462 EXPECT_FALSE(state.CommitPending()); 494 EXPECT_FALSE(state.CommitPending());
463 495
464 // Failing a draw triggers because of high res tiles missing 496 // Failing a draw triggers because of high res tiles missing
465 // request for a new BeginMainFrame. 497 // request for a new BeginMainFrame.
466 state.OnBeginImplFrameDeadline(); 498 state.OnBeginImplFrameDeadline();
467 state.SetDrawResultForTest(DRAW_ABORTED_MISSING_HIGH_RES_CONTENT); 499 state.SetDrawResultForTest(DRAW_ABORTED_MISSING_HIGH_RES_CONTENT);
468 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 500 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
469 EXPECT_ACTION_UPDATE_STATE( 501 EXPECT_ACTION_UPDATE_STATE(
470 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 502 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
471 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 503 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
472 state.OnBeginImplFrameIdle(); 504 state.OnBeginImplFrameIdle();
473 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 505 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
474 506
475 // It doesn't request a draw until we get a new commit though. 507 // It doesn't request a draw until we get a new commit though.
476 EXPECT_TRUE(state.CommitPending()); 508 EXPECT_TRUE(state.CommitPending());
477 EXPECT_FALSE(state.RedrawPending()); 509 EXPECT_FALSE(state.RedrawPending());
478 state.OnBeginImplFrame(); 510 state.IssueNextBeginImplFrame();
479 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 511 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
480 state.OnBeginImplFrameDeadline(); 512 state.OnBeginImplFrameDeadline();
481 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 513 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
482 state.OnBeginImplFrameIdle(); 514 state.OnBeginImplFrameIdle();
483 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 515 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
484 516
485 // Finish the commit and activation. 517 // Finish the commit and activation.
486 state.NotifyBeginMainFrameStarted(); 518 state.NotifyBeginMainFrameStarted();
487 state.NotifyReadyToCommit(); 519 state.NotifyReadyToCommit();
488 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 520 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
489 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 521 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
490 state.NotifyReadyToActivate(); 522 state.NotifyReadyToActivate();
491 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); 523 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
492 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 524 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
493 EXPECT_TRUE(state.RedrawPending()); 525 EXPECT_TRUE(state.RedrawPending());
494 526
495 // Verify we draw with the new frame. 527 // Verify we draw with the new frame.
496 state.OnBeginImplFrame(); 528 state.IssueNextBeginImplFrame();
497 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 529 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
498 state.OnBeginImplFrameDeadline(); 530 state.OnBeginImplFrameDeadline();
499 state.SetDrawResultForTest(DRAW_SUCCESS); 531 state.SetDrawResultForTest(DRAW_SUCCESS);
500 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 532 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
501 state.DidSubmitCompositorFrame(); 533 state.DidSubmitCompositorFrame();
502 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 534 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
503 state.OnBeginImplFrameIdle(); 535 state.OnBeginImplFrameIdle();
504 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 536 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
505 } 537 }
506 538
507 TEST(SchedulerStateMachineTest, 539 TEST(SchedulerStateMachineTest,
508 TestFailedDrawsEventuallyForceDrawAfterNextCommit) { 540 TestFailedDrawsEventuallyForceDrawAfterNextCommit) {
509 SchedulerSettings scheduler_settings; 541 SchedulerSettings scheduler_settings;
510 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced = 1; 542 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced = 1;
511 StateMachine state(scheduler_settings); 543 StateMachine state(scheduler_settings);
512 SET_UP_STATE(state) 544 SET_UP_STATE(state)
513 545
514 // Start a commit. 546 // Start a commit.
515 state.SetNeedsBeginMainFrame(); 547 state.SetNeedsBeginMainFrame();
516 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 548 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
517 state.OnBeginImplFrame(); 549 state.IssueNextBeginImplFrame();
518 EXPECT_ACTION_UPDATE_STATE( 550 EXPECT_ACTION_UPDATE_STATE(
519 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 551 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
520 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 552 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
521 EXPECT_TRUE(state.CommitPending()); 553 EXPECT_TRUE(state.CommitPending());
522 554
523 // Then initiate a draw that fails. 555 // Then initiate a draw that fails.
524 state.SetNeedsRedraw(true); 556 state.SetNeedsRedraw(true);
525 state.OnBeginImplFrameDeadline(); 557 state.OnBeginImplFrameDeadline();
526 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); 558 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
527 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 559 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
(...skipping 10 matching lines...) Expand all
538 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 570 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
539 EXPECT_TRUE(state.RedrawPending()); 571 EXPECT_TRUE(state.RedrawPending());
540 572
541 // Activate so we're ready for a new main frame. 573 // Activate so we're ready for a new main frame.
542 state.NotifyReadyToActivate(); 574 state.NotifyReadyToActivate();
543 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); 575 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
544 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 576 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
545 EXPECT_TRUE(state.RedrawPending()); 577 EXPECT_TRUE(state.RedrawPending());
546 578
547 // The redraw should be forced at the end of the next BeginImplFrame. 579 // The redraw should be forced at the end of the next BeginImplFrame.
548 state.OnBeginImplFrame(); 580 state.IssueNextBeginImplFrame();
549 EXPECT_ACTION_UPDATE_STATE( 581 EXPECT_ACTION_UPDATE_STATE(
550 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 582 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
551 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 583 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
552 state.OnBeginImplFrameDeadline(); 584 state.OnBeginImplFrameDeadline();
553 state.SetDrawResultForTest(DRAW_SUCCESS); 585 state.SetDrawResultForTest(DRAW_SUCCESS);
554 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_FORCED); 586 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_FORCED);
555 state.DidSubmitCompositorFrame(); 587 state.DidSubmitCompositorFrame();
556 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 588 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
557 state.DidReceiveCompositorFrameAck(); 589 state.DidReceiveCompositorFrameAck();
558 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 590 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
559 } 591 }
560 592
561 TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) { 593 TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) {
562 SchedulerSettings scheduler_settings; 594 SchedulerSettings scheduler_settings;
563 int draw_limit = 2; 595 int draw_limit = 2;
564 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced = 596 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced =
565 draw_limit; 597 draw_limit;
566 StateMachine state(scheduler_settings); 598 StateMachine state(scheduler_settings);
567 SET_UP_STATE(state) 599 SET_UP_STATE(state)
568 600
569 // Start a commit. 601 // Start a commit.
570 state.SetNeedsBeginMainFrame(); 602 state.SetNeedsBeginMainFrame();
571 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 603 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
572 state.OnBeginImplFrame(); 604 state.IssueNextBeginImplFrame();
573 EXPECT_ACTION_UPDATE_STATE( 605 EXPECT_ACTION_UPDATE_STATE(
574 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 606 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
575 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 607 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
576 EXPECT_TRUE(state.CommitPending()); 608 EXPECT_TRUE(state.CommitPending());
577 609
578 // Then initiate a draw. 610 // Then initiate a draw.
579 state.SetNeedsRedraw(true); 611 state.SetNeedsRedraw(true);
580 state.OnBeginImplFrameDeadline(); 612 state.OnBeginImplFrameDeadline();
581 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 613 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
582 614
583 // Fail the draw enough times to force a redraw. 615 // Fail the draw enough times to force a redraw.
584 for (int i = 0; i < draw_limit; ++i) { 616 for (int i = 0; i < draw_limit; ++i) {
585 state.SetNeedsRedraw(true); 617 state.SetNeedsRedraw(true);
586 state.OnBeginImplFrame(); 618 state.IssueNextBeginImplFrame();
587 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 619 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
588 state.OnBeginImplFrameDeadline(); 620 state.OnBeginImplFrameDeadline();
589 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); 621 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
590 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 622 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
591 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 623 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
592 state.OnBeginImplFrameIdle(); 624 state.OnBeginImplFrameIdle();
593 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 625 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
594 } 626 }
595 627
596 EXPECT_TRUE(state.BeginFrameNeeded()); 628 EXPECT_TRUE(state.BeginFrameNeeded());
597 EXPECT_TRUE(state.RedrawPending()); 629 EXPECT_TRUE(state.RedrawPending());
598 // But the commit is ongoing. 630 // But the commit is ongoing.
599 EXPECT_TRUE(state.CommitPending()); 631 EXPECT_TRUE(state.CommitPending());
600 EXPECT_TRUE(state.ForcedRedrawState() == 632 EXPECT_TRUE(state.ForcedRedrawState() ==
601 SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_COMMIT); 633 SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_COMMIT);
602 634
603 // After failing additional draws, we should still be in a forced 635 // After failing additional draws, we should still be in a forced
604 // redraw, but not back in IDLE. 636 // redraw, but not back in IDLE.
605 for (int i = 0; i < draw_limit; ++i) { 637 for (int i = 0; i < draw_limit; ++i) {
606 state.SetNeedsRedraw(true); 638 state.SetNeedsRedraw(true);
607 state.OnBeginImplFrame(); 639 state.IssueNextBeginImplFrame();
608 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 640 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
609 state.OnBeginImplFrameDeadline(); 641 state.OnBeginImplFrameDeadline();
610 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); 642 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
611 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 643 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
612 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 644 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
613 state.OnBeginImplFrameIdle(); 645 state.OnBeginImplFrameIdle();
614 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 646 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
615 } 647 }
616 EXPECT_TRUE(state.RedrawPending()); 648 EXPECT_TRUE(state.RedrawPending());
617 EXPECT_TRUE(state.ForcedRedrawState() == 649 EXPECT_TRUE(state.ForcedRedrawState() ==
618 SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_COMMIT); 650 SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_COMMIT);
619 } 651 }
620 652
621 TEST(SchedulerStateMachineTest, TestFailedDrawIsRetriedInNextBeginImplFrame) { 653 TEST(SchedulerStateMachineTest, TestFailedDrawIsRetriedInNextBeginImplFrame) {
622 SchedulerSettings default_scheduler_settings; 654 SchedulerSettings default_scheduler_settings;
623 StateMachine state(default_scheduler_settings); 655 StateMachine state(default_scheduler_settings);
624 SET_UP_STATE(state) 656 SET_UP_STATE(state)
625 657
626 // Start a draw. 658 // Start a draw.
627 state.SetNeedsRedraw(true); 659 state.SetNeedsRedraw(true);
628 EXPECT_TRUE(state.BeginFrameNeeded()); 660 EXPECT_TRUE(state.BeginFrameNeeded());
629 state.OnBeginImplFrame(); 661 state.IssueNextBeginImplFrame();
630 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 662 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
631 state.OnBeginImplFrameDeadline(); 663 state.OnBeginImplFrameDeadline();
632 EXPECT_TRUE(state.RedrawPending()); 664 EXPECT_TRUE(state.RedrawPending());
633 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); 665 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
634 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 666 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
635 667
636 // Failing the draw for animation checkerboards makes us require a commit. 668 // Failing the draw for animation checkerboards makes us require a commit.
637 EXPECT_ACTION_UPDATE_STATE( 669 EXPECT_ACTION_UPDATE_STATE(
638 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 670 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
639 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 671 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
640 EXPECT_TRUE(state.RedrawPending()); 672 EXPECT_TRUE(state.RedrawPending());
641 673
642 // We should not be trying to draw again now, but we have a commit pending. 674 // We should not be trying to draw again now, but we have a commit pending.
643 EXPECT_TRUE(state.BeginFrameNeeded()); 675 EXPECT_TRUE(state.BeginFrameNeeded());
644 state.OnBeginImplFrame(); 676 state.IssueNextBeginImplFrame();
645 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 677 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
646 678
647 // We should try to draw again at the end of the next BeginImplFrame on 679 // We should try to draw again at the end of the next BeginImplFrame on
648 // the impl thread. 680 // the impl thread.
649 state.OnBeginImplFrameDeadline(); 681 state.OnBeginImplFrameDeadline();
650 state.SetDrawResultForTest(DRAW_SUCCESS); 682 state.SetDrawResultForTest(DRAW_SUCCESS);
651 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 683 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
652 state.DidSubmitCompositorFrame(); 684 state.DidSubmitCompositorFrame();
653 state.DidReceiveCompositorFrameAck(); 685 state.DidReceiveCompositorFrameAck();
654 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 686 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
655 } 687 }
656 688
657 TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) { 689 TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) {
658 SchedulerSettings default_scheduler_settings; 690 SchedulerSettings default_scheduler_settings;
659 StateMachine state(default_scheduler_settings); 691 StateMachine state(default_scheduler_settings);
660 SET_UP_STATE(state) 692 SET_UP_STATE(state)
661 state.SetNeedsRedraw(true); 693 state.SetNeedsRedraw(true);
662 694
663 // Draw the first frame. 695 // Draw the first frame.
664 EXPECT_TRUE(state.BeginFrameNeeded()); 696 EXPECT_TRUE(state.BeginFrameNeeded());
665 state.OnBeginImplFrame(); 697 state.IssueNextBeginImplFrame();
666 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 698 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
667 699
668 state.OnBeginImplFrameDeadline(); 700 state.OnBeginImplFrameDeadline();
669 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 701 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
670 state.DidSubmitCompositorFrame(); 702 state.DidSubmitCompositorFrame();
671 state.DidReceiveCompositorFrameAck(); 703 state.DidReceiveCompositorFrameAck();
672 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 704 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
673 705
674 // Before the next BeginImplFrame, set needs redraw again. 706 // Before the next BeginImplFrame, set needs redraw again.
675 // This should not redraw until the next BeginImplFrame. 707 // This should not redraw until the next BeginImplFrame.
676 state.SetNeedsRedraw(true); 708 state.SetNeedsRedraw(true);
677 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 709 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
678 710
679 // Move to another frame. This should now draw. 711 // Move to another frame. This should now draw.
680 EXPECT_TRUE(state.BeginFrameNeeded()); 712 EXPECT_TRUE(state.BeginFrameNeeded());
681 state.OnBeginImplFrame(); 713 state.IssueNextBeginImplFrame();
682 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 714 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
683 state.OnBeginImplFrameDeadline(); 715 state.OnBeginImplFrameDeadline();
684 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 716 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
685 state.DidSubmitCompositorFrame(); 717 state.DidSubmitCompositorFrame();
686 state.DidReceiveCompositorFrameAck(); 718 state.DidReceiveCompositorFrameAck();
687 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 719 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
688 720
689 // We just submitted, so we should proactively request another BeginImplFrame. 721 // We just submitted, so we should proactively request another BeginImplFrame.
690 EXPECT_TRUE(state.BeginFrameNeeded()); 722 EXPECT_TRUE(state.BeginFrameNeeded());
691 } 723 }
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 StateMachine state(default_scheduler_settings); 841 StateMachine state(default_scheduler_settings);
810 state.SetVisible(true); 842 state.SetVisible(true);
811 EXPECT_ACTION_UPDATE_STATE( 843 EXPECT_ACTION_UPDATE_STATE(
812 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); 844 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION);
813 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 845 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
814 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); 846 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit();
815 state.SetBeginMainFrameState(begin_main_frame_states[i]); 847 state.SetBeginMainFrameState(begin_main_frame_states[i]);
816 state.SetVisible(false); 848 state.SetVisible(false);
817 state.SetNeedsRedraw(true); 849 state.SetNeedsRedraw(true);
818 if (j == 1) 850 if (j == 1)
819 state.OnBeginImplFrame(); 851 state.IssueNextBeginImplFrame();
820 852
821 state.SetCanDraw(false); 853 state.SetCanDraw(false);
822 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, 854 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE,
823 state.NextAction()); 855 state.NextAction());
824 } 856 }
825 } 857 }
826 } 858 }
827 859
828 TEST(SchedulerStateMachineTest, 860 TEST(SchedulerStateMachineTest,
829 TestCanRedrawWithWaitingForFirstDrawMakesProgress) { 861 TestCanRedrawWithWaitingForFirstDrawMakesProgress) {
830 SchedulerSettings default_scheduler_settings; 862 SchedulerSettings default_scheduler_settings;
831 StateMachine state(default_scheduler_settings); 863 StateMachine state(default_scheduler_settings);
832 state.SetVisible(true); 864 state.SetVisible(true);
833 EXPECT_ACTION_UPDATE_STATE( 865 EXPECT_ACTION_UPDATE_STATE(
834 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); 866 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION);
835 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 867 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
836 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); 868 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit();
837 869
838 state.SetActiveTreeNeedsFirstDraw(true); 870 state.SetActiveTreeNeedsFirstDraw(true);
839 state.SetNeedsBeginMainFrame(); 871 state.SetNeedsBeginMainFrame();
840 state.SetNeedsRedraw(true); 872 state.SetNeedsRedraw(true);
841 state.SetCanDraw(false); 873 state.SetCanDraw(false);
842 state.OnBeginImplFrame(); 874 state.IssueNextBeginImplFrame();
843 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_ABORT); 875 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_ABORT);
844 EXPECT_ACTION_UPDATE_STATE( 876 EXPECT_ACTION_UPDATE_STATE(
845 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 877 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
846 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 878 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
847 state.NotifyBeginMainFrameStarted(); 879 state.NotifyBeginMainFrameStarted();
848 state.NotifyReadyToCommit(); 880 state.NotifyReadyToCommit();
849 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 881 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
850 state.NotifyReadyToActivate(); 882 state.NotifyReadyToActivate();
851 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); 883 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
852 state.OnBeginImplFrameDeadline(); 884 state.OnBeginImplFrameDeadline();
853 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_ABORT); 885 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_ABORT);
854 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 886 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
855 } 887 }
856 888
857 TEST(SchedulerStateMachineTest, TestSetNeedsBeginMainFrameIsNotLost) { 889 TEST(SchedulerStateMachineTest, TestSetNeedsBeginMainFrameIsNotLost) {
858 SchedulerSettings scheduler_settings; 890 SchedulerSettings scheduler_settings;
859 StateMachine state(scheduler_settings); 891 StateMachine state(scheduler_settings);
860 SET_UP_STATE(state) 892 SET_UP_STATE(state)
861 state.SetNeedsBeginMainFrame(); 893 state.SetNeedsBeginMainFrame();
862 894
863 EXPECT_TRUE(state.BeginFrameNeeded()); 895 EXPECT_TRUE(state.BeginFrameNeeded());
864 896
865 // Begin the frame. 897 // Begin the frame.
866 state.OnBeginImplFrame(); 898 state.IssueNextBeginImplFrame();
867 EXPECT_ACTION_UPDATE_STATE( 899 EXPECT_ACTION_UPDATE_STATE(
868 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 900 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
869 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); 901 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT);
870 902
871 // Now, while the frame is in progress, set another commit. 903 // Now, while the frame is in progress, set another commit.
872 state.SetNeedsBeginMainFrame(); 904 state.SetNeedsBeginMainFrame();
873 EXPECT_TRUE(state.NeedsCommit()); 905 EXPECT_TRUE(state.NeedsCommit());
874 906
875 // Let the frame finish. 907 // Let the frame finish.
876 state.NotifyBeginMainFrameStarted(); 908 state.NotifyBeginMainFrameStarted();
877 state.NotifyReadyToCommit(); 909 state.NotifyReadyToCommit();
878 EXPECT_MAIN_FRAME_STATE( 910 EXPECT_MAIN_FRAME_STATE(
879 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_READY_TO_COMMIT); 911 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_READY_TO_COMMIT);
880 912
881 // Expect to commit regardless of BeginImplFrame state. 913 // Expect to commit regardless of BeginImplFrame state.
882 EXPECT_IMPL_FRAME_STATE( 914 EXPECT_IMPL_FRAME_STATE(
883 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME); 915 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME);
884 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); 916 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT);
885 917
886 state.OnBeginImplFrameDeadline(); 918 state.OnBeginImplFrameDeadline();
887 EXPECT_IMPL_FRAME_STATE( 919 EXPECT_IMPL_FRAME_STATE(
888 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); 920 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE);
889 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); 921 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT);
890 922
891 state.OnBeginImplFrameIdle(); 923 state.OnBeginImplFrameIdle();
892 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); 924 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE);
893 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); 925 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT);
894 926
895 state.OnBeginImplFrame(); 927 state.IssueNextBeginImplFrame();
896 EXPECT_IMPL_FRAME_STATE( 928 EXPECT_IMPL_FRAME_STATE(
897 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME); 929 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME);
898 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); 930 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT);
899 931
900 // Finish the commit and activate, then make sure we start the next commit 932 // Finish the commit and activate, then make sure we start the next commit
901 // immediately and draw on the next BeginImplFrame. 933 // immediately and draw on the next BeginImplFrame.
902 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 934 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
903 state.NotifyReadyToActivate(); 935 state.NotifyReadyToActivate();
904 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); 936 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
905 EXPECT_ACTION_UPDATE_STATE( 937 EXPECT_ACTION_UPDATE_STATE(
(...skipping 11 matching lines...) Expand all
917 949
918 TEST(SchedulerStateMachineTest, TestFullCycle) { 950 TEST(SchedulerStateMachineTest, TestFullCycle) {
919 SchedulerSettings default_scheduler_settings; 951 SchedulerSettings default_scheduler_settings;
920 StateMachine state(default_scheduler_settings); 952 StateMachine state(default_scheduler_settings);
921 SET_UP_STATE(state) 953 SET_UP_STATE(state)
922 954
923 // Start clean and set commit. 955 // Start clean and set commit.
924 state.SetNeedsBeginMainFrame(); 956 state.SetNeedsBeginMainFrame();
925 957
926 // Begin the frame. 958 // Begin the frame.
927 state.OnBeginImplFrame(); 959 state.IssueNextBeginImplFrame();
928 EXPECT_ACTION_UPDATE_STATE( 960 EXPECT_ACTION_UPDATE_STATE(
929 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 961 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
930 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); 962 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT);
931 EXPECT_FALSE(state.NeedsCommit()); 963 EXPECT_FALSE(state.NeedsCommit());
932 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 964 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
933 965
934 // Tell the scheduler the frame finished. 966 // Tell the scheduler the frame finished.
935 state.NotifyBeginMainFrameStarted(); 967 state.NotifyBeginMainFrameStarted();
936 state.NotifyReadyToCommit(); 968 state.NotifyReadyToCommit();
937 EXPECT_MAIN_FRAME_STATE( 969 EXPECT_MAIN_FRAME_STATE(
(...skipping 25 matching lines...) Expand all
963 995
964 TEST(SchedulerStateMachineTest, CommitWithoutDrawWithPendingTree) { 996 TEST(SchedulerStateMachineTest, CommitWithoutDrawWithPendingTree) {
965 SchedulerSettings default_scheduler_settings; 997 SchedulerSettings default_scheduler_settings;
966 StateMachine state(default_scheduler_settings); 998 StateMachine state(default_scheduler_settings);
967 SET_UP_STATE(state) 999 SET_UP_STATE(state)
968 1000
969 // Start clean and set commit. 1001 // Start clean and set commit.
970 state.SetNeedsBeginMainFrame(); 1002 state.SetNeedsBeginMainFrame();
971 1003
972 // Make a main frame, commit and activate it. But don't draw it. 1004 // Make a main frame, commit and activate it. But don't draw it.
973 state.OnBeginImplFrame(); 1005 state.IssueNextBeginImplFrame();
974 EXPECT_ACTION_UPDATE_STATE( 1006 EXPECT_ACTION_UPDATE_STATE(
975 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1007 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
976 state.NotifyBeginMainFrameStarted(); 1008 state.NotifyBeginMainFrameStarted();
977 state.NotifyReadyToCommit(); 1009 state.NotifyReadyToCommit();
978 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1010 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
979 state.NotifyReadyToActivate(); 1011 state.NotifyReadyToActivate();
980 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); 1012 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
981 1013
982 // Try to make a new main frame before drawing. Since we will commit it to a 1014 // Try to make a new main frame before drawing. Since we will commit it to a
983 // pending tree and not clobber the active tree, we're able to start a new 1015 // pending tree and not clobber the active tree, we're able to start a new
984 // begin frame and commit it. 1016 // begin frame and commit it.
985 state.SetNeedsBeginMainFrame(); 1017 state.SetNeedsBeginMainFrame();
986 state.OnBeginImplFrame(); 1018 state.IssueNextBeginImplFrame();
987 EXPECT_ACTION_UPDATE_STATE( 1019 EXPECT_ACTION_UPDATE_STATE(
988 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1020 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
989 state.NotifyBeginMainFrameStarted(); 1021 state.NotifyBeginMainFrameStarted();
990 state.NotifyReadyToCommit(); 1022 state.NotifyReadyToCommit();
991 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1023 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
992 } 1024 }
993 1025
994 TEST(SchedulerStateMachineTest, DontCommitWithoutDrawWithoutPendingTree) { 1026 TEST(SchedulerStateMachineTest, DontCommitWithoutDrawWithoutPendingTree) {
995 SchedulerSettings scheduler_settings; 1027 SchedulerSettings scheduler_settings;
996 scheduler_settings.commit_to_active_tree = true; 1028 scheduler_settings.commit_to_active_tree = true;
997 scheduler_settings.main_frame_before_activation_enabled = false; 1029 scheduler_settings.main_frame_before_activation_enabled = false;
998 StateMachine state(scheduler_settings); 1030 StateMachine state(scheduler_settings);
999 SET_UP_STATE(state) 1031 SET_UP_STATE(state)
1000 1032
1001 // Start clean and set commit. 1033 // Start clean and set commit.
1002 state.SetNeedsBeginMainFrame(); 1034 state.SetNeedsBeginMainFrame();
1003 1035
1004 // Make a main frame, commit and activate it. But don't draw it. 1036 // Make a main frame, commit and activate it. But don't draw it.
1005 state.OnBeginImplFrame(); 1037 state.IssueNextBeginImplFrame();
1006 EXPECT_ACTION_UPDATE_STATE( 1038 EXPECT_ACTION_UPDATE_STATE(
1007 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1039 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1008 state.NotifyBeginMainFrameStarted(); 1040 state.NotifyBeginMainFrameStarted();
1009 state.NotifyReadyToCommit(); 1041 state.NotifyReadyToCommit();
1010 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1042 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1011 state.NotifyReadyToActivate(); 1043 state.NotifyReadyToActivate();
1012 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); 1044 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
1013 1045
1014 // Try to make a new main frame before drawing, but since we would clobber the 1046 // Try to make a new main frame before drawing, but since we would clobber the
1015 // active tree, we will not do so. 1047 // active tree, we will not do so.
1016 state.SetNeedsBeginMainFrame(); 1048 state.SetNeedsBeginMainFrame();
1017 state.OnBeginImplFrame(); 1049 state.IssueNextBeginImplFrame();
1018 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1050 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1019 } 1051 }
1020 1052
1021 TEST(SchedulerStateMachineTest, AbortedMainFrameDoesNotResetPendingTree) { 1053 TEST(SchedulerStateMachineTest, AbortedMainFrameDoesNotResetPendingTree) {
1022 SchedulerSettings scheduler_settings; 1054 SchedulerSettings scheduler_settings;
1023 scheduler_settings.main_frame_before_activation_enabled = true; 1055 scheduler_settings.main_frame_before_activation_enabled = true;
1024 StateMachine state(scheduler_settings); 1056 StateMachine state(scheduler_settings);
1025 SET_UP_STATE(state); 1057 SET_UP_STATE(state);
1026 1058
1027 // Perform a commit so that we have an active tree. 1059 // Perform a commit so that we have an active tree.
1028 state.SetNeedsBeginMainFrame(); 1060 state.SetNeedsBeginMainFrame();
1029 state.OnBeginImplFrame(); 1061 state.IssueNextBeginImplFrame();
1030 EXPECT_ACTION_UPDATE_STATE( 1062 EXPECT_ACTION_UPDATE_STATE(
1031 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1063 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1032 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1064 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1033 state.NotifyBeginMainFrameStarted(); 1065 state.NotifyBeginMainFrameStarted();
1034 state.NotifyReadyToCommit(); 1066 state.NotifyReadyToCommit();
1035 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1067 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1036 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1068 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1037 EXPECT_TRUE(state.has_pending_tree()); 1069 EXPECT_TRUE(state.has_pending_tree());
1038 state.OnBeginImplFrameDeadline(); 1070 state.OnBeginImplFrameDeadline();
1039 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1071 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1040 1072
1041 // Ask for another commit but abort it. Verify that we didn't reset pending 1073 // Ask for another commit but abort it. Verify that we didn't reset pending
1042 // tree state. 1074 // tree state.
1043 state.SetNeedsBeginMainFrame(); 1075 state.SetNeedsBeginMainFrame();
1044 state.OnBeginImplFrame(); 1076 state.IssueNextBeginImplFrame();
1045 EXPECT_ACTION_UPDATE_STATE( 1077 EXPECT_ACTION_UPDATE_STATE(
1046 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1078 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1047 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1079 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1048 EXPECT_TRUE(state.has_pending_tree()); 1080 EXPECT_TRUE(state.has_pending_tree());
1049 state.NotifyBeginMainFrameStarted(); 1081 state.NotifyBeginMainFrameStarted();
1050 state.BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES); 1082 state.BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES);
1051 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1083 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1052 EXPECT_TRUE(state.has_pending_tree()); 1084 EXPECT_TRUE(state.has_pending_tree());
1053 state.OnBeginImplFrameDeadline(); 1085 state.OnBeginImplFrameDeadline();
1054 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1086 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1055 1087
1056 // Ask for another commit that doesn't abort. 1088 // Ask for another commit that doesn't abort.
1057 state.SetNeedsBeginMainFrame(); 1089 state.SetNeedsBeginMainFrame();
1058 state.OnBeginImplFrame(); 1090 state.IssueNextBeginImplFrame();
1059 EXPECT_ACTION_UPDATE_STATE( 1091 EXPECT_ACTION_UPDATE_STATE(
1060 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1092 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1061 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1093 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1062 state.NotifyBeginMainFrameStarted(); 1094 state.NotifyBeginMainFrameStarted();
1063 state.NotifyReadyToCommit(); 1095 state.NotifyReadyToCommit();
1064 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1096 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1065 EXPECT_TRUE(state.has_pending_tree()); 1097 EXPECT_TRUE(state.has_pending_tree());
1066 1098
1067 // Verify that commit is delayed until the pending tree is activated. 1099 // Verify that commit is delayed until the pending tree is activated.
1068 state.NotifyReadyToActivate(); 1100 state.NotifyReadyToActivate();
1069 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); 1101 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
1070 EXPECT_FALSE(state.has_pending_tree()); 1102 EXPECT_FALSE(state.has_pending_tree());
1071 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1103 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1072 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1104 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1073 EXPECT_TRUE(state.has_pending_tree()); 1105 EXPECT_TRUE(state.has_pending_tree());
1074 } 1106 }
1075 1107
1076 TEST(SchedulerStateMachineTest, TestFullCycleWithCommitToActive) { 1108 TEST(SchedulerStateMachineTest, TestFullCycleWithCommitToActive) {
1077 SchedulerSettings scheduler_settings; 1109 SchedulerSettings scheduler_settings;
1078 scheduler_settings.commit_to_active_tree = true; 1110 scheduler_settings.commit_to_active_tree = true;
1079 scheduler_settings.main_frame_before_activation_enabled = false; 1111 scheduler_settings.main_frame_before_activation_enabled = false;
1080 StateMachine state(scheduler_settings); 1112 StateMachine state(scheduler_settings);
1081 SET_UP_STATE(state) 1113 SET_UP_STATE(state)
1082 1114
1083 // Start clean and set commit. 1115 // Start clean and set commit.
1084 state.SetNeedsBeginMainFrame(); 1116 state.SetNeedsBeginMainFrame();
1085 1117
1086 // Begin the frame. 1118 // Begin the frame.
1087 state.OnBeginImplFrame(); 1119 state.OnBeginImplFrame(0, 10);
1088 EXPECT_ACTION_UPDATE_STATE( 1120 EXPECT_ACTION_UPDATE_STATE(
1089 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1121 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1090 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); 1122 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT);
1091 EXPECT_FALSE(state.NeedsCommit()); 1123 EXPECT_FALSE(state.NeedsCommit());
1092 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1124 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1125 EXPECT_SEQUENCE_NUMBERS(10u, 10u, BeginFrameArgs::kInvalidFrameNumber,
1126 BeginFrameArgs::kInvalidFrameNumber,
1127 BeginFrameArgs::kInvalidFrameNumber);
1093 1128
1094 // Tell the scheduler the frame finished. 1129 // Tell the scheduler the frame finished.
1095 state.NotifyBeginMainFrameStarted(); 1130 state.NotifyBeginMainFrameStarted();
1096 state.NotifyReadyToCommit(); 1131 state.NotifyReadyToCommit();
1097 EXPECT_MAIN_FRAME_STATE( 1132 EXPECT_MAIN_FRAME_STATE(
1098 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_READY_TO_COMMIT); 1133 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_READY_TO_COMMIT);
1099 // Commit. 1134 // Commit.
1100 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1135 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1136 EXPECT_SEQUENCE_NUMBERS(10u, 10u, 10u, BeginFrameArgs::kInvalidFrameNumber,
1137 BeginFrameArgs::kInvalidFrameNumber);
1101 // Commit always calls NotifyReadyToActivate in this mode. 1138 // Commit always calls NotifyReadyToActivate in this mode.
1102 state.NotifyReadyToActivate(); 1139 state.NotifyReadyToActivate();
1103 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); 1140 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
1104 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1141 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1142 EXPECT_SEQUENCE_NUMBERS(10u, 10u, 10u, 10u,
1143 BeginFrameArgs::kInvalidFrameNumber);
1105 1144
1106 // No draw because we haven't received NotifyReadyToDraw yet. 1145 // No draw because we haven't received NotifyReadyToDraw yet.
1107 state.OnBeginImplFrameDeadline(); 1146 state.OnBeginImplFrameDeadline();
1108 EXPECT_TRUE(state.active_tree_needs_first_draw()); 1147 EXPECT_TRUE(state.active_tree_needs_first_draw());
1109 EXPECT_TRUE(state.needs_redraw()); 1148 EXPECT_TRUE(state.needs_redraw());
1110 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1149 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1150 EXPECT_SEQUENCE_NUMBERS(10u, 10u, 10u, 10u,
1151 BeginFrameArgs::kInvalidFrameNumber);
1111 1152
1112 // Can't BeginMainFrame yet since last commit hasn't been drawn yet. 1153 // Can't BeginMainFrame yet since last commit hasn't been drawn yet.
1113 state.SetNeedsBeginMainFrame(); 1154 state.SetNeedsBeginMainFrame();
1114 state.OnBeginImplFrame(); 1155 state.OnBeginImplFrame(0, 11);
1115 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1156 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1157 EXPECT_SEQUENCE_NUMBERS(11u, 10u, 10u, 10u,
1158 BeginFrameArgs::kInvalidFrameNumber);
1116 1159
1117 // Now call ready to draw which will allow the draw to happen and 1160 // Now call ready to draw which will allow the draw to happen and
1118 // BeginMainFrame to be sent. 1161 // BeginMainFrame to be sent.
1119 state.NotifyReadyToDraw(); 1162 state.NotifyReadyToDraw();
1120 state.OnBeginImplFrameDeadline(); 1163 state.OnBeginImplFrameDeadline();
1121 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 1164 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
1165 EXPECT_SEQUENCE_NUMBERS(11u, 10u, 10u, 10u, 10u);
1122 // Submit throttled from this point. 1166 // Submit throttled from this point.
1123 state.DidSubmitCompositorFrame(); 1167 state.DidSubmitCompositorFrame();
1124 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1168 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1125 1169
1126 // Can't BeginMainFrame yet since we're submit-frame throttled. 1170 // Can't BeginMainFrame yet since we're submit-frame throttled.
1127 state.OnBeginImplFrame(); 1171 state.OnBeginImplFrame(0, 12);
1128 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1172 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1173 EXPECT_SEQUENCE_NUMBERS(12u, 10u, 10u, 10u, 10u);
1129 1174
1130 // CompositorFrameAck unblocks BeginMainFrame. 1175 // CompositorFrameAck unblocks BeginMainFrame.
1131 state.DidReceiveCompositorFrameAck(); 1176 state.DidReceiveCompositorFrameAck();
1132 EXPECT_ACTION_UPDATE_STATE( 1177 EXPECT_ACTION_UPDATE_STATE(
1133 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1178 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1179 EXPECT_SEQUENCE_NUMBERS(12u, 12u, 10u, 10u, 10u);
1134 state.NotifyBeginMainFrameStarted(); 1180 state.NotifyBeginMainFrameStarted();
1135 state.NotifyReadyToCommit(); 1181 state.NotifyReadyToCommit();
1136 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1182 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1183 EXPECT_SEQUENCE_NUMBERS(12u, 12u, 12u, 10u, 10u);
1137 state.NotifyReadyToActivate(); 1184 state.NotifyReadyToActivate();
1138 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); 1185 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
1139 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1186 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1187 EXPECT_SEQUENCE_NUMBERS(12u, 12u, 12u, 12u, 10u);
1140 1188
1141 // Draw the newly activated tree. 1189 // Draw the newly activated tree.
1142 state.NotifyReadyToDraw(); 1190 state.NotifyReadyToDraw();
1143 state.OnBeginImplFrameDeadline(); 1191 state.OnBeginImplFrameDeadline();
1144 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 1192 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
1145 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1193 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1194 EXPECT_SEQUENCE_NUMBERS(12u, 12u, 12u, 12u, 12u);
1146 } 1195 }
1147 1196
1148 TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) { 1197 TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) {
1149 SchedulerSettings default_scheduler_settings; 1198 SchedulerSettings default_scheduler_settings;
1150 StateMachine state(default_scheduler_settings); 1199 StateMachine state(default_scheduler_settings);
1151 SET_UP_STATE(state) 1200 SET_UP_STATE(state)
1152 1201
1153 // Start clean and set commit. 1202 // Start clean and set commit.
1154 state.SetNeedsBeginMainFrame(); 1203 state.SetNeedsBeginMainFrame();
1155 1204
1156 // Begin the frame. 1205 // Begin the frame.
1157 state.OnBeginImplFrame(); 1206 state.IssueNextBeginImplFrame();
1158 EXPECT_ACTION_UPDATE_STATE( 1207 EXPECT_ACTION_UPDATE_STATE(
1159 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1208 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1160 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); 1209 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT);
1161 EXPECT_FALSE(state.NeedsCommit()); 1210 EXPECT_FALSE(state.NeedsCommit());
1162 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1211 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1163 1212
1164 // Request another commit while the commit is in flight. 1213 // Request another commit while the commit is in flight.
1165 state.SetNeedsBeginMainFrame(); 1214 state.SetNeedsBeginMainFrame();
1166 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1215 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1167 1216
(...skipping 18 matching lines...) Expand all
1186 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 1235 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
1187 state.DidSubmitCompositorFrame(); 1236 state.DidSubmitCompositorFrame();
1188 state.DidReceiveCompositorFrameAck(); 1237 state.DidReceiveCompositorFrameAck();
1189 1238
1190 // Should be synchronized, no draw needed, no action needed. 1239 // Should be synchronized, no draw needed, no action needed.
1191 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1240 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1192 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); 1241 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE);
1193 EXPECT_FALSE(state.needs_redraw()); 1242 EXPECT_FALSE(state.needs_redraw());
1194 1243
1195 // Next BeginImplFrame should initiate second commit. 1244 // Next BeginImplFrame should initiate second commit.
1196 state.OnBeginImplFrame(); 1245 state.IssueNextBeginImplFrame();
1197 EXPECT_ACTION_UPDATE_STATE( 1246 EXPECT_ACTION_UPDATE_STATE(
1198 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1247 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1199 } 1248 }
1200 1249
1201 TEST(SchedulerStateMachineTest, TestNoRequestCommitWhenInvisible) { 1250 TEST(SchedulerStateMachineTest, TestNoRequestCommitWhenInvisible) {
1202 SchedulerSettings default_scheduler_settings; 1251 SchedulerSettings default_scheduler_settings;
1203 StateMachine state(default_scheduler_settings); 1252 StateMachine state(default_scheduler_settings);
1204 state.SetVisible(true); 1253 state.SetVisible(true);
1205 EXPECT_ACTION_UPDATE_STATE( 1254 EXPECT_ACTION_UPDATE_STATE(
1206 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); 1255 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1249 // "EarlyOut_CompositorFrameSinkLost" cases. 1298 // "EarlyOut_CompositorFrameSinkLost" cases.
1250 TEST(SchedulerStateMachineTest, TestAbortBeginMainFrameBecauseInvisible) { 1299 TEST(SchedulerStateMachineTest, TestAbortBeginMainFrameBecauseInvisible) {
1251 SchedulerSettings default_scheduler_settings; 1300 SchedulerSettings default_scheduler_settings;
1252 StateMachine state(default_scheduler_settings); 1301 StateMachine state(default_scheduler_settings);
1253 SET_UP_STATE(state) 1302 SET_UP_STATE(state)
1254 1303
1255 // Start clean and set commit. 1304 // Start clean and set commit.
1256 state.SetNeedsBeginMainFrame(); 1305 state.SetNeedsBeginMainFrame();
1257 1306
1258 // Begin the frame while visible. 1307 // Begin the frame while visible.
1259 state.OnBeginImplFrame(); 1308 state.IssueNextBeginImplFrame();
1260 EXPECT_ACTION_UPDATE_STATE( 1309 EXPECT_ACTION_UPDATE_STATE(
1261 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1310 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1262 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); 1311 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT);
1263 EXPECT_FALSE(state.NeedsCommit()); 1312 EXPECT_FALSE(state.NeedsCommit());
1264 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1313 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1265 1314
1266 // Become invisible and abort BeginMainFrame. 1315 // Become invisible and abort BeginMainFrame.
1267 state.SetVisible(false); 1316 state.SetVisible(false);
1268 state.NotifyBeginMainFrameStarted(); 1317 state.NotifyBeginMainFrameStarted();
1269 state.BeginMainFrameAborted(CommitEarlyOutReason::ABORTED_NOT_VISIBLE); 1318 state.BeginMainFrameAborted(CommitEarlyOutReason::ABORTED_NOT_VISIBLE);
(...skipping 13 matching lines...) Expand all
1283 // Become visible again. 1332 // Become visible again.
1284 state.SetVisible(true); 1333 state.SetVisible(true);
1285 1334
1286 // Although we have aborted on this frame and haven't cancelled the commit 1335 // Although we have aborted on this frame and haven't cancelled the commit
1287 // (i.e. need another), don't send another BeginMainFrame yet. 1336 // (i.e. need another), don't send another BeginMainFrame yet.
1288 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); 1337 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE);
1289 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); 1338 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
1290 EXPECT_TRUE(state.NeedsCommit()); 1339 EXPECT_TRUE(state.NeedsCommit());
1291 1340
1292 // Start a new frame. 1341 // Start a new frame.
1293 state.OnBeginImplFrame(); 1342 state.IssueNextBeginImplFrame();
1294 EXPECT_ACTION_UPDATE_STATE( 1343 EXPECT_ACTION_UPDATE_STATE(
1295 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1344 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1296 1345
1297 // We should be starting the commit now. 1346 // We should be starting the commit now.
1298 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); 1347 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT);
1299 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1348 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1300 } 1349 }
1301 1350
1302 // See ProxyMain::BeginMainFrame "EarlyOut_NoUpdates" case. 1351 // See ProxyMain::BeginMainFrame "EarlyOut_NoUpdates" case.
1303 TEST(SchedulerStateMachineTest, TestAbortBeginMainFrameBecauseCommitNotNeeded) { 1352 TEST(SchedulerStateMachineTest, TestAbortBeginMainFrameBecauseCommitNotNeeded) {
1304 SchedulerSettings default_scheduler_settings; 1353 SchedulerSettings default_scheduler_settings;
1305 StateMachine state(default_scheduler_settings); 1354 StateMachine state(default_scheduler_settings);
1306 state.SetVisible(true); 1355 state.SetVisible(true);
1307 EXPECT_ACTION_UPDATE_STATE( 1356 EXPECT_ACTION_UPDATE_STATE(
1308 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); 1357 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION);
1309 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1358 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1310 state.DidCreateAndInitializeCompositorFrameSink(); 1359 state.DidCreateAndInitializeCompositorFrameSink();
1311 state.SetCanDraw(true); 1360 state.SetCanDraw(true);
1312 1361
1313 // Get into a begin frame / commit state. 1362 // Get into a begin frame / commit state.
1314 state.SetNeedsBeginMainFrame(); 1363 state.SetNeedsBeginMainFrame();
1315 state.OnBeginImplFrame(); 1364 state.IssueNextBeginImplFrame();
1316 EXPECT_ACTION_UPDATE_STATE( 1365 EXPECT_ACTION_UPDATE_STATE(
1317 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1366 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1318 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); 1367 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT);
1319 EXPECT_FALSE(state.NeedsCommit()); 1368 EXPECT_FALSE(state.NeedsCommit());
1320 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); 1369 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
1321 1370
1322 // Abort the commit, true means that the BeginMainFrame was sent but there 1371 // Abort the commit, true means that the BeginMainFrame was sent but there
1323 // was no work to do on the main thread. 1372 // was no work to do on the main thread.
1324 state.NotifyBeginMainFrameStarted(); 1373 state.NotifyBeginMainFrameStarted();
1325 state.BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES); 1374 state.BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES);
1326 1375
1327 // NeedsCommit should now be false because the commit was actually handled. 1376 // NeedsCommit should now be false because the commit was actually handled.
1328 EXPECT_FALSE(state.NeedsCommit()); 1377 EXPECT_FALSE(state.NeedsCommit());
1329 1378
1330 // Since the commit was aborted, we don't need to try and draw. 1379 // Since the commit was aborted, we don't need to try and draw.
1331 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1380 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1332 state.OnBeginImplFrameDeadline(); 1381 state.OnBeginImplFrameDeadline();
1333 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1382 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1334 1383
1335 // Verify another commit doesn't start on another frame either. 1384 // Verify another commit doesn't start on another frame either.
1336 EXPECT_FALSE(state.NeedsCommit()); 1385 EXPECT_FALSE(state.NeedsCommit());
1337 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); 1386 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE);
1338 1387
1339 state.OnBeginImplFrame(); 1388 state.IssueNextBeginImplFrame();
1340 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1389 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1341 state.OnBeginImplFrameDeadline(); 1390 state.OnBeginImplFrameDeadline();
1342 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1391 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1343 1392
1344 // Verify another commit can start if requested, though. 1393 // Verify another commit can start if requested, though.
1345 state.SetNeedsBeginMainFrame(); 1394 state.SetNeedsBeginMainFrame();
1346 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); 1395 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE);
1347 state.OnBeginImplFrame(); 1396 state.IssueNextBeginImplFrame();
1348 EXPECT_ACTION(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1397 EXPECT_ACTION(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1349 } 1398 }
1350 1399
1351 TEST(SchedulerStateMachineTest, TestFirstContextCreation) { 1400 TEST(SchedulerStateMachineTest, TestFirstContextCreation) {
1352 SchedulerSettings default_scheduler_settings; 1401 SchedulerSettings default_scheduler_settings;
1353 StateMachine state(default_scheduler_settings); 1402 StateMachine state(default_scheduler_settings);
1354 state.SetVisible(true); 1403 state.SetVisible(true);
1355 state.SetCanDraw(true); 1404 state.SetCanDraw(true);
1356 1405
1357 EXPECT_ACTION_UPDATE_STATE( 1406 EXPECT_ACTION_UPDATE_STATE(
1358 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); 1407 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION);
1359 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); 1408 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit();
1360 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1409 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1361 1410
1362 // Check that the first init does not SetNeedsBeginMainFrame. 1411 // Check that the first init does not SetNeedsBeginMainFrame.
1363 state.OnBeginImplFrame(); 1412 state.IssueNextBeginImplFrame();
1364 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1413 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1365 state.OnBeginImplFrameDeadline(); 1414 state.OnBeginImplFrameDeadline();
1366 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1415 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1367 1416
1368 // Check that a needs commit initiates a BeginMainFrame. 1417 // Check that a needs commit initiates a BeginMainFrame.
1369 state.SetNeedsBeginMainFrame(); 1418 state.SetNeedsBeginMainFrame();
1370 state.OnBeginImplFrame(); 1419 state.IssueNextBeginImplFrame();
1371 EXPECT_ACTION_UPDATE_STATE( 1420 EXPECT_ACTION_UPDATE_STATE(
1372 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1421 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1373 } 1422 }
1374 1423
1375 TEST(SchedulerStateMachineTest, TestContextLostWhenCompletelyIdle) { 1424 TEST(SchedulerStateMachineTest, TestContextLostWhenCompletelyIdle) {
1376 SchedulerSettings default_scheduler_settings; 1425 SchedulerSettings default_scheduler_settings;
1377 StateMachine state(default_scheduler_settings); 1426 StateMachine state(default_scheduler_settings);
1378 SET_UP_STATE(state) 1427 SET_UP_STATE(state)
1379 1428
1380 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION, 1429 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION,
1381 state.NextAction()); 1430 state.NextAction());
1382 state.DidLoseCompositorFrameSink(); 1431 state.DidLoseCompositorFrameSink();
1383 1432
1384 EXPECT_ACTION_UPDATE_STATE( 1433 EXPECT_ACTION_UPDATE_STATE(
1385 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); 1434 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION);
1386 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1435 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1387 1436
1388 // Once context recreation begins, nothing should happen. 1437 // Once context recreation begins, nothing should happen.
1389 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1438 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1390 1439
1391 // Recreate the context. 1440 // Recreate the context.
1392 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); 1441 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit();
1393 1442
1394 // When the context is recreated, we should begin a commit. 1443 // When the context is recreated, we should begin a commit.
1395 state.OnBeginImplFrame(); 1444 state.IssueNextBeginImplFrame();
1396 EXPECT_ACTION_UPDATE_STATE( 1445 EXPECT_ACTION_UPDATE_STATE(
1397 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1446 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1398 } 1447 }
1399 1448
1400 TEST(SchedulerStateMachineTest, 1449 TEST(SchedulerStateMachineTest,
1401 TestContextLostWhenIdleAndCommitRequestedWhileRecreating) { 1450 TestContextLostWhenIdleAndCommitRequestedWhileRecreating) {
1402 SchedulerSettings default_scheduler_settings; 1451 SchedulerSettings default_scheduler_settings;
1403 StateMachine state(default_scheduler_settings); 1452 StateMachine state(default_scheduler_settings);
1404 SET_UP_STATE(state) 1453 SET_UP_STATE(state)
1405 1454
1406 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION, 1455 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION,
1407 state.NextAction()); 1456 state.NextAction());
1408 state.DidLoseCompositorFrameSink(); 1457 state.DidLoseCompositorFrameSink();
1409 EXPECT_EQ(state.compositor_frame_sink_state(), 1458 EXPECT_EQ(state.compositor_frame_sink_state(),
1410 SchedulerStateMachine::COMPOSITOR_FRAME_SINK_NONE); 1459 SchedulerStateMachine::COMPOSITOR_FRAME_SINK_NONE);
1411 1460
1412 EXPECT_ACTION_UPDATE_STATE( 1461 EXPECT_ACTION_UPDATE_STATE(
1413 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); 1462 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION);
1414 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1463 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1415 1464
1416 // Once context recreation begins, nothing should happen. 1465 // Once context recreation begins, nothing should happen.
1417 state.OnBeginImplFrame(); 1466 state.IssueNextBeginImplFrame();
1418 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1467 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1419 state.OnBeginImplFrameDeadline(); 1468 state.OnBeginImplFrameDeadline();
1420 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1469 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1421 1470
1422 // While context is recreating, commits shouldn't begin. 1471 // While context is recreating, commits shouldn't begin.
1423 state.SetNeedsBeginMainFrame(); 1472 state.SetNeedsBeginMainFrame();
1424 state.OnBeginImplFrame(); 1473 state.IssueNextBeginImplFrame();
1425 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1474 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1426 state.OnBeginImplFrameDeadline(); 1475 state.OnBeginImplFrameDeadline();
1427 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1476 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1428 1477
1429 // Recreate the context 1478 // Recreate the context
1430 state.DidCreateAndInitializeCompositorFrameSink(); 1479 state.DidCreateAndInitializeCompositorFrameSink();
1431 EXPECT_EQ( 1480 EXPECT_EQ(
1432 state.compositor_frame_sink_state(), 1481 state.compositor_frame_sink_state(),
1433 SchedulerStateMachine::COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_COMMIT); 1482 SchedulerStateMachine::COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_COMMIT);
1434 EXPECT_FALSE(state.RedrawPending()); 1483 EXPECT_FALSE(state.RedrawPending());
1435 1484
1436 // When the context is recreated, we wait until the next BeginImplFrame 1485 // When the context is recreated, we wait until the next BeginImplFrame
1437 // before starting. 1486 // before starting.
1438 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1487 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1439 1488
1440 // When the BeginFrame comes in we should begin a commit 1489 // When the BeginFrame comes in we should begin a commit
1441 state.OnBeginImplFrame(); 1490 state.IssueNextBeginImplFrame();
1442 EXPECT_ACTION_UPDATE_STATE( 1491 EXPECT_ACTION_UPDATE_STATE(
1443 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1492 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1444 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1493 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1445 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); 1494 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT);
1446 1495
1447 // Until that commit finishes, we shouldn't be drawing. 1496 // Until that commit finishes, we shouldn't be drawing.
1448 state.OnBeginImplFrameDeadline(); 1497 state.OnBeginImplFrameDeadline();
1449 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1498 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1450 1499
1451 // Finish the commit, which should make the surface active. 1500 // Finish the commit, which should make the surface active.
1452 state.NotifyBeginMainFrameStarted(); 1501 state.NotifyBeginMainFrameStarted();
1453 state.NotifyReadyToCommit(); 1502 state.NotifyReadyToCommit();
1454 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1503 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1455 EXPECT_EQ(state.compositor_frame_sink_state(), 1504 EXPECT_EQ(state.compositor_frame_sink_state(),
1456 SchedulerStateMachine:: 1505 SchedulerStateMachine::
1457 COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_ACTIVATION); 1506 COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_ACTIVATION);
1458 state.NotifyReadyToActivate(); 1507 state.NotifyReadyToActivate();
1459 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); 1508 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
1460 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1509 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1461 EXPECT_EQ(state.compositor_frame_sink_state(), 1510 EXPECT_EQ(state.compositor_frame_sink_state(),
1462 SchedulerStateMachine::COMPOSITOR_FRAME_SINK_ACTIVE); 1511 SchedulerStateMachine::COMPOSITOR_FRAME_SINK_ACTIVE);
1463 1512
1464 // Finishing the first commit after initializing an CompositorFrameSink should 1513 // Finishing the first commit after initializing an CompositorFrameSink should
1465 // automatically cause a redraw. 1514 // automatically cause a redraw.
1466 EXPECT_TRUE(state.RedrawPending()); 1515 EXPECT_TRUE(state.RedrawPending());
1467 state.OnBeginImplFrame(); 1516 state.IssueNextBeginImplFrame();
1468 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1517 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1469 state.OnBeginImplFrameDeadline(); 1518 state.OnBeginImplFrameDeadline();
1470 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 1519 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
1471 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1520 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1472 EXPECT_FALSE(state.RedrawPending()); 1521 EXPECT_FALSE(state.RedrawPending());
1473 1522
1474 // Next frame as no work to do. 1523 // Next frame as no work to do.
1475 state.OnBeginImplFrame(); 1524 state.IssueNextBeginImplFrame();
1476 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1525 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1477 state.OnBeginImplFrameDeadline(); 1526 state.OnBeginImplFrameDeadline();
1478 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1527 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1479 1528
1480 // Once the context is recreated, whether we draw should be based on 1529 // Once the context is recreated, whether we draw should be based on
1481 // SetCanDraw if waiting on first draw after activate. 1530 // SetCanDraw if waiting on first draw after activate.
1482 state.SetNeedsRedraw(true); 1531 state.SetNeedsRedraw(true);
1483 state.OnBeginImplFrame(); 1532 state.IssueNextBeginImplFrame();
1484 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1533 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1485 state.OnBeginImplFrameDeadline(); 1534 state.OnBeginImplFrameDeadline();
1486 EXPECT_ACTION(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 1535 EXPECT_ACTION(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
1487 state.SetCanDraw(false); 1536 state.SetCanDraw(false);
1488 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); 1537 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
1489 state.SetCanDraw(true); 1538 state.SetCanDraw(true);
1490 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 1539 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
1491 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1540 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1492 1541
1493 // Once the context is recreated, whether we draw should be based on 1542 // Once the context is recreated, whether we draw should be based on
1494 // SetCanDraw if waiting on first draw after activate. 1543 // SetCanDraw if waiting on first draw after activate.
1495 state.SetNeedsRedraw(true); 1544 state.SetNeedsRedraw(true);
1496 state.SetNeedsBeginMainFrame(); 1545 state.SetNeedsBeginMainFrame();
1497 state.OnBeginImplFrame(); 1546 state.IssueNextBeginImplFrame();
1498 EXPECT_ACTION_UPDATE_STATE( 1547 EXPECT_ACTION_UPDATE_STATE(
1499 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1548 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1500 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1549 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1501 // Activate so we need the first draw 1550 // Activate so we need the first draw
1502 state.NotifyBeginMainFrameStarted(); 1551 state.NotifyBeginMainFrameStarted();
1503 state.NotifyReadyToCommit(); 1552 state.NotifyReadyToCommit();
1504 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1553 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1505 state.NotifyReadyToActivate(); 1554 state.NotifyReadyToActivate();
1506 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); 1555 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
1507 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1556 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
(...skipping 11 matching lines...) Expand all
1519 TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) { 1568 TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) {
1520 SchedulerSettings scheduler_settings; 1569 SchedulerSettings scheduler_settings;
1521 StateMachine state(scheduler_settings); 1570 StateMachine state(scheduler_settings);
1522 SET_UP_STATE(state) 1571 SET_UP_STATE(state)
1523 1572
1524 // Get a commit in flight. 1573 // Get a commit in flight.
1525 state.SetNeedsBeginMainFrame(); 1574 state.SetNeedsBeginMainFrame();
1526 1575
1527 // Set damage and expect a draw. 1576 // Set damage and expect a draw.
1528 state.SetNeedsRedraw(true); 1577 state.SetNeedsRedraw(true);
1529 state.OnBeginImplFrame(); 1578 state.OnBeginImplFrame(0, 10);
1530 EXPECT_ACTION_UPDATE_STATE( 1579 EXPECT_ACTION_UPDATE_STATE(
1531 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1580 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1532 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1581 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1533 state.OnBeginImplFrameDeadline(); 1582 state.OnBeginImplFrameDeadline();
1534 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 1583 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
1535 state.DidSubmitCompositorFrame(); 1584 state.DidSubmitCompositorFrame();
1536 state.DidReceiveCompositorFrameAck(); 1585 state.DidReceiveCompositorFrameAck();
1537 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1586 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1587 EXPECT_SEQUENCE_NUMBERS(10u, 10u, BeginFrameArgs::kInvalidFrameNumber,
1588 BeginFrameArgs::kInvalidFrameNumber,
1589 BeginFrameArgs::kInvalidFrameNumber);
1538 1590
1539 // Cause a lost context while the BeginMainFrame is in flight. 1591 // Cause a lost context while the BeginMainFrame is in flight.
1540 state.DidLoseCompositorFrameSink(); 1592 state.DidLoseCompositorFrameSink();
1593 EXPECT_FALSE(state.BeginFrameNeeded());
1541 1594
1542 // Ask for another draw. Expect nothing happens. 1595 // Ask for another draw. Expect nothing happens.
1543 state.SetNeedsRedraw(true); 1596 state.SetNeedsRedraw(true);
1544 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); 1597 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
1545 1598
1546 // Finish the frame, commit and activate. 1599 // Finish the frame, commit and activate.
1547 state.NotifyBeginMainFrameStarted(); 1600 state.NotifyBeginMainFrameStarted();
1548 state.NotifyReadyToCommit(); 1601 state.NotifyReadyToCommit();
1549 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1602 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1603 EXPECT_SEQUENCE_NUMBERS(10u, 10u, 10u, BeginFrameArgs::kInvalidFrameNumber,
1604 BeginFrameArgs::kInvalidFrameNumber);
1550 state.NotifyReadyToActivate(); 1605 state.NotifyReadyToActivate();
1551 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); 1606 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
1607 EXPECT_SEQUENCE_NUMBERS(10u, 10u, 10u, 10u,
1608 BeginFrameArgs::kInvalidFrameNumber);
1552 1609
1553 // We will abort the draw when the CompositorFrameSink is lost if we are 1610 // We will abort the draw when the CompositorFrameSink is lost if we are
1554 // waiting for the first draw to unblock the main thread. 1611 // waiting for the first draw to unblock the main thread.
1555 EXPECT_TRUE(state.active_tree_needs_first_draw()); 1612 EXPECT_TRUE(state.active_tree_needs_first_draw());
1556 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_ABORT); 1613 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_ABORT);
1614 EXPECT_SEQUENCE_NUMBERS(10u, 10u, 10u, 10u,
1615 BeginFrameArgs::kInvalidFrameNumber);
1557 1616
1558 // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE 1617 // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE
1559 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); 1618 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE);
1560 EXPECT_ACTION( 1619 EXPECT_ACTION(
1561 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); 1620 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION);
1562 1621
1563 state.OnBeginImplFrame(); 1622 state.OnBeginImplFrame(0, 11);
1564 EXPECT_IMPL_FRAME_STATE( 1623 EXPECT_IMPL_FRAME_STATE(
1565 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME); 1624 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME);
1566 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); 1625 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
1626 EXPECT_SEQUENCE_NUMBERS(11u, 10u, 10u, 10u,
1627 BeginFrameArgs::kInvalidFrameNumber);
1567 1628
1568 state.OnBeginImplFrameDeadline(); 1629 state.OnBeginImplFrameDeadline();
1569 EXPECT_IMPL_FRAME_STATE( 1630 EXPECT_IMPL_FRAME_STATE(
1570 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); 1631 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE);
1571 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); 1632 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
1633 EXPECT_SEQUENCE_NUMBERS(11u, 10u, 10u, 11u, 11u);
1572 } 1634 }
1573 1635
1574 TEST(SchedulerStateMachineTest, 1636 TEST(SchedulerStateMachineTest,
1575 TestContextLostWhileCommitInProgressAndAnotherCommitRequested) { 1637 TestContextLostWhileCommitInProgressAndAnotherCommitRequested) {
1576 SchedulerSettings scheduler_settings; 1638 SchedulerSettings scheduler_settings;
1577 StateMachine state(scheduler_settings); 1639 StateMachine state(scheduler_settings);
1578 SET_UP_STATE(state) 1640 SET_UP_STATE(state)
1579 1641
1580 // Get a commit in flight. 1642 // Get a commit in flight.
1581 state.SetNeedsBeginMainFrame(); 1643 state.SetNeedsBeginMainFrame();
1582 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1644 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1583 1645
1584 // Set damage and expect a draw. 1646 // Set damage and expect a draw.
1585 state.SetNeedsRedraw(true); 1647 state.SetNeedsRedraw(true);
1586 state.OnBeginImplFrame(); 1648 state.IssueNextBeginImplFrame();
1587 EXPECT_ACTION_UPDATE_STATE( 1649 EXPECT_ACTION_UPDATE_STATE(
1588 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1650 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1589 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1651 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1590 state.OnBeginImplFrameDeadline(); 1652 state.OnBeginImplFrameDeadline();
1591 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 1653 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
1592 state.DidSubmitCompositorFrame(); 1654 state.DidSubmitCompositorFrame();
1593 state.DidReceiveCompositorFrameAck(); 1655 state.DidReceiveCompositorFrameAck();
1594 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1656 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1595 1657
1596 // Cause a lost context while the BeginMainFrame is in flight. 1658 // Cause a lost context while the BeginMainFrame is in flight.
(...skipping 13 matching lines...) Expand all
1610 EXPECT_TRUE(state.active_tree_needs_first_draw()); 1672 EXPECT_TRUE(state.active_tree_needs_first_draw());
1611 1673
1612 // Because the CompositorFrameSink is missing, we expect the draw to abort. 1674 // Because the CompositorFrameSink is missing, we expect the draw to abort.
1613 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_ABORT); 1675 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_ABORT);
1614 1676
1615 // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE 1677 // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE
1616 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); 1678 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE);
1617 EXPECT_ACTION( 1679 EXPECT_ACTION(
1618 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); 1680 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION);
1619 1681
1620 state.OnBeginImplFrame(); 1682 state.IssueNextBeginImplFrame();
1621 EXPECT_IMPL_FRAME_STATE( 1683 EXPECT_IMPL_FRAME_STATE(
1622 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME); 1684 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME);
1623 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); 1685 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
1624 1686
1625 state.OnBeginImplFrameDeadline(); 1687 state.OnBeginImplFrameDeadline();
1626 EXPECT_IMPL_FRAME_STATE( 1688 EXPECT_IMPL_FRAME_STATE(
1627 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); 1689 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE);
1628 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); 1690 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
1629 1691
1630 state.OnBeginImplFrameIdle(); 1692 state.OnBeginImplFrameIdle();
1631 EXPECT_ACTION_UPDATE_STATE( 1693 EXPECT_ACTION_UPDATE_STATE(
1632 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); 1694 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION);
1633 1695
1634 // After we get a new CompositorFrameSink, the commit flow should start. 1696 // After we get a new CompositorFrameSink, the commit flow should start.
1635 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); 1697 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit();
1636 state.OnBeginImplFrame(); 1698 state.IssueNextBeginImplFrame();
1637 EXPECT_ACTION_UPDATE_STATE( 1699 EXPECT_ACTION_UPDATE_STATE(
1638 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1700 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1639 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1701 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1640 state.NotifyBeginMainFrameStarted(); 1702 state.NotifyBeginMainFrameStarted();
1641 state.NotifyReadyToCommit(); 1703 state.NotifyReadyToCommit();
1642 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1704 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1643 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1705 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1644 state.NotifyReadyToActivate(); 1706 state.NotifyReadyToActivate();
1645 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); 1707 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
1646 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1708 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
(...skipping 13 matching lines...) Expand all
1660 state.SetNeedsRedraw(true); 1722 state.SetNeedsRedraw(true);
1661 1723
1662 // Cause a lost CompositorFrameSink, and restore it. 1724 // Cause a lost CompositorFrameSink, and restore it.
1663 state.DidLoseCompositorFrameSink(); 1725 state.DidLoseCompositorFrameSink();
1664 EXPECT_ACTION_UPDATE_STATE( 1726 EXPECT_ACTION_UPDATE_STATE(
1665 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); 1727 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION);
1666 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1728 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1667 state.DidCreateAndInitializeCompositorFrameSink(); 1729 state.DidCreateAndInitializeCompositorFrameSink();
1668 1730
1669 EXPECT_FALSE(state.RedrawPending()); 1731 EXPECT_FALSE(state.RedrawPending());
1670 state.OnBeginImplFrame(); 1732 state.IssueNextBeginImplFrame();
1671 EXPECT_ACTION(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1733 EXPECT_ACTION(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1672 } 1734 }
1673 1735
1674 TEST(SchedulerStateMachineTest, 1736 TEST(SchedulerStateMachineTest,
1675 TestPendingActivationsShouldBeForcedAfterLostCompositorFrameSink) { 1737 TestPendingActivationsShouldBeForcedAfterLostCompositorFrameSink) {
1676 SchedulerSettings default_scheduler_settings; 1738 SchedulerSettings default_scheduler_settings;
1677 StateMachine state(default_scheduler_settings); 1739 StateMachine state(default_scheduler_settings);
1678 SET_UP_STATE(state) 1740 SET_UP_STATE(state)
1679 1741
1680 state.SetBeginMainFrameState( 1742 state.SetBeginMainFrameState(
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1723 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1785 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1724 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); 1786 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit();
1725 state.SetVisible(false); 1787 state.SetVisible(false);
1726 state.SetNeedsBeginMainFrame(); 1788 state.SetNeedsBeginMainFrame();
1727 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); 1789 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
1728 EXPECT_FALSE(state.BeginFrameNeeded()); 1790 EXPECT_FALSE(state.BeginFrameNeeded());
1729 1791
1730 // When become visible again, the needs commit should still be pending. 1792 // When become visible again, the needs commit should still be pending.
1731 state.SetVisible(true); 1793 state.SetVisible(true);
1732 EXPECT_TRUE(state.BeginFrameNeeded()); 1794 EXPECT_TRUE(state.BeginFrameNeeded());
1733 state.OnBeginImplFrame(); 1795 state.IssueNextBeginImplFrame();
1734 EXPECT_ACTION_UPDATE_STATE( 1796 EXPECT_ACTION_UPDATE_STATE(
1735 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1797 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1736 } 1798 }
1737 1799
1738 TEST(SchedulerStateMachineTest, TestFinishCommitWhenCommitInProgress) { 1800 TEST(SchedulerStateMachineTest, TestFinishCommitWhenCommitInProgress) {
1739 SchedulerSettings default_scheduler_settings; 1801 SchedulerSettings default_scheduler_settings;
1740 StateMachine state(default_scheduler_settings); 1802 StateMachine state(default_scheduler_settings);
1741 state.SetVisible(true); 1803 state.SetVisible(true);
1742 EXPECT_ACTION_UPDATE_STATE( 1804 EXPECT_ACTION_UPDATE_STATE(
1743 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); 1805 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION);
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
1887 } 1949 }
1888 1950
1889 TEST(SchedulerStateMachineTest, 1951 TEST(SchedulerStateMachineTest,
1890 TestTriggerDeadlineImmediatelyAfterAbortedCommit) { 1952 TestTriggerDeadlineImmediatelyAfterAbortedCommit) {
1891 SchedulerSettings default_scheduler_settings; 1953 SchedulerSettings default_scheduler_settings;
1892 StateMachine state(default_scheduler_settings); 1954 StateMachine state(default_scheduler_settings);
1893 SET_UP_STATE(state) 1955 SET_UP_STATE(state)
1894 1956
1895 // This test mirrors what happens during the first frame of a scroll gesture. 1957 // This test mirrors what happens during the first frame of a scroll gesture.
1896 // First we get the input event and a BeginFrame. 1958 // First we get the input event and a BeginFrame.
1897 state.OnBeginImplFrame(); 1959 state.IssueNextBeginImplFrame();
1898 1960
1899 // As a response the compositor requests a redraw and a commit to tell the 1961 // As a response the compositor requests a redraw and a commit to tell the
1900 // main thread about the new scroll offset. 1962 // main thread about the new scroll offset.
1901 state.SetNeedsRedraw(true); 1963 state.SetNeedsRedraw(true);
1902 state.SetNeedsBeginMainFrame(); 1964 state.SetNeedsBeginMainFrame();
1903 1965
1904 // We should start the commit normally. 1966 // We should start the commit normally.
1905 EXPECT_ACTION_UPDATE_STATE( 1967 EXPECT_ACTION_UPDATE_STATE(
1906 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1968 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1907 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1969 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
(...skipping 14 matching lines...) Expand all
1922 StateMachine& state = *state_ptr; 1984 StateMachine& state = *state_ptr;
1923 1985
1924 state.NotifyBeginMainFrameStarted(); 1986 state.NotifyBeginMainFrameStarted();
1925 state.NotifyReadyToCommit(); 1987 state.NotifyReadyToCommit();
1926 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1988 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1927 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1989 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1928 state.NotifyReadyToActivate(); 1990 state.NotifyReadyToActivate();
1929 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); 1991 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
1930 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1992 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1931 1993
1932 state.OnBeginImplFrame(); 1994 state.IssueNextBeginImplFrame();
1933 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1995 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1934 1996
1935 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); 1997 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately());
1936 state.OnBeginImplFrameDeadline(); 1998 state.OnBeginImplFrameDeadline();
1937 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 1999 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
1938 state.DidSubmitCompositorFrame(); 2000 state.DidSubmitCompositorFrame();
1939 } 2001 }
1940 2002
1941 TEST(SchedulerStateMachineTest, TestImplLatencyTakesPriority) { 2003 TEST(SchedulerStateMachineTest, TestImplLatencyTakesPriority) {
1942 SchedulerSettings default_scheduler_settings; 2004 SchedulerSettings default_scheduler_settings;
1943 StateMachine state(default_scheduler_settings); 2005 StateMachine state(default_scheduler_settings);
1944 SET_UP_STATE(state) 2006 SET_UP_STATE(state)
1945 2007
1946 // This test ensures that impl-draws are prioritized over main thread updates 2008 // This test ensures that impl-draws are prioritized over main thread updates
1947 // in prefer impl latency mode. 2009 // in prefer impl latency mode.
1948 state.SetNeedsRedraw(true); 2010 state.SetNeedsRedraw(true);
1949 state.SetNeedsBeginMainFrame(); 2011 state.SetNeedsBeginMainFrame();
1950 state.OnBeginImplFrame(); 2012 state.IssueNextBeginImplFrame();
1951 EXPECT_ACTION_UPDATE_STATE( 2013 EXPECT_ACTION_UPDATE_STATE(
1952 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 2014 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1953 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 2015 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1954 2016
1955 // Verify the deadline is not triggered early until we enter 2017 // Verify the deadline is not triggered early until we enter
1956 // prefer impl latency mode. 2018 // prefer impl latency mode.
1957 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); 2019 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately());
1958 state.SetTreePrioritiesAndScrollState( 2020 state.SetTreePrioritiesAndScrollState(
1959 SMOOTHNESS_TAKES_PRIORITY, 2021 SMOOTHNESS_TAKES_PRIORITY,
1960 ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER); 2022 ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER);
(...skipping 16 matching lines...) Expand all
1977 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 2039 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1978 2040
1979 // Finish the previous commit and draw it. 2041 // Finish the previous commit and draw it.
1980 FinishPreviousCommitAndDrawWithoutExitingDeadline(&state); 2042 FinishPreviousCommitAndDrawWithoutExitingDeadline(&state);
1981 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 2043 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1982 2044
1983 // Verify we do not send another BeginMainFrame if was are submit-frame 2045 // Verify we do not send another BeginMainFrame if was are submit-frame
1984 // throttled and did not just submit one. 2046 // throttled and did not just submit one.
1985 state.SetNeedsBeginMainFrame(); 2047 state.SetNeedsBeginMainFrame();
1986 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 2048 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1987 state.OnBeginImplFrame(); 2049 state.IssueNextBeginImplFrame();
1988 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 2050 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1989 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); 2051 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately());
1990 state.OnBeginImplFrameDeadline(); 2052 state.OnBeginImplFrameDeadline();
1991 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 2053 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1992 } 2054 }
1993 2055
1994 TEST(SchedulerStateMachineTest, 2056 TEST(SchedulerStateMachineTest,
1995 TestTriggerDeadlineImmediatelyOnLostCompositorFrameSink) { 2057 TestTriggerDeadlineImmediatelyOnLostCompositorFrameSink) {
1996 SchedulerSettings default_scheduler_settings; 2058 SchedulerSettings default_scheduler_settings;
1997 StateMachine state(default_scheduler_settings); 2059 StateMachine state(default_scheduler_settings);
1998 SET_UP_STATE(state) 2060 SET_UP_STATE(state)
1999 2061
2000 state.SetNeedsBeginMainFrame(); 2062 state.SetNeedsBeginMainFrame();
2001 2063
2002 state.OnBeginImplFrame(); 2064 state.IssueNextBeginImplFrame();
2003 EXPECT_ACTION_UPDATE_STATE( 2065 EXPECT_ACTION_UPDATE_STATE(
2004 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 2066 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
2005 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 2067 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2006 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); 2068 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately());
2007 2069
2008 state.DidLoseCompositorFrameSink(); 2070 state.DidLoseCompositorFrameSink();
2009 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 2071 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2010 // The deadline should be triggered immediately when CompositorFrameSink is 2072 // The deadline should be triggered immediately when CompositorFrameSink is
2011 // lost. 2073 // lost.
2012 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); 2074 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately());
2013 } 2075 }
2014 2076
2015 TEST(SchedulerStateMachineTest, TestTriggerDeadlineImmediatelyWhenInvisible) { 2077 TEST(SchedulerStateMachineTest, TestTriggerDeadlineImmediatelyWhenInvisible) {
2016 SchedulerSettings default_scheduler_settings; 2078 SchedulerSettings default_scheduler_settings;
2017 StateMachine state(default_scheduler_settings); 2079 StateMachine state(default_scheduler_settings);
2018 SET_UP_STATE(state) 2080 SET_UP_STATE(state)
2019 2081
2020 state.SetNeedsBeginMainFrame(); 2082 state.SetNeedsBeginMainFrame();
2021 2083
2022 state.OnBeginImplFrame(); 2084 state.IssueNextBeginImplFrame();
2023 EXPECT_ACTION_UPDATE_STATE( 2085 EXPECT_ACTION_UPDATE_STATE(
2024 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 2086 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
2025 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 2087 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2026 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); 2088 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately());
2027 2089
2028 state.SetVisible(false); 2090 state.SetVisible(false);
2029 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 2091 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2030 EXPECT_TRUE(state.PendingActivationsShouldBeForced()); 2092 EXPECT_TRUE(state.PendingActivationsShouldBeForced());
2031 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); 2093 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately());
2032 } 2094 }
2033 2095
2034 TEST(SchedulerStateMachineTest, 2096 TEST(SchedulerStateMachineTest,
2035 TestTriggerDeadlineImmediatelyWhenBeginFrameSourcePaused) { 2097 TestTriggerDeadlineImmediatelyWhenBeginFrameSourcePaused) {
2036 SchedulerSettings default_scheduler_settings; 2098 SchedulerSettings default_scheduler_settings;
2037 StateMachine state(default_scheduler_settings); 2099 StateMachine state(default_scheduler_settings);
2038 SET_UP_STATE(state) 2100 SET_UP_STATE(state)
2039 2101
2040 state.SetNeedsBeginMainFrame(); 2102 state.SetNeedsBeginMainFrame();
2041 2103
2042 state.OnBeginImplFrame(); 2104 state.IssueNextBeginImplFrame();
2043 EXPECT_ACTION_UPDATE_STATE( 2105 EXPECT_ACTION_UPDATE_STATE(
2044 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 2106 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
2045 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 2107 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2046 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); 2108 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately());
2047 2109
2048 state.SetBeginFrameSourcePaused(true); 2110 state.SetBeginFrameSourcePaused(true);
2049 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 2111 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2050 EXPECT_TRUE(state.PendingActivationsShouldBeForced()); 2112 EXPECT_TRUE(state.PendingActivationsShouldBeForced());
2051 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); 2113 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately());
2052 } 2114 }
2053 2115
2054 TEST(SchedulerStateMachineTest, TestDeferCommit) { 2116 TEST(SchedulerStateMachineTest, TestDeferCommit) {
2055 SchedulerSettings settings; 2117 SchedulerSettings settings;
2056 StateMachine state(settings); 2118 StateMachine state(settings);
2057 SET_UP_STATE(state) 2119 SET_UP_STATE(state)
2058 2120
2059 state.SetDeferCommits(true); 2121 state.SetDeferCommits(true);
2060 2122
2061 state.SetNeedsBeginMainFrame(); 2123 state.SetNeedsBeginMainFrame();
2062 EXPECT_FALSE(state.BeginFrameNeeded()); 2124 EXPECT_FALSE(state.BeginFrameNeeded());
2063 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 2125 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2064 2126
2065 state.OnBeginImplFrame(); 2127 state.IssueNextBeginImplFrame();
2066 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 2128 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2067 2129
2068 state.OnBeginImplFrameDeadline(); 2130 state.OnBeginImplFrameDeadline();
2069 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 2131 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2070 2132
2071 state.SetDeferCommits(false); 2133 state.SetDeferCommits(false);
2072 state.OnBeginImplFrame(); 2134 state.IssueNextBeginImplFrame();
2073 EXPECT_ACTION_UPDATE_STATE( 2135 EXPECT_ACTION_UPDATE_STATE(
2074 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 2136 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
2075 } 2137 }
2076 2138
2077 TEST(SchedulerStateMachineTest, EarlyOutCommitWantsProactiveBeginFrame) { 2139 TEST(SchedulerStateMachineTest, EarlyOutCommitWantsProactiveBeginFrame) {
2078 SchedulerSettings settings; 2140 SchedulerSettings settings;
2079 StateMachine state(settings); 2141 StateMachine state(settings);
2080 SET_UP_STATE(state); 2142 SET_UP_STATE(state);
2081 2143
2082 EXPECT_FALSE(state.ProactiveBeginFrameWanted()); 2144 EXPECT_FALSE(state.ProactiveBeginFrameWanted());
2083 bool commit_has_no_updates = true; 2145 bool commit_has_no_updates = true;
2084 state.WillCommit(commit_has_no_updates); 2146 state.WillCommit(commit_has_no_updates);
2085 EXPECT_TRUE(state.ProactiveBeginFrameWanted()); 2147 EXPECT_TRUE(state.ProactiveBeginFrameWanted());
2086 state.OnBeginImplFrame(); 2148 state.IssueNextBeginImplFrame();
2087 EXPECT_FALSE(state.ProactiveBeginFrameWanted()); 2149 EXPECT_FALSE(state.ProactiveBeginFrameWanted());
2088 } 2150 }
2089 2151
2090 TEST(SchedulerStateMachineTest, 2152 TEST(SchedulerStateMachineTest,
2091 NoCompositorFrameSinkCreationWhileCommitPending) { 2153 NoCompositorFrameSinkCreationWhileCommitPending) {
2092 SchedulerSettings settings; 2154 SchedulerSettings settings;
2093 StateMachine state(settings); 2155 StateMachine state(settings);
2094 SET_UP_STATE(state); 2156 SET_UP_STATE(state);
2095 2157
2096 // Set up the request for a commit and start a frame. 2158 // Set up the request for a commit and start a frame.
2097 state.SetNeedsBeginMainFrame(); 2159 state.SetNeedsBeginMainFrame();
2098 state.OnBeginImplFrame(); 2160 state.IssueNextBeginImplFrame();
2099 PerformAction(&state, SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 2161 PerformAction(&state, SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
2100 2162
2101 // Lose the CompositorFrameSink. 2163 // Lose the CompositorFrameSink.
2102 state.DidLoseCompositorFrameSink(); 2164 state.DidLoseCompositorFrameSink();
2103 2165
2104 // The scheduler shouldn't trigger the CompositorFrameSink creation till the 2166 // The scheduler shouldn't trigger the CompositorFrameSink creation till the
2105 // previous commit has been cleared. 2167 // previous commit has been cleared.
2106 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 2168 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2107 2169
2108 // Trigger the deadline and ensure that the scheduler does not trigger any 2170 // Trigger the deadline and ensure that the scheduler does not trigger any
2109 // actions until we receive a response for the pending commit. 2171 // actions until we receive a response for the pending commit.
2110 state.OnBeginImplFrameDeadline(); 2172 state.OnBeginImplFrameDeadline();
2111 state.OnBeginImplFrameIdle(); 2173 state.OnBeginImplFrameIdle();
2112 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 2174 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2113 2175
2114 // Abort the commit, since that is what we expect the main thread to do if the 2176 // Abort the commit, since that is what we expect the main thread to do if the
2115 // CompositorFrameSink was lost due to a synchronous call from the main thread 2177 // CompositorFrameSink was lost due to a synchronous call from the main thread
2116 // to release the CompositorFrameSink. 2178 // to release the CompositorFrameSink.
2117 state.NotifyBeginMainFrameStarted(); 2179 state.NotifyBeginMainFrameStarted();
2118 state.BeginMainFrameAborted( 2180 state.BeginMainFrameAborted(
2119 CommitEarlyOutReason::ABORTED_COMPOSITOR_FRAME_SINK_LOST); 2181 CommitEarlyOutReason::ABORTED_COMPOSITOR_FRAME_SINK_LOST);
2120 2182
2121 // The scheduler should begin the CompositorFrameSink creation now. 2183 // The scheduler should begin the CompositorFrameSink creation now.
2122 EXPECT_ACTION_UPDATE_STATE( 2184 EXPECT_ACTION_UPDATE_STATE(
2123 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); 2185 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION);
2124 } 2186 }
2125 2187
2188 TEST(SchedulerStateMachineTest, TestBeginFrameFreshnessInitialState) {
2189 SchedulerSettings default_scheduler_settings;
2190 StateMachine state(default_scheduler_settings);
2191 SET_UP_STATE(state)
2192
2193 // Initially, we report a invalid frame numbers.
2194 EXPECT_SEQUENCE_NUMBERS(
2195 BeginFrameArgs::kInvalidFrameNumber, BeginFrameArgs::kInvalidFrameNumber,
2196 BeginFrameArgs::kInvalidFrameNumber, BeginFrameArgs::kInvalidFrameNumber,
2197 BeginFrameArgs::kInvalidFrameNumber);
2198 }
2199
2200 TEST(SchedulerStateMachineTest, TestBeginFrameFreshnessWithoutUpdates) {
2201 // Setup without any requested updates.
2202 SchedulerSettings default_scheduler_settings;
2203 StateMachine state(default_scheduler_settings);
2204 SET_UP_STATE(state)
2205 state.SetNeedsRedraw(false);
2206 EXPECT_FALSE(state.RedrawPending());
2207 EXPECT_FALSE(state.NeedsCommit());
2208
2209 // OnBeginImplFrame() updates the sequence number.
2210 state.OnBeginImplFrame(0, 10);
2211 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2212 EXPECT_SEQUENCE_NUMBERS(10u, BeginFrameArgs::kInvalidFrameNumber,
2213 BeginFrameArgs::kInvalidFrameNumber,
2214 BeginFrameArgs::kInvalidFrameNumber,
2215 BeginFrameArgs::kInvalidFrameNumber);
2216
2217 // When no updates are required, OnBeginImplFrameDeadline() updates active
2218 // tree and compositor frame freshness.
2219 state.OnBeginImplFrameDeadline();
2220 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2221 EXPECT_SEQUENCE_NUMBERS(10u, BeginFrameArgs::kInvalidFrameNumber,
2222 BeginFrameArgs::kInvalidFrameNumber, 10u, 10u);
2223 state.OnBeginImplFrameIdle();
2224 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2225 }
2226
2227 TEST(SchedulerStateMachineTest, TestBeginFrameFreshnessWithImplFrameUpdates) {
2228 // Setup with an impl-thread draw requested.
2229 SchedulerSettings default_scheduler_settings;
2230 StateMachine state(default_scheduler_settings);
2231 SET_UP_STATE(state)
2232 state.SetNeedsRedraw(true);
2233 EXPECT_TRUE(state.RedrawPending());
2234 EXPECT_FALSE(state.NeedsCommit());
2235
2236 // OnBeginImplFrame() updates the sequence number.
2237 state.OnBeginImplFrame(0, 10);
2238 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2239 EXPECT_SEQUENCE_NUMBERS(10u, BeginFrameArgs::kInvalidFrameNumber,
2240 BeginFrameArgs::kInvalidFrameNumber,
2241 BeginFrameArgs::kInvalidFrameNumber,
2242 BeginFrameArgs::kInvalidFrameNumber);
2243
2244 // With only an impl-thread draw requested, OnBeginImplFrameDeadline()
2245 // updates the active tree freshness.
2246 state.OnBeginImplFrameDeadline();
2247 EXPECT_SEQUENCE_NUMBERS(10u, BeginFrameArgs::kInvalidFrameNumber,
2248 BeginFrameArgs::kInvalidFrameNumber, 10u,
2249 BeginFrameArgs::kInvalidFrameNumber);
2250
2251 // Compositor frame freshness is updated when active tree is drawn.
2252 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
2253 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2254 EXPECT_FALSE(state.RedrawPending());
2255 state.DidSubmitCompositorFrame();
2256 state.DidReceiveCompositorFrameAck();
2257 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2258 EXPECT_SEQUENCE_NUMBERS(10u, BeginFrameArgs::kInvalidFrameNumber,
2259 BeginFrameArgs::kInvalidFrameNumber, 10u, 10u);
2260 state.OnBeginImplFrameIdle();
2261 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2262 }
2263
2264 TEST(SchedulerStateMachineTest, TestBeginFrameFreshnessWithMainFrameUpdates) {
2265 // Setup with a BeginMainFrame requested.
2266 SchedulerSettings default_scheduler_settings;
2267 StateMachine state(default_scheduler_settings);
2268 SET_UP_STATE(state)
2269 state.SetNeedsRedraw(false);
2270 state.SetNeedsBeginMainFrameForTest(true);
2271 EXPECT_FALSE(state.RedrawPending());
2272 EXPECT_TRUE(state.NeedsCommit());
2273
2274 // OnBeginImplFrame() updates the sequence number, WillSendBeginMainFrame()
2275 // updates begin_main_frame_sent sequence number.
2276 state.OnBeginImplFrame(0, 10);
2277 EXPECT_ACTION_UPDATE_STATE(
2278 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
2279 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2280 EXPECT_FALSE(state.NeedsCommit());
2281 EXPECT_TRUE(state.CommitPending());
2282 EXPECT_SEQUENCE_NUMBERS(10u, 10u, BeginFrameArgs::kInvalidFrameNumber,
2283 BeginFrameArgs::kInvalidFrameNumber,
2284 BeginFrameArgs::kInvalidFrameNumber);
2285
2286 // When a BeginMainFrame is needed, OnBeginImplFrameDeadline() updates no
2287 // freshness numbers.
2288 state.OnBeginImplFrameDeadline();
2289 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2290 EXPECT_SEQUENCE_NUMBERS(10u, 10u, BeginFrameArgs::kInvalidFrameNumber,
2291 BeginFrameArgs::kInvalidFrameNumber,
2292 BeginFrameArgs::kInvalidFrameNumber);
2293 state.OnBeginImplFrameIdle();
2294 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2295
2296 // When a main frame is in progress, OnBeginImplFrameDeadline() updates no
2297 // freshness numbers.
2298 state.NotifyBeginMainFrameStarted();
2299 state.OnBeginImplFrame(0, 11);
2300 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2301 state.OnBeginImplFrameDeadline();
2302 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2303 EXPECT_SEQUENCE_NUMBERS(11u, 10u, BeginFrameArgs::kInvalidFrameNumber,
2304 BeginFrameArgs::kInvalidFrameNumber,
2305 BeginFrameArgs::kInvalidFrameNumber);
2306 state.OnBeginImplFrameIdle();
2307 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2308
2309 // Pending tree freshness is updated when the new pending tree is committed.
2310 state.NotifyReadyToCommit();
2311 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
2312 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2313 EXPECT_FALSE(state.CommitPending());
2314 EXPECT_TRUE(state.has_pending_tree());
2315 EXPECT_SEQUENCE_NUMBERS(11u, 10u, 10u, BeginFrameArgs::kInvalidFrameNumber,
2316 BeginFrameArgs::kInvalidFrameNumber);
2317
2318 // If no further BeginMainFrame is needed, OnBeginFrameImplDeadline()
2319 // updates the pending tree's frame number.
2320 state.OnBeginImplFrame(0, 12);
2321 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2322 EXPECT_SEQUENCE_NUMBERS(12u, 10u, 10u, BeginFrameArgs::kInvalidFrameNumber,
2323 BeginFrameArgs::kInvalidFrameNumber);
2324 state.OnBeginImplFrameDeadline();
2325 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2326 EXPECT_SEQUENCE_NUMBERS(12u, 10u, 12u, BeginFrameArgs::kInvalidFrameNumber,
2327 BeginFrameArgs::kInvalidFrameNumber);
2328 state.OnBeginImplFrameIdle();
2329 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2330
2331 // If a further BeginMainFrame is needed, OnBeginFrameImplDeadline()
2332 // updates no freshness numbers.
2333 state.SetNeedsBeginMainFrameForTest(true);
2334 EXPECT_TRUE(state.NeedsCommit());
2335 state.OnBeginImplFrame(0, 13);
2336 // BMF will be sent only after pending_tree activation.
2337 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2338 state.OnBeginImplFrameDeadline();
2339 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2340 EXPECT_SEQUENCE_NUMBERS(13u, 10u, 12u, BeginFrameArgs::kInvalidFrameNumber,
2341 BeginFrameArgs::kInvalidFrameNumber);
2342 state.OnBeginImplFrameIdle();
2343 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2344
2345 // Active tree freshness is updated when pending frame is activated.
2346 state.NotifyReadyToActivate();
2347 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
2348 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2349 EXPECT_FALSE(state.has_pending_tree());
2350 EXPECT_SEQUENCE_NUMBERS(13u, 10u, 12u, 12u,
2351 BeginFrameArgs::kInvalidFrameNumber);
2352 EXPECT_TRUE(state.RedrawPending());
2353
2354 // BMF requested above will be sent after activation.
2355 state.OnBeginImplFrame(0, 14);
2356 EXPECT_ACTION_UPDATE_STATE(
2357 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
2358 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2359
2360 // Active tree freshness is updated when commit didn't have updates, but
2361 // compositor frame freshness is not updated.
2362 state.NotifyBeginMainFrameStarted();
2363 state.BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES);
2364 EXPECT_SEQUENCE_NUMBERS(14u, 14u, 12u, 14u,
2365 BeginFrameArgs::kInvalidFrameNumber);
2366
2367 // Compositor frame freshness is updated when active tree is drawn.
2368 state.OnBeginImplFrameDeadline();
2369 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
2370 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2371 EXPECT_FALSE(state.RedrawPending());
2372 state.DidSubmitCompositorFrame();
2373 state.DidReceiveCompositorFrameAck();
2374 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2375 EXPECT_SEQUENCE_NUMBERS(14u, 14u, 12u, 14u, 14u);
2376 state.OnBeginImplFrameIdle();
2377 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2378
2379 // When no updates are required, OnBeginImplFrameDeadline() updates active
2380 // tree and compositor frame freshness.
2381 state.OnBeginImplFrame(0, 15);
2382 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2383 state.OnBeginImplFrameDeadline();
2384 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2385 EXPECT_SEQUENCE_NUMBERS(15u, 14u, 12u, 15u, 15u);
2386 state.OnBeginImplFrameIdle();
2387 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2388
2389 // Active tree and compositor frame freshness are updated when commit doesn't
2390 // have updates and compositor frame was fresh before.
2391 state.SetNeedsBeginMainFrameForTest(true);
2392 EXPECT_TRUE(state.NeedsCommit());
2393 state.OnBeginImplFrame(0, 16);
2394 EXPECT_ACTION_UPDATE_STATE(
2395 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
2396 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2397 EXPECT_FALSE(state.NeedsCommit());
2398 EXPECT_TRUE(state.CommitPending());
2399 state.NotifyBeginMainFrameStarted();
2400 state.BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES);
2401 EXPECT_SEQUENCE_NUMBERS(16u, 16u, 12u, 16u, 16u);
2402 state.OnBeginImplFrameDeadline();
2403 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2404 EXPECT_SEQUENCE_NUMBERS(16u, 16u, 12u, 16u, 16u);
2405 state.OnBeginImplFrameIdle();
2406 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2407
2408 // When the source changes, the current frame number is updated and frame
2409 // numbers for freshness are reset to invalid numbers.
2410 state.OnBeginImplFrame(1, 5);
2411 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2412 EXPECT_SEQUENCE_NUMBERS(5u, BeginFrameArgs::kInvalidFrameNumber,
2413 BeginFrameArgs::kInvalidFrameNumber,
2414 BeginFrameArgs::kInvalidFrameNumber,
2415 BeginFrameArgs::kInvalidFrameNumber);
2416
2417 // When no updates are required, OnBeginImplFrameDeadline() updates active
2418 // tree and compositor frame freshness.
2419 state.OnBeginImplFrameDeadline();
2420 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2421 EXPECT_SEQUENCE_NUMBERS(5u, BeginFrameArgs::kInvalidFrameNumber,
2422 BeginFrameArgs::kInvalidFrameNumber, 5u, 5u);
2423 state.OnBeginImplFrameIdle();
2424 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2425 }
2426
2427 TEST(SchedulerStateMachineTest,
2428 TestBeginFrameFreshnessWithNoUpdatesCommitAndPendingTree) {
2429 // Setup with main_frame_before_activation_enabled, a pending tree, and a
2430 // new BeginMainFrame requested.
2431 SchedulerSettings settings;
2432 settings.main_frame_before_activation_enabled = true;
2433 StateMachine state(settings);
2434 SET_UP_STATE(state)
2435 state.SetHasPendingTree(true);
2436 state.SetNeedsRedraw(false);
2437 state.SetNeedsBeginMainFrameForTest(true);
2438 EXPECT_FALSE(state.RedrawPending());
2439 EXPECT_TRUE(state.NeedsCommit());
2440
2441 // OnBeginImplFrame() updates the sequence number, WillSendBeginMainFrame()
2442 // updates begin_main_frame_sent sequence number.
2443 state.OnBeginImplFrame(0, 10);
2444 EXPECT_ACTION_UPDATE_STATE(
2445 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
2446 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2447 EXPECT_FALSE(state.NeedsCommit());
2448 EXPECT_TRUE(state.CommitPending());
2449 EXPECT_SEQUENCE_NUMBERS(10u, 10u, BeginFrameArgs::kInvalidFrameNumber,
2450 BeginFrameArgs::kInvalidFrameNumber,
2451 BeginFrameArgs::kInvalidFrameNumber);
2452
2453 // Pending tree freshness is updated when commit didn't have updates, but an
2454 // older pending tree is still pending.
2455 state.NotifyBeginMainFrameStarted();
2456 state.BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES);
2457 EXPECT_SEQUENCE_NUMBERS(10u, 10u, 10u, BeginFrameArgs::kInvalidFrameNumber,
2458 BeginFrameArgs::kInvalidFrameNumber);
2459
2460 // As no further BeginMainFrame is needed, OnBeginFrameImplDeadline()
2461 // updates the pending tree's frame number, but without any visible change.
2462 state.OnBeginImplFrameDeadline();
2463 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2464 EXPECT_SEQUENCE_NUMBERS(10u, 10u, 10u, BeginFrameArgs::kInvalidFrameNumber,
2465 BeginFrameArgs::kInvalidFrameNumber);
2466 state.OnBeginImplFrameIdle();
2467 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
2468 }
2469
2126 } // namespace 2470 } // namespace
2127 } // namespace cc 2471 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698