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

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

Issue 1265023005: cc: Add SchedulerStateMachine::DidDraw and use for forced draws (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@WillDidAction0
Patch Set: Remove SetDrawResult and pass result as argument instead Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/scheduler/scheduler_state_machine.h" 5 #include "cc/scheduler/scheduler_state_machine.h"
6 6
7 #include "base/trace_event/trace_event.h" 7 #include "base/trace_event/trace_event.h"
8 #include "cc/scheduler/scheduler.h" 8 #include "cc/scheduler/scheduler.h"
9 #include "cc/test/begin_frame_args_test.h" 9 #include "cc/test/begin_frame_args_test.h"
10 #include "testing/gtest/include/gtest/gtest.h" 10 #include "testing/gtest/include/gtest/gtest.h"
(...skipping 22 matching lines...) Expand all
33 EXPECT_ENUM_EQ(ActionToString, expected, state.NextAction()) \ 33 EXPECT_ENUM_EQ(ActionToString, expected, state.NextAction()) \
34 << state.AsValue()->ToString() 34 << state.AsValue()->ToString()
35 35
36 #define EXPECT_ACTION_UPDATE_STATE(action) \ 36 #define EXPECT_ACTION_UPDATE_STATE(action) \
37 EXPECT_ACTION(action); \ 37 EXPECT_ACTION(action); \
38 if (action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE || \ 38 if (action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE || \
39 action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED) { \ 39 action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED) { \
40 EXPECT_IMPL_FRAME_STATE( \ 40 EXPECT_IMPL_FRAME_STATE( \
41 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); \ 41 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); \
42 } \ 42 } \
43 WillPerformAction(&state, action); \ 43 PerformAction(&state, action); \
44 if (action == SchedulerStateMachine::ACTION_NONE) { \ 44 if (action == SchedulerStateMachine::ACTION_NONE) { \
45 if (state.begin_impl_frame_state() == \ 45 if (state.begin_impl_frame_state() == \
46 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING) \ 46 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING) \
47 state.OnBeginImplFrameDeadlinePending(); \ 47 state.OnBeginImplFrameDeadlinePending(); \
48 if (state.begin_impl_frame_state() == \ 48 if (state.begin_impl_frame_state() == \
49 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) \ 49 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) \
50 state.OnBeginImplFrameIdle(); \ 50 state.OnBeginImplFrameIdle(); \
51 } 51 }
52 52
53 #define SET_UP_STATE(state) \ 53 #define SET_UP_STATE(state) \
54 state.SetVisible(true); \ 54 state.SetVisible(true); \
55 EXPECT_ACTION_UPDATE_STATE( \ 55 EXPECT_ACTION_UPDATE_STATE( \
56 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); \ 56 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); \
57 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); \ 57 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); \
58 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); \ 58 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); \
59 state.SetCanDraw(true); 59 state.SetCanDraw(true);
60 60
61 namespace cc { 61 namespace cc {
62 62
63 namespace { 63 namespace {
64 64
65 void WillPerformAction(SchedulerStateMachine* sm,
66 SchedulerStateMachine::Action action) {
67 switch (action) {
68 case SchedulerStateMachine::ACTION_NONE:
69 return;
70
71 case SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE:
72 sm->WillActivate();
73 return;
74
75 case SchedulerStateMachine::ACTION_ANIMATE:
76 sm->WillAnimate();
77 return;
78
79 case SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME:
80 sm->WillSendBeginMainFrame();
81 return;
82
83 case SchedulerStateMachine::ACTION_COMMIT: {
84 bool commit_has_no_updates = false;
85 sm->WillCommit(commit_has_no_updates);
86 return;
87 }
88
89 case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED:
90 case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE: {
91 bool did_request_swap = true;
92 sm->WillDraw(did_request_swap);
93 return;
94 }
95
96 case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT: {
97 bool did_request_swap = false;
98 sm->WillDraw(did_request_swap);
99 return;
100 }
101
102 case SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION:
103 sm->WillBeginOutputSurfaceCreation();
104 return;
105
106 case SchedulerStateMachine::ACTION_PREPARE_TILES:
107 sm->WillPrepareTiles();
108 return;
109
110 case SchedulerStateMachine::ACTION_INVALIDATE_OUTPUT_SURFACE:
111 sm->WillInvalidateOutputSurface();
112 return;
113 }
114 }
115
116 const SchedulerStateMachine::BeginImplFrameState all_begin_impl_frame_states[] = 65 const SchedulerStateMachine::BeginImplFrameState all_begin_impl_frame_states[] =
117 {SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE, 66 {SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE,
118 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING, 67 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING,
119 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME, 68 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME,
120 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE, }; 69 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE, };
121 70
122 const SchedulerStateMachine::BeginMainFrameState begin_main_frame_states[] = { 71 const SchedulerStateMachine::BeginMainFrameState begin_main_frame_states[] = {
123 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE, 72 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE,
124 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT, 73 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT,
125 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_STARTED, 74 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_STARTED,
126 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_READY_TO_COMMIT, 75 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_READY_TO_COMMIT,
127 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_WAITING_FOR_ACTIVATION, 76 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_WAITING_FOR_ACTIVATION,
128 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_WAITING_FOR_DRAW}; 77 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_WAITING_FOR_DRAW};
129 78
130 // Exposes the protected state fields of the SchedulerStateMachine for testing 79 // Exposes the protected state fields of the SchedulerStateMachine for testing
131 class StateMachine : public SchedulerStateMachine { 80 class StateMachine : public SchedulerStateMachine {
132 public: 81 public:
133 explicit StateMachine(const SchedulerSettings& scheduler_settings) 82 explicit StateMachine(const SchedulerSettings& scheduler_settings)
134 : SchedulerStateMachine(scheduler_settings) {} 83 : SchedulerStateMachine(scheduler_settings),
84 draw_result_for_test_(DRAW_SUCCESS) {}
135 85
136 void CreateAndInitializeOutputSurfaceWithActivatedCommit() { 86 void CreateAndInitializeOutputSurfaceWithActivatedCommit() {
137 DidCreateAndInitializeOutputSurface(); 87 DidCreateAndInitializeOutputSurface();
138 output_surface_state_ = OUTPUT_SURFACE_ACTIVE; 88 output_surface_state_ = OUTPUT_SURFACE_ACTIVE;
139 } 89 }
140 90
141 void SetBeginMainFrameState(BeginMainFrameState cs) { 91 void SetBeginMainFrameState(BeginMainFrameState cs) {
142 begin_main_frame_state_ = cs; 92 begin_main_frame_state_ = cs;
143 } 93 }
144 BeginMainFrameState BeginMainFrameState() const { 94 BeginMainFrameState BeginMainFrameState() const {
(...skipping 21 matching lines...) Expand all
166 } 116 }
167 117
168 bool NeedsCommit() const { return needs_begin_main_frame_; } 118 bool NeedsCommit() const { return needs_begin_main_frame_; }
169 119
170 void SetNeedsAnimateForTest(bool needs_animate) { 120 void SetNeedsAnimateForTest(bool needs_animate) {
171 needs_animate_ = needs_animate; 121 needs_animate_ = needs_animate;
172 } 122 }
173 123
174 void SetNeedsRedraw(bool needs_redraw) { needs_redraw_ = needs_redraw; } 124 void SetNeedsRedraw(bool needs_redraw) { needs_redraw_ = needs_redraw; }
175 125
126 void SetDrawResultForTest(DrawResult draw_result) {
127 draw_result_for_test_ = draw_result;
128 }
129 DrawResult draw_result_for_test() { return draw_result_for_test_; }
130
176 void SetNeedsForcedRedrawForTimeout(bool b) { 131 void SetNeedsForcedRedrawForTimeout(bool b) {
177 forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_COMMIT; 132 forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_COMMIT;
178 active_tree_needs_first_draw_ = true; 133 active_tree_needs_first_draw_ = true;
179 } 134 }
180 bool NeedsForcedRedrawForTimeout() const { 135 bool NeedsForcedRedrawForTimeout() const {
181 return forced_redraw_state_ != FORCED_REDRAW_STATE_IDLE; 136 return forced_redraw_state_ != FORCED_REDRAW_STATE_IDLE;
182 } 137 }
183 138
184 void SetActiveTreeNeedsFirstDraw(bool needs_first_draw) { 139 void SetActiveTreeNeedsFirstDraw(bool needs_first_draw) {
185 active_tree_needs_first_draw_ = needs_first_draw; 140 active_tree_needs_first_draw_ = needs_first_draw;
186 } 141 }
187 142
188 bool CanDraw() const { return can_draw_; } 143 bool CanDraw() const { return can_draw_; }
189 bool Visible() const { return visible_; } 144 bool Visible() const { return visible_; }
190 145
191 bool PendingActivationsShouldBeForced() const { 146 bool PendingActivationsShouldBeForced() const {
192 return SchedulerStateMachine::PendingActivationsShouldBeForced(); 147 return SchedulerStateMachine::PendingActivationsShouldBeForced();
193 } 148 }
194 149
195 void SetHasPendingTree(bool has_pending_tree) { 150 void SetHasPendingTree(bool has_pending_tree) {
196 has_pending_tree_ = has_pending_tree; 151 has_pending_tree_ = has_pending_tree;
197 } 152 }
198 153
199 using SchedulerStateMachine::ShouldTriggerBeginImplFrameDeadlineImmediately; 154 using SchedulerStateMachine::ShouldTriggerBeginImplFrameDeadlineImmediately;
200 using SchedulerStateMachine::ProactiveBeginFrameWanted; 155 using SchedulerStateMachine::ProactiveBeginFrameWanted;
201 using SchedulerStateMachine::WillCommit; 156 using SchedulerStateMachine::WillCommit;
157
158 protected:
159 DrawResult draw_result_for_test_;
202 }; 160 };
203 161
162 void PerformAction(StateMachine* sm, SchedulerStateMachine::Action action) {
163 switch (action) {
164 case SchedulerStateMachine::ACTION_NONE:
165 return;
166
167 case SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE:
168 sm->WillActivate();
169 return;
170
171 case SchedulerStateMachine::ACTION_ANIMATE:
172 sm->WillAnimate();
173 return;
174
175 case SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME:
176 sm->WillSendBeginMainFrame();
177 return;
178
179 case SchedulerStateMachine::ACTION_COMMIT: {
180 bool commit_has_no_updates = false;
181 sm->WillCommit(commit_has_no_updates);
182 return;
183 }
184
185 case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED:
186 case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE: {
187 bool did_request_swap = true;
188 sm->WillDraw();
189 sm->DidDraw(did_request_swap, sm->draw_result_for_test());
190 return;
191 }
192
193 case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT: {
194 bool did_request_swap = false;
195 sm->WillDraw();
196 sm->DidDraw(did_request_swap, sm->draw_result_for_test());
197 return;
198 }
199
200 case SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION:
201 sm->WillBeginOutputSurfaceCreation();
202 return;
203
204 case SchedulerStateMachine::ACTION_PREPARE_TILES:
205 sm->WillPrepareTiles();
206 return;
207
208 case SchedulerStateMachine::ACTION_INVALIDATE_OUTPUT_SURFACE:
209 sm->WillInvalidateOutputSurface();
210 return;
211 }
212 }
213
204 TEST(SchedulerStateMachineTest, BeginFrameNeeded) { 214 TEST(SchedulerStateMachineTest, BeginFrameNeeded) {
205 SchedulerSettings default_scheduler_settings; 215 SchedulerSettings default_scheduler_settings;
206 StateMachine state(default_scheduler_settings); 216 StateMachine state(default_scheduler_settings);
207 state.SetVisible(true); 217 state.SetVisible(true);
208 EXPECT_ACTION_UPDATE_STATE( 218 EXPECT_ACTION_UPDATE_STATE(
209 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); 219 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION);
210 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 220 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
211 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 221 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
212 state.SetBeginMainFrameState( 222 state.SetBeginMainFrameState(
213 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); 223 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE);
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 409 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
400 EXPECT_ACTION_UPDATE_STATE( 410 EXPECT_ACTION_UPDATE_STATE(
401 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 411 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
402 state.DidSwapBuffers(); 412 state.DidSwapBuffers();
403 state.DidSwapBuffersComplete(); 413 state.DidSwapBuffersComplete();
404 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 414 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
405 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); 415 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE);
406 } 416 }
407 417
408 TEST(SchedulerStateMachineTest, 418 TEST(SchedulerStateMachineTest,
409 TestFailedDrawForAnimationCheckerboardSetsNeedsCommitAndDoesNotDrawAgain) { 419 FailedDrawForAnimationCheckerboardSetsNeedsCommitAndRetriesDraw) {
410 SchedulerSettings default_scheduler_settings;
411 StateMachine state(default_scheduler_settings);
412 SET_UP_STATE(state)
413 state.SetNeedsRedraw(true);
414 EXPECT_TRUE(state.RedrawPending());
415 EXPECT_TRUE(state.BeginFrameNeeded());
416 state.OnBeginImplFrame();
417 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
418 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
419 state.OnBeginImplFrameDeadline();
420
421 // We're drawing now.
422 EXPECT_ACTION_UPDATE_STATE(
423 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
424 state.DidSwapBuffers();
425 state.DidSwapBuffersComplete();
426 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
427
428 EXPECT_FALSE(state.RedrawPending());
429 EXPECT_FALSE(state.CommitPending());
430
431 // Failing the draw makes us require a commit.
432 state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
433 state.OnBeginImplFrame();
434 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
435 EXPECT_ACTION_UPDATE_STATE(
436 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
437 EXPECT_TRUE(state.RedrawPending());
438 EXPECT_TRUE(state.CommitPending());
439 }
440
441 TEST(SchedulerStateMachineTest, TestFailedDrawForMissingHighResNeedsCommit) {
442 SchedulerSettings default_scheduler_settings; 420 SchedulerSettings default_scheduler_settings;
443 StateMachine state(default_scheduler_settings); 421 StateMachine state(default_scheduler_settings);
444 SET_UP_STATE(state) 422 SET_UP_STATE(state)
445 state.SetNeedsRedraw(true); 423 state.SetNeedsRedraw(true);
446 EXPECT_TRUE(state.RedrawPending()); 424 EXPECT_TRUE(state.RedrawPending());
447 EXPECT_TRUE(state.BeginFrameNeeded()); 425 EXPECT_TRUE(state.BeginFrameNeeded());
448 426
427 // Start a frame.
449 state.OnBeginImplFrame(); 428 state.OnBeginImplFrame();
450 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 429 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
451 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 430 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
431 state.OnBeginImplFrameDeadlinePending();
432 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
433 EXPECT_FALSE(state.CommitPending());
434
435 // Failing a draw triggers request for a new BeginMainFrame.
452 state.OnBeginImplFrameDeadline(); 436 state.OnBeginImplFrameDeadline();
437 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
453 EXPECT_ACTION_UPDATE_STATE( 438 EXPECT_ACTION_UPDATE_STATE(
454 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 439 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
455 state.DidSwapBuffers(); 440 state.DidSwapBuffers();
441 EXPECT_ACTION_UPDATE_STATE(
442 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
443 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
444 state.OnBeginImplFrameIdle();
445 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
456 state.DidSwapBuffersComplete(); 446 state.DidSwapBuffersComplete();
sunnyps 2015/11/20 23:34:07 Do we actually swap when a draw is aborted due to
brianderson 2015/11/21 01:25:30 Missed this. You are correct. Let me fix this test
457 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 447 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
458 EXPECT_FALSE(state.RedrawPending());
459 EXPECT_FALSE(state.CommitPending());
460 448
461 // Missing high res content requires a commit (but not a redraw) 449 // It's okay to attempt more draws just in case additional raster
462 state.DidDrawIfPossibleCompleted(DRAW_ABORTED_MISSING_HIGH_RES_CONTENT); 450 // finishes and the requested commit wasn't actually necessary.
451 EXPECT_TRUE(state.CommitPending());
452 EXPECT_TRUE(state.RedrawPending());
463 state.OnBeginImplFrame(); 453 state.OnBeginImplFrame();
454 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
455 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
456 state.OnBeginImplFrameDeadlinePending();
457 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
458 state.OnBeginImplFrameDeadline();
459 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
464 EXPECT_ACTION_UPDATE_STATE( 460 EXPECT_ACTION_UPDATE_STATE(
465 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 461 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
466 EXPECT_FALSE(state.RedrawPending()); 462 state.DidSwapBuffers();
467 EXPECT_TRUE(state.CommitPending()); 463 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
464 state.OnBeginImplFrameIdle();
465 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
466 state.DidSwapBuffersComplete();
467 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
468 } 468 }
469 469
470 TEST(SchedulerStateMachineTest, 470 TEST(SchedulerStateMachineTest, FailedDrawForMissingHighResNeedsCommit) {
471 TestsetNeedsRedrawDuringFailedDrawDoesNotRemoveNeedsRedraw) {
472 SchedulerSettings default_scheduler_settings; 471 SchedulerSettings default_scheduler_settings;
473 StateMachine state(default_scheduler_settings); 472 StateMachine state(default_scheduler_settings);
474 SET_UP_STATE(state) 473 SET_UP_STATE(state)
475 state.SetNeedsRedraw(true); 474 state.SetNeedsRedraw(true);
476 EXPECT_TRUE(state.RedrawPending()); 475 EXPECT_TRUE(state.RedrawPending());
477 EXPECT_TRUE(state.BeginFrameNeeded()); 476 EXPECT_TRUE(state.BeginFrameNeeded());
477
478 // Start a frame.
478 state.OnBeginImplFrame(); 479 state.OnBeginImplFrame();
479 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 480 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
480 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 481 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
482 state.OnBeginImplFrameDeadlinePending();
483 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
484 EXPECT_FALSE(state.CommitPending());
485
486 // Failing a draw triggers because of high res tiles missing
487 // request for a new BeginMainFrame.
481 state.OnBeginImplFrameDeadline(); 488 state.OnBeginImplFrameDeadline();
482 489 state.SetDrawResultForTest(DRAW_ABORTED_MISSING_HIGH_RES_CONTENT);
483 // We're drawing now.
484 EXPECT_ACTION_UPDATE_STATE( 490 EXPECT_ACTION_UPDATE_STATE(
485 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 491 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
486 state.DidSwapBuffers(); 492 state.DidSwapBuffers();
493 EXPECT_ACTION_UPDATE_STATE(
494 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
495 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
496 state.OnBeginImplFrameIdle();
497 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
487 state.DidSwapBuffersComplete(); 498 state.DidSwapBuffersComplete();
488 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 499 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
500
501 // It doesn't request a draw until we get a new commit though.
502 EXPECT_TRUE(state.CommitPending());
489 EXPECT_FALSE(state.RedrawPending()); 503 EXPECT_FALSE(state.RedrawPending());
490 EXPECT_FALSE(state.CommitPending()); 504 state.OnBeginImplFrame();
491 505 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
492 // While still in the same BeginMainFrame callback on the main thread, 506 state.OnBeginImplFrameDeadlinePending();
493 // set needs redraw again. This should not redraw. 507 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
494 state.SetNeedsRedraw(true); 508 state.OnBeginImplFrameDeadline();
509 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
510 state.OnBeginImplFrameIdle();
495 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 511 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
496 512
497 // Failing the draw for animation checkerboards makes us require a commit. 513 // Finish the commit and activation.
498 state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); 514 state.NotifyBeginMainFrameStarted();
515 state.NotifyReadyToCommit();
516 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
517 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
518 state.NotifyReadyToActivate();
519 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
520 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
521 EXPECT_TRUE(state.RedrawPending());
522
523 // Verify we draw with the new frame.
499 state.OnBeginImplFrame(); 524 state.OnBeginImplFrame();
500 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 525 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
526 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
527 state.OnBeginImplFrameDeadlinePending();
528 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
529 state.OnBeginImplFrameDeadline();
530 state.SetDrawResultForTest(DRAW_SUCCESS);
501 EXPECT_ACTION_UPDATE_STATE( 531 EXPECT_ACTION_UPDATE_STATE(
502 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 532 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
503 EXPECT_TRUE(state.RedrawPending()); 533 state.DidSwapBuffers();
534 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
535 state.OnBeginImplFrameIdle();
536 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
504 } 537 }
505 538
506 TEST(SchedulerStateMachineTest, 539 TEST(SchedulerStateMachineTest,
507 TestFailedDrawsEventuallyForceDrawAfterNextCommit) { 540 TestFailedDrawsEventuallyForceDrawAfterNextCommit) {
508 SchedulerSettings scheduler_settings; 541 SchedulerSettings scheduler_settings;
509 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;
510 StateMachine state(scheduler_settings); 543 StateMachine state(scheduler_settings);
511 SET_UP_STATE(state) 544 SET_UP_STATE(state)
512 545
513 // Start a commit. 546 // Start a commit.
514 state.SetNeedsBeginMainFrame(); 547 state.SetNeedsBeginMainFrame();
515 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 548 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
516 state.OnBeginImplFrame(); 549 state.OnBeginImplFrame();
517 EXPECT_ACTION_UPDATE_STATE( 550 EXPECT_ACTION_UPDATE_STATE(
518 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 551 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
519 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 552 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
520 EXPECT_TRUE(state.CommitPending()); 553 EXPECT_TRUE(state.CommitPending());
521 554
522 // Then initiate a draw. 555 // Then initiate a draw that fails.
523 state.SetNeedsRedraw(true); 556 state.SetNeedsRedraw(true);
524 state.OnBeginImplFrameDeadline(); 557 state.OnBeginImplFrameDeadline();
525 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 558 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
559 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
526 EXPECT_ACTION_UPDATE_STATE( 560 EXPECT_ACTION_UPDATE_STATE(
527 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 561 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
528
529 // Fail the draw.
530 state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
531 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 562 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
532 EXPECT_TRUE(state.BeginFrameNeeded()); 563 EXPECT_TRUE(state.BeginFrameNeeded());
533 EXPECT_TRUE(state.RedrawPending()); 564 EXPECT_TRUE(state.RedrawPending());
534 // But the commit is ongoing.
535 EXPECT_TRUE(state.CommitPending()); 565 EXPECT_TRUE(state.CommitPending());
536 566
537 // Finish the commit. Note, we should not yet be forcing a draw, but should 567 // Finish the commit. Note, we should not yet be forcing a draw, but should
538 // continue the commit as usual. 568 // continue the commit as usual.
539 state.NotifyBeginMainFrameStarted(); 569 state.NotifyBeginMainFrameStarted();
540 state.NotifyReadyToCommit(); 570 state.NotifyReadyToCommit();
541 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 571 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
542 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 572 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
543 EXPECT_TRUE(state.RedrawPending()); 573 EXPECT_TRUE(state.RedrawPending());
544 574
(...skipping 11 matching lines...) Expand all
556 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 586 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
557 state.OnBeginImplFrameDeadline(); 587 state.OnBeginImplFrameDeadline();
558 EXPECT_ACTION_UPDATE_STATE( 588 EXPECT_ACTION_UPDATE_STATE(
559 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED); 589 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED);
560 state.DidSwapBuffers(); 590 state.DidSwapBuffers();
561 state.DidSwapBuffersComplete(); 591 state.DidSwapBuffersComplete();
562 } 592 }
563 593
564 TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) { 594 TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) {
565 SchedulerSettings scheduler_settings; 595 SchedulerSettings scheduler_settings;
566 int draw_limit = 1; 596 int draw_limit = 2;
567 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced = 597 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced =
568 draw_limit; 598 draw_limit;
569 StateMachine state(scheduler_settings); 599 StateMachine state(scheduler_settings);
570 SET_UP_STATE(state) 600 SET_UP_STATE(state)
571 601
572 // Start a commit. 602 // Start a commit.
573 state.SetNeedsBeginMainFrame(); 603 state.SetNeedsBeginMainFrame();
574 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 604 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
575 state.OnBeginImplFrame(); 605 state.OnBeginImplFrame();
576 EXPECT_ACTION_UPDATE_STATE( 606 EXPECT_ACTION_UPDATE_STATE(
577 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 607 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
578 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 608 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
579 EXPECT_TRUE(state.CommitPending()); 609 EXPECT_TRUE(state.CommitPending());
580 610
581 // Then initiate a draw. 611 // Then initiate a draw.
582 state.SetNeedsRedraw(true); 612 state.SetNeedsRedraw(true);
583 state.OnBeginImplFrameDeadline(); 613 state.OnBeginImplFrameDeadline();
584 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 614 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
585 EXPECT_ACTION_UPDATE_STATE( 615 EXPECT_ACTION_UPDATE_STATE(
586 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 616 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
587 617
588 // Fail the draw enough times to force a redraw, 618 // Fail the draw enough times to force a redraw.
589 // then once more for good measure. 619 for (int i = 0; i < draw_limit; ++i) {
590 for (int i = 0; i < draw_limit + 1; ++i) 620 state.SetNeedsRedraw(true);
591 state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); 621 state.OnBeginImplFrame();
592 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 622 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
623 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
624 state.OnBeginImplFrameDeadlinePending();
625 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
626 state.OnBeginImplFrameDeadline();
627 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
628 EXPECT_ACTION_UPDATE_STATE(
629 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
630 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
631 state.OnBeginImplFrameIdle();
632 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
633 }
634
593 EXPECT_TRUE(state.BeginFrameNeeded()); 635 EXPECT_TRUE(state.BeginFrameNeeded());
594 EXPECT_TRUE(state.RedrawPending()); 636 EXPECT_TRUE(state.RedrawPending());
595 // But the commit is ongoing. 637 // But the commit is ongoing.
596 EXPECT_TRUE(state.CommitPending()); 638 EXPECT_TRUE(state.CommitPending());
597 EXPECT_TRUE(state.ForcedRedrawState() == 639 EXPECT_TRUE(state.ForcedRedrawState() ==
598 SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_COMMIT); 640 SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_COMMIT);
599 641
600 state.NotifyBeginMainFrameStarted(); 642 state.NotifyBeginMainFrameStarted();
601 state.NotifyReadyToCommit(); 643 state.NotifyReadyToCommit();
602 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 644 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
603 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 645 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
604 EXPECT_TRUE(state.RedrawPending()); 646 EXPECT_TRUE(state.RedrawPending());
605 EXPECT_FALSE(state.CommitPending()); 647 EXPECT_FALSE(state.CommitPending());
606 648
607 // Now force redraw should be in waiting for activation 649 // Now force redraw should be in waiting for activation
608 EXPECT_TRUE(state.ForcedRedrawState() == 650 EXPECT_TRUE(state.ForcedRedrawState() ==
609 SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_ACTIVATION); 651 SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_ACTIVATION);
610 652
611 // After failing additional draws, we should still be in a forced 653 // After failing additional draws, we should still be in a forced
612 // redraw, but not back in WAITING_FOR_COMMIT. 654 // redraw, but not back in WAITING_FOR_COMMIT.
613 for (int i = 0; i < draw_limit + 1; ++i) 655 for (int i = 0; i < draw_limit; ++i) {
614 state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); 656 state.SetNeedsRedraw(true);
657 state.OnBeginImplFrame();
658 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
659 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
660 state.OnBeginImplFrameDeadlinePending();
661 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
662 state.OnBeginImplFrameDeadline();
663 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
664 EXPECT_ACTION_UPDATE_STATE(
665 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
666 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
667 state.OnBeginImplFrameIdle();
668 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
669 }
615 EXPECT_TRUE(state.RedrawPending()); 670 EXPECT_TRUE(state.RedrawPending());
616 EXPECT_TRUE(state.ForcedRedrawState() == 671 EXPECT_TRUE(state.ForcedRedrawState() ==
617 SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_ACTIVATION); 672 SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_ACTIVATION);
618 } 673 }
619 674
620 TEST(SchedulerStateMachineTest, TestFailedDrawIsRetriedInNextBeginImplFrame) { 675 TEST(SchedulerStateMachineTest, TestFailedDrawIsRetriedInNextBeginImplFrame) {
621 SchedulerSettings default_scheduler_settings; 676 SchedulerSettings default_scheduler_settings;
622 StateMachine state(default_scheduler_settings); 677 StateMachine state(default_scheduler_settings);
623 SET_UP_STATE(state) 678 SET_UP_STATE(state)
624 679
625 // Start a draw. 680 // Start a draw.
626 state.SetNeedsRedraw(true); 681 state.SetNeedsRedraw(true);
627 EXPECT_TRUE(state.BeginFrameNeeded()); 682 EXPECT_TRUE(state.BeginFrameNeeded());
628 state.OnBeginImplFrame(); 683 state.OnBeginImplFrame();
629 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 684 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
630 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 685 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
631 state.OnBeginImplFrameDeadline(); 686 state.OnBeginImplFrameDeadline();
632 EXPECT_TRUE(state.RedrawPending()); 687 EXPECT_TRUE(state.RedrawPending());
688 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
633 EXPECT_ACTION_UPDATE_STATE( 689 EXPECT_ACTION_UPDATE_STATE(
634 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 690 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
635 691
636 // Failing the draw for animation checkerboards makes us require a commit. 692 // Failing the draw for animation checkerboards makes us require a commit.
637 state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
638 EXPECT_ACTION_UPDATE_STATE( 693 EXPECT_ACTION_UPDATE_STATE(
639 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 694 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
640 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 695 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
641 EXPECT_TRUE(state.RedrawPending()); 696 EXPECT_TRUE(state.RedrawPending());
642 697
643 // We should not be trying to draw again now, but we have a commit pending. 698 // We should not be trying to draw again now, but we have a commit pending.
644 EXPECT_TRUE(state.BeginFrameNeeded()); 699 EXPECT_TRUE(state.BeginFrameNeeded());
645 state.OnBeginImplFrame(); 700 state.OnBeginImplFrame();
646 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 701 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
647 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 702 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
(...skipping 17 matching lines...) Expand all
665 // Draw the first frame. 720 // Draw the first frame.
666 EXPECT_TRUE(state.BeginFrameNeeded()); 721 EXPECT_TRUE(state.BeginFrameNeeded());
667 state.OnBeginImplFrame(); 722 state.OnBeginImplFrame();
668 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 723 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
669 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 724 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
670 725
671 state.OnBeginImplFrameDeadline(); 726 state.OnBeginImplFrameDeadline();
672 EXPECT_ACTION_UPDATE_STATE( 727 EXPECT_ACTION_UPDATE_STATE(
673 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 728 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
674 state.DidSwapBuffers(); 729 state.DidSwapBuffers();
675 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
676 state.DidSwapBuffersComplete(); 730 state.DidSwapBuffersComplete();
677 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 731 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
678 732
679 // Before the next BeginImplFrame, set needs redraw again. 733 // Before the next BeginImplFrame, set needs redraw again.
680 // This should not redraw until the next BeginImplFrame. 734 // This should not redraw until the next BeginImplFrame.
681 state.SetNeedsRedraw(true); 735 state.SetNeedsRedraw(true);
682 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 736 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
683 737
684 // Move to another frame. This should now draw. 738 // Move to another frame. This should now draw.
685 EXPECT_TRUE(state.BeginFrameNeeded()); 739 EXPECT_TRUE(state.BeginFrameNeeded());
686 state.OnBeginImplFrame(); 740 state.OnBeginImplFrame();
687 741
688 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 742 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
689 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 743 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
690 744
691 state.OnBeginImplFrameDeadline(); 745 state.OnBeginImplFrameDeadline();
692 EXPECT_ACTION_UPDATE_STATE( 746 EXPECT_ACTION_UPDATE_STATE(
693 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 747 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
694 state.DidSwapBuffers(); 748 state.DidSwapBuffers();
695 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
696 state.DidSwapBuffersComplete(); 749 state.DidSwapBuffersComplete();
697 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 750 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
698 751
699 // We just swapped, so we should proactively request another BeginImplFrame. 752 // We just swapped, so we should proactively request another BeginImplFrame.
700 EXPECT_TRUE(state.BeginFrameNeeded()); 753 EXPECT_TRUE(state.BeginFrameNeeded());
701 } 754 }
702 755
703 TEST(SchedulerStateMachineTest, TestNextActionDrawsOnBeginImplFrame) { 756 TEST(SchedulerStateMachineTest, TestNextActionDrawsOnBeginImplFrame) {
704 SchedulerSettings default_scheduler_settings; 757 SchedulerSettings default_scheduler_settings;
705 758
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
924 EXPECT_ACTION_UPDATE_STATE( 977 EXPECT_ACTION_UPDATE_STATE(
925 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 978 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
926 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 979 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
927 980
928 state.OnBeginImplFrameDeadline(); 981 state.OnBeginImplFrameDeadline();
929 982
930 EXPECT_TRUE(state.active_tree_needs_first_draw()); 983 EXPECT_TRUE(state.active_tree_needs_first_draw());
931 EXPECT_ACTION_UPDATE_STATE( 984 EXPECT_ACTION_UPDATE_STATE(
932 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 985 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
933 state.DidSwapBuffers(); 986 state.DidSwapBuffers();
934 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
935 state.DidSwapBuffersComplete(); 987 state.DidSwapBuffersComplete();
936 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 988 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
937 } 989 }
938 990
939 TEST(SchedulerStateMachineTest, TestFullCycle) { 991 TEST(SchedulerStateMachineTest, TestFullCycle) {
940 SchedulerSettings default_scheduler_settings; 992 SchedulerSettings default_scheduler_settings;
941 StateMachine state(default_scheduler_settings); 993 StateMachine state(default_scheduler_settings);
942 SET_UP_STATE(state) 994 SET_UP_STATE(state)
943 995
944 // Start clean and set commit. 996 // Start clean and set commit.
(...skipping 24 matching lines...) Expand all
969 1021
970 // Expect to do nothing until BeginImplFrame deadline 1022 // Expect to do nothing until BeginImplFrame deadline
971 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1023 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
972 1024
973 // At BeginImplFrame deadline, draw. 1025 // At BeginImplFrame deadline, draw.
974 state.OnBeginImplFrameDeadline(); 1026 state.OnBeginImplFrameDeadline();
975 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 1027 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
976 EXPECT_ACTION_UPDATE_STATE( 1028 EXPECT_ACTION_UPDATE_STATE(
977 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 1029 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
978 state.DidSwapBuffers(); 1030 state.DidSwapBuffers();
979 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
980 state.DidSwapBuffersComplete(); 1031 state.DidSwapBuffersComplete();
981 1032
982 // Should be synchronized, no draw needed, no action needed. 1033 // Should be synchronized, no draw needed, no action needed.
983 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1034 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
984 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); 1035 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE);
985 EXPECT_FALSE(state.needs_redraw()); 1036 EXPECT_FALSE(state.needs_redraw());
986 } 1037 }
987 1038
988 TEST(SchedulerStateMachineTest, CommitWithoutDrawWithPendingTree) { 1039 TEST(SchedulerStateMachineTest, CommitWithoutDrawWithPendingTree) {
989 SchedulerSettings default_scheduler_settings; 1040 SchedulerSettings default_scheduler_settings;
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
1108 // Haven't draw since last commit, do not begin new main frame. 1159 // Haven't draw since last commit, do not begin new main frame.
1109 state.OnBeginImplFrame(); 1160 state.OnBeginImplFrame();
1110 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 1161 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
1111 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1162 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1112 1163
1113 // At BeginImplFrame deadline, draw. This draws unblocks BeginMainFrame. 1164 // At BeginImplFrame deadline, draw. This draws unblocks BeginMainFrame.
1114 state.OnBeginImplFrameDeadline(); 1165 state.OnBeginImplFrameDeadline();
1115 EXPECT_ACTION_UPDATE_STATE( 1166 EXPECT_ACTION_UPDATE_STATE(
1116 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 1167 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
1117 state.DidSwapBuffers(); 1168 state.DidSwapBuffers();
1118 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
1119 state.DidSwapBuffersComplete(); 1169 state.DidSwapBuffersComplete();
1120 1170
1121 // Now will be able to start main frame. 1171 // Now will be able to start main frame.
1122 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); 1172 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE);
1123 EXPECT_FALSE(state.needs_redraw()); 1173 EXPECT_FALSE(state.needs_redraw());
1124 EXPECT_ACTION_UPDATE_STATE( 1174 EXPECT_ACTION_UPDATE_STATE(
1125 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1175 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1126 } 1176 }
1127 1177
1128 TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) { 1178 TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1160 1210
1161 // Expect to do nothing until BeginImplFrame deadline. 1211 // Expect to do nothing until BeginImplFrame deadline.
1162 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1212 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1163 1213
1164 // At BeginImplFrame deadline, draw. 1214 // At BeginImplFrame deadline, draw.
1165 state.OnBeginImplFrameDeadline(); 1215 state.OnBeginImplFrameDeadline();
1166 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 1216 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
1167 EXPECT_ACTION_UPDATE_STATE( 1217 EXPECT_ACTION_UPDATE_STATE(
1168 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 1218 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
1169 state.DidSwapBuffers(); 1219 state.DidSwapBuffers();
1170 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
1171 state.DidSwapBuffersComplete(); 1220 state.DidSwapBuffersComplete();
1172 1221
1173 // Should be synchronized, no draw needed, no action needed. 1222 // Should be synchronized, no draw needed, no action needed.
1174 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1223 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1175 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); 1224 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE);
1176 EXPECT_FALSE(state.needs_redraw()); 1225 EXPECT_FALSE(state.needs_redraw());
1177 1226
1178 // Next BeginImplFrame should initiate second commit. 1227 // Next BeginImplFrame should initiate second commit.
1179 state.OnBeginImplFrame(); 1228 state.OnBeginImplFrame();
1180 EXPECT_ACTION_UPDATE_STATE( 1229 EXPECT_ACTION_UPDATE_STATE(
(...skipping 948 matching lines...) Expand 10 before | Expand all | Expand 10 after
2129 EXPECT_FALSE(state.ProactiveBeginFrameWanted()); 2178 EXPECT_FALSE(state.ProactiveBeginFrameWanted());
2130 bool commit_has_no_updates = true; 2179 bool commit_has_no_updates = true;
2131 state.WillCommit(commit_has_no_updates); 2180 state.WillCommit(commit_has_no_updates);
2132 EXPECT_TRUE(state.ProactiveBeginFrameWanted()); 2181 EXPECT_TRUE(state.ProactiveBeginFrameWanted());
2133 state.OnBeginImplFrame(); 2182 state.OnBeginImplFrame();
2134 EXPECT_FALSE(state.ProactiveBeginFrameWanted()); 2183 EXPECT_FALSE(state.ProactiveBeginFrameWanted());
2135 } 2184 }
2136 2185
2137 } // namespace 2186 } // namespace
2138 } // namespace cc 2187 } // namespace cc
OLDNEW
« cc/scheduler/scheduler_state_machine.cc ('K') | « cc/scheduler/scheduler_state_machine.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698