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

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

Issue 23796002: cc: Implement deadine scheduling disabled by default (Closed) Base URL: http://git.chromium.org/chromium/src.git@schedReadback4
Patch Set: rebase? 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 state.UpdateState(action); 12 if (action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE || \
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, \
20 state.begin_frame_state()) \
21 << *state.AsValue(); \
22 } \
23 state.UpdateState(action); \
24 if (action == SchedulerStateMachine::ACTION_NONE) { \
25 state.AdvanceBeginFrameStateWhenNoActionsRemain(); \
26 }
13 27
14 namespace cc { 28 namespace cc {
15 29
16 namespace { 30 namespace {
17 31
32 const SchedulerStateMachine::BeginFrameState all_begin_frame_states[] = {
33 SchedulerStateMachine::BEGIN_FRAME_STATE_IDLE,
34 SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_BEGIN_FRAME,
35 SchedulerStateMachine::BEGIN_FRAME_STATE_DEADLINE_PENDING,
36 SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE, };
37
18 const SchedulerStateMachine::CommitState all_commit_states[] = { 38 const SchedulerStateMachine::CommitState all_commit_states[] = {
19 SchedulerStateMachine::COMMIT_STATE_IDLE, 39 SchedulerStateMachine::COMMIT_STATE_IDLE,
20 SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 40 SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
21 SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, 41 SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
22 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW 42 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, };
23 };
24 43
25 // Exposes the protected state fields of the SchedulerStateMachine for testing 44 // Exposes the protected state fields of the SchedulerStateMachine for testing
26 class StateMachine : public SchedulerStateMachine { 45 class StateMachine : public SchedulerStateMachine {
27 public: 46 public:
28 explicit StateMachine(const SchedulerSettings& scheduler_settings) 47 explicit StateMachine(const SchedulerSettings& scheduler_settings)
29 : SchedulerStateMachine(scheduler_settings) {} 48 : SchedulerStateMachine(scheduler_settings) {}
30 49
31 void CreateAndInitializeOutputSurfaceWithActivatedCommit() { 50 void CreateAndInitializeOutputSurfaceWithActivatedCommit() {
32 DidCreateAndInitializeOutputSurface(); 51 DidCreateAndInitializeOutputSurface();
33 output_surface_state_ = OUTPUT_SURFACE_ACTIVE; 52 output_surface_state_ = OUTPUT_SURFACE_ACTIVE;
34 } 53 }
35 54
36 void SetCommitState(CommitState cs) { commit_state_ = cs; } 55 void SetCommitState(CommitState cs) { commit_state_ = cs; }
37 CommitState CommitState() const { return commit_state_; } 56 CommitState CommitState() const { return commit_state_; }
38 57
58 void SetBeginFrameState(BeginFrameState bfs) {
59 begin_frame_state_ = bfs;
60 }
61
62 BeginFrameState begin_frame_state() const {
63 return begin_frame_state_;
64 }
65
39 OutputSurfaceState output_surface_state() const { 66 OutputSurfaceState output_surface_state() const {
40 return output_surface_state_; 67 return output_surface_state_;
41 } 68 }
42 69
43 bool NeedsCommit() const { return needs_commit_; } 70 bool NeedsCommit() const { return needs_commit_; }
44 71
45 void SetNeedsRedraw(bool b) { needs_redraw_ = b; } 72 void SetNeedsRedraw(bool b) { needs_redraw_ = b; }
46 bool NeedsRedraw() const { return needs_redraw_; } 73 bool NeedsRedraw() const { return needs_redraw_; }
47 74
48 void SetNeedsForcedRedrawForTimeout(bool b) { 75 void SetNeedsForcedRedrawForTimeout(bool b) {
49 forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_COMMIT; 76 forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_COMMIT;
50 commit_state_ = COMMIT_STATE_WAITING_FOR_FIRST_DRAW; 77 commit_state_ = COMMIT_STATE_WAITING_FOR_FIRST_DRAW;
51 } 78 }
52 bool NeedsForcedRedrawForTimeout() const { 79 bool NeedsForcedRedrawForTimeout() const {
53 return forced_redraw_state_ != FORCED_REDRAW_STATE_IDLE; 80 return forced_redraw_state_ != FORCED_REDRAW_STATE_IDLE;
54 } 81 }
55 82
56 void SetNeedsForcedRedrawForReadback() { 83 void SetNeedsForcedRedrawForReadback() {
57 readback_state_ = READBACK_STATE_WAITING_FOR_DRAW_AND_READBACK; 84 readback_state_ = READBACK_STATE_WAITING_FOR_DRAW_AND_READBACK;
58 commit_state_ = COMMIT_STATE_WAITING_FOR_FIRST_DRAW; 85 commit_state_ = COMMIT_STATE_WAITING_FOR_FIRST_DRAW;
59 } 86 }
60 87
61 bool NeedsForcedRedrawForReadback() const { 88 bool NeedsForcedRedrawForReadback() const {
62 return readback_state_ != READBACK_STATE_IDLE; 89 return readback_state_ != READBACK_STATE_IDLE;
63 } 90 }
64 91
92 void SetActiveTreeNeedsFirstDraw(bool needs_first_draw) {
93 active_tree_needs_first_draw_ = needs_first_draw;
94 }
95
65 bool CanDraw() const { return can_draw_; } 96 bool CanDraw() const { return can_draw_; }
66 bool Visible() const { return visible_; } 97 bool Visible() const { return visible_; }
98
99 bool PendingActivationsShouldBeForced() const {
100 return SchedulerStateMachine::PendingActivationsShouldBeForced();
101 }
67 }; 102 };
68 103
69 TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) { 104 TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) {
70 SchedulerSettings default_scheduler_settings; 105 SchedulerSettings default_scheduler_settings;
71 106
72 // If no commit needed, do nothing. 107 // If no commit needed, do nothing.
73 { 108 {
74 StateMachine state(default_scheduler_settings); 109 StateMachine state(default_scheduler_settings);
75 state.SetCanStart(); 110 state.SetCanStart();
76 EXPECT_ACTION_UPDATE_STATE( 111 EXPECT_ACTION_UPDATE_STATE(
77 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION) 112 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION)
78 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 113 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
79 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); 114 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE);
80 state.SetNeedsRedraw(false); 115 state.SetNeedsRedraw(false);
81 state.SetVisible(true); 116 state.SetVisible(true);
82 117
83 EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread()); 118 EXPECT_FALSE(state.BeginFrameNeededByImplThread());
84 119
85 state.DidLeaveBeginFrame(); 120 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
86 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 121 EXPECT_FALSE(state.BeginFrameNeededByImplThread());
87 EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread()); 122 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
88 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 123
89 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 124 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
125 state.OnBeginFrameDeadline();
90 } 126 }
91 127
92 // If commit requested but can_start is still false, do nothing. 128 // If commit requested but can_start is still false, do nothing.
93 { 129 {
94 StateMachine state(default_scheduler_settings); 130 StateMachine state(default_scheduler_settings);
95 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); 131 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE);
96 state.SetNeedsRedraw(false); 132 state.SetNeedsRedraw(false);
97 state.SetVisible(true); 133 state.SetVisible(true);
98 134
99 EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread()); 135 EXPECT_FALSE(state.BeginFrameNeededByImplThread());
100 136
101 state.DidLeaveBeginFrame(); 137 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
102 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 138 EXPECT_FALSE(state.BeginFrameNeededByImplThread());
103 EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread()); 139 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
104 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 140 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
105 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 141 state.OnBeginFrameDeadline();
106 } 142 }
107 143
108 // If commit requested, begin a main frame. 144 // If commit requested, begin a main frame.
109 { 145 {
110 StateMachine state(default_scheduler_settings); 146 StateMachine state(default_scheduler_settings);
111 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); 147 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE);
112 state.SetCanStart(); 148 state.SetCanStart();
113 state.SetNeedsRedraw(false); 149 state.SetNeedsRedraw(false);
114 state.SetVisible(true); 150 state.SetVisible(true);
115 EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread()); 151 EXPECT_FALSE(state.BeginFrameNeededByImplThread());
116 } 152 }
117 153
118 // Begin the frame, make sure needs_commit and commit_state update correctly. 154 // Begin the frame, make sure needs_commit and commit_state update correctly.
119 { 155 {
120 StateMachine state(default_scheduler_settings); 156 StateMachine state(default_scheduler_settings);
121 state.SetCanStart(); 157 state.SetCanStart();
122 state.UpdateState(state.NextAction()); 158 state.UpdateState(state.NextAction());
123 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 159 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
124 state.SetVisible(true); 160 state.SetVisible(true);
125 state.UpdateState( 161 state.UpdateState(
126 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); 162 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
127 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 163 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
128 state.CommitState()); 164 state.CommitState());
129 EXPECT_FALSE(state.NeedsCommit()); 165 EXPECT_FALSE(state.NeedsCommit());
130 EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread()); 166 EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread());
131 } 167 }
132 } 168 }
133 169
134 TEST(SchedulerStateMachineTest, 170 TEST(SchedulerStateMachineTest,
135 TestFailedDrawSetsNeedsCommitAndDoesNotDrawAgain) { 171 TestFailedDrawSetsNeedsCommitAndDoesNotDrawAgain) {
136 SchedulerSettings default_scheduler_settings; 172 SchedulerSettings default_scheduler_settings;
137 StateMachine state(default_scheduler_settings); 173 StateMachine state(default_scheduler_settings);
138 state.SetCanStart(); 174 state.SetCanStart();
139 state.UpdateState(state.NextAction()); 175 state.UpdateState(state.NextAction());
140 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 176 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
141 state.SetVisible(true); 177 state.SetVisible(true);
142 state.SetCanDraw(true); 178 state.SetCanDraw(true);
143 state.SetNeedsRedraw(true); 179 state.SetNeedsRedraw(true);
144 EXPECT_TRUE(state.RedrawPending()); 180 EXPECT_TRUE(state.RedrawPending());
145 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); 181 EXPECT_TRUE(state.BeginFrameNeededByImplThread());
146 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 182 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
183 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
184 state.OnBeginFrameDeadline();
147 185
148 // We're drawing now. 186 // We're drawing now.
149 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, 187 EXPECT_ACTION_UPDATE_STATE(
150 state.NextAction()); 188 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
151 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 189 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
152 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 190
153 EXPECT_FALSE(state.RedrawPending()); 191 EXPECT_FALSE(state.RedrawPending());
154 EXPECT_FALSE(state.CommitPending()); 192 EXPECT_FALSE(state.CommitPending());
155 193
156 // Failing the draw makes us require a commit. 194 // Failing the draw makes us require a commit.
157 state.DidDrawIfPossibleCompleted(false); 195 state.DidDrawIfPossibleCompleted(false);
158 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 196 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
159 state.NextAction()); 197 EXPECT_ACTION_UPDATE_STATE(
160 state.UpdateState(
161 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); 198 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
162 EXPECT_TRUE(state.RedrawPending()); 199 EXPECT_TRUE(state.RedrawPending());
163 EXPECT_TRUE(state.CommitPending()); 200 EXPECT_TRUE(state.CommitPending());
164 } 201 }
165 202
166 TEST(SchedulerStateMachineTest, 203 TEST(SchedulerStateMachineTest,
167 TestsetNeedsRedrawDuringFailedDrawDoesNotRemoveNeedsRedraw) { 204 TestsetNeedsRedrawDuringFailedDrawDoesNotRemoveNeedsRedraw) {
168 SchedulerSettings default_scheduler_settings; 205 SchedulerSettings default_scheduler_settings;
169 StateMachine state(default_scheduler_settings); 206 StateMachine state(default_scheduler_settings);
170 state.SetCanStart(); 207 state.SetCanStart();
171 state.UpdateState(state.NextAction()); 208 state.UpdateState(state.NextAction());
172 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 209 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
173 210
174 state.SetVisible(true); 211 state.SetVisible(true);
175 state.SetCanDraw(true); 212 state.SetCanDraw(true);
176 state.SetNeedsRedraw(true); 213 state.SetNeedsRedraw(true);
177 EXPECT_TRUE(state.RedrawPending()); 214 EXPECT_TRUE(state.RedrawPending());
178 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); 215 EXPECT_TRUE(state.BeginFrameNeededByImplThread());
179 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 216 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
217 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
218 state.OnBeginFrameDeadline();
180 219
181 // We're drawing now. 220 // We're drawing now.
182 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, 221 EXPECT_ACTION_UPDATE_STATE(
183 state.NextAction()); 222 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
184 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 223 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
185 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
186 EXPECT_FALSE(state.RedrawPending()); 224 EXPECT_FALSE(state.RedrawPending());
187 EXPECT_FALSE(state.CommitPending()); 225 EXPECT_FALSE(state.CommitPending());
188 226
189 // While still in the same begin frame callback on the main thread, 227 // While still in the same begin frame callback on the main thread,
190 // set needs redraw again. This should not redraw. 228 // set needs redraw again. This should not redraw.
191 state.SetNeedsRedraw(true); 229 state.SetNeedsRedraw(true);
192 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 230 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
193 231
194 // Failing the draw makes us require a commit. 232 // Failing the draw makes us require a commit.
195 state.DidDrawIfPossibleCompleted(false); 233 state.DidDrawIfPossibleCompleted(false);
196 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 234 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
197 state.NextAction()); 235 EXPECT_ACTION_UPDATE_STATE(
236 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
198 EXPECT_TRUE(state.RedrawPending()); 237 EXPECT_TRUE(state.RedrawPending());
199 } 238 }
200 239
201 TEST(SchedulerStateMachineTest, 240 TEST(SchedulerStateMachineTest,
202 TestCommitAfterFailedDrawAllowsDrawInSameFrame) {
203 SchedulerSettings default_scheduler_settings;
204 StateMachine state(default_scheduler_settings);
205 state.SetCanStart();
206 state.UpdateState(state.NextAction());
207 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
208 state.SetVisible(true);
209 state.SetCanDraw(true);
210
211 // Start a commit.
212 state.SetNeedsCommit();
213 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
214 state.NextAction());
215 state.UpdateState(
216 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
217 EXPECT_TRUE(state.CommitPending());
218
219 // Then initiate a draw.
220 state.SetNeedsRedraw(true);
221 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread());
222 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
223 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
224 state.NextAction());
225 EXPECT_TRUE(state.RedrawPending());
226
227 // Fail the draw.
228 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
229 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
230 state.DidDrawIfPossibleCompleted(false);
231 EXPECT_TRUE(state.RedrawPending());
232 // But the commit is ongoing.
233 EXPECT_TRUE(state.CommitPending());
234
235 // Finish the commit.
236 state.FinishCommit();
237 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
238 state.UpdateState(SchedulerStateMachine::ACTION_COMMIT);
239 EXPECT_TRUE(state.RedrawPending());
240
241 // And we should be allowed to draw again.
242 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
243 state.NextAction());
244 }
245
246 TEST(SchedulerStateMachineTest,
247 TestFailedDrawsWillEventuallyForceADrawAfterTheNextCommit) { 241 TestFailedDrawsWillEventuallyForceADrawAfterTheNextCommit) {
248 SchedulerSettings scheduler_settings; 242 SchedulerSettings scheduler_settings;
249 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced_ = 1; 243 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced_ = 1;
250 StateMachine state(scheduler_settings); 244 StateMachine state(scheduler_settings);
251 state.SetCanStart(); 245 state.SetCanStart();
252 state.UpdateState(state.NextAction()); 246 state.UpdateState(state.NextAction());
253 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 247 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
254 state.SetVisible(true); 248 state.SetVisible(true);
255 state.SetCanDraw(true); 249 state.SetCanDraw(true);
256 250
257 // Start a commit. 251 // Start a commit.
258 state.SetNeedsCommit(); 252 state.SetNeedsCommit();
259 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 253 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
260 state.NextAction()); 254 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
261 state.UpdateState( 255 EXPECT_ACTION_UPDATE_STATE(
262 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); 256 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
257 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
263 EXPECT_TRUE(state.CommitPending()); 258 EXPECT_TRUE(state.CommitPending());
264 259
265 // Then initiate a draw. 260 // Then initiate a draw.
266 state.SetNeedsRedraw(true); 261 state.SetNeedsRedraw(true);
267 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); 262 state.OnBeginFrameDeadline();
268 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 263 EXPECT_ACTION_UPDATE_STATE(
269 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, 264 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
270 state.NextAction());
271 EXPECT_TRUE(state.RedrawPending());
272 265
273 // Fail the draw. 266 // Fail the draw.
274 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
275 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
276 state.DidDrawIfPossibleCompleted(false); 267 state.DidDrawIfPossibleCompleted(false);
268 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
269 EXPECT_TRUE(state.BeginFrameNeededByImplThread());
277 EXPECT_TRUE(state.RedrawPending()); 270 EXPECT_TRUE(state.RedrawPending());
278 // But the commit is ongoing. 271 // But the commit is ongoing.
279 EXPECT_TRUE(state.CommitPending()); 272 EXPECT_TRUE(state.CommitPending());
280 273
281 // Finish the commit. Note, we should not yet be forcing a draw, but should 274 // Finish the commit. Note, we should not yet be forcing a draw, but should
282 // continue the commit as usual. 275 // continue the commit as usual.
283 state.FinishCommit(); 276 state.FinishCommit();
284 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); 277 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
285 state.UpdateState(SchedulerStateMachine::ACTION_COMMIT); 278 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
286 EXPECT_TRUE(state.RedrawPending()); 279 EXPECT_TRUE(state.RedrawPending());
287 280
288 // The redraw should be forced in this case. 281 // The redraw should be forced at the end of the next BeginFrame.
289 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED, 282 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
290 state.NextAction()); 283 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
284 state.OnBeginFrameDeadline();
285 EXPECT_ACTION_UPDATE_STATE(
286 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED);
291 } 287 }
292 288
293 TEST(SchedulerStateMachineTest, 289 TEST(SchedulerStateMachineTest,
294 TestFailedDrawIsRetriedInNextBeginFrameForImplThread) { 290 TestFailedDrawIsRetriedInNextBeginFrameForImplThread) {
295 SchedulerSettings default_scheduler_settings; 291 SchedulerSettings default_scheduler_settings;
296 StateMachine state(default_scheduler_settings); 292 StateMachine state(default_scheduler_settings);
297 state.SetCanStart(); 293 state.SetCanStart();
298 state.UpdateState(state.NextAction()); 294 state.UpdateState(state.NextAction());
299 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 295 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
300 state.SetVisible(true); 296 state.SetVisible(true);
301 state.SetCanDraw(true); 297 state.SetCanDraw(true);
302 298
303 // Start a draw. 299 // Start a draw.
304 state.SetNeedsRedraw(true); 300 state.SetNeedsRedraw(true);
305 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); 301 EXPECT_TRUE(state.BeginFrameNeededByImplThread());
306 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 302 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
307 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, 303 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
308 state.NextAction()); 304 state.OnBeginFrameDeadline();
309 EXPECT_TRUE(state.RedrawPending()); 305 EXPECT_TRUE(state.RedrawPending());
306 EXPECT_ACTION_UPDATE_STATE(
307 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
310 308
311 // Fail the draw. 309 // Fail the draw
312 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
313 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
314 state.DidDrawIfPossibleCompleted(false); 310 state.DidDrawIfPossibleCompleted(false);
311 EXPECT_ACTION_UPDATE_STATE(
312 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
313 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
315 EXPECT_TRUE(state.RedrawPending()); 314 EXPECT_TRUE(state.RedrawPending());
316 315
317 // We should not be trying to draw again now, but we have a commit pending. 316 // We should not be trying to draw again now, but we have a commit pending.
318 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 317 EXPECT_TRUE(state.BeginFrameNeededByImplThread());
319 state.NextAction()); 318 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
319 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
320 320
321 state.DidLeaveBeginFrame(); 321 // We should try to draw again at the end of the next BeginFrame on
322 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); 322 // the impl thread.
323 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 323 state.OnBeginFrameDeadline();
324 324 EXPECT_ACTION_UPDATE_STATE(
325 // We should try to draw again in the next begin frame on the impl thread. 325 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
326 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, 326 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
327 state.NextAction());
328 } 327 }
329 328
330 TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) { 329 TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) {
331 SchedulerSettings default_scheduler_settings; 330 SchedulerSettings default_scheduler_settings;
332 StateMachine state(default_scheduler_settings); 331 StateMachine state(default_scheduler_settings);
333 state.SetCanStart(); 332 state.SetCanStart();
334 state.UpdateState(state.NextAction()); 333 state.UpdateState(state.NextAction());
335 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 334 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
336 state.SetVisible(true); 335 state.SetVisible(true);
337 state.SetCanDraw(true); 336 state.SetCanDraw(true);
338 state.SetNeedsRedraw(true); 337 state.SetNeedsRedraw(true);
339 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread());
340 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
341 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
342 state.NextAction());
343 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
344 338
345 // While still in the same begin frame for the impl thread, set needs redraw 339 // Draw the first frame.
346 // again. This should not redraw. 340 EXPECT_TRUE(state.BeginFrameNeededByImplThread());
341 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
342 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
343
344 state.OnBeginFrameDeadline();
345 EXPECT_ACTION_UPDATE_STATE(
346 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
347 state.DidDrawIfPossibleCompleted(true);
348 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
349
350 // Before the next begin frame for the impl thread, set needs redraw
351 // again. This should not redraw until the next begin frame.
347 state.SetNeedsRedraw(true); 352 state.SetNeedsRedraw(true);
348 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 353 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
349 354
350 // Move to another frame. This should now draw. 355 // Move to another frame. This should now draw.
356 EXPECT_TRUE(state.BeginFrameNeededByImplThread());
357 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
358
359 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
360
361 state.OnBeginFrameDeadline();
362 EXPECT_ACTION_UPDATE_STATE(
363 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
351 state.DidDrawIfPossibleCompleted(true); 364 state.DidDrawIfPossibleCompleted(true);
352 state.DidLeaveBeginFrame(); 365 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
353 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); 366 EXPECT_FALSE(state.BeginFrameNeededByImplThread());
354 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
355
356 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
357 state.NextAction());
358 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
359 state.DidDrawIfPossibleCompleted(true);
360 EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread());
361 } 367 }
362 368
363 TEST(SchedulerStateMachineTest, TestNextActionDrawsOnBeginFrame) { 369 TEST(SchedulerStateMachineTest, TestNextActionDrawsOnBeginFrame) {
364 SchedulerSettings default_scheduler_settings; 370 SchedulerSettings default_scheduler_settings;
365 371
366 // When not in BeginFrame, or in BeginFrame but not visible, 372 // When not in BeginFrame deadline, or in BeginFrame deadline but not visible,
367 // don't draw. 373 // don't draw.
368 size_t num_commit_states = 374 size_t num_commit_states =
369 sizeof(all_commit_states) / sizeof(SchedulerStateMachine::CommitState); 375 sizeof(all_commit_states) / sizeof(SchedulerStateMachine::CommitState);
376 size_t num_begin_frame_states =
377 sizeof(all_begin_frame_states) /
378 sizeof(SchedulerStateMachine::BeginFrameState);
370 for (size_t i = 0; i < num_commit_states; ++i) { 379 for (size_t i = 0; i < num_commit_states; ++i) {
371 for (size_t j = 0; j < 2; ++j) { 380 for (size_t j = 0; j < num_begin_frame_states; ++j) {
372 StateMachine state(default_scheduler_settings); 381 StateMachine state(default_scheduler_settings);
373 state.SetCanStart(); 382 state.SetCanStart();
374 state.UpdateState(state.NextAction()); 383 state.UpdateState(state.NextAction());
375 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 384 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
376 state.SetCommitState(all_commit_states[i]); 385 state.SetCommitState(all_commit_states[i]);
377 bool visible = j; 386 state.SetBeginFrameState(all_begin_frame_states[j]);
378 if (!visible) { 387 bool visible = (all_begin_frame_states[j] !=
379 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 388 SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE);
380 state.SetVisible(false); 389 state.SetVisible(visible);
381 } else {
382 state.SetVisible(true);
383 }
384 390
385 // Case 1: needs_commit=false 391 // Case 1: needs_commit=false
386 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, 392 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
387 state.NextAction()); 393 state.NextAction());
388 394
389 // Case 2: needs_commit=true 395 // Case 2: needs_commit=true
390 state.SetNeedsCommit(); 396 state.SetNeedsCommit();
391 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, 397 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
392 state.NextAction()); 398 state.NextAction())
399 << *state.AsValue();
393 } 400 }
394 } 401 }
395 402
396 // When in BeginFrame, or not in BeginFrame but needs_forced_dedraw 403 // When in BeginFrame deadline we should always draw for SetNeedsRedraw or
397 // set, should always draw except if you're ready to commit, in which case 404 // SetNeedsForcedRedrawForReadback have been called... except if we're
398 // commit. 405 // ready to commit, in which case we expect a commit first.
399 for (size_t i = 0; i < num_commit_states; ++i) { 406 for (size_t i = 0; i < num_commit_states; ++i) {
400 for (size_t j = 0; j < 2; ++j) { 407 for (size_t j = 0; j < 2; ++j) {
401 bool request_readback = j; 408 bool request_readback = j;
402 409
403 // Skip invalid states 410 // Skip invalid states
404 if (request_readback && 411 if (request_readback &&
405 (SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW != 412 (SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW !=
406 all_commit_states[i])) 413 all_commit_states[i]))
407 continue; 414 continue;
408 415
409 StateMachine state(default_scheduler_settings); 416 StateMachine state(default_scheduler_settings);
410 state.SetCanStart(); 417 state.SetCanStart();
411 state.UpdateState(state.NextAction()); 418 state.UpdateState(state.NextAction());
412 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 419 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
413 state.SetCanDraw(true); 420 state.SetCanDraw(true);
414 state.SetCommitState(all_commit_states[i]); 421 state.SetCommitState(all_commit_states[i]);
415 if (!request_readback) { 422 state.SetBeginFrameState(
416 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 423 SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE);
424 if (request_readback) {
425 state.SetNeedsForcedRedrawForReadback();
426 } else {
417 state.SetNeedsRedraw(true); 427 state.SetNeedsRedraw(true);
418 state.SetVisible(true); 428 state.SetVisible(true);
419 } else {
420 state.SetNeedsForcedRedrawForReadback();
421 } 429 }
422 430
423 SchedulerStateMachine::Action expected_action; 431 SchedulerStateMachine::Action expected_action;
424 if (all_commit_states[i] != 432 if (all_commit_states[i] ==
425 SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT) { 433 SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT) {
434 expected_action = SchedulerStateMachine::ACTION_COMMIT;
435 } else if (request_readback) {
436 if (all_commit_states[i] ==
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 {
426 expected_action = 442 expected_action =
427 request_readback 443 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE;
428 ? SchedulerStateMachine::ACTION_DRAW_AND_READBACK
429 : SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE;
430 } else {
431 expected_action = SchedulerStateMachine::ACTION_COMMIT;
432 } 444 }
433 445
434 // Case 1: needs_commit=false. 446 // Case 1: needs_commit=false.
435 EXPECT_NE(state.BeginFrameNeededToDrawByImplThread(), request_readback) 447 EXPECT_NE(state.BeginFrameNeededToDrawByImplThread(), request_readback)
436 << *state.AsValue(); 448 << *state.AsValue();
437 EXPECT_EQ(expected_action, state.NextAction()) << *state.AsValue(); 449 EXPECT_EQ(expected_action, state.NextAction()) << *state.AsValue();
438 450
439 // Case 2: needs_commit=true. 451 // Case 2: needs_commit=true.
440 state.SetNeedsCommit(); 452 state.SetNeedsCommit();
441 EXPECT_NE(state.BeginFrameNeededToDrawByImplThread(), request_readback) 453 EXPECT_NE(state.BeginFrameNeededToDrawByImplThread(), request_readback)
(...skipping 11 matching lines...) Expand all
453 for (size_t i = 0; i < num_commit_states; ++i) { 465 for (size_t i = 0; i < num_commit_states; ++i) {
454 // There shouldn't be any drawing regardless of BeginFrame. 466 // There shouldn't be any drawing regardless of BeginFrame.
455 for (size_t j = 0; j < 2; ++j) { 467 for (size_t j = 0; j < 2; ++j) {
456 StateMachine state(default_scheduler_settings); 468 StateMachine state(default_scheduler_settings);
457 state.SetCanStart(); 469 state.SetCanStart();
458 state.UpdateState(state.NextAction()); 470 state.UpdateState(state.NextAction());
459 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 471 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
460 state.SetCommitState(all_commit_states[i]); 472 state.SetCommitState(all_commit_states[i]);
461 state.SetVisible(false); 473 state.SetVisible(false);
462 state.SetNeedsRedraw(true); 474 state.SetNeedsRedraw(true);
463 if (j == 1) 475 if (j == 1) {
464 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 476 state.SetBeginFrameState(
477 SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE);
478 }
465 479
466 // Case 1: needs_commit=false. 480 // Case 1: needs_commit=false.
467 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, 481 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
468 state.NextAction()); 482 state.NextAction());
469 483
470 // Case 2: needs_commit=true. 484 // Case 2: needs_commit=true.
471 state.SetNeedsCommit(); 485 state.SetNeedsCommit();
472 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, 486 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
473 state.NextAction()); 487 state.NextAction())
488 << *state.AsValue();
474 } 489 }
475 } 490 }
476 } 491 }
477 492
478 TEST(SchedulerStateMachineTest, TestCanRedraw_StopsDraw) { 493 TEST(SchedulerStateMachineTest, TestCanRedraw_StopsDraw) {
479 SchedulerSettings default_scheduler_settings; 494 SchedulerSettings default_scheduler_settings;
480 495
481 size_t num_commit_states = 496 size_t num_commit_states =
482 sizeof(all_commit_states) / sizeof(SchedulerStateMachine::CommitState); 497 sizeof(all_commit_states) / sizeof(SchedulerStateMachine::CommitState);
483 for (size_t i = 0; i < num_commit_states; ++i) { 498 for (size_t i = 0; i < num_commit_states; ++i) {
484 // There shouldn't be any drawing regardless of BeginFrame. 499 // There shouldn't be any drawing regardless of BeginFrame.
485 for (size_t j = 0; j < 2; ++j) { 500 for (size_t j = 0; j < 2; ++j) {
486 StateMachine state(default_scheduler_settings); 501 StateMachine state(default_scheduler_settings);
487 state.SetCanStart(); 502 state.SetCanStart();
488 state.UpdateState(state.NextAction()); 503 state.UpdateState(state.NextAction());
489 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 504 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
490 state.SetCommitState(all_commit_states[i]); 505 state.SetCommitState(all_commit_states[i]);
491 state.SetVisible(false); 506 state.SetVisible(false);
492 state.SetNeedsRedraw(true); 507 state.SetNeedsRedraw(true);
493 if (j == 1) 508 if (j == 1)
494 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 509 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
495 510
496 state.SetCanDraw(false); 511 state.SetCanDraw(false);
497 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, 512 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
498 state.NextAction()); 513 state.NextAction());
499 } 514 }
500 } 515 }
501 } 516 }
502 517
503 TEST(SchedulerStateMachineTest, 518 TEST(SchedulerStateMachineTest,
504 TestCanRedrawWithWaitingForFirstDrawMakesProgress) { 519 TestCanRedrawWithWaitingForFirstDrawMakesProgress) {
505 SchedulerSettings default_scheduler_settings; 520 SchedulerSettings default_scheduler_settings;
506 StateMachine state(default_scheduler_settings); 521 StateMachine state(default_scheduler_settings);
507 state.SetCanStart(); 522 state.SetCanStart();
508 state.UpdateState(state.NextAction()); 523 state.UpdateState(state.NextAction());
509 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 524 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
510 525
511 state.SetVisible(true); 526 state.SetCommitState(
512 state.SetNeedsCommit(); 527 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW);
513 EXPECT_ACTION_UPDATE_STATE( 528 state.SetActiveTreeNeedsFirstDraw(true);
514 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
515 state.FinishCommit();
516 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
517 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
518 state.CommitState());
519
520 state.SetNeedsCommit(); 529 state.SetNeedsCommit();
521 state.SetNeedsRedraw(true); 530 state.SetNeedsRedraw(true);
522 state.SetVisible(true); 531 state.SetVisible(true);
523 state.SetCanDraw(false); 532 state.SetCanDraw(false);
524 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT) 533 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
525 534 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
526 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
527 EXPECT_ACTION_UPDATE_STATE( 535 EXPECT_ACTION_UPDATE_STATE(
528 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); 536 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
529 state.DidLeaveBeginFrame(); 537 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
538 state.FinishCommit();
539 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
540 state.OnBeginFrameDeadline();
541 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
530 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 542 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
531 } 543 }
532 544
533 TEST(SchedulerStateMachineTest, TestsetNeedsCommitIsNotLost) { 545 TEST(SchedulerStateMachineTest, TestsetNeedsCommitIsNotLost) {
534 SchedulerSettings default_scheduler_settings; 546 SchedulerSettings default_scheduler_settings;
535 StateMachine state(default_scheduler_settings); 547 StateMachine state(default_scheduler_settings);
536 state.SetCanStart(); 548 state.SetCanStart();
537 state.UpdateState(state.NextAction()); 549 state.UpdateState(state.NextAction());
538 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 550 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
539 state.SetNeedsCommit(); 551 state.SetNeedsCommit();
540 state.SetVisible(true); 552 state.SetVisible(true);
541 state.SetCanDraw(true); 553 state.SetCanDraw(true);
542 554
555 EXPECT_TRUE(state.BeginFrameNeededByImplThread());
556
543 // Begin the frame. 557 // Begin the frame.
544 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 558 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
545 state.NextAction()); 559 EXPECT_ACTION_UPDATE_STATE(
546 state.UpdateState(state.NextAction()); 560 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
547 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 561 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
548 state.CommitState()); 562 state.CommitState());
549 563
550 // Now, while the frame is in progress, set another commit. 564 // Now, while the frame is in progress, set another commit.
551 state.SetNeedsCommit(); 565 state.SetNeedsCommit();
552 EXPECT_TRUE(state.NeedsCommit()); 566 EXPECT_TRUE(state.NeedsCommit());
553 567
554 // Let the frame finish. 568 // Let the frame finish.
555 state.FinishCommit(); 569 state.FinishCommit();
556 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, 570 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
557 state.CommitState()); 571 state.CommitState());
558 572
559 // Expect to commit regardless of BeginFrame state. 573 // Expect to commit regardless of BeginFrame state.
560 state.DidLeaveBeginFrame(); 574 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_BEGIN_FRAME,
575 state.begin_frame_state());
561 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); 576 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
562 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 577
578 state.AdvanceBeginFrameStateWhenNoActionsRemain();
579 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_DEADLINE_PENDING,
580 state.begin_frame_state());
581 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
582
583 state.OnBeginFrameDeadline();
584 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE,
585 state.begin_frame_state());
586 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
587
588 state.AdvanceBeginFrameStateWhenNoActionsRemain();
589 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_IDLE,
590 state.begin_frame_state());
591 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
592
593 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
594 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_BEGIN_FRAME,
595 state.begin_frame_state());
563 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); 596 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
564 597
565 // Commit and make sure we draw on next BeginFrame 598 // Commit and make sure we draw on next BeginFrame
566 state.UpdateState(SchedulerStateMachine::ACTION_COMMIT); 599 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
567 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, 600 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
568 state.NextAction()); 601 state.OnBeginFrameDeadline();
569 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 602 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
570 state.CommitState()); 603 state.CommitState());
571 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 604 EXPECT_ACTION_UPDATE_STATE(
605 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
572 state.DidDrawIfPossibleCompleted(true); 606 state.DidDrawIfPossibleCompleted(true);
573 607
574 // Verify that another commit will begin. 608 // Verify that another commit will start immediately after draw.
575 state.DidLeaveBeginFrame(); 609 EXPECT_ACTION_UPDATE_STATE(
576 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 610 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
577 state.NextAction()); 611 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
578 } 612 }
579 613
580 TEST(SchedulerStateMachineTest, TestFullCycle) { 614 TEST(SchedulerStateMachineTest, TestFullCycle) {
581 SchedulerSettings default_scheduler_settings; 615 SchedulerSettings default_scheduler_settings;
582 StateMachine state(default_scheduler_settings); 616 StateMachine state(default_scheduler_settings);
583 state.SetCanStart(); 617 state.SetCanStart();
584 state.UpdateState(state.NextAction()); 618 state.UpdateState(state.NextAction());
585 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 619 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
586 state.SetVisible(true); 620 state.SetVisible(true);
587 state.SetCanDraw(true); 621 state.SetCanDraw(true);
588 622
589 // Start clean and set commit. 623 // Start clean and set commit.
590 state.SetNeedsCommit(); 624 state.SetNeedsCommit();
591 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
592 state.NextAction());
593 625
594 // Begin the frame. 626 // Begin the frame.
595 state.UpdateState( 627 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
628 EXPECT_ACTION_UPDATE_STATE(
596 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); 629 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
597 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 630 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
598 state.CommitState()); 631 state.CommitState());
599 EXPECT_FALSE(state.NeedsCommit()); 632 EXPECT_FALSE(state.NeedsCommit());
600 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 633 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
601 634
602 // Tell the scheduler the frame finished. 635 // Tell the scheduler the frame finished.
603 state.FinishCommit(); 636 state.FinishCommit();
604 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, 637 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
605 state.CommitState()); 638 state.CommitState());
606 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
607 639
608 // Commit. 640 // Commit.
609 state.UpdateState(SchedulerStateMachine::ACTION_COMMIT); 641 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
610 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 642 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
611 state.CommitState()); 643 state.CommitState());
612 EXPECT_TRUE(state.NeedsRedraw()); 644 EXPECT_TRUE(state.NeedsRedraw());
613 645
614 // Expect to do nothing until BeginFrame. 646 // Expect to do nothing until BeginFrame deadline
615 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 647 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
616 648
617 // At BeginFrame, draw. 649 // At BeginFrame deadline, draw.
618 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 650 state.OnBeginFrameDeadline();
619 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, 651 EXPECT_ACTION_UPDATE_STATE(
620 state.NextAction()); 652 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
621 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
622 state.DidDrawIfPossibleCompleted(true); 653 state.DidDrawIfPossibleCompleted(true);
623 state.DidLeaveBeginFrame();
624 654
625 // Should be synchronized, no draw needed, no action needed. 655 // Should be synchronized, no draw needed, no action needed.
656 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
626 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); 657 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
627 EXPECT_FALSE(state.NeedsRedraw()); 658 EXPECT_FALSE(state.NeedsRedraw());
628 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
629 } 659 }
630 660
631 TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) { 661 TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) {
632 SchedulerSettings default_scheduler_settings; 662 SchedulerSettings default_scheduler_settings;
633 StateMachine state(default_scheduler_settings); 663 StateMachine state(default_scheduler_settings);
634 state.SetCanStart(); 664 state.SetCanStart();
635 state.UpdateState(state.NextAction()); 665 state.UpdateState(state.NextAction());
636 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 666 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
637 state.SetVisible(true); 667 state.SetVisible(true);
638 state.SetCanDraw(true); 668 state.SetCanDraw(true);
639 669
640 // Start clean and set commit. 670 // Start clean and set commit.
641 state.SetNeedsCommit(); 671 state.SetNeedsCommit();
642 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
643 state.NextAction());
644 672
645 // Begin the frame. 673 // Begin the frame.
646 state.UpdateState( 674 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
675 EXPECT_ACTION_UPDATE_STATE(
647 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); 676 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
648 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 677 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
649 state.CommitState()); 678 state.CommitState());
650 EXPECT_FALSE(state.NeedsCommit()); 679 EXPECT_FALSE(state.NeedsCommit());
651 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 680 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
652 681
653 // Request another commit while the commit is in flight. 682 // Request another commit while the commit is in flight.
654 state.SetNeedsCommit(); 683 state.SetNeedsCommit();
655 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 684 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
656 685
657 // Tell the scheduler the frame finished. 686 // Tell the scheduler the frame finished.
658 state.FinishCommit(); 687 state.FinishCommit();
659 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, 688 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
660 state.CommitState()); 689 state.CommitState());
661 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
662 690
663 // Commit. 691 // First commit.
664 state.UpdateState(SchedulerStateMachine::ACTION_COMMIT); 692 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
665 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 693 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
666 state.CommitState()); 694 state.CommitState());
667 EXPECT_TRUE(state.NeedsRedraw()); 695 EXPECT_TRUE(state.NeedsRedraw());
668 696
669 // Expect to do nothing until BeginFrame. 697 // Expect to do nothing until BeginFrame deadline.
670 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 698 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
671 699
672 // At BeginFrame, draw. 700 // At BeginFrame deadline, draw.
673 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 701 state.OnBeginFrameDeadline();
674 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, 702 EXPECT_ACTION_UPDATE_STATE(
675 state.NextAction()); 703 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
676 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
677 state.DidDrawIfPossibleCompleted(true); 704 state.DidDrawIfPossibleCompleted(true);
678 state.DidLeaveBeginFrame();
679 705
680 // Should be synchronized, no draw needed, no action needed. 706 // Should be synchronized, no draw needed, no action needed.
707 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
681 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); 708 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
682 EXPECT_FALSE(state.NeedsRedraw()); 709 EXPECT_FALSE(state.NeedsRedraw());
683 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 710
684 state.NextAction()); 711 // Next BeginFrame should initiate second commit.
712 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
713 EXPECT_ACTION_UPDATE_STATE(
714 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
685 } 715 }
686 716
687 TEST(SchedulerStateMachineTest, TestRequestCommitInvisible) { 717 TEST(SchedulerStateMachineTest, TestRequestCommitInvisible) {
688 SchedulerSettings default_scheduler_settings; 718 SchedulerSettings default_scheduler_settings;
689 StateMachine state(default_scheduler_settings); 719 StateMachine state(default_scheduler_settings);
690 state.SetCanStart(); 720 state.SetCanStart();
691 state.UpdateState(state.NextAction()); 721 state.UpdateState(state.NextAction());
692 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 722 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
693 state.SetNeedsCommit(); 723 state.SetNeedsCommit();
694 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 724 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
695 } 725 }
696 726
697 TEST(SchedulerStateMachineTest, TestGoesInvisibleBeforeFinishCommit) { 727 TEST(SchedulerStateMachineTest, TestGoesInvisibleBeforeFinishCommit) {
698 SchedulerSettings default_scheduler_settings; 728 SchedulerSettings default_scheduler_settings;
699 StateMachine state(default_scheduler_settings); 729 StateMachine state(default_scheduler_settings);
700 state.SetCanStart(); 730 state.SetCanStart();
701 state.UpdateState(state.NextAction()); 731 state.UpdateState(state.NextAction());
702 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 732 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
703 state.SetVisible(true); 733 state.SetVisible(true);
704 state.SetCanDraw(true); 734 state.SetCanDraw(true);
705 735
706 // Start clean and set commit. 736 // Start clean and set commit.
707 state.SetNeedsCommit(); 737 state.SetNeedsCommit();
708 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
709 state.NextAction());
710 738
711 // Begin the frame while visible. 739 // Begin the frame while visible.
712 state.UpdateState( 740 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
741 EXPECT_ACTION_UPDATE_STATE(
713 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); 742 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
714 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 743 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
715 state.CommitState()); 744 state.CommitState());
716 EXPECT_FALSE(state.NeedsCommit()); 745 EXPECT_FALSE(state.NeedsCommit());
717 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 746 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
718 747
719 // Become invisible and abort the main thread's begin frame. 748 // Become invisible and abort the main thread's begin frame.
720 state.SetVisible(false); 749 state.SetVisible(false);
721 state.BeginFrameAbortedByMainThread(false); 750 state.BeginFrameAbortedByMainThread(false);
722 751
723 // We should now be back in the idle state as if we didn't start a frame at 752 // We should now be back in the idle state as if we never started the frame.
724 // all.
725 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); 753 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
726 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 754 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
755
756 // We shouldn't do anything on the BeginFrame deadline.
757 state.OnBeginFrameDeadline();
758 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
727 759
728 // Become visible again. 760 // Become visible again.
729 state.SetVisible(true); 761 state.SetVisible(true);
730 762
731 // Although we have aborted on this frame and haven't cancelled the commit 763 // Although we have aborted on this frame and haven't cancelled the commit
732 // (i.e. need another), don't send another begin frame yet. 764 // (i.e. need another), don't send another begin frame yet.
733 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); 765 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
734 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 766 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
735 EXPECT_TRUE(state.NeedsCommit()); 767 EXPECT_TRUE(state.NeedsCommit());
736 768
737 // Start a new frame. 769 // Start a new frame.
738 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 770 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
739 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 771 EXPECT_ACTION_UPDATE_STATE(
740 state.NextAction()); 772 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
741
742 // Begin the frame.
743 state.UpdateState(state.NextAction());
744 773
745 // We should be starting the commit now. 774 // We should be starting the commit now.
746 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 775 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
747 state.CommitState()); 776 state.CommitState());
777 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
748 } 778 }
749 779
750 TEST(SchedulerStateMachineTest, AbortBeginFrameAndCancelCommit) { 780 TEST(SchedulerStateMachineTest, AbortBeginFrameAndCancelCommit) {
751 SchedulerSettings default_scheduler_settings; 781 SchedulerSettings default_scheduler_settings;
752 StateMachine state(default_scheduler_settings); 782 StateMachine state(default_scheduler_settings);
753 state.SetCanStart(); 783 state.SetCanStart();
754 state.UpdateState(state.NextAction()); 784 state.UpdateState(state.NextAction());
755 state.DidCreateAndInitializeOutputSurface(); 785 state.DidCreateAndInitializeOutputSurface();
756 state.SetVisible(true); 786 state.SetVisible(true);
757 state.SetCanDraw(true); 787 state.SetCanDraw(true);
758 788
759 // Get into a begin frame / commit state. 789 // Get into a begin frame / commit state.
760 state.SetNeedsCommit(); 790 state.SetNeedsCommit();
761 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 791
762 state.NextAction()); 792 EXPECT_ACTION_UPDATE_STATE(
763 state.UpdateState(
764 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); 793 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
765 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 794 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
766 state.CommitState()); 795 state.CommitState());
767 EXPECT_FALSE(state.NeedsCommit()); 796 EXPECT_FALSE(state.NeedsCommit());
768 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 797 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
769 798
770 // Abort the commit, cancelling future commits. 799 // Abort the commit, cancelling future commits.
771 state.BeginFrameAbortedByMainThread(true); 800 state.BeginFrameAbortedByMainThread(true);
772 801
773 // Verify that another commit doesn't start on the same frame. 802 // Verify that another commit doesn't start on the same frame.
774 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); 803 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
775 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 804 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
776 EXPECT_FALSE(state.NeedsCommit()); 805 EXPECT_FALSE(state.NeedsCommit());
777 806
778 // Start a new frame; draw because this is the first frame since output 807 // Start a new frame; draw because this is the first frame since output
779 // surface init'd. 808 // surface init'd.
780 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 809 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
781 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, 810 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
782 state.NextAction()) 811 state.OnBeginFrameDeadline();
783 << *state.AsValue(); 812 EXPECT_ACTION_UPDATE_STATE(
784 state.DidLeaveBeginFrame(); 813 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
785 814
786 // Verify another commit doesn't start on another frame either. 815 // Verify another commit doesn't start on another frame either.
787 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); 816 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
788 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 817 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
789 EXPECT_FALSE(state.NeedsCommit()); 818 EXPECT_FALSE(state.NeedsCommit());
790 819
791 // Verify another commit can start if requested, though. 820 // Verify another commit can start if requested, though.
792 state.SetNeedsCommit(); 821 state.SetNeedsCommit();
793 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); 822 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
794 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 823 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
795 state.NextAction()); 824 state.NextAction());
796 } 825 }
797 826
798 TEST(SchedulerStateMachineTest, TestFirstContextCreation) { 827 TEST(SchedulerStateMachineTest, TestFirstContextCreation) {
799 SchedulerSettings default_scheduler_settings; 828 SchedulerSettings default_scheduler_settings;
800 StateMachine state(default_scheduler_settings); 829 StateMachine state(default_scheduler_settings);
801 state.SetCanStart(); 830 state.SetCanStart();
802 state.SetVisible(true); 831 state.SetVisible(true);
803 state.SetCanDraw(true); 832 state.SetCanDraw(true);
804 833
805 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 834 EXPECT_ACTION_UPDATE_STATE(
806 state.NextAction()); 835 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION);
807 state.UpdateState(state.NextAction()); 836 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
808 state.DidCreateAndInitializeOutputSurface(); 837 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
809 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
810 838
811 // Check that the first init does not SetNeedsCommit. 839 // Check that the first init does not SetNeedsCommit.
840 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
841 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
842 state.OnBeginFrameDeadline();
843 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
844
845 // Check that a needs commit initiates a BeginFrame to the main thread.
812 state.SetNeedsCommit(); 846 state.SetNeedsCommit();
813 EXPECT_NE(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 847 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
848 EXPECT_ACTION_UPDATE_STATE(
849 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
814 } 850 }
815 851
816 TEST(SchedulerStateMachineTest, TestContextLostWhenCompletelyIdle) { 852 TEST(SchedulerStateMachineTest, TestContextLostWhenCompletelyIdle) {
817 SchedulerSettings default_scheduler_settings; 853 SchedulerSettings default_scheduler_settings;
818 StateMachine state(default_scheduler_settings); 854 StateMachine state(default_scheduler_settings);
819 state.SetCanStart(); 855 state.SetCanStart();
820 state.UpdateState(state.NextAction()); 856 state.UpdateState(state.NextAction());
821 state.DidCreateAndInitializeOutputSurface(); 857 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
822 858
823 state.SetVisible(true); 859 state.SetVisible(true);
824 state.SetCanDraw(true); 860 state.SetCanDraw(true);
825 861
826 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 862 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
827 state.NextAction()); 863 state.NextAction());
828 state.DidLoseOutputSurface(); 864 state.DidLoseOutputSurface();
829 865
830 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 866 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
831 state.NextAction()); 867 state.NextAction());
832 state.UpdateState(state.NextAction()); 868 state.UpdateState(state.NextAction());
833 869
834 // Once context recreation begins, nothing should happen. 870 // Once context recreation begins, nothing should happen.
835 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 871 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
836 872
837 // Recreate the context. 873 // Recreate the context.
838 state.DidCreateAndInitializeOutputSurface(); 874 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
839 875
840 // When the context is recreated, we should begin a commit. 876 // When the context is recreated, we should begin a commit.
841 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 877 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
842 state.NextAction()); 878 EXPECT_ACTION_UPDATE_STATE(
843 state.UpdateState(state.NextAction()); 879 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
844 } 880 }
845 881
846 TEST(SchedulerStateMachineTest, 882 TEST(SchedulerStateMachineTest,
847 TestContextLostWhenIdleAndCommitRequestedWhileRecreating) { 883 TestContextLostWhenIdleAndCommitRequestedWhileRecreating) {
848 SchedulerSettings default_scheduler_settings; 884 SchedulerSettings default_scheduler_settings;
849 StateMachine state(default_scheduler_settings); 885 StateMachine state(default_scheduler_settings);
850 state.SetCanStart(); 886 state.SetCanStart();
851 state.UpdateState(state.NextAction()); 887 state.UpdateState(state.NextAction());
852 state.DidCreateAndInitializeOutputSurface(); 888 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
853 state.SetVisible(true); 889 state.SetVisible(true);
854 state.SetCanDraw(true); 890 state.SetCanDraw(true);
855 891
856 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 892 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
857 state.NextAction()); 893 state.NextAction());
858 state.DidLoseOutputSurface(); 894 state.DidLoseOutputSurface();
859 895
860 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 896 EXPECT_ACTION_UPDATE_STATE(
861 state.NextAction()); 897 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION);
862 state.UpdateState(state.NextAction());
863 898
864 // Once context recreation begins, nothing should happen. 899 // Once context recreation begins, nothing should happen.
865 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 900 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
901 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
902 state.OnBeginFrameDeadline();
903 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
866 904
867 // While context is recreating, commits shouldn't begin. 905 // While context is recreating, commits shouldn't begin.
868 state.SetNeedsCommit(); 906 state.SetNeedsCommit();
869 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 907 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
908 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
909 state.OnBeginFrameDeadline();
910 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
870 911
871 // Recreate the context 912 // Recreate the context
872 state.DidCreateAndInitializeOutputSurface(); 913 state.DidCreateAndInitializeOutputSurface();
873 EXPECT_FALSE(state.RedrawPending()); 914 EXPECT_FALSE(state.RedrawPending());
874 915
875 // When the context is recreated, we should begin a commit 916 // When the context is recreated, we should begin a commit
876 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 917 EXPECT_ACTION_UPDATE_STATE(
877 state.NextAction()); 918 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
878 state.UpdateState(state.NextAction()); 919 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
879 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 920 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
880 state.CommitState()); 921 state.CommitState());
881 state.FinishCommit(); 922 state.FinishCommit();
882 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); 923 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
883 state.UpdateState(state.NextAction()); 924 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
884 // Finishing the first commit after initializing an output surface should 925 // Finishing the first commit after initializing an output surface should
885 // automatically cause a redraw. 926 // automatically cause a redraw.
886 EXPECT_TRUE(state.RedrawPending()); 927 EXPECT_TRUE(state.RedrawPending());
887 928
888 // Once the context is recreated, whether we draw should be based on 929 // Once the context is recreated, whether we draw should be based on
889 // SetCanDraw. 930 // SetCanDraw.
890 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 931 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
932 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
933 state.OnBeginFrameDeadline();
891 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, 934 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
892 state.NextAction()); 935 state.NextAction());
893 state.SetCanDraw(false); 936 state.SetCanDraw(false);
894 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT, 937 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT,
895 state.NextAction()); 938 state.NextAction());
896 state.SetCanDraw(true); 939 state.SetCanDraw(true);
897 state.DidLeaveBeginFrame(); 940 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
941 state.NextAction());
898 } 942 }
899 943
900 TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) { 944 TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) {
901 SchedulerSettings default_scheduler_settings; 945 SchedulerSettings default_scheduler_settings;
902 StateMachine state(default_scheduler_settings); 946 StateMachine state(default_scheduler_settings);
903 state.SetCanStart(); 947 state.SetCanStart();
904 state.UpdateState(state.NextAction()); 948 state.UpdateState(state.NextAction());
905 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 949 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
906 state.SetVisible(true); 950 state.SetVisible(true);
907 state.SetCanDraw(true); 951 state.SetCanDraw(true);
908 952
909 // Get a commit in flight. 953 // Get a commit in flight.
910 state.SetNeedsCommit(); 954 state.SetNeedsCommit();
911 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 955 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
912 state.NextAction());
913 state.UpdateState(state.NextAction());
914 956
915 // Set damage and expect a draw. 957 // Set damage and expect a draw.
916 state.SetNeedsRedraw(true); 958 state.SetNeedsRedraw(true);
917 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 959 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
918 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, 960 EXPECT_ACTION_UPDATE_STATE(
919 state.NextAction()); 961 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
920 state.UpdateState(state.NextAction()); 962 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
921 state.DidLeaveBeginFrame(); 963 state.OnBeginFrameDeadline();
964 EXPECT_ACTION_UPDATE_STATE(
965 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
966 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
922 967
923 // Cause a lost context while the begin frame is in flight 968 // Cause a lost context while the begin frame is in flight
924 // for the main thread. 969 // for the main thread.
925 state.DidLoseOutputSurface(); 970 state.DidLoseOutputSurface();
926 971
927 // Ask for another draw. Expect nothing happens. 972 // Ask for another draw. Expect nothing happens.
928 state.SetNeedsRedraw(true); 973 state.SetNeedsRedraw(true);
929 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 974 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
930 975
931 // Finish the frame, and commit. 976 // Finish the frame, and commit.
932 state.FinishCommit(); 977 state.FinishCommit();
933 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); 978 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
934 state.UpdateState(state.NextAction());
935 979
980 // 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.
936 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 982 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
937 state.CommitState()); 983 state.CommitState());
938 984 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
939 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT,
940 state.NextAction());
941 state.UpdateState(state.NextAction());
942 985
943 // Expect to be told to begin context recreation, independent of 986 // Expect to be told to begin context recreation, independent of
944 // BeginFrame state. 987 // BeginFrame state.
945 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 988 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_IDLE,
989 state.begin_frame_state());
946 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 990 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
947 state.NextAction()); 991 state.NextAction());
948 state.DidLeaveBeginFrame(); 992
993 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
994 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_BEGIN_FRAME,
995 state.begin_frame_state());
996 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
997 state.NextAction());
998
999 state.AdvanceBeginFrameStateWhenNoActionsRemain();
1000 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_DEADLINE_PENDING,
1001 state.begin_frame_state());
1002 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
1003 state.NextAction());
1004
1005 state.OnBeginFrameDeadline();
1006 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE,
1007 state.begin_frame_state());
949 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 1008 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
950 state.NextAction()); 1009 state.NextAction());
951 } 1010 }
952 1011
953 TEST(SchedulerStateMachineTest, 1012 TEST(SchedulerStateMachineTest,
954 TestContextLostWhileCommitInProgressAndAnotherCommitRequested) { 1013 TestContextLostWhileCommitInProgressAndAnotherCommitRequested) {
955 SchedulerSettings default_scheduler_settings; 1014 SchedulerSettings default_scheduler_settings;
956 StateMachine state(default_scheduler_settings); 1015 StateMachine state(default_scheduler_settings);
957 state.SetCanStart(); 1016 state.SetCanStart();
958 state.UpdateState(state.NextAction()); 1017 state.UpdateState(state.NextAction());
959 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1018 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
960 state.SetVisible(true); 1019 state.SetVisible(true);
961 state.SetCanDraw(true); 1020 state.SetCanDraw(true);
962 1021
963 // Get a commit in flight. 1022 // Get a commit in flight.
964 state.SetNeedsCommit(); 1023 state.SetNeedsCommit();
965 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 1024 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
966 state.NextAction());
967 state.UpdateState(state.NextAction());
968 1025
969 // Set damage and expect a draw. 1026 // Set damage and expect a draw.
970 state.SetNeedsRedraw(true); 1027 state.SetNeedsRedraw(true);
971 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 1028 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
972 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, 1029 EXPECT_ACTION_UPDATE_STATE(
973 state.NextAction()); 1030 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
974 state.UpdateState(state.NextAction()); 1031 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
975 state.DidLeaveBeginFrame(); 1032 state.OnBeginFrameDeadline();
1033 EXPECT_ACTION_UPDATE_STATE(
1034 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
1035 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
976 1036
977 // Cause a lost context while the begin frame is in flight 1037 // Cause a lost context while the begin frame is in flight
978 // for the main thread. 1038 // for the main thread.
979 state.DidLoseOutputSurface(); 1039 state.DidLoseOutputSurface();
980 1040
981 // Ask for another draw and also set needs commit. Expect nothing happens. 1041 // Ask for another draw and also set needs commit. Expect nothing happens.
982 state.SetNeedsRedraw(true); 1042 state.SetNeedsRedraw(true);
983 state.SetNeedsCommit(); 1043 state.SetNeedsCommit();
984 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 1044 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
985 1045
986 // Finish the frame, and commit. 1046 // Finish the frame, and commit.
987 state.FinishCommit(); 1047 state.FinishCommit();
988 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); 1048 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
989 state.UpdateState(state.NextAction());
990
991 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 1049 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
992 state.CommitState()); 1050 state.CommitState());
993 1051
994 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT, 1052 // Because the output surface is missing, we expect the draw to abort.
995 state.NextAction()); 1053 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
996 state.UpdateState(state.NextAction());
997 1054
998 // Expect to be told to begin context recreation, independent of 1055 // Expect to be told to begin context recreation, independent of
999 // BeginFrame state 1056 // BeginFrame state
1000 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 1057 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_IDLE,
1058 state.begin_frame_state());
1001 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 1059 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
1002 state.NextAction()); 1060 state.NextAction());
1003 state.DidLeaveBeginFrame(); 1061
1062 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
1063 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_BEGIN_FRAME,
1064 state.begin_frame_state());
1004 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 1065 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
1005 state.NextAction()); 1066 state.NextAction());
1067
1068 state.AdvanceBeginFrameStateWhenNoActionsRemain();
1069 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_DEADLINE_PENDING,
1070 state.begin_frame_state());
1071 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
1072 state.NextAction());
1073
1074 state.OnBeginFrameDeadline();
1075 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE,
1076 state.begin_frame_state());
1077 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
1078 state.NextAction());
1079
1080 // After we get a new output surface, the commit flow should start.
1081 EXPECT_ACTION_UPDATE_STATE(
1082 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION);
1083 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1084 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
1085 EXPECT_ACTION_UPDATE_STATE(
1086 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
1087 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1088 state.FinishCommit();
1089 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1090 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1091 state.OnBeginFrameDeadline();
1092 EXPECT_ACTION_UPDATE_STATE(
1093 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
1094 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1006 } 1095 }
1007 1096
1008 TEST(SchedulerStateMachineTest, TestFinishAllRenderingWhileContextLost) { 1097 TEST(SchedulerStateMachineTest, TestFinishAllRenderingWhileContextLost) {
1009 SchedulerSettings default_scheduler_settings; 1098 SchedulerSettings default_scheduler_settings;
1010 StateMachine state(default_scheduler_settings); 1099 StateMachine state(default_scheduler_settings);
1011 state.SetCanStart(); 1100 state.SetCanStart();
1012 state.UpdateState(state.NextAction()); 1101 state.UpdateState(state.NextAction());
1013 state.DidCreateAndInitializeOutputSurface(); 1102 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1014 state.SetVisible(true); 1103 state.SetVisible(true);
1015 state.SetCanDraw(true); 1104 state.SetCanDraw(true);
1016 1105
1017 // Cause a lost context lost. 1106 // Cause a lost context lost.
1018 state.DidLoseOutputSurface(); 1107 state.DidLoseOutputSurface();
1019 1108
1020 // Ask a forced redraw and verify it ocurrs, even with a lost context, 1109 // Ask a forced redraw for readback and verify it ocurrs.
1021 // independent of the BeginFrame stae. 1110 state.SetCommitState(
1111 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW);
1022 state.SetNeedsForcedRedrawForReadback(); 1112 state.SetNeedsForcedRedrawForReadback();
1113 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
1023 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); 1114 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
1115 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1024 1116
1025 // Forced redraws for readbacks need to be followed by a new commit 1117 // Forced redraws for readbacks need to be followed by a new commit
1026 // to replace the readback commit. 1118 // to replace the readback commit.
1027 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 1119 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
1028 state.CommitState()); 1120 state.CommitState());
1029 state.FinishCommit(); 1121 state.FinishCommit();
1030 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1122 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1031 1123
1032 // We don't yet have an output surface, so we the draw and swap should abort. 1124 // We don't yet have an output surface, so we the draw and swap should abort.
1033 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); 1125 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
1034 1126
1035 // Expect to be told to begin context recreation, independent of 1127 // Expect to be told to begin context recreation, independent of
1036 // BeginFrame state. 1128 // BeginFrame state
1037 EXPECT_ACTION_UPDATE_STATE( 1129 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
1038 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); 1130 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
1131 state.NextAction());
1039 1132
1040 // Ask a readback and verify it ocurrs. 1133 state.OnBeginFrameDeadline();
1134 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
1135 state.NextAction());
1136
1137 // Ask a readback and verify it occurs.
1138 state.SetCommitState(
1139 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW);
1041 state.SetNeedsForcedRedrawForReadback(); 1140 state.SetNeedsForcedRedrawForReadback();
1042 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_READBACK, 1141 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
1043 state.NextAction()); 1142 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1044 } 1143 }
1045 1144
1046 TEST(SchedulerStateMachineTest, DontDrawBeforeCommitAfterLostOutputSurface) { 1145 TEST(SchedulerStateMachineTest, DontDrawBeforeCommitAfterLostOutputSurface) {
1047 SchedulerSettings default_scheduler_settings; 1146 SchedulerSettings default_scheduler_settings;
1048 StateMachine state(default_scheduler_settings); 1147 StateMachine state(default_scheduler_settings);
1049 state.SetCanStart(); 1148 state.SetCanStart();
1050 state.UpdateState(state.NextAction()); 1149 state.UpdateState(state.NextAction());
1051 state.DidCreateAndInitializeOutputSurface(); 1150 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1052 state.SetVisible(true); 1151 state.SetVisible(true);
1053 state.SetCanDraw(true); 1152 state.SetCanDraw(true);
1054 1153
1055 state.SetNeedsRedraw(true); 1154 state.SetNeedsRedraw(true);
1056 1155
1057 // Cause a lost output surface, and restore it. 1156 // Cause a lost output surface, and restore it.
1058 state.DidLoseOutputSurface(); 1157 state.DidLoseOutputSurface();
1059 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 1158 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
1060 state.NextAction()); 1159 state.NextAction());
1061 state.UpdateState(state.NextAction()); 1160 state.UpdateState(state.NextAction());
1062 state.DidCreateAndInitializeOutputSurface(); 1161 state.DidCreateAndInitializeOutputSurface();
1063 1162
1064 EXPECT_FALSE(state.RedrawPending()); 1163 EXPECT_FALSE(state.RedrawPending());
1164 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
1065 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 1165 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
1066 state.NextAction()); 1166 state.NextAction());
1067 } 1167 }
1068 1168
1069 TEST(SchedulerStateMachineTest, 1169 TEST(SchedulerStateMachineTest,
1070 TestSendBeginFrameToMainThreadWhenInvisibleAndForceCommit) { 1170 TestSendBeginFrameToMainThreadWhenInvisibleAndForceCommit) {
1071 SchedulerSettings default_scheduler_settings; 1171 SchedulerSettings default_scheduler_settings;
1072 StateMachine state(default_scheduler_settings); 1172 StateMachine state(default_scheduler_settings);
1073 state.SetCanStart(); 1173 state.SetCanStart();
1074 state.UpdateState(state.NextAction()); 1174 state.UpdateState(state.NextAction());
1075 state.DidCreateAndInitializeOutputSurface(); 1175 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1076 state.SetVisible(false); 1176 state.SetVisible(false);
1077 state.SetNeedsCommit(); 1177 state.SetNeedsCommit();
1078 state.SetNeedsForcedCommitForReadback(); 1178 state.SetNeedsForcedCommitForReadback();
1079 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 1179 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
1080 state.NextAction()); 1180 state.NextAction());
1081 } 1181 }
1082 1182
1083 TEST(SchedulerStateMachineTest, 1183 TEST(SchedulerStateMachineTest,
1084 TestSendBeginFrameToMainThreadWhenCanStartFalseAndForceCommit) { 1184 TestSendBeginFrameToMainThreadWhenCanStartFalseAndForceCommit) {
1085 SchedulerSettings default_scheduler_settings; 1185 SchedulerSettings default_scheduler_settings;
1086 StateMachine state(default_scheduler_settings); 1186 StateMachine state(default_scheduler_settings);
1087 state.SetVisible(true); 1187 state.SetVisible(true);
1088 state.SetCanDraw(true); 1188 state.SetCanDraw(true);
1089 state.SetNeedsCommit(); 1189 state.SetNeedsCommit();
1090 state.SetNeedsForcedCommitForReadback(); 1190 state.SetNeedsForcedCommitForReadback();
1091 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 1191 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
1092 state.NextAction()); 1192 state.NextAction());
1093 } 1193 }
1094 1194
1095 TEST(SchedulerStateMachineTest, TestFinishCommitWhenCommitInProgress) { 1195 TEST(SchedulerStateMachineTest, TestFinishCommitWhenCommitInProgress) {
1096 SchedulerSettings default_scheduler_settings; 1196 SchedulerSettings default_scheduler_settings;
1097 StateMachine state(default_scheduler_settings); 1197 StateMachine state(default_scheduler_settings);
1098 state.SetCanStart(); 1198 state.SetCanStart();
1099 state.UpdateState(state.NextAction()); 1199 state.UpdateState(state.NextAction());
1100 state.DidCreateAndInitializeOutputSurface(); 1200 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1101 state.SetVisible(false); 1201 state.SetVisible(false);
1102 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS); 1202 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS);
1103 state.SetNeedsCommit(); 1203 state.SetNeedsCommit();
1104 1204
1105 state.FinishCommit(); 1205 state.FinishCommit();
1106 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); 1206 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
1107 state.UpdateState(state.NextAction()); 1207 state.UpdateState(state.NextAction());
1108 1208
1109 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 1209 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
1110 state.CommitState()); 1210 state.CommitState());
1111 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT, 1211 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
1112 state.NextAction());
1113 state.UpdateState(state.NextAction());
1114
1115 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
1116 } 1212 }
1117 1213
1118 TEST(SchedulerStateMachineTest, TestFinishCommitWhenForcedCommitInProgress) { 1214 TEST(SchedulerStateMachineTest, TestFinishCommitWhenForcedCommitInProgress) {
1119 SchedulerSettings default_scheduler_settings; 1215 SchedulerSettings default_scheduler_settings;
1120 StateMachine state(default_scheduler_settings); 1216 StateMachine state(default_scheduler_settings);
1121 state.SetCanStart(); 1217 state.SetCanStart();
1122 state.UpdateState(state.NextAction()); 1218 state.UpdateState(state.NextAction());
1123 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1219 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1124 state.SetVisible(false); 1220 state.SetVisible(false);
1125 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS); 1221 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS);
(...skipping 16 matching lines...) Expand all
1142 // The normal commit can then proceed. 1238 // The normal commit can then proceed.
1143 state.FinishCommit(); 1239 state.FinishCommit();
1144 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1240 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1145 } 1241 }
1146 1242
1147 TEST(SchedulerStateMachineTest, TestInitialActionsWhenContextLost) { 1243 TEST(SchedulerStateMachineTest, TestInitialActionsWhenContextLost) {
1148 SchedulerSettings default_scheduler_settings; 1244 SchedulerSettings default_scheduler_settings;
1149 StateMachine state(default_scheduler_settings); 1245 StateMachine state(default_scheduler_settings);
1150 state.SetCanStart(); 1246 state.SetCanStart();
1151 state.UpdateState(state.NextAction()); 1247 state.UpdateState(state.NextAction());
1152 state.DidCreateAndInitializeOutputSurface(); 1248 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1153 state.SetVisible(true); 1249 state.SetVisible(true);
1154 state.SetCanDraw(true); 1250 state.SetCanDraw(true);
1155 state.SetNeedsCommit(); 1251 state.SetNeedsCommit();
1156 state.DidLoseOutputSurface(); 1252 state.DidLoseOutputSurface();
1157 1253
1158 // When we are visible, we normally want to begin output surface creation 1254 // When we are visible, we normally want to begin output surface creation
1159 // as soon as possible. 1255 // as soon as possible.
1160 EXPECT_ACTION_UPDATE_STATE( 1256 EXPECT_ACTION_UPDATE_STATE(
1161 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); 1257 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION);
1162 1258
(...skipping 15 matching lines...) Expand all
1178 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 1274 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
1179 state.NextAction()) 1275 state.NextAction())
1180 << *state.AsValue(); 1276 << *state.AsValue();
1181 } 1277 }
1182 1278
1183 TEST(SchedulerStateMachineTest, TestImmediateFinishCommit) { 1279 TEST(SchedulerStateMachineTest, TestImmediateFinishCommit) {
1184 SchedulerSettings default_scheduler_settings; 1280 SchedulerSettings default_scheduler_settings;
1185 StateMachine state(default_scheduler_settings); 1281 StateMachine state(default_scheduler_settings);
1186 state.SetCanStart(); 1282 state.SetCanStart();
1187 state.UpdateState(state.NextAction()); 1283 state.UpdateState(state.NextAction());
1188 state.DidCreateAndInitializeOutputSurface(); 1284 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1189 state.SetVisible(true); 1285 state.SetVisible(true);
1190 state.SetCanDraw(true); 1286 state.SetCanDraw(true);
1191 1287
1192 // Schedule a readback, commit it, draw it. 1288 // Schedule a readback, commit it, draw it.
1193 state.SetNeedsCommit(); 1289 state.SetNeedsCommit();
1194 state.SetNeedsForcedCommitForReadback(); 1290 state.SetNeedsForcedCommitForReadback();
1195 EXPECT_ACTION_UPDATE_STATE( 1291 EXPECT_ACTION_UPDATE_STATE(
1196 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); 1292 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
1197 state.FinishCommit(); 1293 state.FinishCommit();
1198 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); 1294
1199 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, 1295 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
1200 state.CommitState()); 1296 state.CommitState());
1201 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1297 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1202 1298
1203 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 1299 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
1204 state.CommitState()); 1300 state.CommitState());
1205 1301
1206 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); 1302 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
1207 state.DidDrawIfPossibleCompleted(true); 1303 state.DidDrawIfPossibleCompleted(true);
1304
1208 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1305 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1209 1306
1210 // Should be waiting for the normal begin frame from the main thread. 1307 // Should be waiting for the normal begin frame from the main thread.
1211 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 1308 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
1212 state.CommitState()); 1309 state.CommitState());
1213 } 1310 }
1214 1311
1215 TEST(SchedulerStateMachineTest, TestImmediateFinishCommitDuringCommit) { 1312 TEST(SchedulerStateMachineTest, TestImmediateFinishCommitDuringCommit) {
1216 SchedulerSettings default_scheduler_settings; 1313 SchedulerSettings default_scheduler_settings;
1217 StateMachine state(default_scheduler_settings); 1314 StateMachine state(default_scheduler_settings);
1218 state.SetCanStart(); 1315 state.SetCanStart();
1219 state.UpdateState(state.NextAction()); 1316 state.UpdateState(state.NextAction());
1220 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1317 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1221 state.SetVisible(true); 1318 state.SetVisible(true);
1222 state.SetCanDraw(true); 1319 state.SetCanDraw(true);
1223 1320
1224 // Start a normal commit. 1321 // Start a normal commit.
1225 state.SetNeedsCommit(); 1322 state.SetNeedsCommit();
1323 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1324
1325 // Schedule a readback, commit it, draw it.
1326 state.SetNeedsForcedCommitForReadback();
1226 EXPECT_ACTION_UPDATE_STATE( 1327 EXPECT_ACTION_UPDATE_STATE(
1227 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); 1328 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
1228
1229 // Schedule a readback, commit it, draw it.
1230 state.SetNeedsCommit();
1231 state.SetNeedsForcedCommitForReadback();
1232 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1233 state.FinishCommit(); 1329 state.FinishCommit();
1234 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, 1330 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
1235 state.CommitState()); 1331 state.CommitState());
1236 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1332 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1237 1333
1238 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 1334 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
1239 state.CommitState()); 1335 state.CommitState());
1240 1336
1241 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); 1337 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
1242 state.DidDrawIfPossibleCompleted(true); 1338 state.DidDrawIfPossibleCompleted(true);
1243 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1339 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1244 1340
1245 // Should be waiting for the normal begin frame from the main thread. 1341 // Should be waiting for the normal begin frame from the main thread.
1246 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 1342 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
1247 state.CommitState()) 1343 state.CommitState())
1248 << *state.AsValue(); 1344 << *state.AsValue();
1249 } 1345 }
1250 1346
1251 TEST(SchedulerStateMachineTest, 1347 TEST(SchedulerStateMachineTest,
1252 ImmediateBeginFrameAbortedByMainThreadWhileInvisible) { 1348 ImmediateBeginFrameAbortedByMainThreadWhileInvisible) {
1253 SchedulerSettings default_scheduler_settings; 1349 SchedulerSettings default_scheduler_settings;
1254 StateMachine state(default_scheduler_settings); 1350 StateMachine state(default_scheduler_settings);
1255 state.SetCanStart(); 1351 state.SetCanStart();
1256 state.UpdateState(state.NextAction()); 1352 state.UpdateState(state.NextAction());
1257 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1353 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1258 state.SetVisible(true); 1354 state.SetVisible(true);
1259 state.SetCanDraw(true); 1355 state.SetCanDraw(true);
1260 1356
1261 state.SetNeedsCommit(); 1357 state.SetNeedsCommit();
1262 EXPECT_ACTION_UPDATE_STATE( 1358 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1263 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
1264 1359
1265 state.SetNeedsCommit(); 1360 state.SetNeedsCommit();
1266 state.SetNeedsForcedCommitForReadback(); 1361 state.SetNeedsForcedCommitForReadback();
1267 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1362 EXPECT_ACTION_UPDATE_STATE(
1363 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
1268 state.FinishCommit(); 1364 state.FinishCommit();
1269 1365
1270 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, 1366 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
1271 state.CommitState()); 1367 state.CommitState());
1272 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1368 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1273 1369
1274 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 1370 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
1275 state.CommitState()); 1371 state.CommitState());
1276 1372
1277 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); 1373 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1353 SchedulerSettings default_scheduler_settings; 1449 SchedulerSettings default_scheduler_settings;
1354 StateMachine state(default_scheduler_settings); 1450 StateMachine state(default_scheduler_settings);
1355 state.SetCanStart(); 1451 state.SetCanStart();
1356 state.UpdateState(state.NextAction()); 1452 state.UpdateState(state.NextAction());
1357 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1453 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1358 state.SetCanDraw(true); 1454 state.SetCanDraw(true);
1359 state.SetVisible(true); 1455 state.SetVisible(true);
1360 EXPECT_FALSE(state.PendingDrawsShouldBeAborted()); 1456 EXPECT_FALSE(state.PendingDrawsShouldBeAborted());
1361 1457
1362 state.SetMainThreadNeedsLayerTextures(); 1458 state.SetMainThreadNeedsLayerTextures();
1363 EXPECT_EQ( 1459 EXPECT_ACTION_UPDATE_STATE(
1364 SchedulerStateMachine::ACTION_ACQUIRE_LAYER_TEXTURES_FOR_MAIN_THREAD, 1460 SchedulerStateMachine::ACTION_ACQUIRE_LAYER_TEXTURES_FOR_MAIN_THREAD);
1365 state.NextAction());
1366 state.UpdateState(state.NextAction());
1367 EXPECT_TRUE(state.PendingDrawsShouldBeAborted()); 1461 EXPECT_TRUE(state.PendingDrawsShouldBeAborted());
1462 EXPECT_TRUE(state.PendingActivationsShouldBeForced());
1463
1464 state.SetNeedsCommit();
1465 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
1466 EXPECT_ACTION_UPDATE_STATE(
1467 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
1468 EXPECT_TRUE(state.PendingDrawsShouldBeAborted());
1469 EXPECT_TRUE(state.PendingActivationsShouldBeForced());
1368 1470
1369 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 1471 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
1370 1472
1371 state.SetNeedsCommit();
1372 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
1373 state.NextAction());
1374
1375 state.UpdateState(state.NextAction());
1376 EXPECT_TRUE(state.PendingDrawsShouldBeAborted());
1377
1378 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
1379
1380 state.FinishCommit(); 1473 state.FinishCommit();
1381 EXPECT_TRUE(state.PendingDrawsShouldBeAborted()); 1474 EXPECT_TRUE(state.PendingDrawsShouldBeAborted());
1382 1475
1383 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); 1476 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
1384 1477
1385 state.UpdateState(state.NextAction()); 1478 state.UpdateState(state.NextAction());
1386 EXPECT_FALSE(state.PendingDrawsShouldBeAborted()); 1479 EXPECT_FALSE(state.PendingDrawsShouldBeAborted());
1387 } 1480 }
1388 1481
1389 TEST(SchedulerStateMachineTest, AcquireTexturesWithAbort) { 1482 TEST(SchedulerStateMachineTest, AcquireTexturesWithAbort) {
1390 SchedulerSettings default_scheduler_settings; 1483 SchedulerSettings default_scheduler_settings;
1391 SchedulerStateMachine state(default_scheduler_settings); 1484 StateMachine state(default_scheduler_settings);
1392 state.SetCanStart(); 1485 state.SetCanStart();
1393 state.UpdateState(state.NextAction()); 1486 state.UpdateState(state.NextAction());
1394 state.DidCreateAndInitializeOutputSurface(); 1487 state.DidCreateAndInitializeOutputSurface();
1395 state.SetCanDraw(true); 1488 state.SetCanDraw(true);
1396 state.SetVisible(true); 1489 state.SetVisible(true);
1397 1490
1398 state.SetMainThreadNeedsLayerTextures(); 1491 state.SetMainThreadNeedsLayerTextures();
1399 EXPECT_EQ( 1492 EXPECT_EQ(
1400 SchedulerStateMachine::ACTION_ACQUIRE_LAYER_TEXTURES_FOR_MAIN_THREAD, 1493 SchedulerStateMachine::ACTION_ACQUIRE_LAYER_TEXTURES_FOR_MAIN_THREAD,
1401 state.NextAction()); 1494 state.NextAction());
(...skipping 11 matching lines...) Expand all
1413 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 1506 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
1414 1507
1415 state.BeginFrameAbortedByMainThread(true); 1508 state.BeginFrameAbortedByMainThread(true);
1416 1509
1417 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 1510 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
1418 EXPECT_FALSE(state.PendingDrawsShouldBeAborted()); 1511 EXPECT_FALSE(state.PendingDrawsShouldBeAborted());
1419 } 1512 }
1420 1513
1421 } // namespace 1514 } // namespace
1422 } // namespace cc 1515 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698