Chromium Code Reviews

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

Issue 761903003: Update from https://crrev.com/306655 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff |
« no previous file with comments | « cc/scheduler/scheduler_state_machine.cc ('k') | cc/scheduler/scheduler_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/scheduler/scheduler_state_machine.h" 5 #include "cc/scheduler/scheduler_state_machine.h"
6 6
7 #include "base/debug/trace_event.h" 7 #include "base/debug/trace_event.h"
8 #include "cc/scheduler/scheduler.h" 8 #include "cc/scheduler/scheduler.h"
9 #include "cc/test/begin_frame_args_test.h" 9 #include "cc/test/begin_frame_args_test.h"
10 #include "testing/gtest/include/gtest/gtest.h" 10 #include "testing/gtest/include/gtest/gtest.h"
(...skipping 26 matching lines...)
37 {SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE, 37 {SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE,
38 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING, 38 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING,
39 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME, 39 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME,
40 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE, }; 40 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE, };
41 41
42 const SchedulerStateMachine::CommitState all_commit_states[] = { 42 const SchedulerStateMachine::CommitState all_commit_states[] = {
43 SchedulerStateMachine::COMMIT_STATE_IDLE, 43 SchedulerStateMachine::COMMIT_STATE_IDLE,
44 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, 44 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT,
45 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED, 45 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED,
46 SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, 46 SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
47 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_ACTIVATION}; 47 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_ACTIVATION,
48 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_DRAW};
48 49
49 // Exposes the protected state fields of the SchedulerStateMachine for testing 50 // Exposes the protected state fields of the SchedulerStateMachine for testing
50 class StateMachine : public SchedulerStateMachine { 51 class StateMachine : public SchedulerStateMachine {
51 public: 52 public:
52 explicit StateMachine(const SchedulerSettings& scheduler_settings) 53 explicit StateMachine(const SchedulerSettings& scheduler_settings)
53 : SchedulerStateMachine(scheduler_settings) {} 54 : SchedulerStateMachine(scheduler_settings) {}
54 55
55 void CreateAndInitializeOutputSurfaceWithActivatedCommit() { 56 void CreateAndInitializeOutputSurfaceWithActivatedCommit() {
56 DidCreateAndInitializeOutputSurface(); 57 DidCreateAndInitializeOutputSurface();
57 output_surface_state_ = OUTPUT_SURFACE_ACTIVE; 58 output_surface_state_ = OUTPUT_SURFACE_ACTIVE;
(...skipping 57 matching lines...)
115 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION) 116 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION)
116 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 117 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
117 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); 118 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE);
118 state.SetNeedsRedraw(false); 119 state.SetNeedsRedraw(false);
119 state.SetVisible(true); 120 state.SetVisible(true);
120 121
121 EXPECT_FALSE(state.BeginFrameNeeded()); 122 EXPECT_FALSE(state.BeginFrameNeeded());
122 123
123 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 124 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
124 EXPECT_FALSE(state.BeginFrameNeeded()); 125 EXPECT_FALSE(state.BeginFrameNeeded());
125 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 126 state.OnBeginImplFrame(
127 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
126 128
127 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 129 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
128 state.OnBeginImplFrameDeadline(); 130 state.OnBeginImplFrameDeadline();
129 } 131 }
130 132
131 // If commit requested but can_start is still false, do nothing. 133 // If commit requested but can_start is still false, do nothing.
132 { 134 {
133 StateMachine state(default_scheduler_settings); 135 StateMachine state(default_scheduler_settings);
134 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); 136 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE);
135 state.SetNeedsRedraw(false); 137 state.SetNeedsRedraw(false);
136 state.SetVisible(true); 138 state.SetVisible(true);
137 state.SetNeedsCommit(); 139 state.SetNeedsCommit();
138 140
139 EXPECT_FALSE(state.BeginFrameNeeded()); 141 EXPECT_FALSE(state.BeginFrameNeeded());
140 142
141 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 143 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
142 EXPECT_FALSE(state.BeginFrameNeeded()); 144 EXPECT_FALSE(state.BeginFrameNeeded());
143 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 145 state.OnBeginImplFrame(
146 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
144 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 147 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
145 state.OnBeginImplFrameDeadline(); 148 state.OnBeginImplFrameDeadline();
146 } 149 }
147 150
148 // If commit requested, begin a main frame. 151 // If commit requested, begin a main frame.
149 { 152 {
150 StateMachine state(default_scheduler_settings); 153 StateMachine state(default_scheduler_settings);
151 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); 154 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE);
152 state.SetCanStart(); 155 state.SetCanStart();
153 state.UpdateState(state.NextAction()); 156 state.UpdateState(state.NextAction());
154 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 157 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
155 state.SetNeedsRedraw(false); 158 state.SetNeedsRedraw(false);
156 state.SetVisible(true); 159 state.SetVisible(true);
157 state.SetNeedsCommit(); 160 state.SetNeedsCommit();
158 161
159 EXPECT_TRUE(state.BeginFrameNeeded()); 162 EXPECT_TRUE(state.BeginFrameNeeded());
160 163
161 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 164 state.OnBeginImplFrame(
165 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
162 EXPECT_ACTION_UPDATE_STATE( 166 EXPECT_ACTION_UPDATE_STATE(
163 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 167 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
164 } 168 }
165 169
166 // Begin the frame, make sure needs_commit and commit_state update correctly. 170 // Begin the frame, make sure needs_commit and commit_state update correctly.
167 { 171 {
168 StateMachine state(default_scheduler_settings); 172 StateMachine state(default_scheduler_settings);
169 state.SetCanStart(); 173 state.SetCanStart();
170 state.UpdateState(state.NextAction()); 174 state.UpdateState(state.NextAction());
171 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 175 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
(...skipping 16 matching lines...)
188 state.UpdateState(state.NextAction()); 192 state.UpdateState(state.NextAction());
189 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 193 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
190 state.SetNeedsRedraw(false); 194 state.SetNeedsRedraw(false);
191 state.SetVisible(true); 195 state.SetVisible(true);
192 state.SetCanDraw(true); 196 state.SetCanDraw(true);
193 state.SetNeedsCommit(); 197 state.SetNeedsCommit();
194 198
195 EXPECT_TRUE(state.BeginFrameNeeded()); 199 EXPECT_TRUE(state.BeginFrameNeeded());
196 200
197 // Commit to the pending tree. 201 // Commit to the pending tree.
198 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 202 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
199 EXPECT_ACTION_UPDATE_STATE( 203 EXPECT_ACTION_UPDATE_STATE(
200 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 204 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
201 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 205 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
202 206
203 state.NotifyBeginMainFrameStarted(); 207 state.NotifyBeginMainFrameStarted();
204 state.NotifyReadyToCommit(); 208 state.NotifyReadyToCommit();
205 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 209 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
206 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 210 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
207 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); 211 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
208 212
209 state.OnBeginImplFrameDeadline(); 213 state.OnBeginImplFrameDeadline();
210 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 214 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
211 215
212 // Verify that the next commit starts while there is still a pending tree. 216 // Verify that the next commit starts while there is still a pending tree.
213 state.SetNeedsCommit(); 217 state.SetNeedsCommit();
214 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 218 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
215 EXPECT_ACTION_UPDATE_STATE( 219 EXPECT_ACTION_UPDATE_STATE(
216 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 220 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
217 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 221 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
218 222
219 // Verify the pending commit doesn't overwrite the pending 223 // Verify the pending commit doesn't overwrite the pending
220 // tree until the pending tree has been activated. 224 // tree until the pending tree has been activated.
221 state.NotifyBeginMainFrameStarted(); 225 state.NotifyBeginMainFrameStarted();
222 state.NotifyReadyToCommit(); 226 state.NotifyReadyToCommit();
223 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 227 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
224 228
(...skipping 20 matching lines...)
245 SchedulerSettings default_scheduler_settings; 249 SchedulerSettings default_scheduler_settings;
246 StateMachine state(default_scheduler_settings); 250 StateMachine state(default_scheduler_settings);
247 state.SetCanStart(); 251 state.SetCanStart();
248 state.UpdateState(state.NextAction()); 252 state.UpdateState(state.NextAction());
249 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 253 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
250 state.SetVisible(true); 254 state.SetVisible(true);
251 state.SetCanDraw(true); 255 state.SetCanDraw(true);
252 state.SetNeedsRedraw(true); 256 state.SetNeedsRedraw(true);
253 EXPECT_TRUE(state.RedrawPending()); 257 EXPECT_TRUE(state.RedrawPending());
254 EXPECT_TRUE(state.BeginFrameNeeded()); 258 EXPECT_TRUE(state.BeginFrameNeeded());
255 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 259 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
256 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 260 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
257 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 261 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
258 state.OnBeginImplFrameDeadline(); 262 state.OnBeginImplFrameDeadline();
259 263
260 // We're drawing now. 264 // We're drawing now.
261 EXPECT_ACTION_UPDATE_STATE( 265 EXPECT_ACTION_UPDATE_STATE(
262 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 266 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
263 state.DidSwapBuffers(); 267 state.DidSwapBuffers();
264 state.DidSwapBuffersComplete(); 268 state.DidSwapBuffersComplete();
265 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 269 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
266 270
267 EXPECT_FALSE(state.RedrawPending()); 271 EXPECT_FALSE(state.RedrawPending());
268 EXPECT_FALSE(state.CommitPending()); 272 EXPECT_FALSE(state.CommitPending());
269 273
270 // Failing the draw makes us require a commit. 274 // Failing the draw makes us require a commit.
271 state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); 275 state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
272 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 276 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
273 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 277 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
274 EXPECT_ACTION_UPDATE_STATE( 278 EXPECT_ACTION_UPDATE_STATE(
275 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 279 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
276 EXPECT_TRUE(state.RedrawPending()); 280 EXPECT_TRUE(state.RedrawPending());
277 EXPECT_TRUE(state.CommitPending()); 281 EXPECT_TRUE(state.CommitPending());
278 } 282 }
279 283
280 TEST(SchedulerStateMachineTest, TestFailedDrawForMissingHighResNeedsCommit) { 284 TEST(SchedulerStateMachineTest, TestFailedDrawForMissingHighResNeedsCommit) {
281 SchedulerSettings default_scheduler_settings; 285 SchedulerSettings default_scheduler_settings;
282 StateMachine state(default_scheduler_settings); 286 StateMachine state(default_scheduler_settings);
283 state.SetCanStart(); 287 state.SetCanStart();
284 state.UpdateState(state.NextAction()); 288 state.UpdateState(state.NextAction());
285 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 289 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
286 state.SetVisible(true); 290 state.SetVisible(true);
287 state.SetCanDraw(true); 291 state.SetCanDraw(true);
288 state.SetNeedsRedraw(true); 292 state.SetNeedsRedraw(true);
289 EXPECT_TRUE(state.RedrawPending()); 293 EXPECT_TRUE(state.RedrawPending());
290 EXPECT_TRUE(state.BeginFrameNeeded()); 294 EXPECT_TRUE(state.BeginFrameNeeded());
291 295
292 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 296 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
293 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 297 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
294 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 298 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
295 state.OnBeginImplFrameDeadline(); 299 state.OnBeginImplFrameDeadline();
296 EXPECT_ACTION_UPDATE_STATE( 300 EXPECT_ACTION_UPDATE_STATE(
297 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 301 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
298 state.DidSwapBuffers(); 302 state.DidSwapBuffers();
299 state.DidSwapBuffersComplete(); 303 state.DidSwapBuffersComplete();
300 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 304 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
301 EXPECT_FALSE(state.RedrawPending()); 305 EXPECT_FALSE(state.RedrawPending());
302 EXPECT_FALSE(state.CommitPending()); 306 EXPECT_FALSE(state.CommitPending());
303 307
304 // Missing high res content requires a commit (but not a redraw) 308 // Missing high res content requires a commit (but not a redraw)
305 state.DidDrawIfPossibleCompleted(DRAW_ABORTED_MISSING_HIGH_RES_CONTENT); 309 state.DidDrawIfPossibleCompleted(DRAW_ABORTED_MISSING_HIGH_RES_CONTENT);
306 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 310 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
307 EXPECT_ACTION_UPDATE_STATE( 311 EXPECT_ACTION_UPDATE_STATE(
308 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 312 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
309 EXPECT_FALSE(state.RedrawPending()); 313 EXPECT_FALSE(state.RedrawPending());
310 EXPECT_TRUE(state.CommitPending()); 314 EXPECT_TRUE(state.CommitPending());
311 } 315 }
312 316
313 TEST(SchedulerStateMachineTest, 317 TEST(SchedulerStateMachineTest,
314 TestsetNeedsRedrawDuringFailedDrawDoesNotRemoveNeedsRedraw) { 318 TestsetNeedsRedrawDuringFailedDrawDoesNotRemoveNeedsRedraw) {
315 SchedulerSettings default_scheduler_settings; 319 SchedulerSettings default_scheduler_settings;
316 StateMachine state(default_scheduler_settings); 320 StateMachine state(default_scheduler_settings);
317 state.SetCanStart(); 321 state.SetCanStart();
318 state.UpdateState(state.NextAction()); 322 state.UpdateState(state.NextAction());
319 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 323 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
320 324
321 state.SetVisible(true); 325 state.SetVisible(true);
322 state.SetCanDraw(true); 326 state.SetCanDraw(true);
323 state.SetNeedsRedraw(true); 327 state.SetNeedsRedraw(true);
324 EXPECT_TRUE(state.RedrawPending()); 328 EXPECT_TRUE(state.RedrawPending());
325 EXPECT_TRUE(state.BeginFrameNeeded()); 329 EXPECT_TRUE(state.BeginFrameNeeded());
326 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 330 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
327 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 331 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
328 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 332 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
329 state.OnBeginImplFrameDeadline(); 333 state.OnBeginImplFrameDeadline();
330 334
331 // We're drawing now. 335 // We're drawing now.
332 EXPECT_ACTION_UPDATE_STATE( 336 EXPECT_ACTION_UPDATE_STATE(
333 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 337 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
334 state.DidSwapBuffers(); 338 state.DidSwapBuffers();
335 state.DidSwapBuffersComplete(); 339 state.DidSwapBuffersComplete();
336 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 340 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
337 EXPECT_FALSE(state.RedrawPending()); 341 EXPECT_FALSE(state.RedrawPending());
338 EXPECT_FALSE(state.CommitPending()); 342 EXPECT_FALSE(state.CommitPending());
339 343
340 // While still in the same BeginMainFrame callback on the main thread, 344 // While still in the same BeginMainFrame callback on the main thread,
341 // set needs redraw again. This should not redraw. 345 // set needs redraw again. This should not redraw.
342 state.SetNeedsRedraw(true); 346 state.SetNeedsRedraw(true);
343 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 347 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
344 348
345 // Failing the draw for animation checkerboards makes us require a commit. 349 // Failing the draw for animation checkerboards makes us require a commit.
346 state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); 350 state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
347 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 351 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
348 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 352 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
349 EXPECT_ACTION_UPDATE_STATE( 353 EXPECT_ACTION_UPDATE_STATE(
350 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 354 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
351 EXPECT_TRUE(state.RedrawPending()); 355 EXPECT_TRUE(state.RedrawPending());
352 } 356 }
353 357
354 TEST(SchedulerStateMachineTest, 358 TEST(SchedulerStateMachineTest,
355 TestFailedDrawsEventuallyForceDrawAfterNextCommit) { 359 TestFailedDrawsEventuallyForceDrawAfterNextCommit) {
356 SchedulerSettings scheduler_settings; 360 SchedulerSettings scheduler_settings;
357 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced_ = 1; 361 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced_ = 1;
358 StateMachine state(scheduler_settings); 362 StateMachine state(scheduler_settings);
359 state.SetCanStart(); 363 state.SetCanStart();
360 state.UpdateState(state.NextAction()); 364 state.UpdateState(state.NextAction());
361 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 365 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
362 state.SetVisible(true); 366 state.SetVisible(true);
363 state.SetCanDraw(true); 367 state.SetCanDraw(true);
364 368
365 // Start a commit. 369 // Start a commit.
366 state.SetNeedsCommit(); 370 state.SetNeedsCommit();
367 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 371 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
368 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 372 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
369 EXPECT_ACTION_UPDATE_STATE( 373 EXPECT_ACTION_UPDATE_STATE(
370 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 374 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
371 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 375 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
372 EXPECT_TRUE(state.CommitPending()); 376 EXPECT_TRUE(state.CommitPending());
373 377
374 // Then initiate a draw. 378 // Then initiate a draw.
375 state.SetNeedsRedraw(true); 379 state.SetNeedsRedraw(true);
376 state.OnBeginImplFrameDeadline(); 380 state.OnBeginImplFrameDeadline();
377 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 381 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
378 EXPECT_ACTION_UPDATE_STATE( 382 EXPECT_ACTION_UPDATE_STATE(
379 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 383 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
380 384
381 // Fail the draw. 385 // Fail the draw.
382 state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); 386 state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
383 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 387 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
384 EXPECT_TRUE(state.BeginFrameNeeded()); 388 EXPECT_TRUE(state.BeginFrameNeeded());
385 EXPECT_TRUE(state.RedrawPending()); 389 EXPECT_TRUE(state.RedrawPending());
386 // But the commit is ongoing. 390 // But the commit is ongoing.
387 EXPECT_TRUE(state.CommitPending()); 391 EXPECT_TRUE(state.CommitPending());
388 392
389 // Finish the commit. Note, we should not yet be forcing a draw, but should 393 // Finish the commit. Note, we should not yet be forcing a draw, but should
390 // continue the commit as usual. 394 // continue the commit as usual.
391 state.NotifyBeginMainFrameStarted(); 395 state.NotifyBeginMainFrameStarted();
392 state.NotifyReadyToCommit(); 396 state.NotifyReadyToCommit();
393 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 397 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
394 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 398 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
395 EXPECT_TRUE(state.RedrawPending()); 399 EXPECT_TRUE(state.RedrawPending());
396 400
397 // The redraw should be forced at the end of the next BeginImplFrame. 401 // The redraw should be forced at the end of the next BeginImplFrame.
398 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 402 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
399 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 403 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
400 EXPECT_ACTION_UPDATE_STATE( 404 EXPECT_ACTION_UPDATE_STATE(
401 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 405 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
402 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 406 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
403 state.OnBeginImplFrameDeadline(); 407 state.OnBeginImplFrameDeadline();
404 EXPECT_ACTION_UPDATE_STATE( 408 EXPECT_ACTION_UPDATE_STATE(
405 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED); 409 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED);
406 state.DidSwapBuffers(); 410 state.DidSwapBuffers();
407 state.DidSwapBuffersComplete(); 411 state.DidSwapBuffersComplete();
408 } 412 }
409 413
410 TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) { 414 TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) {
411 SchedulerSettings scheduler_settings; 415 SchedulerSettings scheduler_settings;
412 int draw_limit = 1; 416 int draw_limit = 1;
413 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced_ = 417 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced_ =
414 draw_limit; 418 draw_limit;
415 scheduler_settings.impl_side_painting = true; 419 scheduler_settings.impl_side_painting = true;
416 StateMachine state(scheduler_settings); 420 StateMachine state(scheduler_settings);
417 state.SetCanStart(); 421 state.SetCanStart();
418 state.UpdateState(state.NextAction()); 422 state.UpdateState(state.NextAction());
419 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 423 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
420 state.SetVisible(true); 424 state.SetVisible(true);
421 state.SetCanDraw(true); 425 state.SetCanDraw(true);
422 426
423 // Start a commit. 427 // Start a commit.
424 state.SetNeedsCommit(); 428 state.SetNeedsCommit();
425 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 429 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
426 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 430 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
427 EXPECT_ACTION_UPDATE_STATE( 431 EXPECT_ACTION_UPDATE_STATE(
428 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 432 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
429 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 433 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
430 EXPECT_TRUE(state.CommitPending()); 434 EXPECT_TRUE(state.CommitPending());
431 435
432 // Then initiate a draw. 436 // Then initiate a draw.
433 state.SetNeedsRedraw(true); 437 state.SetNeedsRedraw(true);
434 state.OnBeginImplFrameDeadline(); 438 state.OnBeginImplFrameDeadline();
435 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 439 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
436 EXPECT_ACTION_UPDATE_STATE( 440 EXPECT_ACTION_UPDATE_STATE(
(...skipping 36 matching lines...)
473 StateMachine state(default_scheduler_settings); 477 StateMachine state(default_scheduler_settings);
474 state.SetCanStart(); 478 state.SetCanStart();
475 state.UpdateState(state.NextAction()); 479 state.UpdateState(state.NextAction());
476 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 480 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
477 state.SetVisible(true); 481 state.SetVisible(true);
478 state.SetCanDraw(true); 482 state.SetCanDraw(true);
479 483
480 // Start a draw. 484 // Start a draw.
481 state.SetNeedsRedraw(true); 485 state.SetNeedsRedraw(true);
482 EXPECT_TRUE(state.BeginFrameNeeded()); 486 EXPECT_TRUE(state.BeginFrameNeeded());
483 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 487 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
484 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 488 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
485 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 489 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
486 state.OnBeginImplFrameDeadline(); 490 state.OnBeginImplFrameDeadline();
487 EXPECT_TRUE(state.RedrawPending()); 491 EXPECT_TRUE(state.RedrawPending());
488 EXPECT_ACTION_UPDATE_STATE( 492 EXPECT_ACTION_UPDATE_STATE(
489 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 493 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
490 494
491 // Failing the draw for animation checkerboards makes us require a commit. 495 // Failing the draw for animation checkerboards makes us require a commit.
492 state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); 496 state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
493 EXPECT_ACTION_UPDATE_STATE( 497 EXPECT_ACTION_UPDATE_STATE(
494 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 498 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
495 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 499 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
496 EXPECT_TRUE(state.RedrawPending()); 500 EXPECT_TRUE(state.RedrawPending());
497 501
498 // We should not be trying to draw again now, but we have a commit pending. 502 // We should not be trying to draw again now, but we have a commit pending.
499 EXPECT_TRUE(state.BeginFrameNeeded()); 503 EXPECT_TRUE(state.BeginFrameNeeded());
500 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 504 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
501 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 505 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
502 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 506 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
503 507
504 // We should try to draw again at the end of the next BeginImplFrame on 508 // We should try to draw again at the end of the next BeginImplFrame on
505 // the impl thread. 509 // the impl thread.
506 state.OnBeginImplFrameDeadline(); 510 state.OnBeginImplFrameDeadline();
507 EXPECT_ACTION_UPDATE_STATE( 511 EXPECT_ACTION_UPDATE_STATE(
508 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 512 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
509 state.DidSwapBuffers(); 513 state.DidSwapBuffers();
510 state.DidSwapBuffersComplete(); 514 state.DidSwapBuffersComplete();
511 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 515 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
512 } 516 }
513 517
514 TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) { 518 TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) {
515 SchedulerSettings default_scheduler_settings; 519 SchedulerSettings default_scheduler_settings;
516 StateMachine state(default_scheduler_settings); 520 StateMachine state(default_scheduler_settings);
517 state.SetCanStart(); 521 state.SetCanStart();
518 state.UpdateState(state.NextAction()); 522 state.UpdateState(state.NextAction());
519 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 523 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
520 state.SetVisible(true); 524 state.SetVisible(true);
521 state.SetCanDraw(true); 525 state.SetCanDraw(true);
522 state.SetNeedsRedraw(true); 526 state.SetNeedsRedraw(true);
523 527
524 // Draw the first frame. 528 // Draw the first frame.
525 EXPECT_TRUE(state.BeginFrameNeeded()); 529 EXPECT_TRUE(state.BeginFrameNeeded());
526 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 530 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
527 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 531 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
528 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 532 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
529 533
530 state.OnBeginImplFrameDeadline(); 534 state.OnBeginImplFrameDeadline();
531 EXPECT_ACTION_UPDATE_STATE( 535 EXPECT_ACTION_UPDATE_STATE(
532 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 536 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
533 state.DidSwapBuffers(); 537 state.DidSwapBuffers();
534 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS); 538 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
535 state.DidSwapBuffersComplete(); 539 state.DidSwapBuffersComplete();
536 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 540 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
537 541
538 // Before the next BeginImplFrame, set needs redraw again. 542 // Before the next BeginImplFrame, set needs redraw again.
539 // This should not redraw until the next BeginImplFrame. 543 // This should not redraw until the next BeginImplFrame.
540 state.SetNeedsRedraw(true); 544 state.SetNeedsRedraw(true);
541 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 545 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
542 546
543 // Move to another frame. This should now draw. 547 // Move to another frame. This should now draw.
544 EXPECT_TRUE(state.BeginFrameNeeded()); 548 EXPECT_TRUE(state.BeginFrameNeeded());
545 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 549 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
546 550
547 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 551 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
548 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 552 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
549 553
550 state.OnBeginImplFrameDeadline(); 554 state.OnBeginImplFrameDeadline();
551 EXPECT_ACTION_UPDATE_STATE( 555 EXPECT_ACTION_UPDATE_STATE(
552 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 556 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
553 state.DidSwapBuffers(); 557 state.DidSwapBuffers();
554 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS); 558 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
555 state.DidSwapBuffersComplete(); 559 state.DidSwapBuffersComplete();
(...skipping 117 matching lines...)
673 // There shouldn't be any drawing regardless of BeginImplFrame. 677 // There shouldn't be any drawing regardless of BeginImplFrame.
674 for (size_t j = 0; j < 2; ++j) { 678 for (size_t j = 0; j < 2; ++j) {
675 StateMachine state(default_scheduler_settings); 679 StateMachine state(default_scheduler_settings);
676 state.SetCanStart(); 680 state.SetCanStart();
677 state.UpdateState(state.NextAction()); 681 state.UpdateState(state.NextAction());
678 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 682 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
679 state.SetCommitState(all_commit_states[i]); 683 state.SetCommitState(all_commit_states[i]);
680 state.SetVisible(false); 684 state.SetVisible(false);
681 state.SetNeedsRedraw(true); 685 state.SetNeedsRedraw(true);
682 if (j == 1) 686 if (j == 1)
683 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 687 state.OnBeginImplFrame(
688 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
684 689
685 state.SetCanDraw(false); 690 state.SetCanDraw(false);
686 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, 691 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
687 state.NextAction()); 692 state.NextAction());
688 } 693 }
689 } 694 }
690 } 695 }
691 696
692 TEST(SchedulerStateMachineTest, 697 TEST(SchedulerStateMachineTest,
693 TestCanRedrawWithWaitingForFirstDrawMakesProgress) { 698 TestCanRedrawWithWaitingForFirstDrawMakesProgress) {
694 SchedulerSettings default_scheduler_settings; 699 SchedulerSettings default_scheduler_settings;
695 StateMachine state(default_scheduler_settings); 700 StateMachine state(default_scheduler_settings);
696 state.SetCanStart(); 701 state.SetCanStart();
697 state.UpdateState(state.NextAction()); 702 state.UpdateState(state.NextAction());
698 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 703 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
699 704
700 state.SetActiveTreeNeedsFirstDraw(true); 705 state.SetActiveTreeNeedsFirstDraw(true);
701 state.SetNeedsCommit(); 706 state.SetNeedsCommit();
702 state.SetNeedsRedraw(true); 707 state.SetNeedsRedraw(true);
703 state.SetVisible(true); 708 state.SetVisible(true);
704 state.SetCanDraw(false); 709 state.SetCanDraw(false);
705 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 710 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
706 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 711 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
707 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); 712 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
708 EXPECT_ACTION_UPDATE_STATE( 713 EXPECT_ACTION_UPDATE_STATE(
709 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 714 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
710 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 715 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
711 state.NotifyBeginMainFrameStarted(); 716 state.NotifyBeginMainFrameStarted();
712 state.NotifyReadyToCommit(); 717 state.NotifyReadyToCommit();
713 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 718 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
714 state.OnBeginImplFrameDeadline(); 719 state.OnBeginImplFrameDeadline();
715 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 720 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
716 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); 721 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
717 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 722 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
718 } 723 }
719 724
720 TEST(SchedulerStateMachineTest, TestSetNeedsCommitIsNotLost) { 725 TEST(SchedulerStateMachineTest, TestSetNeedsCommitIsNotLost) {
721 SchedulerSettings scheduler_settings; 726 SchedulerSettings scheduler_settings;
722 StateMachine state(scheduler_settings); 727 StateMachine state(scheduler_settings);
723 state.SetCanStart(); 728 state.SetCanStart();
724 state.UpdateState(state.NextAction()); 729 state.UpdateState(state.NextAction());
725 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 730 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
726 state.SetNeedsCommit(); 731 state.SetNeedsCommit();
727 state.SetVisible(true); 732 state.SetVisible(true);
728 state.SetCanDraw(true); 733 state.SetCanDraw(true);
729 734
730 EXPECT_TRUE(state.BeginFrameNeeded()); 735 EXPECT_TRUE(state.BeginFrameNeeded());
731 736
732 // Begin the frame. 737 // Begin the frame.
733 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 738 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
734 EXPECT_ACTION_UPDATE_STATE( 739 EXPECT_ACTION_UPDATE_STATE(
735 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 740 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
736 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, 741 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT,
737 state.CommitState()); 742 state.CommitState());
738 743
739 // Now, while the frame is in progress, set another commit. 744 // Now, while the frame is in progress, set another commit.
740 state.SetNeedsCommit(); 745 state.SetNeedsCommit();
741 EXPECT_TRUE(state.NeedsCommit()); 746 EXPECT_TRUE(state.NeedsCommit());
742 747
743 // Let the frame finish. 748 // Let the frame finish.
(...skipping 15 matching lines...)
759 state.OnBeginImplFrameDeadline(); 764 state.OnBeginImplFrameDeadline();
760 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE, 765 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE,
761 state.begin_impl_frame_state()); 766 state.begin_impl_frame_state());
762 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); 767 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
763 768
764 state.OnBeginImplFrameIdle(); 769 state.OnBeginImplFrameIdle();
765 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE, 770 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE,
766 state.begin_impl_frame_state()); 771 state.begin_impl_frame_state());
767 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); 772 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
768 773
769 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 774 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
770 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING, 775 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING,
771 state.begin_impl_frame_state()); 776 state.begin_impl_frame_state());
772 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); 777 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
773 778
774 // Finish the commit, then make sure we start the next commit immediately 779 // Finish the commit, then make sure we start the next commit immediately
775 // and draw on the next BeginImplFrame. 780 // and draw on the next BeginImplFrame.
776 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 781 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
777 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 782 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
778 EXPECT_ACTION_UPDATE_STATE( 783 EXPECT_ACTION_UPDATE_STATE(
779 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 784 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
(...skipping 16 matching lines...)
796 state.SetCanStart(); 801 state.SetCanStart();
797 state.UpdateState(state.NextAction()); 802 state.UpdateState(state.NextAction());
798 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 803 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
799 state.SetVisible(true); 804 state.SetVisible(true);
800 state.SetCanDraw(true); 805 state.SetCanDraw(true);
801 806
802 // Start clean and set commit. 807 // Start clean and set commit.
803 state.SetNeedsCommit(); 808 state.SetNeedsCommit();
804 809
805 // Begin the frame. 810 // Begin the frame.
806 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 811 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
807 EXPECT_ACTION_UPDATE_STATE( 812 EXPECT_ACTION_UPDATE_STATE(
808 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 813 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
809 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, 814 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT,
810 state.CommitState()); 815 state.CommitState());
811 EXPECT_FALSE(state.NeedsCommit()); 816 EXPECT_FALSE(state.NeedsCommit());
812 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 817 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
813 818
814 // Tell the scheduler the frame finished. 819 // Tell the scheduler the frame finished.
815 state.NotifyBeginMainFrameStarted(); 820 state.NotifyBeginMainFrameStarted();
816 state.NotifyReadyToCommit(); 821 state.NotifyReadyToCommit();
(...skipping 16 matching lines...)
833 state.DidSwapBuffers(); 838 state.DidSwapBuffers();
834 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS); 839 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
835 state.DidSwapBuffersComplete(); 840 state.DidSwapBuffersComplete();
836 841
837 // Should be synchronized, no draw needed, no action needed. 842 // Should be synchronized, no draw needed, no action needed.
838 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 843 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
839 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); 844 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
840 EXPECT_FALSE(state.needs_redraw()); 845 EXPECT_FALSE(state.needs_redraw());
841 } 846 }
842 847
848 TEST(SchedulerStateMachineTest, TestFullCycleWithMainThreadLowLatencyMode) {
849 SchedulerSettings scheduler_settings;
850 scheduler_settings.main_thread_should_always_be_low_latency = true;
851 StateMachine state(scheduler_settings);
852 state.SetCanStart();
853 state.UpdateState(state.NextAction());
854 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
855 state.SetVisible(true);
856 state.SetCanDraw(true);
857
858 // Start clean and set commit.
859 state.SetNeedsCommit();
860
861 // Begin the frame.
862 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
863 EXPECT_ACTION_UPDATE_STATE(
864 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
865 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT,
866 state.CommitState());
867 EXPECT_FALSE(state.NeedsCommit());
868 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
869
870 // Tell the scheduler the frame finished.
871 state.NotifyBeginMainFrameStarted();
872 state.NotifyReadyToCommit();
873 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
874 state.CommitState());
875
876 // Commit.
877 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
878 EXPECT_TRUE(state.active_tree_needs_first_draw());
879 EXPECT_TRUE(state.needs_redraw());
880
881 // Now commit should wait for draw.
882 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_DRAW,
883 state.CommitState());
884
885 // Swap throttled. Do not draw.
886 state.DidSwapBuffers();
887 state.OnBeginImplFrameDeadline();
888 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
889 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
890 state.DidSwapBuffersComplete();
891
892 // Haven't draw since last commit, do not begin new main frame.
893 state.SetNeedsCommit();
894 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
895 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
896 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
897
898 // At BeginImplFrame deadline, draw.
899 state.OnBeginImplFrameDeadline();
900 EXPECT_ACTION_UPDATE_STATE(
901 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
902 state.DidSwapBuffers();
903 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
904 state.DidSwapBuffersComplete();
905
906 // Now will be able to start main frame.
907 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
908 EXPECT_FALSE(state.needs_redraw());
909 EXPECT_ACTION_UPDATE_STATE(
910 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
911 }
912
913 TEST(SchedulerStateMachineTest,
914 TestFullCycleWithMainThreadLowLatencyMode_ImplSidePaint) {
915 SchedulerSettings scheduler_settings;
916 scheduler_settings.main_thread_should_always_be_low_latency = true;
917 scheduler_settings.impl_side_painting = true;
918 StateMachine state(scheduler_settings);
919 state.SetCanStart();
920 state.UpdateState(state.NextAction());
921 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
922 state.SetVisible(true);
923 state.SetCanDraw(true);
924
925 // Start clean and set commit.
926 state.SetNeedsCommit();
927
928 // Begin the frame.
929 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
930 EXPECT_ACTION_UPDATE_STATE(
931 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
932 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT,
933 state.CommitState());
934 EXPECT_FALSE(state.NeedsCommit());
935 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
936
937 // Tell the scheduler the frame finished.
938 state.NotifyBeginMainFrameStarted();
939 state.NotifyReadyToCommit();
940 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
941 state.CommitState());
942
943 // Commit.
944 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
945
946 // Now commit should wait for activation.
947 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_ACTIVATION,
948 state.CommitState());
949
950 // No activation yet, so this commit is not drawn yet. Force to draw this
951 // frame, and still block BeginMainFrame.
952 state.SetNeedsRedraw(true);
953 state.SetNeedsCommit();
954 state.OnBeginImplFrameDeadline();
955 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
956 EXPECT_ACTION_UPDATE_STATE(
957 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
958 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
959
960 // Cannot BeginMainFrame yet since last commit is not yet activated and drawn.
961 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
962 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_ACTIVATION,
963 state.CommitState());
964 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
965
966 // Now activate sync tree.
967 state.NotifyReadyToActivate();
968 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
969 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
970 EXPECT_TRUE(state.active_tree_needs_first_draw());
971 EXPECT_TRUE(state.needs_redraw());
972 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_DRAW,
973 state.CommitState());
974
975 // Swap throttled. Do not draw.
976 state.DidSwapBuffers();
977 state.OnBeginImplFrameDeadline();
978 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
979 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
980 state.DidSwapBuffersComplete();
981
982 // Haven't draw since last commit, do not begin new main frame.
983 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
984 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
985 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
986
987 // At BeginImplFrame deadline, draw. This draws unblocks BeginMainFrame.
988 state.OnBeginImplFrameDeadline();
989 EXPECT_ACTION_UPDATE_STATE(
990 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
991 state.DidSwapBuffers();
992 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
993 state.DidSwapBuffersComplete();
994
995 // Now will be able to start main frame.
996 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
997 EXPECT_FALSE(state.needs_redraw());
998 EXPECT_ACTION_UPDATE_STATE(
999 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1000 }
1001
843 TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) { 1002 TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) {
844 SchedulerSettings default_scheduler_settings; 1003 SchedulerSettings default_scheduler_settings;
845 StateMachine state(default_scheduler_settings); 1004 StateMachine state(default_scheduler_settings);
846 state.SetCanStart(); 1005 state.SetCanStart();
847 state.UpdateState(state.NextAction()); 1006 state.UpdateState(state.NextAction());
848 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1007 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
849 state.SetVisible(true); 1008 state.SetVisible(true);
850 state.SetCanDraw(true); 1009 state.SetCanDraw(true);
851 1010
852 // Start clean and set commit. 1011 // Start clean and set commit.
853 state.SetNeedsCommit(); 1012 state.SetNeedsCommit();
854 1013
855 // Begin the frame. 1014 // Begin the frame.
856 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1015 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
857 EXPECT_ACTION_UPDATE_STATE( 1016 EXPECT_ACTION_UPDATE_STATE(
858 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1017 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
859 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, 1018 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT,
860 state.CommitState()); 1019 state.CommitState());
861 EXPECT_FALSE(state.NeedsCommit()); 1020 EXPECT_FALSE(state.NeedsCommit());
862 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1021 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
863 1022
864 // Request another commit while the commit is in flight. 1023 // Request another commit while the commit is in flight.
865 state.SetNeedsCommit(); 1024 state.SetNeedsCommit();
866 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1025 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
(...skipping 20 matching lines...)
887 state.DidSwapBuffers(); 1046 state.DidSwapBuffers();
888 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS); 1047 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
889 state.DidSwapBuffersComplete(); 1048 state.DidSwapBuffersComplete();
890 1049
891 // Should be synchronized, no draw needed, no action needed. 1050 // Should be synchronized, no draw needed, no action needed.
892 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1051 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
893 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); 1052 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
894 EXPECT_FALSE(state.needs_redraw()); 1053 EXPECT_FALSE(state.needs_redraw());
895 1054
896 // Next BeginImplFrame should initiate second commit. 1055 // Next BeginImplFrame should initiate second commit.
897 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1056 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
898 EXPECT_ACTION_UPDATE_STATE( 1057 EXPECT_ACTION_UPDATE_STATE(
899 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1058 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
900 } 1059 }
901 1060
902 TEST(SchedulerStateMachineTest, TestRequestCommitInvisible) { 1061 TEST(SchedulerStateMachineTest, TestRequestCommitInvisible) {
903 SchedulerSettings default_scheduler_settings; 1062 SchedulerSettings default_scheduler_settings;
904 StateMachine state(default_scheduler_settings); 1063 StateMachine state(default_scheduler_settings);
905 state.SetCanStart(); 1064 state.SetCanStart();
906 state.UpdateState(state.NextAction()); 1065 state.UpdateState(state.NextAction());
907 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1066 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
908 state.SetNeedsCommit(); 1067 state.SetNeedsCommit();
909 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1068 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
910 } 1069 }
911 1070
912 TEST(SchedulerStateMachineTest, TestGoesInvisibleBeforeFinishCommit) { 1071 TEST(SchedulerStateMachineTest, TestGoesInvisibleBeforeFinishCommit) {
913 SchedulerSettings default_scheduler_settings; 1072 SchedulerSettings default_scheduler_settings;
914 StateMachine state(default_scheduler_settings); 1073 StateMachine state(default_scheduler_settings);
915 state.SetCanStart(); 1074 state.SetCanStart();
916 state.UpdateState(state.NextAction()); 1075 state.UpdateState(state.NextAction());
917 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1076 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
918 state.SetVisible(true); 1077 state.SetVisible(true);
919 state.SetCanDraw(true); 1078 state.SetCanDraw(true);
920 1079
921 // Start clean and set commit. 1080 // Start clean and set commit.
922 state.SetNeedsCommit(); 1081 state.SetNeedsCommit();
923 1082
924 // Begin the frame while visible. 1083 // Begin the frame while visible.
925 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1084 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
926 EXPECT_ACTION_UPDATE_STATE( 1085 EXPECT_ACTION_UPDATE_STATE(
927 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1086 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
928 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, 1087 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT,
929 state.CommitState()); 1088 state.CommitState());
930 EXPECT_FALSE(state.NeedsCommit()); 1089 EXPECT_FALSE(state.NeedsCommit());
931 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1090 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
932 1091
933 // Become invisible and abort BeginMainFrame. 1092 // Become invisible and abort BeginMainFrame.
934 state.SetVisible(false); 1093 state.SetVisible(false);
935 state.BeginMainFrameAborted(false); 1094 state.BeginMainFrameAborted(false);
936 1095
937 // We should now be back in the idle state as if we never started the frame. 1096 // We should now be back in the idle state as if we never started the frame.
938 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); 1097 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
939 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1098 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
940 1099
941 // We shouldn't do anything on the BeginImplFrame deadline. 1100 // We shouldn't do anything on the BeginImplFrame deadline.
942 state.OnBeginImplFrameDeadline(); 1101 state.OnBeginImplFrameDeadline();
943 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1102 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
944 1103
945 // Become visible again. 1104 // Become visible again.
946 state.SetVisible(true); 1105 state.SetVisible(true);
947 1106
948 // Although we have aborted on this frame and haven't cancelled the commit 1107 // Although we have aborted on this frame and haven't cancelled the commit
949 // (i.e. need another), don't send another BeginMainFrame yet. 1108 // (i.e. need another), don't send another BeginMainFrame yet.
950 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); 1109 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
951 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 1110 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
952 EXPECT_TRUE(state.NeedsCommit()); 1111 EXPECT_TRUE(state.NeedsCommit());
953 1112
954 // Start a new frame. 1113 // Start a new frame.
955 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1114 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
956 EXPECT_ACTION_UPDATE_STATE( 1115 EXPECT_ACTION_UPDATE_STATE(
957 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1116 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
958 1117
959 // We should be starting the commit now. 1118 // We should be starting the commit now.
960 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, 1119 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT,
961 state.CommitState()); 1120 state.CommitState());
962 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1121 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
963 } 1122 }
964 1123
965 TEST(SchedulerStateMachineTest, AbortBeginMainFrameAndCancelCommit) { 1124 TEST(SchedulerStateMachineTest, AbortBeginMainFrameAndCancelCommit) {
(...skipping 18 matching lines...)
984 // Abort the commit, cancelling future commits. 1143 // Abort the commit, cancelling future commits.
985 state.BeginMainFrameAborted(true); 1144 state.BeginMainFrameAborted(true);
986 1145
987 // Verify that another commit doesn't start on the same frame. 1146 // Verify that another commit doesn't start on the same frame.
988 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); 1147 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
989 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 1148 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
990 EXPECT_FALSE(state.NeedsCommit()); 1149 EXPECT_FALSE(state.NeedsCommit());
991 1150
992 // Start a new frame; draw because this is the first frame since output 1151 // Start a new frame; draw because this is the first frame since output
993 // surface init'd. 1152 // surface init'd.
994 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1153 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
995 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 1154 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
996 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1155 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
997 state.OnBeginImplFrameDeadline(); 1156 state.OnBeginImplFrameDeadline();
998 EXPECT_ACTION_UPDATE_STATE( 1157 EXPECT_ACTION_UPDATE_STATE(
999 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 1158 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
1000 state.DidSwapBuffers(); 1159 state.DidSwapBuffers();
1001 state.DidSwapBuffersComplete(); 1160 state.DidSwapBuffersComplete();
1002 1161
1003 // Verify another commit doesn't start on another frame either. 1162 // Verify another commit doesn't start on another frame either.
1004 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); 1163 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
(...skipping 31 matching lines...)
1036 state.SetVisible(false); 1195 state.SetVisible(false);
1037 state.BeginMainFrameAborted(true); 1196 state.BeginMainFrameAborted(true);
1038 1197
1039 // Verify that another commit doesn't start on the same frame. 1198 // Verify that another commit doesn't start on the same frame.
1040 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); 1199 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
1041 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 1200 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
1042 EXPECT_FALSE(state.NeedsCommit()); 1201 EXPECT_FALSE(state.NeedsCommit());
1043 1202
1044 // Become visible and start a new frame. 1203 // Become visible and start a new frame.
1045 state.SetVisible(true); 1204 state.SetVisible(true);
1046 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1205 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
1047 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 1206 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
1048 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1207 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1049 1208
1050 // Draw because this is the first frame since output surface init'd. 1209 // Draw because this is the first frame since output surface init'd.
1051 state.OnBeginImplFrameDeadline(); 1210 state.OnBeginImplFrameDeadline();
1052 EXPECT_ACTION_UPDATE_STATE( 1211 EXPECT_ACTION_UPDATE_STATE(
1053 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 1212 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
1054 state.DidSwapBuffers(); 1213 state.DidSwapBuffers();
1055 state.DidSwapBuffersComplete(); 1214 state.DidSwapBuffersComplete();
1056 1215
(...skipping 44 matching lines...)
1101 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 1260 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
1102 EXPECT_TRUE(state.NeedsCommit()); 1261 EXPECT_TRUE(state.NeedsCommit());
1103 1262
1104 // Become visible but nothing happens until the next frame. 1263 // Become visible but nothing happens until the next frame.
1105 state.SetVisible(true); 1264 state.SetVisible(true);
1106 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); 1265 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
1107 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 1266 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
1108 EXPECT_TRUE(state.NeedsCommit()); 1267 EXPECT_TRUE(state.NeedsCommit());
1109 1268
1110 // We should get that commit when we begin the next frame. 1269 // We should get that commit when we begin the next frame.
1111 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1270 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
1112 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 1271 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
1113 EXPECT_ACTION_UPDATE_STATE( 1272 EXPECT_ACTION_UPDATE_STATE(
1114 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1273 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1115 } 1274 }
1116 1275
1117 TEST(SchedulerStateMachineTest, 1276 TEST(SchedulerStateMachineTest,
1118 AbortBeginMainFrameAndRequestCommitAndBeginImplFrameWhenInvisible) { 1277 AbortBeginMainFrameAndRequestCommitAndBeginImplFrameWhenInvisible) {
1119 SchedulerSettings default_scheduler_settings; 1278 SchedulerSettings default_scheduler_settings;
1120 StateMachine state(default_scheduler_settings); 1279 StateMachine state(default_scheduler_settings);
1121 state.SetCanStart(); 1280 state.SetCanStart();
(...skipping 16 matching lines...)
1138 state.SetVisible(false); 1297 state.SetVisible(false);
1139 state.BeginMainFrameAborted(true); 1298 state.BeginMainFrameAborted(true);
1140 1299
1141 // Asking for a commit while not visible won't make it happen. 1300 // Asking for a commit while not visible won't make it happen.
1142 state.SetNeedsCommit(); 1301 state.SetNeedsCommit();
1143 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); 1302 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
1144 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 1303 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
1145 EXPECT_TRUE(state.NeedsCommit()); 1304 EXPECT_TRUE(state.NeedsCommit());
1146 1305
1147 // Begin a frame when not visible, the scheduler animates but does not commit. 1306 // Begin a frame when not visible, the scheduler animates but does not commit.
1148 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1307 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
1149 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); 1308 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
1150 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 1309 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
1151 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 1310 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
1152 EXPECT_TRUE(state.NeedsCommit()); 1311 EXPECT_TRUE(state.NeedsCommit());
1153 1312
1154 // Become visible and the requested commit happens immediately. 1313 // Become visible and the requested commit happens immediately.
1155 state.SetVisible(true); 1314 state.SetVisible(true);
1156 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); 1315 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
1157 EXPECT_ACTION_UPDATE_STATE( 1316 EXPECT_ACTION_UPDATE_STATE(
1158 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1317 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1159 } 1318 }
1160 1319
1161 TEST(SchedulerStateMachineTest, TestFirstContextCreation) { 1320 TEST(SchedulerStateMachineTest, TestFirstContextCreation) {
1162 SchedulerSettings default_scheduler_settings; 1321 SchedulerSettings default_scheduler_settings;
1163 StateMachine state(default_scheduler_settings); 1322 StateMachine state(default_scheduler_settings);
1164 state.SetCanStart(); 1323 state.SetCanStart();
1165 state.SetVisible(true); 1324 state.SetVisible(true);
1166 state.SetCanDraw(true); 1325 state.SetCanDraw(true);
1167 1326
1168 EXPECT_ACTION_UPDATE_STATE( 1327 EXPECT_ACTION_UPDATE_STATE(
1169 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); 1328 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION);
1170 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1329 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1171 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1330 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1172 1331
1173 // Check that the first init does not SetNeedsCommit. 1332 // Check that the first init does not SetNeedsCommit.
1174 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1333 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
1175 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1334 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1176 state.OnBeginImplFrameDeadline(); 1335 state.OnBeginImplFrameDeadline();
1177 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1336 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1178 1337
1179 // Check that a needs commit initiates a BeginMainFrame. 1338 // Check that a needs commit initiates a BeginMainFrame.
1180 state.SetNeedsCommit(); 1339 state.SetNeedsCommit();
1181 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1340 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
1182 EXPECT_ACTION_UPDATE_STATE( 1341 EXPECT_ACTION_UPDATE_STATE(
1183 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1342 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1184 } 1343 }
1185 1344
1186 TEST(SchedulerStateMachineTest, TestContextLostWhenCompletelyIdle) { 1345 TEST(SchedulerStateMachineTest, TestContextLostWhenCompletelyIdle) {
1187 SchedulerSettings default_scheduler_settings; 1346 SchedulerSettings default_scheduler_settings;
1188 StateMachine state(default_scheduler_settings); 1347 StateMachine state(default_scheduler_settings);
1189 state.SetCanStart(); 1348 state.SetCanStart();
1190 state.UpdateState(state.NextAction()); 1349 state.UpdateState(state.NextAction());
1191 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1350 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1192 1351
1193 state.SetVisible(true); 1352 state.SetVisible(true);
1194 state.SetCanDraw(true); 1353 state.SetCanDraw(true);
1195 1354
1196 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 1355 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
1197 state.NextAction()); 1356 state.NextAction());
1198 state.DidLoseOutputSurface(); 1357 state.DidLoseOutputSurface();
1199 1358
1200 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 1359 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
1201 state.NextAction()); 1360 state.NextAction());
1202 state.UpdateState(state.NextAction()); 1361 state.UpdateState(state.NextAction());
1203 1362
1204 // Once context recreation begins, nothing should happen. 1363 // Once context recreation begins, nothing should happen.
1205 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1364 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1206 1365
1207 // Recreate the context. 1366 // Recreate the context.
1208 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1367 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1209 1368
1210 // When the context is recreated, we should begin a commit. 1369 // When the context is recreated, we should begin a commit.
1211 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1370 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
1212 EXPECT_ACTION_UPDATE_STATE( 1371 EXPECT_ACTION_UPDATE_STATE(
1213 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1372 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1214 } 1373 }
1215 1374
1216 TEST(SchedulerStateMachineTest, 1375 TEST(SchedulerStateMachineTest,
1217 TestContextLostWhenIdleAndCommitRequestedWhileRecreating) { 1376 TestContextLostWhenIdleAndCommitRequestedWhileRecreating) {
1218 SchedulerSettings default_scheduler_settings; 1377 SchedulerSettings default_scheduler_settings;
1219 StateMachine state(default_scheduler_settings); 1378 StateMachine state(default_scheduler_settings);
1220 state.SetCanStart(); 1379 state.SetCanStart();
1221 state.UpdateState(state.NextAction()); 1380 state.UpdateState(state.NextAction());
1222 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1381 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1223 state.SetVisible(true); 1382 state.SetVisible(true);
1224 state.SetCanDraw(true); 1383 state.SetCanDraw(true);
1225 1384
1226 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 1385 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
1227 state.NextAction()); 1386 state.NextAction());
1228 state.DidLoseOutputSurface(); 1387 state.DidLoseOutputSurface();
1229 1388
1230 EXPECT_ACTION_UPDATE_STATE( 1389 EXPECT_ACTION_UPDATE_STATE(
1231 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); 1390 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION);
1232 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1391 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1233 1392
1234 // Once context recreation begins, nothing should happen. 1393 // Once context recreation begins, nothing should happen.
1235 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1394 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
1236 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1395 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1237 state.OnBeginImplFrameDeadline(); 1396 state.OnBeginImplFrameDeadline();
1238 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1397 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1239 1398
1240 // While context is recreating, commits shouldn't begin. 1399 // While context is recreating, commits shouldn't begin.
1241 state.SetNeedsCommit(); 1400 state.SetNeedsCommit();
1242 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1401 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
1243 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1402 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1244 state.OnBeginImplFrameDeadline(); 1403 state.OnBeginImplFrameDeadline();
1245 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1404 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1246 1405
1247 // Recreate the context 1406 // Recreate the context
1248 state.DidCreateAndInitializeOutputSurface(); 1407 state.DidCreateAndInitializeOutputSurface();
1249 EXPECT_FALSE(state.RedrawPending()); 1408 EXPECT_FALSE(state.RedrawPending());
1250 1409
1251 // When the context is recreated, we should begin a commit 1410 // When the context is recreated, we should begin a commit
1252 EXPECT_ACTION_UPDATE_STATE( 1411 EXPECT_ACTION_UPDATE_STATE(
1253 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1412 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1254 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1413 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1255 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, 1414 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT,
1256 state.CommitState()); 1415 state.CommitState());
1257 1416
1258 state.NotifyBeginMainFrameStarted(); 1417 state.NotifyBeginMainFrameStarted();
1259 state.NotifyReadyToCommit(); 1418 state.NotifyReadyToCommit();
1260 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1419 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1261 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1420 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1262 // Finishing the first commit after initializing an output surface should 1421 // Finishing the first commit after initializing an output surface should
1263 // automatically cause a redraw. 1422 // automatically cause a redraw.
1264 EXPECT_TRUE(state.RedrawPending()); 1423 EXPECT_TRUE(state.RedrawPending());
1265 1424
1266 // Once the context is recreated, whether we draw should be based on 1425 // Once the context is recreated, whether we draw should be based on
1267 // SetCanDraw. 1426 // SetCanDraw.
1268 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1427 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
1269 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 1428 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
1270 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1429 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1271 state.OnBeginImplFrameDeadline(); 1430 state.OnBeginImplFrameDeadline();
1272 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, 1431 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
1273 state.NextAction()); 1432 state.NextAction());
1274 state.SetCanDraw(false); 1433 state.SetCanDraw(false);
1275 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT, 1434 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT,
1276 state.NextAction()); 1435 state.NextAction());
1277 state.SetCanDraw(true); 1436 state.SetCanDraw(true);
1278 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, 1437 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
1279 state.NextAction()); 1438 state.NextAction());
1280 } 1439 }
1281 1440
1282 TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) { 1441 TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) {
1283 SchedulerSettings scheduler_settings; 1442 SchedulerSettings scheduler_settings;
1284 StateMachine state(scheduler_settings); 1443 StateMachine state(scheduler_settings);
1285 state.SetCanStart(); 1444 state.SetCanStart();
1286 state.UpdateState(state.NextAction()); 1445 state.UpdateState(state.NextAction());
1287 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1446 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1288 state.SetVisible(true); 1447 state.SetVisible(true);
1289 state.SetCanDraw(true); 1448 state.SetCanDraw(true);
1290 1449
1291 // Get a commit in flight. 1450 // Get a commit in flight.
1292 state.SetNeedsCommit(); 1451 state.SetNeedsCommit();
1293 1452
1294 // Set damage and expect a draw. 1453 // Set damage and expect a draw.
1295 state.SetNeedsRedraw(true); 1454 state.SetNeedsRedraw(true);
1296 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1455 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
1297 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 1456 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
1298 EXPECT_ACTION_UPDATE_STATE( 1457 EXPECT_ACTION_UPDATE_STATE(
1299 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1458 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1300 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1459 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1301 state.OnBeginImplFrameDeadline(); 1460 state.OnBeginImplFrameDeadline();
1302 EXPECT_ACTION_UPDATE_STATE( 1461 EXPECT_ACTION_UPDATE_STATE(
1303 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 1462 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
1304 state.DidSwapBuffers(); 1463 state.DidSwapBuffers();
1305 state.DidSwapBuffersComplete(); 1464 state.DidSwapBuffersComplete();
1306 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1465 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
(...skipping 14 matching lines...)
1321 // waiting for the first draw to unblock the main thread. 1480 // waiting for the first draw to unblock the main thread.
1322 EXPECT_TRUE(state.active_tree_needs_first_draw()); 1481 EXPECT_TRUE(state.active_tree_needs_first_draw());
1323 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); 1482 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
1324 1483
1325 // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE 1484 // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE
1326 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE, 1485 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE,
1327 state.begin_impl_frame_state()); 1486 state.begin_impl_frame_state());
1328 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 1487 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
1329 state.NextAction()); 1488 state.NextAction());
1330 1489
1331 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1490 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
1332 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING, 1491 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING,
1333 state.begin_impl_frame_state()); 1492 state.begin_impl_frame_state());
1334 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 1493 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
1335 1494
1336 state.OnBeginImplFrameDeadlinePending(); 1495 state.OnBeginImplFrameDeadlinePending();
1337 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME, 1496 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME,
1338 state.begin_impl_frame_state()); 1497 state.begin_impl_frame_state());
1339 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 1498 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
1340 1499
1341 state.OnBeginImplFrameDeadline(); 1500 state.OnBeginImplFrameDeadline();
(...skipping 11 matching lines...)
1353 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1512 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1354 state.SetVisible(true); 1513 state.SetVisible(true);
1355 state.SetCanDraw(true); 1514 state.SetCanDraw(true);
1356 1515
1357 // Get a commit in flight. 1516 // Get a commit in flight.
1358 state.SetNeedsCommit(); 1517 state.SetNeedsCommit();
1359 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1518 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1360 1519
1361 // Set damage and expect a draw. 1520 // Set damage and expect a draw.
1362 state.SetNeedsRedraw(true); 1521 state.SetNeedsRedraw(true);
1363 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1522 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
1364 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 1523 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
1365 EXPECT_ACTION_UPDATE_STATE( 1524 EXPECT_ACTION_UPDATE_STATE(
1366 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1525 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1367 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1526 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1368 state.OnBeginImplFrameDeadline(); 1527 state.OnBeginImplFrameDeadline();
1369 EXPECT_ACTION_UPDATE_STATE( 1528 EXPECT_ACTION_UPDATE_STATE(
1370 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 1529 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
1371 state.DidSwapBuffers(); 1530 state.DidSwapBuffers();
1372 state.DidSwapBuffersComplete(); 1531 state.DidSwapBuffersComplete();
1373 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1532 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
(...skipping 14 matching lines...)
1388 1547
1389 // Because the output surface is missing, we expect the draw to abort. 1548 // Because the output surface is missing, we expect the draw to abort.
1390 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); 1549 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
1391 1550
1392 // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE 1551 // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE
1393 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE, 1552 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE,
1394 state.begin_impl_frame_state()); 1553 state.begin_impl_frame_state());
1395 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 1554 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
1396 state.NextAction()); 1555 state.NextAction());
1397 1556
1398 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1557 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
1399 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING, 1558 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING,
1400 state.begin_impl_frame_state()); 1559 state.begin_impl_frame_state());
1401 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 1560 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
1402 1561
1403 state.OnBeginImplFrameDeadlinePending(); 1562 state.OnBeginImplFrameDeadlinePending();
1404 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME, 1563 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME,
1405 state.begin_impl_frame_state()); 1564 state.begin_impl_frame_state());
1406 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 1565 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
1407 1566
1408 state.OnBeginImplFrameDeadline(); 1567 state.OnBeginImplFrameDeadline();
1409 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE, 1568 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE,
1410 state.begin_impl_frame_state()); 1569 state.begin_impl_frame_state());
1411 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 1570 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
1412 1571
1413 state.OnBeginImplFrameIdle(); 1572 state.OnBeginImplFrameIdle();
1414 EXPECT_ACTION_UPDATE_STATE( 1573 EXPECT_ACTION_UPDATE_STATE(
1415 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); 1574 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION);
1416 1575
1417 // After we get a new output surface, the commit flow should start. 1576 // After we get a new output surface, the commit flow should start.
1418 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1577 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1419 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1578 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
1420 EXPECT_ACTION_UPDATE_STATE( 1579 EXPECT_ACTION_UPDATE_STATE(
1421 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1580 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1422 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1581 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1423 state.NotifyBeginMainFrameStarted(); 1582 state.NotifyBeginMainFrameStarted();
1424 state.NotifyReadyToCommit(); 1583 state.NotifyReadyToCommit();
1425 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1584 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1426 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1585 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1427 state.OnBeginImplFrameDeadline(); 1586 state.OnBeginImplFrameDeadline();
1428 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 1587 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
1429 EXPECT_ACTION_UPDATE_STATE( 1588 EXPECT_ACTION_UPDATE_STATE(
(...skipping 15 matching lines...)
1445 state.SetNeedsRedraw(true); 1604 state.SetNeedsRedraw(true);
1446 1605
1447 // Cause a lost output surface, and restore it. 1606 // Cause a lost output surface, and restore it.
1448 state.DidLoseOutputSurface(); 1607 state.DidLoseOutputSurface();
1449 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 1608 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
1450 state.NextAction()); 1609 state.NextAction());
1451 state.UpdateState(state.NextAction()); 1610 state.UpdateState(state.NextAction());
1452 state.DidCreateAndInitializeOutputSurface(); 1611 state.DidCreateAndInitializeOutputSurface();
1453 1612
1454 EXPECT_FALSE(state.RedrawPending()); 1613 EXPECT_FALSE(state.RedrawPending());
1455 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1614 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
1456 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME, 1615 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME,
1457 state.NextAction()); 1616 state.NextAction());
1458 } 1617 }
1459 1618
1460 TEST(SchedulerStateMachineTest, 1619 TEST(SchedulerStateMachineTest,
1461 TestPendingActivationsShouldBeForcedAfterLostOutputSurface) { 1620 TestPendingActivationsShouldBeForcedAfterLostOutputSurface) {
1462 SchedulerSettings settings; 1621 SchedulerSettings settings;
1463 settings.impl_side_painting = true; 1622 settings.impl_side_painting = true;
1464 StateMachine state(settings); 1623 StateMachine state(settings);
1465 state.SetCanStart(); 1624 state.SetCanStart();
(...skipping 111 matching lines...)
1577 settings.impl_side_painting = true; 1736 settings.impl_side_painting = true;
1578 StateMachine state(settings); 1737 StateMachine state(settings);
1579 state.SetCanStart(); 1738 state.SetCanStart();
1580 state.UpdateState(state.NextAction()); 1739 state.UpdateState(state.NextAction());
1581 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1740 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1582 state.SetVisible(true); 1741 state.SetVisible(true);
1583 state.SetCanDraw(true); 1742 state.SetCanDraw(true);
1584 1743
1585 // This test mirrors what happens during the first frame of a scroll gesture. 1744 // This test mirrors what happens during the first frame of a scroll gesture.
1586 // First we get the input event and a BeginFrame. 1745 // First we get the input event and a BeginFrame.
1587 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1746 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
1588 1747
1589 // As a response the compositor requests a redraw and a commit to tell the 1748 // As a response the compositor requests a redraw and a commit to tell the
1590 // main thread about the new scroll offset. 1749 // main thread about the new scroll offset.
1591 state.SetNeedsRedraw(true); 1750 state.SetNeedsRedraw(true);
1592 state.SetNeedsCommit(); 1751 state.SetNeedsCommit();
1593 1752
1594 // We should start the commit normally. 1753 // We should start the commit normally.
1595 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 1754 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
1596 EXPECT_ACTION_UPDATE_STATE( 1755 EXPECT_ACTION_UPDATE_STATE(
1597 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1756 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
(...skipping 14 matching lines...)
1612 StateMachine& state = *state_ptr; 1771 StateMachine& state = *state_ptr;
1613 1772
1614 state.NotifyBeginMainFrameStarted(); 1773 state.NotifyBeginMainFrameStarted();
1615 state.NotifyReadyToCommit(); 1774 state.NotifyReadyToCommit();
1616 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1775 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1617 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1776 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1618 state.NotifyReadyToActivate(); 1777 state.NotifyReadyToActivate();
1619 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); 1778 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
1620 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1779 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1621 1780
1622 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1781 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
1623 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 1782 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
1624 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1783 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1625 1784
1626 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineEarly()); 1785 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineEarly());
1627 state.OnBeginImplFrameDeadline(); 1786 state.OnBeginImplFrameDeadline();
1628 EXPECT_ACTION_UPDATE_STATE( 1787 EXPECT_ACTION_UPDATE_STATE(
1629 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 1788 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
1630 state.DidSwapBuffers(); 1789 state.DidSwapBuffers();
1631 } 1790 }
1632 1791
1633 TEST(SchedulerStateMachineTest, TestImplLatencyTakesPriority) { 1792 TEST(SchedulerStateMachineTest, TestImplLatencyTakesPriority) {
1634 SchedulerSettings settings; 1793 SchedulerSettings settings;
1635 settings.impl_side_painting = true; 1794 settings.impl_side_painting = true;
1636 StateMachine state(settings); 1795 StateMachine state(settings);
1637 state.SetCanStart(); 1796 state.SetCanStart();
1638 state.UpdateState(state.NextAction()); 1797 state.UpdateState(state.NextAction());
1639 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1798 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1640 state.SetVisible(true); 1799 state.SetVisible(true);
1641 state.SetCanDraw(true); 1800 state.SetCanDraw(true);
1642 1801
1643 // This test ensures that impl-draws are prioritized over main thread updates 1802 // This test ensures that impl-draws are prioritized over main thread updates
1644 // in prefer impl latency mode. 1803 // in prefer impl latency mode.
1645 state.SetNeedsRedraw(true); 1804 state.SetNeedsRedraw(true);
1646 state.SetNeedsCommit(); 1805 state.SetNeedsCommit();
1647 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1806 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
1648 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 1807 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
1649 EXPECT_ACTION_UPDATE_STATE( 1808 EXPECT_ACTION_UPDATE_STATE(
1650 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1809 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1651 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1810 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1652 1811
1653 // Verify the deadline is not triggered early until we enter 1812 // Verify the deadline is not triggered early until we enter
1654 // prefer impl latency mode. 1813 // prefer impl latency mode.
1655 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineEarly()); 1814 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineEarly());
1656 state.SetImplLatencyTakesPriority(true); 1815 state.SetImplLatencyTakesPriority(true);
1657 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineEarly()); 1816 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineEarly());
(...skipping 16 matching lines...)
1674 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1833 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1675 1834
1676 // Finish the previous commit and draw it. 1835 // Finish the previous commit and draw it.
1677 FinishPreviousCommitAndDrawWithoutExitingDeadline(&state); 1836 FinishPreviousCommitAndDrawWithoutExitingDeadline(&state);
1678 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1837 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1679 1838
1680 // Verify we do not send another BeginMainFrame if was are swap throttled 1839 // Verify we do not send another BeginMainFrame if was are swap throttled
1681 // and did not just swap. 1840 // and did not just swap.
1682 state.SetNeedsCommit(); 1841 state.SetNeedsCommit();
1683 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1842 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1684 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1843 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
1685 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1844 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1686 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineEarly()); 1845 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineEarly());
1687 state.OnBeginImplFrameDeadline(); 1846 state.OnBeginImplFrameDeadline();
1688 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1847 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1689 } 1848 }
1690 1849
1691 TEST(SchedulerStateMachineTest, TestTriggerDeadlineEarlyOnLostOutputSurface) { 1850 TEST(SchedulerStateMachineTest, TestTriggerDeadlineEarlyOnLostOutputSurface) {
1692 SchedulerSettings default_scheduler_settings; 1851 SchedulerSettings default_scheduler_settings;
1693 StateMachine state(default_scheduler_settings); 1852 StateMachine state(default_scheduler_settings);
1694 state.SetCanStart(); 1853 state.SetCanStart();
1695 state.UpdateState(state.NextAction()); 1854 state.UpdateState(state.NextAction());
1696 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1855 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1697 state.SetVisible(true); 1856 state.SetVisible(true);
1698 state.SetCanDraw(true); 1857 state.SetCanDraw(true);
1699 1858
1700 state.SetNeedsCommit(); 1859 state.SetNeedsCommit();
1701 1860
1702 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1861 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
1703 EXPECT_ACTION_UPDATE_STATE( 1862 EXPECT_ACTION_UPDATE_STATE(
1704 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1863 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1705 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1864 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1706 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineEarly()); 1865 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineEarly());
1707 1866
1708 state.DidLoseOutputSurface(); 1867 state.DidLoseOutputSurface();
1709 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1868 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1710 // The deadline should be triggered immediately when output surface is lost. 1869 // The deadline should be triggered immediately when output surface is lost.
1711 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineEarly()); 1870 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineEarly());
1712 } 1871 }
1713 1872
1714 TEST(SchedulerStateMachineTest, TestSetNeedsAnimate) { 1873 TEST(SchedulerStateMachineTest, TestSetNeedsAnimate) {
1715 SchedulerSettings settings; 1874 SchedulerSettings settings;
1716 settings.impl_side_painting = true; 1875 settings.impl_side_painting = true;
1717 StateMachine state(settings); 1876 StateMachine state(settings);
1718 state.SetCanStart(); 1877 state.SetCanStart();
1719 state.UpdateState(state.NextAction()); 1878 state.UpdateState(state.NextAction());
1720 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1879 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1721 state.SetVisible(true); 1880 state.SetVisible(true);
1722 state.SetCanDraw(true); 1881 state.SetCanDraw(true);
1723 1882
1724 // Test requesting an animation that, when run, causes us to draw. 1883 // Test requesting an animation that, when run, causes us to draw.
1725 state.SetNeedsAnimate(); 1884 state.SetNeedsAnimate();
1726 EXPECT_TRUE(state.BeginFrameNeeded()); 1885 EXPECT_TRUE(state.BeginFrameNeeded());
1727 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1886 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1728 1887
1729 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1888 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
1730 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 1889 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
1731 1890
1732 state.OnBeginImplFrameDeadlinePending(); 1891 state.OnBeginImplFrameDeadlinePending();
1733 state.OnBeginImplFrameDeadline(); 1892 state.OnBeginImplFrameDeadline();
1734 EXPECT_ACTION_UPDATE_STATE( 1893 EXPECT_ACTION_UPDATE_STATE(
1735 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 1894 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
1736 } 1895 }
1737 1896
1738 TEST(SchedulerStateMachineTest, TestAnimateBeforeCommit) { 1897 TEST(SchedulerStateMachineTest, TestAnimateBeforeCommit) {
1739 SchedulerSettings settings; 1898 SchedulerSettings settings;
1740 settings.impl_side_painting = true; 1899 settings.impl_side_painting = true;
1741 StateMachine state(settings); 1900 StateMachine state(settings);
1742 state.SetCanStart(); 1901 state.SetCanStart();
1743 state.UpdateState(state.NextAction()); 1902 state.UpdateState(state.NextAction());
1744 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1903 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1745 state.SetVisible(true); 1904 state.SetVisible(true);
1746 state.SetCanDraw(true); 1905 state.SetCanDraw(true);
1747 1906
1748 // Check that animations are updated before we start a commit. 1907 // Check that animations are updated before we start a commit.
1749 state.SetNeedsAnimate(); 1908 state.SetNeedsAnimate();
1750 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1909 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1751 state.SetNeedsCommit(); 1910 state.SetNeedsCommit();
1752 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1911 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1753 EXPECT_TRUE(state.BeginFrameNeeded()); 1912 EXPECT_TRUE(state.BeginFrameNeeded());
1754 1913
1755 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1914 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
1756 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 1915 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
1757 EXPECT_ACTION_UPDATE_STATE( 1916 EXPECT_ACTION_UPDATE_STATE(
1758 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1917 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1759 1918
1760 state.OnBeginImplFrameDeadlinePending(); 1919 state.OnBeginImplFrameDeadlinePending();
1761 state.OnBeginImplFrameDeadline(); 1920 state.OnBeginImplFrameDeadline();
1762 EXPECT_ACTION_UPDATE_STATE( 1921 EXPECT_ACTION_UPDATE_STATE(
1763 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 1922 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
1764 } 1923 }
1765 1924
1766 TEST(SchedulerStateMachineTest, TestAnimateAfterCommitBeforeDraw) { 1925 TEST(SchedulerStateMachineTest, TestAnimateAfterCommitBeforeDraw) {
1767 SchedulerSettings settings; 1926 SchedulerSettings settings;
1768 settings.impl_side_painting = true; 1927 settings.impl_side_painting = true;
1769 StateMachine state(settings); 1928 StateMachine state(settings);
1770 state.SetCanStart(); 1929 state.SetCanStart();
1771 state.UpdateState(state.NextAction()); 1930 state.UpdateState(state.NextAction());
1772 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1931 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1773 state.SetVisible(true); 1932 state.SetVisible(true);
1774 state.SetCanDraw(true); 1933 state.SetCanDraw(true);
1775 1934
1776 // Check that animations are updated before we start a commit. 1935 // Check that animations are updated before we start a commit.
1777 state.SetNeedsAnimate(); 1936 state.SetNeedsAnimate();
1778 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1937 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1779 state.SetNeedsCommit(); 1938 state.SetNeedsCommit();
1780 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1939 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1781 EXPECT_TRUE(state.BeginFrameNeeded()); 1940 EXPECT_TRUE(state.BeginFrameNeeded());
1782 1941
1783 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1942 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
1784 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 1943 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
1785 EXPECT_ACTION_UPDATE_STATE( 1944 EXPECT_ACTION_UPDATE_STATE(
1786 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); 1945 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
1787 1946
1788 state.NotifyBeginMainFrameStarted(); 1947 state.NotifyBeginMainFrameStarted();
1789 state.NotifyReadyToCommit(); 1948 state.NotifyReadyToCommit();
1790 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); 1949 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1791 1950
1792 state.OnBeginImplFrameDeadlinePending(); 1951 state.OnBeginImplFrameDeadlinePending();
1793 state.OnBeginImplFrameDeadline(); 1952 state.OnBeginImplFrameDeadline();
(...skipping 11 matching lines...)
1805 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1964 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1806 state.SetVisible(true); 1965 state.SetVisible(true);
1807 state.SetCanDraw(true); 1966 state.SetCanDraw(true);
1808 1967
1809 // Test requesting an animation after we have already animated during this 1968 // Test requesting an animation after we have already animated during this
1810 // frame. 1969 // frame.
1811 state.SetNeedsRedraw(true); 1970 state.SetNeedsRedraw(true);
1812 EXPECT_TRUE(state.BeginFrameNeeded()); 1971 EXPECT_TRUE(state.BeginFrameNeeded());
1813 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1972 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1814 1973
1815 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); 1974 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
1816 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); 1975 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
1817 1976
1818 state.SetNeedsAnimate(); 1977 state.SetNeedsAnimate();
1819 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); 1978 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1820 1979
1821 state.OnBeginImplFrameDeadline(); 1980 state.OnBeginImplFrameDeadline();
1822 EXPECT_ACTION_UPDATE_STATE( 1981 EXPECT_ACTION_UPDATE_STATE(
1823 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); 1982 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
1824 } 1983 }
1825 1984
1826 TEST(SchedulerStateMachineTest, TestForwardBeginFramesToChildren) { 1985 TEST(SchedulerStateMachineTest, TestForwardBeginFramesToChildren) {
1827 SchedulerSettings settings; 1986 SchedulerSettings settings;
1828 settings.forward_begin_frames_to_children = true; 1987 settings.forward_begin_frames_to_children = true;
1829 StateMachine state(settings); 1988 StateMachine state(settings);
1830 state.SetCanStart(); 1989 state.SetCanStart();
1831 state.UpdateState(state.NextAction()); 1990 state.UpdateState(state.NextAction());
1832 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); 1991 state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
1833 state.SetVisible(true); 1992 state.SetVisible(true);
1834 state.SetCanDraw(true); 1993 state.SetCanDraw(true);
1835 1994
1836 EXPECT_FALSE(state.BeginFrameNeeded()); 1995 EXPECT_FALSE(state.BeginFrameNeeded());
1837 state.SetChildrenNeedBeginFrames(true); 1996 state.SetChildrenNeedBeginFrames(true);
1838 EXPECT_TRUE(state.BeginFrameNeeded()); 1997 EXPECT_TRUE(state.BeginFrameNeeded());
1839 } 1998 }
1840 1999
1841 } // namespace 2000 } // namespace
1842 } // namespace cc 2001 } // namespace cc
OLDNEW
« no previous file with comments | « cc/scheduler/scheduler_state_machine.cc ('k') | cc/scheduler/scheduler_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine