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

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

Issue 23907006: cc: Allow sending BeginMainFrame before draw or activation (Closed) Base URL: http://git.chromium.org/chromium/src.git@schedDeadline3
Patch Set: Block main thread from state machine; remove completion event; Created 7 years, 3 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 "cc/scheduler/scheduler.h" 7 #include "cc/scheduler/scheduler.h"
8 #include "testing/gtest/include/gtest/gtest.h" 8 #include "testing/gtest/include/gtest/gtest.h"
9 9
10 #define EXPECT_ACTION_UPDATE_STATE(action) \ 10 #define EXPECT_ACTION_UPDATE_STATE(action) \
11 EXPECT_EQ(action, state.NextAction()) << *state.AsValue(); \ 11 EXPECT_EQ(action, state.NextAction()) << *state.AsValue(); \
12 if (action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE || \ 12 if (action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE || \
13 action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED) { \ 13 action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED) { \
14 if (SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW == \
15 state.CommitState() && \
16 SchedulerStateMachine::OUTPUT_SURFACE_ACTIVE != \
17 state.output_surface_state()) \
18 return; \
19 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE, \ 14 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE, \
20 state.begin_frame_state()) \ 15 state.begin_frame_state()) \
21 << *state.AsValue(); \ 16 << *state.AsValue(); \
22 } \ 17 } \
23 state.UpdateState(action); \ 18 state.UpdateState(action); \
24 if (action == SchedulerStateMachine::ACTION_NONE) { \ 19 if (action == SchedulerStateMachine::ACTION_NONE) { \
25 state.AdvanceBeginFrameStateWhenNoActionsRemain(); \ 20 state.AdvanceBeginFrameStateWhenNoActionsRemain(); \
26 } 21 }
27 22
28 namespace cc { 23 namespace cc {
29 24
30 namespace { 25 namespace {
31 26
32 const SchedulerStateMachine::BeginFrameState all_begin_frame_states[] = { 27 const SchedulerStateMachine::BeginFrameState all_begin_frame_states[] = {
33 SchedulerStateMachine::BEGIN_FRAME_STATE_IDLE, 28 SchedulerStateMachine::BEGIN_FRAME_STATE_IDLE,
34 SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_BEGIN_FRAME, 29 SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_BEGIN_FRAME,
35 SchedulerStateMachine::BEGIN_FRAME_STATE_DEADLINE_PENDING, 30 SchedulerStateMachine::BEGIN_FRAME_STATE_DEADLINE_PENDING,
36 SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE, }; 31 SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE, };
37 32
38 const SchedulerStateMachine::CommitState all_commit_states[] = { 33 const SchedulerStateMachine::CommitState all_commit_states[] = {
39 SchedulerStateMachine::COMMIT_STATE_IDLE, 34 SchedulerStateMachine::COMMIT_STATE_IDLE,
40 SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 35 SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
41 SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, 36 SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, };
42 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, };
43 37
44 // Exposes the protected state fields of the SchedulerStateMachine for testing 38 // Exposes the protected state fields of the SchedulerStateMachine for testing
45 class StateMachine : public SchedulerStateMachine { 39 class StateMachine : public SchedulerStateMachine {
46 public: 40 public:
47 explicit StateMachine(const SchedulerSettings& scheduler_settings) 41 explicit StateMachine(const SchedulerSettings& scheduler_settings)
48 : SchedulerStateMachine(scheduler_settings) {} 42 : SchedulerStateMachine(scheduler_settings) {}
49 43
50 void CreateAndInitializeOutputSurfaceWithActivatedCommit() { 44 void CreateAndInitializeOutputSurfaceWithActivatedCommit() {
51 DidCreateAndInitializeOutputSurface(); 45 DidCreateAndInitializeOutputSurface();
52 output_surface_state_ = OUTPUT_SURFACE_ACTIVE; 46 output_surface_state_ = OUTPUT_SURFACE_ACTIVE;
(...skipping 14 matching lines...) Expand all
67 return output_surface_state_; 61 return output_surface_state_;
68 } 62 }
69 63
70 bool NeedsCommit() const { return needs_commit_; } 64 bool NeedsCommit() const { return needs_commit_; }
71 65
72 void SetNeedsRedraw(bool b) { needs_redraw_ = b; } 66 void SetNeedsRedraw(bool b) { needs_redraw_ = b; }
73 bool NeedsRedraw() const { return needs_redraw_; } 67 bool NeedsRedraw() const { return needs_redraw_; }
74 68
75 void SetNeedsForcedRedrawForTimeout(bool b) { 69 void SetNeedsForcedRedrawForTimeout(bool b) {
76 forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_COMMIT; 70 forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_COMMIT;
77 commit_state_ = COMMIT_STATE_WAITING_FOR_FIRST_DRAW; 71 active_tree_needs_first_draw_ = true;
danakj 2013/09/17 17:05:07 Can you explain these? I don't see that the state
brianderson 2013/10/03 14:44:38 You are right. I shouldn't be setting active_tree_
78 } 72 }
79 bool NeedsForcedRedrawForTimeout() const { 73 bool NeedsForcedRedrawForTimeout() const {
80 return forced_redraw_state_ != FORCED_REDRAW_STATE_IDLE; 74 return forced_redraw_state_ != FORCED_REDRAW_STATE_IDLE;
81 } 75 }
82 76
83 void SetNeedsForcedRedrawForReadback() { 77 void SetNeedsForcedRedrawForReadback() {
84 readback_state_ = READBACK_STATE_WAITING_FOR_DRAW_AND_READBACK; 78 readback_state_ = READBACK_STATE_WAITING_FOR_DRAW_AND_READBACK;
85 commit_state_ = COMMIT_STATE_WAITING_FOR_FIRST_DRAW; 79 active_tree_needs_first_draw_ = true;
86 } 80 }
87 81
88 bool NeedsForcedRedrawForReadback() const { 82 bool NeedsForcedRedrawForReadback() const {
89 return readback_state_ != READBACK_STATE_IDLE; 83 return readback_state_ != READBACK_STATE_IDLE;
90 } 84 }
91 85
92 void SetActiveTreeNeedsFirstDraw(bool needs_first_draw) { 86 void SetActiveTreeNeedsFirstDraw(bool needs_first_draw) {
93 active_tree_needs_first_draw_ = needs_first_draw; 87 active_tree_needs_first_draw_ = needs_first_draw;
94 } 88 }
95 89
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 } 394 }
401 } 395 }
402 396
403 // When in BeginFrame deadline we should always draw for SetNeedsRedraw or 397 // When in BeginFrame deadline we should always draw for SetNeedsRedraw or
404 // SetNeedsForcedRedrawForReadback have been called... except if we're 398 // SetNeedsForcedRedrawForReadback have been called... except if we're
405 // ready to commit, in which case we expect a commit first. 399 // ready to commit, in which case we expect a commit first.
406 for (size_t i = 0; i < num_commit_states; ++i) { 400 for (size_t i = 0; i < num_commit_states; ++i) {
407 for (size_t j = 0; j < 2; ++j) { 401 for (size_t j = 0; j < 2; ++j) {
408 bool request_readback = j; 402 bool request_readback = j;
409 403
410 // Skip invalid states
411 if (request_readback &&
412 (SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW !=
413 all_commit_states[i]))
414 continue;
415
416 StateMachine state(default_scheduler_settings); 404 StateMachine state(default_scheduler_settings);
417 state.SetCanStart(); 405 state.SetCanStart();
418 state.UpdateState(state.NextAction()); 406 state.UpdateState(state.NextAction());
419 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 407 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
420 state.SetCanDraw(true); 408 state.SetCanDraw(true);
421 state.SetCommitState(all_commit_states[i]); 409 state.SetCommitState(all_commit_states[i]);
422 state.SetBeginFrameState( 410 state.SetBeginFrameState(
423 SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE); 411 SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE);
424 if (request_readback) { 412 if (request_readback) {
425 state.SetNeedsForcedRedrawForReadback(); 413 state.SetNeedsForcedRedrawForReadback();
426 } else { 414 } else {
427 state.SetNeedsRedraw(true); 415 state.SetNeedsRedraw(true);
428 state.SetVisible(true); 416 state.SetVisible(true);
429 } 417 }
430 418
431 SchedulerStateMachine::Action expected_action; 419 SchedulerStateMachine::Action expected_action;
432 if (all_commit_states[i] == 420 if (all_commit_states[i] ==
433 SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT) { 421 SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT) {
434 expected_action = SchedulerStateMachine::ACTION_COMMIT; 422 expected_action = SchedulerStateMachine::ACTION_COMMIT;
435 } else if (request_readback) { 423 } else if (request_readback) {
436 if (all_commit_states[i] == 424 expected_action = SchedulerStateMachine::ACTION_DRAW_AND_READBACK;
437 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW)
438 expected_action = SchedulerStateMachine::ACTION_DRAW_AND_READBACK;
439 else
440 expected_action = SchedulerStateMachine::ACTION_NONE;
441 } else { 425 } else {
442 expected_action = 426 expected_action =
443 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE; 427 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE;
444 } 428 }
445 429
446 // Case 1: needs_commit=false. 430 // Case 1: needs_commit=false.
447 EXPECT_NE(state.BeginFrameNeededToDrawByImplThread(), request_readback) 431 EXPECT_NE(state.BeginFrameNeededToDrawByImplThread(), request_readback)
448 << *state.AsValue(); 432 << *state.AsValue();
449 EXPECT_EQ(expected_action, state.NextAction()) << *state.AsValue(); 433 EXPECT_EQ(expected_action, state.NextAction()) << *state.AsValue();
450 434
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
516 } 500 }
517 501
518 TEST(SchedulerStateMachineTest, 502 TEST(SchedulerStateMachineTest,
519 TestCanRedrawWithWaitingForFirstDrawMakesProgress) { 503 TestCanRedrawWithWaitingForFirstDrawMakesProgress) {
520 SchedulerSettings default_scheduler_settings; 504 SchedulerSettings default_scheduler_settings;
521 StateMachine state(default_scheduler_settings); 505 StateMachine state(default_scheduler_settings);
522 state.SetCanStart(); 506 state.SetCanStart();
523 state.UpdateState(state.NextAction()); 507 state.UpdateState(state.NextAction());
524 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 508 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
525 509
526 state.SetCommitState(
527 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW);
528 state.SetActiveTreeNeedsFirstDraw(true); 510 state.SetActiveTreeNeedsFirstDraw(true);
529 state.SetNeedsCommit(); 511 state.SetNeedsCommit();
530 state.SetNeedsRedraw(true); 512 state.SetNeedsRedraw(true);
531 state.SetVisible(true); 513 state.SetVisible(true);
532 state.SetCanDraw(false); 514 state.SetCanDraw(false);
533 state.OnBeginFrame(BeginFrameArgs::CreateForTesting()); 515 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
534 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); 516 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
535 EXPECT_ACTION_UPDATE_STATE( 517 EXPECT_ACTION_UPDATE_STATE(
536 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); 518 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
537 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 519 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
592 574
593 state.OnBeginFrame(BeginFrameArgs::CreateForTesting()); 575 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
594 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_BEGIN_FRAME, 576 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_BEGIN_FRAME,
595 state.begin_frame_state()); 577 state.begin_frame_state());
596 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); 578 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
597 579
598 // Commit and make sure we draw on next BeginFrame 580 // Commit and make sure we draw on next BeginFrame
599 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 581 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
600 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 582 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
601 state.OnBeginFrameDeadline(); 583 state.OnBeginFrameDeadline();
602 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 584 EXPECT_TRUE(state.active_tree_needs_first_draw());
603 state.CommitState());
604 EXPECT_ACTION_UPDATE_STATE( 585 EXPECT_ACTION_UPDATE_STATE(
605 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 586 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
606 state.DidDrawIfPossibleCompleted(true); 587 state.DidDrawIfPossibleCompleted(true);
607 588
608 // Verify that another commit will start immediately after draw. 589 // Verify that another commit will start immediately after draw.
609 EXPECT_ACTION_UPDATE_STATE( 590 EXPECT_ACTION_UPDATE_STATE(
610 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); 591 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
611 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 592 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
612 } 593 }
613 594
(...skipping 18 matching lines...) Expand all
632 EXPECT_FALSE(state.NeedsCommit()); 613 EXPECT_FALSE(state.NeedsCommit());
633 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 614 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
634 615
635 // Tell the scheduler the frame finished. 616 // Tell the scheduler the frame finished.
636 state.FinishCommit(); 617 state.FinishCommit();
637 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, 618 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
638 state.CommitState()); 619 state.CommitState());
639 620
640 // Commit. 621 // Commit.
641 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 622 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
642 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 623 EXPECT_TRUE(state.active_tree_needs_first_draw());
643 state.CommitState());
644 EXPECT_TRUE(state.NeedsRedraw()); 624 EXPECT_TRUE(state.NeedsRedraw());
645 625
646 // Expect to do nothing until BeginFrame deadline 626 // Expect to do nothing until BeginFrame deadline
647 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 627 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
648 628
649 // At BeginFrame deadline, draw. 629 // At BeginFrame deadline, draw.
650 state.OnBeginFrameDeadline(); 630 state.OnBeginFrameDeadline();
651 EXPECT_ACTION_UPDATE_STATE( 631 EXPECT_ACTION_UPDATE_STATE(
652 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 632 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
653 state.DidDrawIfPossibleCompleted(true); 633 state.DidDrawIfPossibleCompleted(true);
(...skipping 29 matching lines...) Expand all
683 state.SetNeedsCommit(); 663 state.SetNeedsCommit();
684 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 664 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
685 665
686 // Tell the scheduler the frame finished. 666 // Tell the scheduler the frame finished.
687 state.FinishCommit(); 667 state.FinishCommit();
688 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, 668 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
689 state.CommitState()); 669 state.CommitState());
690 670
691 // First commit. 671 // First commit.
692 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 672 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
693 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 673 EXPECT_TRUE(state.active_tree_needs_first_draw());
694 state.CommitState());
695 EXPECT_TRUE(state.NeedsRedraw()); 674 EXPECT_TRUE(state.NeedsRedraw());
696 675
697 // Expect to do nothing until BeginFrame deadline. 676 // Expect to do nothing until BeginFrame deadline.
698 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 677 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
699 678
700 // At BeginFrame deadline, draw. 679 // At BeginFrame deadline, draw.
701 state.OnBeginFrameDeadline(); 680 state.OnBeginFrameDeadline();
702 EXPECT_ACTION_UPDATE_STATE( 681 EXPECT_ACTION_UPDATE_STATE(
703 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 682 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
704 state.DidDrawIfPossibleCompleted(true); 683 state.DidDrawIfPossibleCompleted(true);
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
972 // Ask for another draw. Expect nothing happens. 951 // Ask for another draw. Expect nothing happens.
973 state.SetNeedsRedraw(true); 952 state.SetNeedsRedraw(true);
974 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 953 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
975 954
976 // Finish the frame, and commit. 955 // Finish the frame, and commit.
977 state.FinishCommit(); 956 state.FinishCommit();
978 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 957 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
979 958
980 // We will abort the draw when the output surface is lost if we are 959 // We will abort the draw when the output surface is lost if we are
981 // waiting for the first draw to unblock the main thread. 960 // waiting for the first draw to unblock the main thread.
982 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 961 EXPECT_TRUE(state.active_tree_needs_first_draw());
983 state.CommitState());
984 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); 962 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
985 963
986 // Expect to be told to begin context recreation, independent of 964 // Expect to be told to begin context recreation, independent of
987 // BeginFrame state. 965 // BeginFrame state.
988 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_IDLE, 966 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_IDLE,
989 state.begin_frame_state()); 967 state.begin_frame_state());
990 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 968 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
991 state.NextAction()); 969 state.NextAction());
992 970
993 state.OnBeginFrame(BeginFrameArgs::CreateForTesting()); 971 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1039 state.DidLoseOutputSurface(); 1017 state.DidLoseOutputSurface();
1040 1018
1041 // Ask for another draw and also set needs commit. Expect nothing happens. 1019 // Ask for another draw and also set needs commit. Expect nothing happens.
1042 state.SetNeedsRedraw(true); 1020 state.SetNeedsRedraw(true);
1043 state.SetNeedsCommit(); 1021 state.SetNeedsCommit();
1044 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1022 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1045 1023
1046 // Finish the frame, and commit. 1024 // Finish the frame, and commit.
1047 state.FinishCommit(); 1025 state.FinishCommit();
1048 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1026 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1049 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 1027 EXPECT_TRUE(state.active_tree_needs_first_draw());
1050 state.CommitState());
1051 1028
1052 // Because the output surface is missing, we expect the draw to abort. 1029 // Because the output surface is missing, we expect the draw to abort.
1053 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); 1030 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
1054 1031
1055 // Expect to be told to begin context recreation, independent of 1032 // Expect to be told to begin context recreation, independent of
1056 // BeginFrame state 1033 // BeginFrame state
1057 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_IDLE, 1034 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_IDLE,
1058 state.begin_frame_state()); 1035 state.begin_frame_state());
1059 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 1036 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
1060 state.NextAction()); 1037 state.NextAction());
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1100 state.SetCanStart(); 1077 state.SetCanStart();
1101 state.UpdateState(state.NextAction()); 1078 state.UpdateState(state.NextAction());
1102 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1079 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1103 state.SetVisible(true); 1080 state.SetVisible(true);
1104 state.SetCanDraw(true); 1081 state.SetCanDraw(true);
1105 1082
1106 // Cause a lost context lost. 1083 // Cause a lost context lost.
1107 state.DidLoseOutputSurface(); 1084 state.DidLoseOutputSurface();
1108 1085
1109 // Ask a forced redraw for readback and verify it ocurrs. 1086 // Ask a forced redraw for readback and verify it ocurrs.
1110 state.SetCommitState(
1111 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW);
1112 state.SetNeedsForcedRedrawForReadback(); 1087 state.SetNeedsForcedRedrawForReadback();
1113 state.OnBeginFrame(BeginFrameArgs::CreateForTesting()); 1088 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
1114 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); 1089 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
1115 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1090 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1116 1091
1117 // Forced redraws for readbacks need to be followed by a new commit 1092 // Forced redraws for readbacks need to be followed by a new commit
1118 // to replace the readback commit. 1093 // to replace the readback commit.
1119 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 1094 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
1120 state.CommitState()); 1095 state.CommitState());
1121 state.FinishCommit(); 1096 state.FinishCommit();
1122 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1097 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1123 1098
1124 // We don't yet have an output surface, so we the draw and swap should abort. 1099 // We don't yet have an output surface, so we the draw and swap should abort.
1125 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); 1100 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
1126 1101
1127 // Expect to be told to begin context recreation, independent of 1102 // Expect to be told to begin context recreation, independent of
1128 // BeginFrame state 1103 // BeginFrame state
1129 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); 1104 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
1130 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 1105 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
1131 state.NextAction()); 1106 state.NextAction());
1132 1107
1133 state.OnBeginFrameDeadline(); 1108 state.OnBeginFrameDeadline();
1134 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 1109 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
1135 state.NextAction()); 1110 state.NextAction());
1136 1111
1137 // Ask a readback and verify it occurs. 1112 // Ask a readback and verify it occurs.
1138 state.SetCommitState(
1139 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW);
1140 state.SetNeedsForcedRedrawForReadback(); 1113 state.SetNeedsForcedRedrawForReadback();
1141 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); 1114 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
1142 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1115 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1143 } 1116 }
1144 1117
1145 TEST(SchedulerStateMachineTest, DontDrawBeforeCommitAfterLostOutputSurface) { 1118 TEST(SchedulerStateMachineTest, DontDrawBeforeCommitAfterLostOutputSurface) {
1146 SchedulerSettings default_scheduler_settings; 1119 SchedulerSettings default_scheduler_settings;
1147 StateMachine state(default_scheduler_settings); 1120 StateMachine state(default_scheduler_settings);
1148 state.SetCanStart(); 1121 state.SetCanStart();
1149 state.UpdateState(state.NextAction()); 1122 state.UpdateState(state.NextAction());
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1199 state.UpdateState(state.NextAction()); 1172 state.UpdateState(state.NextAction());
1200 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1173 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1201 state.SetVisible(false); 1174 state.SetVisible(false);
1202 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS); 1175 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS);
1203 state.SetNeedsCommit(); 1176 state.SetNeedsCommit();
1204 1177
1205 state.FinishCommit(); 1178 state.FinishCommit();
1206 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); 1179 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
1207 state.UpdateState(state.NextAction()); 1180 state.UpdateState(state.NextAction());
1208 1181
1209 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 1182 EXPECT_TRUE(state.active_tree_needs_first_draw());
1210 state.CommitState());
1211 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); 1183 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
1212 } 1184 }
1213 1185
1214 TEST(SchedulerStateMachineTest, TestFinishCommitWhenForcedCommitInProgress) { 1186 TEST(SchedulerStateMachineTest, TestFinishCommitWhenForcedCommitInProgress) {
1215 SchedulerSettings default_scheduler_settings; 1187 SchedulerSettings default_scheduler_settings;
1216 StateMachine state(default_scheduler_settings); 1188 StateMachine state(default_scheduler_settings);
1217 state.SetCanStart(); 1189 state.SetCanStart();
1218 state.UpdateState(state.NextAction()); 1190 state.UpdateState(state.NextAction());
1219 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1191 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1220 state.SetVisible(false); 1192 state.SetVisible(false);
1221 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS); 1193 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS);
1222 state.SetNeedsCommit(); 1194 state.SetNeedsCommit();
1223 state.SetNeedsForcedCommitForReadback(); 1195 state.SetNeedsForcedCommitForReadback();
1224 1196
1225 // The commit for readback interupts the normal commit. 1197 // The commit for readback interupts the normal commit.
1226 state.FinishCommit(); 1198 state.FinishCommit();
1227 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1199 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1228 1200
1229 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 1201 EXPECT_TRUE(state.active_tree_needs_first_draw());
1230 state.CommitState());
1231 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); 1202 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
1232 1203
1233 // When the readback interrupts the normal commit, we should not get 1204 // When the readback interrupts the normal commit, we should not get
1234 // another BeginFrame on the impl thread when the readback completes. 1205 // another BeginFrame on the impl thread when the readback completes.
1235 EXPECT_NE(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 1206 EXPECT_NE(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
1236 state.NextAction()); 1207 state.NextAction());
1237 1208
1238 // The normal commit can then proceed. 1209 // The normal commit can then proceed.
1239 state.FinishCommit(); 1210 state.FinishCommit();
1240 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1211 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1289 state.SetNeedsCommit(); 1260 state.SetNeedsCommit();
1290 state.SetNeedsForcedCommitForReadback(); 1261 state.SetNeedsForcedCommitForReadback();
1291 EXPECT_ACTION_UPDATE_STATE( 1262 EXPECT_ACTION_UPDATE_STATE(
1292 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); 1263 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
1293 state.FinishCommit(); 1264 state.FinishCommit();
1294 1265
1295 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, 1266 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
1296 state.CommitState()); 1267 state.CommitState());
1297 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1268 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1298 1269
1299 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 1270 EXPECT_TRUE(state.active_tree_needs_first_draw());
1300 state.CommitState());
1301 1271
1302 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); 1272 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
1303 state.DidDrawIfPossibleCompleted(true); 1273 state.DidDrawIfPossibleCompleted(true);
1304 1274
1305 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1275 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1306 1276
1307 // Should be waiting for the normal begin frame from the main thread. 1277 // Should be waiting for the normal begin frame from the main thread.
1308 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 1278 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
1309 state.CommitState()); 1279 state.CommitState());
1310 } 1280 }
(...skipping 13 matching lines...) Expand all
1324 1294
1325 // Schedule a readback, commit it, draw it. 1295 // Schedule a readback, commit it, draw it.
1326 state.SetNeedsForcedCommitForReadback(); 1296 state.SetNeedsForcedCommitForReadback();
1327 EXPECT_ACTION_UPDATE_STATE( 1297 EXPECT_ACTION_UPDATE_STATE(
1328 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); 1298 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
1329 state.FinishCommit(); 1299 state.FinishCommit();
1330 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, 1300 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
1331 state.CommitState()); 1301 state.CommitState());
1332 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1302 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1333 1303
1334 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 1304 EXPECT_TRUE(state.active_tree_needs_first_draw());
1335 state.CommitState());
1336 1305
1337 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); 1306 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
1338 state.DidDrawIfPossibleCompleted(true); 1307 state.DidDrawIfPossibleCompleted(true);
1339 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1308 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1340 1309
1341 // Should be waiting for the normal begin frame from the main thread. 1310 // Should be waiting for the normal begin frame from the main thread.
1342 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 1311 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
1343 state.CommitState()) 1312 state.CommitState())
1344 << *state.AsValue(); 1313 << *state.AsValue();
1345 } 1314 }
(...skipping 14 matching lines...) Expand all
1360 state.SetNeedsCommit(); 1329 state.SetNeedsCommit();
1361 state.SetNeedsForcedCommitForReadback(); 1330 state.SetNeedsForcedCommitForReadback();
1362 EXPECT_ACTION_UPDATE_STATE( 1331 EXPECT_ACTION_UPDATE_STATE(
1363 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); 1332 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
1364 state.FinishCommit(); 1333 state.FinishCommit();
1365 1334
1366 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, 1335 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
1367 state.CommitState()); 1336 state.CommitState());
1368 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1337 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1369 1338
1370 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 1339 EXPECT_TRUE(state.active_tree_needs_first_draw());
1371 state.CommitState());
1372 1340
1373 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); 1341 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
1374 state.DidDrawIfPossibleCompleted(true); 1342 state.DidDrawIfPossibleCompleted(true);
1375 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1343 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1376 1344
1377 // Should be waiting for the main thread's begin frame. 1345 // Should be waiting for the main thread's begin frame.
1378 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 1346 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
1379 state.CommitState()) 1347 state.CommitState())
1380 << *state.AsValue(); 1348 << *state.AsValue();
1381 1349
(...skipping 20 matching lines...) Expand all
1402 1370
1403 state.SetNeedsCommit(); 1371 state.SetNeedsCommit();
1404 state.SetNeedsForcedCommitForReadback(); 1372 state.SetNeedsForcedCommitForReadback();
1405 state.UpdateState(state.NextAction()); 1373 state.UpdateState(state.NextAction());
1406 state.FinishCommit(); 1374 state.FinishCommit();
1407 1375
1408 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, 1376 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
1409 state.CommitState()); 1377 state.CommitState());
1410 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1378 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1411 1379
1412 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 1380 EXPECT_TRUE(state.active_tree_needs_first_draw());
1413 state.CommitState());
1414 1381
1415 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); 1382 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
1416 state.DidDrawIfPossibleCompleted(true); 1383 state.DidDrawIfPossibleCompleted(true);
1417 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1384 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1418 } 1385 }
1419 1386
1420 TEST(SchedulerStateMachineTest, ReportIfNotDrawing) { 1387 TEST(SchedulerStateMachineTest, ReportIfNotDrawing) {
1421 SchedulerSettings default_scheduler_settings; 1388 SchedulerSettings default_scheduler_settings;
1422 StateMachine state(default_scheduler_settings); 1389 StateMachine state(default_scheduler_settings);
1423 state.SetCanStart(); 1390 state.SetCanStart();
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1506 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 1473 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
1507 1474
1508 state.BeginFrameAbortedByMainThread(true); 1475 state.BeginFrameAbortedByMainThread(true);
1509 1476
1510 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 1477 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
1511 EXPECT_FALSE(state.PendingDrawsShouldBeAborted()); 1478 EXPECT_FALSE(state.PendingDrawsShouldBeAborted());
1512 } 1479 }
1513 1480
1514 } // namespace 1481 } // namespace
1515 } // namespace cc 1482 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698