OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/scheduler/scheduler_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/scheduler/scheduler.h" | 10 #include "cc/scheduler/scheduler.h" |
(...skipping 27 matching lines...) Expand all Loading... |
38 #define EXPECT_ACTION_UPDATE_STATE(action) \ | 38 #define EXPECT_ACTION_UPDATE_STATE(action) \ |
39 EXPECT_ACTION(action); \ | 39 EXPECT_ACTION(action); \ |
40 if (action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE || \ | 40 if (action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE || \ |
41 action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED) { \ | 41 action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED) { \ |
42 EXPECT_IMPL_FRAME_STATE( \ | 42 EXPECT_IMPL_FRAME_STATE( \ |
43 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); \ | 43 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); \ |
44 } \ | 44 } \ |
45 PerformAction(&state, action); \ | 45 PerformAction(&state, action); \ |
46 if (action == SchedulerStateMachine::ACTION_NONE) { \ | 46 if (action == SchedulerStateMachine::ACTION_NONE) { \ |
47 if (state.begin_impl_frame_state() == \ | 47 if (state.begin_impl_frame_state() == \ |
48 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING) \ | |
49 state.OnBeginImplFrameDeadlinePending(); \ | |
50 if (state.begin_impl_frame_state() == \ | |
51 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) \ | 48 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) \ |
52 state.OnBeginImplFrameIdle(); \ | 49 state.OnBeginImplFrameIdle(); \ |
53 } | 50 } |
54 | 51 |
55 #define SET_UP_STATE(state) \ | 52 #define SET_UP_STATE(state) \ |
56 state.SetVisible(true); \ | 53 state.SetVisible(true); \ |
57 EXPECT_ACTION_UPDATE_STATE( \ | 54 EXPECT_ACTION_UPDATE_STATE( \ |
58 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); \ | 55 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); \ |
59 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); \ | 56 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); \ |
60 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); \ | 57 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); \ |
61 state.SetCanDraw(true); | 58 state.SetCanDraw(true); |
62 | 59 |
63 namespace cc { | 60 namespace cc { |
64 | 61 |
65 namespace { | 62 namespace { |
66 | 63 |
67 const SchedulerStateMachine::BeginImplFrameState all_begin_impl_frame_states[] = | 64 const SchedulerStateMachine::BeginImplFrameState all_begin_impl_frame_states[] = |
68 {SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE, | 65 {SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE, |
69 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING, | |
70 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME, | 66 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME, |
71 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE, }; | 67 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE, }; |
72 | 68 |
73 const SchedulerStateMachine::BeginMainFrameState begin_main_frame_states[] = { | 69 const SchedulerStateMachine::BeginMainFrameState begin_main_frame_states[] = { |
74 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE, | 70 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE, |
75 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT, | 71 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT, |
76 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_STARTED, | 72 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_STARTED, |
77 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_READY_TO_COMMIT, | 73 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_READY_TO_COMMIT, |
78 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_WAITING_FOR_ACTIVATION, | 74 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_WAITING_FOR_ACTIVATION, |
79 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_WAITING_FOR_DRAW}; | 75 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_WAITING_FOR_DRAW}; |
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
419 SchedulerSettings default_scheduler_settings; | 415 SchedulerSettings default_scheduler_settings; |
420 StateMachine state(default_scheduler_settings); | 416 StateMachine state(default_scheduler_settings); |
421 SET_UP_STATE(state) | 417 SET_UP_STATE(state) |
422 state.SetNeedsRedraw(true); | 418 state.SetNeedsRedraw(true); |
423 EXPECT_TRUE(state.RedrawPending()); | 419 EXPECT_TRUE(state.RedrawPending()); |
424 EXPECT_TRUE(state.BeginFrameNeeded()); | 420 EXPECT_TRUE(state.BeginFrameNeeded()); |
425 | 421 |
426 // Start a frame. | 422 // Start a frame. |
427 state.OnBeginImplFrame(); | 423 state.OnBeginImplFrame(); |
428 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 424 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
429 state.OnBeginImplFrameDeadlinePending(); | |
430 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | |
431 EXPECT_FALSE(state.CommitPending()); | 425 EXPECT_FALSE(state.CommitPending()); |
432 | 426 |
433 // Failing a draw triggers request for a new BeginMainFrame. | 427 // Failing a draw triggers request for a new BeginMainFrame. |
434 state.OnBeginImplFrameDeadline(); | 428 state.OnBeginImplFrameDeadline(); |
435 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); | 429 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); |
436 EXPECT_ACTION_UPDATE_STATE( | 430 EXPECT_ACTION_UPDATE_STATE( |
437 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 431 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
438 EXPECT_ACTION_UPDATE_STATE( | 432 EXPECT_ACTION_UPDATE_STATE( |
439 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 433 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
440 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 434 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
441 state.OnBeginImplFrameIdle(); | 435 state.OnBeginImplFrameIdle(); |
442 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 436 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
443 | 437 |
444 // It's okay to attempt more draws just in case additional raster | 438 // It's okay to attempt more draws just in case additional raster |
445 // finishes and the requested commit wasn't actually necessary. | 439 // finishes and the requested commit wasn't actually necessary. |
446 EXPECT_TRUE(state.CommitPending()); | 440 EXPECT_TRUE(state.CommitPending()); |
447 EXPECT_TRUE(state.RedrawPending()); | 441 EXPECT_TRUE(state.RedrawPending()); |
448 state.OnBeginImplFrame(); | 442 state.OnBeginImplFrame(); |
449 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 443 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
450 state.OnBeginImplFrameDeadlinePending(); | |
451 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | |
452 state.OnBeginImplFrameDeadline(); | 444 state.OnBeginImplFrameDeadline(); |
453 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); | 445 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); |
454 EXPECT_ACTION_UPDATE_STATE( | 446 EXPECT_ACTION_UPDATE_STATE( |
455 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 447 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
456 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 448 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
457 state.OnBeginImplFrameIdle(); | 449 state.OnBeginImplFrameIdle(); |
458 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 450 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
459 } | 451 } |
460 | 452 |
461 TEST(SchedulerStateMachineTest, FailedDrawForMissingHighResNeedsCommit) { | 453 TEST(SchedulerStateMachineTest, FailedDrawForMissingHighResNeedsCommit) { |
462 SchedulerSettings default_scheduler_settings; | 454 SchedulerSettings default_scheduler_settings; |
463 StateMachine state(default_scheduler_settings); | 455 StateMachine state(default_scheduler_settings); |
464 SET_UP_STATE(state) | 456 SET_UP_STATE(state) |
465 state.SetNeedsRedraw(true); | 457 state.SetNeedsRedraw(true); |
466 EXPECT_TRUE(state.RedrawPending()); | 458 EXPECT_TRUE(state.RedrawPending()); |
467 EXPECT_TRUE(state.BeginFrameNeeded()); | 459 EXPECT_TRUE(state.BeginFrameNeeded()); |
468 | 460 |
469 // Start a frame. | 461 // Start a frame. |
470 state.OnBeginImplFrame(); | 462 state.OnBeginImplFrame(); |
471 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 463 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
472 state.OnBeginImplFrameDeadlinePending(); | |
473 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | |
474 EXPECT_FALSE(state.CommitPending()); | 464 EXPECT_FALSE(state.CommitPending()); |
475 | 465 |
476 // Failing a draw triggers because of high res tiles missing | 466 // Failing a draw triggers because of high res tiles missing |
477 // request for a new BeginMainFrame. | 467 // request for a new BeginMainFrame. |
478 state.OnBeginImplFrameDeadline(); | 468 state.OnBeginImplFrameDeadline(); |
479 state.SetDrawResultForTest(DRAW_ABORTED_MISSING_HIGH_RES_CONTENT); | 469 state.SetDrawResultForTest(DRAW_ABORTED_MISSING_HIGH_RES_CONTENT); |
480 EXPECT_ACTION_UPDATE_STATE( | 470 EXPECT_ACTION_UPDATE_STATE( |
481 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 471 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
482 EXPECT_ACTION_UPDATE_STATE( | 472 EXPECT_ACTION_UPDATE_STATE( |
483 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 473 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
484 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 474 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
485 state.OnBeginImplFrameIdle(); | 475 state.OnBeginImplFrameIdle(); |
486 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 476 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
487 | 477 |
488 // It doesn't request a draw until we get a new commit though. | 478 // It doesn't request a draw until we get a new commit though. |
489 EXPECT_TRUE(state.CommitPending()); | 479 EXPECT_TRUE(state.CommitPending()); |
490 EXPECT_FALSE(state.RedrawPending()); | 480 EXPECT_FALSE(state.RedrawPending()); |
491 state.OnBeginImplFrame(); | 481 state.OnBeginImplFrame(); |
492 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 482 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
493 state.OnBeginImplFrameDeadlinePending(); | |
494 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | |
495 state.OnBeginImplFrameDeadline(); | 483 state.OnBeginImplFrameDeadline(); |
496 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 484 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
497 state.OnBeginImplFrameIdle(); | 485 state.OnBeginImplFrameIdle(); |
498 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 486 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
499 | 487 |
500 // Finish the commit and activation. | 488 // Finish the commit and activation. |
501 state.NotifyBeginMainFrameStarted(); | 489 state.NotifyBeginMainFrameStarted(); |
502 state.NotifyReadyToCommit(); | 490 state.NotifyReadyToCommit(); |
503 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 491 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
504 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 492 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
505 state.NotifyReadyToActivate(); | 493 state.NotifyReadyToActivate(); |
506 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); | 494 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); |
507 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 495 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
508 EXPECT_TRUE(state.RedrawPending()); | 496 EXPECT_TRUE(state.RedrawPending()); |
509 | 497 |
510 // Verify we draw with the new frame. | 498 // Verify we draw with the new frame. |
511 state.OnBeginImplFrame(); | 499 state.OnBeginImplFrame(); |
512 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 500 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
513 state.OnBeginImplFrameDeadlinePending(); | |
514 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | |
515 state.OnBeginImplFrameDeadline(); | 501 state.OnBeginImplFrameDeadline(); |
516 state.SetDrawResultForTest(DRAW_SUCCESS); | 502 state.SetDrawResultForTest(DRAW_SUCCESS); |
517 EXPECT_ACTION_UPDATE_STATE( | 503 EXPECT_ACTION_UPDATE_STATE( |
518 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 504 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
519 state.DidSwapBuffers(); | 505 state.DidSwapBuffers(); |
520 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 506 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
521 state.OnBeginImplFrameIdle(); | 507 state.OnBeginImplFrameIdle(); |
522 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 508 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
523 } | 509 } |
524 | 510 |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
599 state.SetNeedsRedraw(true); | 585 state.SetNeedsRedraw(true); |
600 state.OnBeginImplFrameDeadline(); | 586 state.OnBeginImplFrameDeadline(); |
601 EXPECT_ACTION_UPDATE_STATE( | 587 EXPECT_ACTION_UPDATE_STATE( |
602 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 588 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
603 | 589 |
604 // Fail the draw enough times to force a redraw. | 590 // Fail the draw enough times to force a redraw. |
605 for (int i = 0; i < draw_limit; ++i) { | 591 for (int i = 0; i < draw_limit; ++i) { |
606 state.SetNeedsRedraw(true); | 592 state.SetNeedsRedraw(true); |
607 state.OnBeginImplFrame(); | 593 state.OnBeginImplFrame(); |
608 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 594 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
609 state.OnBeginImplFrameDeadlinePending(); | |
610 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | |
611 state.OnBeginImplFrameDeadline(); | 595 state.OnBeginImplFrameDeadline(); |
612 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); | 596 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); |
613 EXPECT_ACTION_UPDATE_STATE( | 597 EXPECT_ACTION_UPDATE_STATE( |
614 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 598 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
615 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 599 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
616 state.OnBeginImplFrameIdle(); | 600 state.OnBeginImplFrameIdle(); |
617 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 601 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
618 } | 602 } |
619 | 603 |
620 EXPECT_TRUE(state.BeginFrameNeeded()); | 604 EXPECT_TRUE(state.BeginFrameNeeded()); |
(...skipping 13 matching lines...) Expand all Loading... |
634 // Now force redraw should be in waiting for activation | 618 // Now force redraw should be in waiting for activation |
635 EXPECT_TRUE(state.ForcedRedrawState() == | 619 EXPECT_TRUE(state.ForcedRedrawState() == |
636 SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_ACTIVATION); | 620 SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_ACTIVATION); |
637 | 621 |
638 // After failing additional draws, we should still be in a forced | 622 // After failing additional draws, we should still be in a forced |
639 // redraw, but not back in WAITING_FOR_COMMIT. | 623 // redraw, but not back in WAITING_FOR_COMMIT. |
640 for (int i = 0; i < draw_limit; ++i) { | 624 for (int i = 0; i < draw_limit; ++i) { |
641 state.SetNeedsRedraw(true); | 625 state.SetNeedsRedraw(true); |
642 state.OnBeginImplFrame(); | 626 state.OnBeginImplFrame(); |
643 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 627 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
644 state.OnBeginImplFrameDeadlinePending(); | |
645 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | |
646 state.OnBeginImplFrameDeadline(); | 628 state.OnBeginImplFrameDeadline(); |
647 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); | 629 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); |
648 EXPECT_ACTION_UPDATE_STATE( | 630 EXPECT_ACTION_UPDATE_STATE( |
649 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 631 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
650 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 632 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
651 state.OnBeginImplFrameIdle(); | 633 state.OnBeginImplFrameIdle(); |
652 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 634 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
653 } | 635 } |
654 EXPECT_TRUE(state.RedrawPending()); | 636 EXPECT_TRUE(state.RedrawPending()); |
655 EXPECT_TRUE(state.ForcedRedrawState() == | 637 EXPECT_TRUE(state.ForcedRedrawState() == |
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
915 EXPECT_TRUE(state.NeedsCommit()); | 897 EXPECT_TRUE(state.NeedsCommit()); |
916 | 898 |
917 // Let the frame finish. | 899 // Let the frame finish. |
918 state.NotifyBeginMainFrameStarted(); | 900 state.NotifyBeginMainFrameStarted(); |
919 state.NotifyReadyToCommit(); | 901 state.NotifyReadyToCommit(); |
920 EXPECT_MAIN_FRAME_STATE( | 902 EXPECT_MAIN_FRAME_STATE( |
921 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_READY_TO_COMMIT); | 903 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_READY_TO_COMMIT); |
922 | 904 |
923 // Expect to commit regardless of BeginImplFrame state. | 905 // Expect to commit regardless of BeginImplFrame state. |
924 EXPECT_IMPL_FRAME_STATE( | 906 EXPECT_IMPL_FRAME_STATE( |
925 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING); | |
926 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); | |
927 | |
928 state.OnBeginImplFrameDeadlinePending(); | |
929 EXPECT_IMPL_FRAME_STATE( | |
930 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME); | 907 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME); |
931 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); | 908 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); |
932 | 909 |
933 state.OnBeginImplFrameDeadline(); | 910 state.OnBeginImplFrameDeadline(); |
934 EXPECT_IMPL_FRAME_STATE( | 911 EXPECT_IMPL_FRAME_STATE( |
935 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); | 912 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); |
936 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); | 913 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); |
937 | 914 |
938 state.OnBeginImplFrameIdle(); | 915 state.OnBeginImplFrameIdle(); |
939 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); | 916 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); |
940 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); | 917 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); |
941 | 918 |
942 state.OnBeginImplFrame(); | 919 state.OnBeginImplFrame(); |
943 EXPECT_IMPL_FRAME_STATE( | 920 EXPECT_IMPL_FRAME_STATE( |
944 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING); | 921 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME); |
945 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); | 922 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); |
946 | 923 |
947 // Finish the commit and activate, then make sure we start the next commit | 924 // Finish the commit and activate, then make sure we start the next commit |
948 // immediately and draw on the next BeginImplFrame. | 925 // immediately and draw on the next BeginImplFrame. |
949 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 926 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
950 state.NotifyReadyToActivate(); | 927 state.NotifyReadyToActivate(); |
951 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); | 928 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); |
952 EXPECT_ACTION_UPDATE_STATE( | 929 EXPECT_ACTION_UPDATE_STATE( |
953 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 930 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
954 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 931 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
(...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1555 // waiting for the first draw to unblock the main thread. | 1532 // waiting for the first draw to unblock the main thread. |
1556 EXPECT_TRUE(state.active_tree_needs_first_draw()); | 1533 EXPECT_TRUE(state.active_tree_needs_first_draw()); |
1557 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); | 1534 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); |
1558 | 1535 |
1559 // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE | 1536 // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE |
1560 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); | 1537 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); |
1561 EXPECT_ACTION(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); | 1538 EXPECT_ACTION(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); |
1562 | 1539 |
1563 state.OnBeginImplFrame(); | 1540 state.OnBeginImplFrame(); |
1564 EXPECT_IMPL_FRAME_STATE( | 1541 EXPECT_IMPL_FRAME_STATE( |
1565 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING); | |
1566 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); | |
1567 | |
1568 state.OnBeginImplFrameDeadlinePending(); | |
1569 EXPECT_IMPL_FRAME_STATE( | |
1570 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME); | 1542 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME); |
1571 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); | 1543 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1572 | 1544 |
1573 state.OnBeginImplFrameDeadline(); | 1545 state.OnBeginImplFrameDeadline(); |
1574 EXPECT_IMPL_FRAME_STATE( | 1546 EXPECT_IMPL_FRAME_STATE( |
1575 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); | 1547 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); |
1576 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); | 1548 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1577 } | 1549 } |
1578 | 1550 |
1579 TEST(SchedulerStateMachineTest, | 1551 TEST(SchedulerStateMachineTest, |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1617 | 1589 |
1618 // Because the output surface is missing, we expect the draw to abort. | 1590 // Because the output surface is missing, we expect the draw to abort. |
1619 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); | 1591 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); |
1620 | 1592 |
1621 // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE | 1593 // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE |
1622 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); | 1594 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); |
1623 EXPECT_ACTION(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); | 1595 EXPECT_ACTION(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); |
1624 | 1596 |
1625 state.OnBeginImplFrame(); | 1597 state.OnBeginImplFrame(); |
1626 EXPECT_IMPL_FRAME_STATE( | 1598 EXPECT_IMPL_FRAME_STATE( |
1627 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING); | |
1628 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); | |
1629 | |
1630 state.OnBeginImplFrameDeadlinePending(); | |
1631 EXPECT_IMPL_FRAME_STATE( | |
1632 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME); | 1599 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME); |
1633 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); | 1600 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1634 | 1601 |
1635 state.OnBeginImplFrameDeadline(); | 1602 state.OnBeginImplFrameDeadline(); |
1636 EXPECT_IMPL_FRAME_STATE( | 1603 EXPECT_IMPL_FRAME_STATE( |
1637 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); | 1604 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); |
1638 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); | 1605 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
1639 | 1606 |
1640 state.OnBeginImplFrameIdle(); | 1607 state.OnBeginImplFrameIdle(); |
1641 EXPECT_ACTION_UPDATE_STATE( | 1608 EXPECT_ACTION_UPDATE_STATE( |
(...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2118 | 2085 |
2119 // Lose the output surface. | 2086 // Lose the output surface. |
2120 state.DidLoseOutputSurface(); | 2087 state.DidLoseOutputSurface(); |
2121 | 2088 |
2122 // The scheduler shouldn't trigger the output surface creation till the | 2089 // The scheduler shouldn't trigger the output surface creation till the |
2123 // previous commit has been cleared. | 2090 // previous commit has been cleared. |
2124 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2091 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
2125 | 2092 |
2126 // Trigger the deadline and ensure that the scheduler does not trigger any | 2093 // Trigger the deadline and ensure that the scheduler does not trigger any |
2127 // actions until we receive a response for the pending commit. | 2094 // actions until we receive a response for the pending commit. |
2128 state.OnBeginImplFrameDeadlinePending(); | |
2129 state.OnBeginImplFrameDeadline(); | 2095 state.OnBeginImplFrameDeadline(); |
2130 state.OnBeginImplFrameIdle(); | 2096 state.OnBeginImplFrameIdle(); |
2131 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2097 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
2132 | 2098 |
2133 // Abort the commit, since that is what we expect the main thread to do if the | 2099 // Abort the commit, since that is what we expect the main thread to do if the |
2134 // output surface was lost due to a synchronous call from the main thread to | 2100 // output surface was lost due to a synchronous call from the main thread to |
2135 // release the output surface. | 2101 // release the output surface. |
2136 state.NotifyBeginMainFrameStarted(); | 2102 state.NotifyBeginMainFrameStarted(); |
2137 state.BeginMainFrameAborted( | 2103 state.BeginMainFrameAborted( |
2138 CommitEarlyOutReason::ABORTED_OUTPUT_SURFACE_LOST); | 2104 CommitEarlyOutReason::ABORTED_OUTPUT_SURFACE_LOST); |
(...skipping 15 matching lines...) Expand all Loading... |
2154 PerformAction(&state, SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 2120 PerformAction(&state, SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
2155 | 2121 |
2156 // Lose the output surface. | 2122 // Lose the output surface. |
2157 state.DidLoseOutputSurface(); | 2123 state.DidLoseOutputSurface(); |
2158 | 2124 |
2159 // The scheduler shouldn't trigger the output surface creation till the | 2125 // The scheduler shouldn't trigger the output surface creation till the |
2160 // previous begin impl frame state is cleared from the pipeline. | 2126 // previous begin impl frame state is cleared from the pipeline. |
2161 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2127 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
2162 | 2128 |
2163 // Cycle through the frame stages to clear the scheduler state. | 2129 // Cycle through the frame stages to clear the scheduler state. |
2164 state.OnBeginImplFrameDeadlinePending(); | |
2165 state.OnBeginImplFrameDeadline(); | 2130 state.OnBeginImplFrameDeadline(); |
2166 state.OnBeginImplFrameIdle(); | 2131 state.OnBeginImplFrameIdle(); |
2167 | 2132 |
2168 // The scheduler should begin the output surface creation now. | 2133 // The scheduler should begin the output surface creation now. |
2169 EXPECT_ACTION_UPDATE_STATE( | 2134 EXPECT_ACTION_UPDATE_STATE( |
2170 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); | 2135 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); |
2171 } | 2136 } |
2172 | 2137 |
2173 } // namespace | 2138 } // namespace |
2174 } // namespace cc | 2139 } // namespace cc |
OLD | NEW |