OLD | NEW |
---|---|
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/scheduler/scheduler_state_machine.h" | 5 #include "cc/scheduler/scheduler_state_machine.h" |
6 | 6 |
7 #include "cc/scheduler/scheduler.h" | 7 #include "cc/scheduler/scheduler.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
9 | 9 |
10 #define EXPECT_ACTION_UPDATE_STATE(action) \ | 10 #define EXPECT_ACTION_UPDATE_STATE(action) \ |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
166 state.UpdateState(state.NextAction()); | 166 state.UpdateState(state.NextAction()); |
167 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 167 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
168 state.SetVisible(true); | 168 state.SetVisible(true); |
169 state.UpdateState(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 169 state.UpdateState(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
170 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, | 170 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, |
171 state.CommitState()); | 171 state.CommitState()); |
172 EXPECT_FALSE(state.NeedsCommit()); | 172 EXPECT_FALSE(state.NeedsCommit()); |
173 } | 173 } |
174 } | 174 } |
175 | 175 |
176 TEST(SchedulerStateMachineTest, | 176 TEST(SchedulerStateMachineTest, TestFailedDrawSetsRedrawAndCommitFlags) { |
177 TestFailedDrawSetsNeedsCommitAndDoesNotDrawAgain) { | |
178 SchedulerSettings default_scheduler_settings; | 177 SchedulerSettings default_scheduler_settings; |
179 StateMachine state(default_scheduler_settings); | 178 StateMachine state(default_scheduler_settings); |
180 state.SetCanStart(); | 179 state.SetCanStart(); |
181 state.UpdateState(state.NextAction()); | 180 state.UpdateState(state.NextAction()); |
182 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 181 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
183 state.SetVisible(true); | 182 state.SetVisible(true); |
184 state.SetCanDraw(true); | 183 state.SetCanDraw(true); |
185 state.SetNeedsRedraw(true); | 184 state.SetNeedsRedraw(true); |
186 EXPECT_TRUE(state.RedrawPending()); | 185 EXPECT_TRUE(state.RedrawPending()); |
187 EXPECT_TRUE(state.BeginImplFrameNeeded()); | 186 EXPECT_TRUE(state.BeginImplFrameNeeded()); |
188 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | |
189 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | |
190 state.OnBeginImplFrameDeadline(); | |
191 | 187 |
192 // We're drawing now. | 188 DrawSwapReadbackResult::DrawResult aborts[] = { |
brianderson
2014/01/29 01:31:22
Thanks for testing all the new abort results.
| |
193 EXPECT_ACTION_UPDATE_STATE( | 189 DrawSwapReadbackResult::DRAW_ABORTED_CANT_DRAW, |
194 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 190 DrawSwapReadbackResult::DRAW_ABORTED_NO_TREE, |
195 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 191 DrawSwapReadbackResult::DRAW_ABORTED_NO_RENDERER, |
192 DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS, }; | |
196 | 193 |
197 EXPECT_FALSE(state.RedrawPending()); | 194 for (size_t i = 0; i < arraysize(aborts); ++i) { |
198 EXPECT_FALSE(state.CommitPending()); | 195 state.SetNeedsRedraw(true); |
196 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | |
197 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | |
198 state.OnBeginImplFrameDeadline(); | |
199 | 199 |
200 // Failing the draw makes us require a commit. | 200 EXPECT_ACTION_UPDATE_STATE( |
201 state.DidDrawIfPossibleCompleted(false); | 201 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
202 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 202 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
203 EXPECT_ACTION_UPDATE_STATE( | 203 EXPECT_FALSE(state.RedrawPending()); |
204 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 204 EXPECT_FALSE(state.CommitPending()); |
205 EXPECT_TRUE(state.RedrawPending()); | 205 |
206 EXPECT_TRUE(state.CommitPending()); | 206 state.DidDrawIfPossibleCompleted(aborts[i]); |
207 | |
208 if (aborts[i] == | |
209 DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS) { | |
210 // Failing the draw for checkerboarding causes a commit/redraw. | |
211 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | |
212 EXPECT_ACTION_UPDATE_STATE( | |
213 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | |
214 EXPECT_TRUE(state.RedrawPending()); | |
215 EXPECT_TRUE(state.CommitPending()); | |
216 } else { | |
217 // Failing the draw for most reasons does not require a commit or a | |
218 // redraw. | |
219 EXPECT_FALSE(state.RedrawPending()); | |
220 EXPECT_FALSE(state.CommitPending()); | |
221 } | |
222 } | |
207 } | 223 } |
208 | 224 |
209 TEST(SchedulerStateMachineTest, | 225 TEST(SchedulerStateMachineTest, |
210 TestsetNeedsRedrawDuringFailedDrawDoesNotRemoveNeedsRedraw) { | 226 TestsetNeedsRedrawDuringFailedDrawDoesNotRemoveNeedsRedraw) { |
211 SchedulerSettings default_scheduler_settings; | 227 SchedulerSettings default_scheduler_settings; |
212 StateMachine state(default_scheduler_settings); | 228 StateMachine state(default_scheduler_settings); |
213 state.SetCanStart(); | 229 state.SetCanStart(); |
214 state.UpdateState(state.NextAction()); | 230 state.UpdateState(state.NextAction()); |
215 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 231 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
216 | 232 |
(...skipping 11 matching lines...) Expand all Loading... | |
228 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 244 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
229 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 245 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
230 EXPECT_FALSE(state.RedrawPending()); | 246 EXPECT_FALSE(state.RedrawPending()); |
231 EXPECT_FALSE(state.CommitPending()); | 247 EXPECT_FALSE(state.CommitPending()); |
232 | 248 |
233 // While still in the same BeginMainFrame callback on the main thread, | 249 // While still in the same BeginMainFrame callback on the main thread, |
234 // set needs redraw again. This should not redraw. | 250 // set needs redraw again. This should not redraw. |
235 state.SetNeedsRedraw(true); | 251 state.SetNeedsRedraw(true); |
236 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 252 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
237 | 253 |
238 // Failing the draw makes us require a commit. | 254 // Failing the draw for animation checkerboards makes us require a commit. |
239 state.DidDrawIfPossibleCompleted(false); | 255 state.DidDrawIfPossibleCompleted( |
256 DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); | |
240 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 257 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); |
241 EXPECT_ACTION_UPDATE_STATE( | 258 EXPECT_ACTION_UPDATE_STATE( |
242 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 259 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
243 EXPECT_TRUE(state.RedrawPending()); | 260 EXPECT_TRUE(state.RedrawPending()); |
244 } | 261 } |
245 | 262 |
246 void TestFailedDrawsWillEventuallyForceADrawAfterTheNextCommit( | 263 void TestFailedDrawsWillEventuallyForceADrawAfterTheNextCommit( |
247 bool deadline_scheduling_enabled) { | 264 bool deadline_scheduling_enabled) { |
248 SchedulerSettings scheduler_settings; | 265 SchedulerSettings scheduler_settings; |
249 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced_ = 1; | 266 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced_ = 1; |
(...skipping 20 matching lines...) Expand all Loading... | |
270 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 287 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
271 EXPECT_TRUE(state.CommitPending()); | 288 EXPECT_TRUE(state.CommitPending()); |
272 | 289 |
273 // Then initiate a draw. | 290 // Then initiate a draw. |
274 state.SetNeedsRedraw(true); | 291 state.SetNeedsRedraw(true); |
275 state.OnBeginImplFrameDeadline(); | 292 state.OnBeginImplFrameDeadline(); |
276 EXPECT_ACTION_UPDATE_STATE( | 293 EXPECT_ACTION_UPDATE_STATE( |
277 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 294 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
278 | 295 |
279 // Fail the draw. | 296 // Fail the draw. |
280 state.DidDrawIfPossibleCompleted(false); | 297 state.DidDrawIfPossibleCompleted( |
298 DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); | |
281 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 299 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
282 EXPECT_TRUE(state.BeginImplFrameNeeded()); | 300 EXPECT_TRUE(state.BeginImplFrameNeeded()); |
283 EXPECT_TRUE(state.RedrawPending()); | 301 EXPECT_TRUE(state.RedrawPending()); |
284 // But the commit is ongoing. | 302 // But the commit is ongoing. |
285 EXPECT_TRUE(state.CommitPending()); | 303 EXPECT_TRUE(state.CommitPending()); |
286 | 304 |
287 // Finish the commit. Note, we should not yet be forcing a draw, but should | 305 // Finish the commit. Note, we should not yet be forcing a draw, but should |
288 // continue the commit as usual. | 306 // continue the commit as usual. |
289 state.FinishCommit(); | 307 state.FinishCommit(); |
290 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 308 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
(...skipping 18 matching lines...) Expand all Loading... | |
309 TEST(SchedulerStateMachineTest, | 327 TEST(SchedulerStateMachineTest, |
310 TestFailedDrawsWillEventuallyForceADrawAfterTheNextCommit_Deadline) { | 328 TestFailedDrawsWillEventuallyForceADrawAfterTheNextCommit_Deadline) { |
311 bool deadline_scheduling_enabled = true; | 329 bool deadline_scheduling_enabled = true; |
312 TestFailedDrawsWillEventuallyForceADrawAfterTheNextCommit( | 330 TestFailedDrawsWillEventuallyForceADrawAfterTheNextCommit( |
313 deadline_scheduling_enabled); | 331 deadline_scheduling_enabled); |
314 } | 332 } |
315 | 333 |
316 void TestFailedDrawsDoNotRestartForcedDraw( | 334 void TestFailedDrawsDoNotRestartForcedDraw( |
317 bool deadline_scheduling_enabled) { | 335 bool deadline_scheduling_enabled) { |
318 SchedulerSettings scheduler_settings; | 336 SchedulerSettings scheduler_settings; |
319 int drawLimit = 1; | 337 int draw_limit = 1; |
320 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced_ = | 338 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced_ = |
321 drawLimit; | 339 draw_limit; |
322 scheduler_settings.deadline_scheduling_enabled = deadline_scheduling_enabled; | 340 scheduler_settings.deadline_scheduling_enabled = deadline_scheduling_enabled; |
323 scheduler_settings.impl_side_painting = true; | 341 scheduler_settings.impl_side_painting = true; |
324 StateMachine state(scheduler_settings); | 342 StateMachine state(scheduler_settings); |
325 state.SetCanStart(); | 343 state.SetCanStart(); |
326 state.UpdateState(state.NextAction()); | 344 state.UpdateState(state.NextAction()); |
327 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 345 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
328 state.SetVisible(true); | 346 state.SetVisible(true); |
329 state.SetCanDraw(true); | 347 state.SetCanDraw(true); |
330 | 348 |
331 // Start a commit. | 349 // Start a commit. |
(...skipping 12 matching lines...) Expand all Loading... | |
344 EXPECT_TRUE(state.CommitPending()); | 362 EXPECT_TRUE(state.CommitPending()); |
345 | 363 |
346 // Then initiate a draw. | 364 // Then initiate a draw. |
347 state.SetNeedsRedraw(true); | 365 state.SetNeedsRedraw(true); |
348 state.OnBeginImplFrameDeadline(); | 366 state.OnBeginImplFrameDeadline(); |
349 EXPECT_ACTION_UPDATE_STATE( | 367 EXPECT_ACTION_UPDATE_STATE( |
350 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 368 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
351 | 369 |
352 // Fail the draw enough times to force a redraw, | 370 // Fail the draw enough times to force a redraw, |
353 // then once more for good measure. | 371 // then once more for good measure. |
354 for (int i = 0; i < drawLimit; ++i) | 372 for (int i = 0; i < draw_limit + 1; ++i) { |
355 state.DidDrawIfPossibleCompleted(false); | 373 state.DidDrawIfPossibleCompleted( |
356 state.DidDrawIfPossibleCompleted(false); | 374 DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); |
375 } | |
357 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 376 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
358 EXPECT_TRUE(state.BeginImplFrameNeeded()); | 377 EXPECT_TRUE(state.BeginImplFrameNeeded()); |
359 EXPECT_TRUE(state.RedrawPending()); | 378 EXPECT_TRUE(state.RedrawPending()); |
360 // But the commit is ongoing. | 379 // But the commit is ongoing. |
361 EXPECT_TRUE(state.CommitPending()); | 380 EXPECT_TRUE(state.CommitPending()); |
362 EXPECT_TRUE(state.ForcedRedrawState() == | 381 EXPECT_TRUE(state.ForcedRedrawState() == |
363 SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_COMMIT); | 382 SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_COMMIT); |
364 | 383 |
365 state.FinishCommit(); | 384 state.FinishCommit(); |
366 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 385 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
367 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 386 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
368 EXPECT_TRUE(state.RedrawPending()); | 387 EXPECT_TRUE(state.RedrawPending()); |
369 EXPECT_FALSE(state.CommitPending()); | 388 EXPECT_FALSE(state.CommitPending()); |
370 | 389 |
371 // Now force redraw should be in waiting for activation | 390 // Now force redraw should be in waiting for activation |
372 EXPECT_TRUE(state.ForcedRedrawState() == | 391 EXPECT_TRUE(state.ForcedRedrawState() == |
373 SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_ACTIVATION); | 392 SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_ACTIVATION); |
374 | 393 |
375 // After failing additional draws, we should still be in a forced | 394 // After failing additional draws, we should still be in a forced |
376 // redraw, but not back in WAITING_FOR_COMMIT. | 395 // redraw, but not back in WAITING_FOR_COMMIT. |
377 for (int i = 0; i < drawLimit; ++i) | 396 for (int i = 0; i < draw_limit + 1; ++i) { |
378 state.DidDrawIfPossibleCompleted(false); | 397 state.DidDrawIfPossibleCompleted( |
379 state.DidDrawIfPossibleCompleted(false); | 398 DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); |
399 } | |
380 EXPECT_TRUE(state.RedrawPending()); | 400 EXPECT_TRUE(state.RedrawPending()); |
381 EXPECT_TRUE(state.ForcedRedrawState() == | 401 EXPECT_TRUE(state.ForcedRedrawState() == |
382 SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_ACTIVATION); | 402 SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_ACTIVATION); |
383 } | 403 } |
384 | 404 |
385 TEST(SchedulerStateMachineTest, | 405 TEST(SchedulerStateMachineTest, |
386 TestFailedDrawsDoNotRestartForcedDraw) { | 406 TestFailedDrawsDoNotRestartForcedDraw) { |
387 bool deadline_scheduling_enabled = false; | 407 bool deadline_scheduling_enabled = false; |
388 TestFailedDrawsDoNotRestartForcedDraw( | 408 TestFailedDrawsDoNotRestartForcedDraw( |
389 deadline_scheduling_enabled); | 409 deadline_scheduling_enabled); |
(...skipping 18 matching lines...) Expand all Loading... | |
408 // Start a draw. | 428 // Start a draw. |
409 state.SetNeedsRedraw(true); | 429 state.SetNeedsRedraw(true); |
410 EXPECT_TRUE(state.BeginImplFrameNeeded()); | 430 EXPECT_TRUE(state.BeginImplFrameNeeded()); |
411 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 431 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); |
412 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 432 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
413 state.OnBeginImplFrameDeadline(); | 433 state.OnBeginImplFrameDeadline(); |
414 EXPECT_TRUE(state.RedrawPending()); | 434 EXPECT_TRUE(state.RedrawPending()); |
415 EXPECT_ACTION_UPDATE_STATE( | 435 EXPECT_ACTION_UPDATE_STATE( |
416 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 436 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
417 | 437 |
418 // Fail the draw | 438 // Failing the draw for animation checkerboards makes us require a commit. |
419 state.DidDrawIfPossibleCompleted(false); | 439 state.DidDrawIfPossibleCompleted( |
440 DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); | |
420 EXPECT_ACTION_UPDATE_STATE( | 441 EXPECT_ACTION_UPDATE_STATE( |
421 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 442 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
422 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 443 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
423 EXPECT_TRUE(state.RedrawPending()); | 444 EXPECT_TRUE(state.RedrawPending()); |
424 | 445 |
425 // We should not be trying to draw again now, but we have a commit pending. | 446 // We should not be trying to draw again now, but we have a commit pending. |
426 EXPECT_TRUE(state.BeginImplFrameNeeded()); | 447 EXPECT_TRUE(state.BeginImplFrameNeeded()); |
427 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 448 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); |
428 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 449 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
429 | 450 |
(...skipping 16 matching lines...) Expand all Loading... | |
446 state.SetNeedsRedraw(true); | 467 state.SetNeedsRedraw(true); |
447 | 468 |
448 // Draw the first frame. | 469 // Draw the first frame. |
449 EXPECT_TRUE(state.BeginImplFrameNeeded()); | 470 EXPECT_TRUE(state.BeginImplFrameNeeded()); |
450 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 471 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); |
451 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 472 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
452 | 473 |
453 state.OnBeginImplFrameDeadline(); | 474 state.OnBeginImplFrameDeadline(); |
454 EXPECT_ACTION_UPDATE_STATE( | 475 EXPECT_ACTION_UPDATE_STATE( |
455 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 476 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
456 state.DidDrawIfPossibleCompleted(true); | 477 state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DID_DRAW); |
457 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 478 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
458 | 479 |
459 // Before the next BeginImplFrame, set needs redraw again. | 480 // Before the next BeginImplFrame, set needs redraw again. |
460 // This should not redraw until the next BeginImplFrame. | 481 // This should not redraw until the next BeginImplFrame. |
461 state.SetNeedsRedraw(true); | 482 state.SetNeedsRedraw(true); |
462 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 483 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
463 | 484 |
464 // Move to another frame. This should now draw. | 485 // Move to another frame. This should now draw. |
465 EXPECT_TRUE(state.BeginImplFrameNeeded()); | 486 EXPECT_TRUE(state.BeginImplFrameNeeded()); |
466 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 487 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); |
467 | 488 |
468 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 489 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
469 | 490 |
470 state.OnBeginImplFrameDeadline(); | 491 state.OnBeginImplFrameDeadline(); |
471 EXPECT_ACTION_UPDATE_STATE( | 492 EXPECT_ACTION_UPDATE_STATE( |
472 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 493 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
473 state.DidDrawIfPossibleCompleted(true); | 494 state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DID_DRAW); |
474 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 495 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
475 | 496 |
476 // We just swapped, so we should proactively request another BeginImplFrame. | 497 // We just swapped, so we should proactively request another BeginImplFrame. |
477 EXPECT_TRUE(state.BeginImplFrameNeeded()); | 498 EXPECT_TRUE(state.BeginImplFrameNeeded()); |
478 } | 499 } |
479 | 500 |
480 TEST(SchedulerStateMachineTest, TestNextActionDrawsOnBeginImplFrame) { | 501 TEST(SchedulerStateMachineTest, TestNextActionDrawsOnBeginImplFrame) { |
481 SchedulerSettings default_scheduler_settings; | 502 SchedulerSettings default_scheduler_settings; |
482 | 503 |
483 // When not in BeginImplFrame deadline, or in BeginImplFrame deadline | 504 // When not in BeginImplFrame deadline, or in BeginImplFrame deadline |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
708 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); | 729 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); |
709 | 730 |
710 // Commit and make sure we draw on next BeginImplFrame | 731 // Commit and make sure we draw on next BeginImplFrame |
711 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 732 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
712 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 733 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
713 state.OnBeginImplFrameDeadline(); | 734 state.OnBeginImplFrameDeadline(); |
714 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, | 735 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, |
715 state.CommitState()); | 736 state.CommitState()); |
716 EXPECT_ACTION_UPDATE_STATE( | 737 EXPECT_ACTION_UPDATE_STATE( |
717 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 738 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
718 state.DidDrawIfPossibleCompleted(true); | 739 state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DID_DRAW); |
719 | 740 |
720 // Verify that another commit will start immediately after draw. | 741 // Verify that another commit will start immediately after draw. |
721 EXPECT_ACTION_UPDATE_STATE( | 742 EXPECT_ACTION_UPDATE_STATE( |
722 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 743 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
723 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 744 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
724 } | 745 } |
725 | 746 |
726 TEST(SchedulerStateMachineTest, TestFullCycle) { | 747 TEST(SchedulerStateMachineTest, TestFullCycle) { |
727 SchedulerSettings default_scheduler_settings; | 748 SchedulerSettings default_scheduler_settings; |
728 StateMachine state(default_scheduler_settings); | 749 StateMachine state(default_scheduler_settings); |
(...skipping 26 matching lines...) Expand all Loading... | |
755 state.CommitState()); | 776 state.CommitState()); |
756 EXPECT_TRUE(state.needs_redraw()); | 777 EXPECT_TRUE(state.needs_redraw()); |
757 | 778 |
758 // Expect to do nothing until BeginImplFrame deadline | 779 // Expect to do nothing until BeginImplFrame deadline |
759 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 780 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
760 | 781 |
761 // At BeginImplFrame deadline, draw. | 782 // At BeginImplFrame deadline, draw. |
762 state.OnBeginImplFrameDeadline(); | 783 state.OnBeginImplFrameDeadline(); |
763 EXPECT_ACTION_UPDATE_STATE( | 784 EXPECT_ACTION_UPDATE_STATE( |
764 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 785 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
765 state.DidDrawIfPossibleCompleted(true); | 786 state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DID_DRAW); |
766 | 787 |
767 // Should be synchronized, no draw needed, no action needed. | 788 // Should be synchronized, no draw needed, no action needed. |
768 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 789 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
769 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 790 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); |
770 EXPECT_FALSE(state.needs_redraw()); | 791 EXPECT_FALSE(state.needs_redraw()); |
771 } | 792 } |
772 | 793 |
773 TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) { | 794 TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) { |
774 SchedulerSettings default_scheduler_settings; | 795 SchedulerSettings default_scheduler_settings; |
775 StateMachine state(default_scheduler_settings); | 796 StateMachine state(default_scheduler_settings); |
(...skipping 30 matching lines...) Expand all Loading... | |
806 state.CommitState()); | 827 state.CommitState()); |
807 EXPECT_TRUE(state.needs_redraw()); | 828 EXPECT_TRUE(state.needs_redraw()); |
808 | 829 |
809 // Expect to do nothing until BeginImplFrame deadline. | 830 // Expect to do nothing until BeginImplFrame deadline. |
810 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 831 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
811 | 832 |
812 // At BeginImplFrame deadline, draw. | 833 // At BeginImplFrame deadline, draw. |
813 state.OnBeginImplFrameDeadline(); | 834 state.OnBeginImplFrameDeadline(); |
814 EXPECT_ACTION_UPDATE_STATE( | 835 EXPECT_ACTION_UPDATE_STATE( |
815 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 836 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
816 state.DidDrawIfPossibleCompleted(true); | 837 state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DID_DRAW); |
817 | 838 |
818 // Should be synchronized, no draw needed, no action needed. | 839 // Should be synchronized, no draw needed, no action needed. |
819 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 840 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
820 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 841 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); |
821 EXPECT_FALSE(state.needs_redraw()); | 842 EXPECT_FALSE(state.needs_redraw()); |
822 | 843 |
823 // Next BeginImplFrame should initiate second commit. | 844 // Next BeginImplFrame should initiate second commit. |
824 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 845 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); |
825 EXPECT_ACTION_UPDATE_STATE( | 846 EXPECT_ACTION_UPDATE_STATE( |
826 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 847 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
(...skipping 615 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1442 state.FinishCommit(); | 1463 state.FinishCommit(); |
1443 | 1464 |
1444 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, | 1465 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, |
1445 state.CommitState()); | 1466 state.CommitState()); |
1446 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 1467 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
1447 | 1468 |
1448 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, | 1469 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, |
1449 state.CommitState()); | 1470 state.CommitState()); |
1450 | 1471 |
1451 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); | 1472 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); |
1452 state.DidDrawIfPossibleCompleted(true); | 1473 state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DID_DRAW); |
1453 | 1474 |
1454 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1475 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
1455 | 1476 |
1456 // Should be waiting for the normal BeginMainFrame. | 1477 // Should be waiting for the normal BeginMainFrame. |
1457 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, | 1478 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, |
1458 state.CommitState()); | 1479 state.CommitState()); |
1459 } | 1480 } |
1460 | 1481 |
1461 void TestImmediateFinishCommitDuringCommit(bool deadline_scheduling_enabled) { | 1482 void TestImmediateFinishCommitDuringCommit(bool deadline_scheduling_enabled) { |
1462 SchedulerSettings scheduler_settings; | 1483 SchedulerSettings scheduler_settings; |
(...skipping 22 matching lines...) Expand all Loading... | |
1485 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1506 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
1486 state.FinishCommit(); | 1507 state.FinishCommit(); |
1487 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, | 1508 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, |
1488 state.CommitState()); | 1509 state.CommitState()); |
1489 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 1510 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
1490 | 1511 |
1491 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, | 1512 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, |
1492 state.CommitState()); | 1513 state.CommitState()); |
1493 | 1514 |
1494 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); | 1515 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); |
1495 state.DidDrawIfPossibleCompleted(true); | 1516 state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DID_DRAW); |
1496 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1517 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
1497 | 1518 |
1498 // Should be waiting for the normal BeginMainFrame. | 1519 // Should be waiting for the normal BeginMainFrame. |
1499 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, | 1520 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, |
1500 state.CommitState()) | 1521 state.CommitState()) |
1501 << *state.AsValue(); | 1522 << *state.AsValue(); |
1502 } | 1523 } |
1503 | 1524 |
1504 TEST(SchedulerStateMachineTest, TestImmediateFinishCommitDuringCommit) { | 1525 TEST(SchedulerStateMachineTest, TestImmediateFinishCommitDuringCommit) { |
1505 bool deadline_scheduling_enabled = false; | 1526 bool deadline_scheduling_enabled = false; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1539 state.FinishCommit(); | 1560 state.FinishCommit(); |
1540 | 1561 |
1541 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, | 1562 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, |
1542 state.CommitState()); | 1563 state.CommitState()); |
1543 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 1564 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
1544 | 1565 |
1545 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, | 1566 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, |
1546 state.CommitState()); | 1567 state.CommitState()); |
1547 | 1568 |
1548 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); | 1569 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); |
1549 state.DidDrawIfPossibleCompleted(true); | 1570 state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DID_DRAW); |
1550 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1571 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
1551 | 1572 |
1552 // Should be waiting for BeginMainFrame. | 1573 // Should be waiting for BeginMainFrame. |
1553 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, | 1574 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, |
1554 state.CommitState()) | 1575 state.CommitState()) |
1555 << *state.AsValue(); | 1576 << *state.AsValue(); |
1556 | 1577 |
1557 // Become invisible and abort BeginMainFrame. | 1578 // Become invisible and abort BeginMainFrame. |
1558 state.SetVisible(false); | 1579 state.SetVisible(false); |
1559 state.BeginMainFrameAborted(false); | 1580 state.BeginMainFrameAborted(false); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1595 state.FinishCommit(); | 1616 state.FinishCommit(); |
1596 | 1617 |
1597 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, | 1618 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, |
1598 state.CommitState()); | 1619 state.CommitState()); |
1599 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 1620 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
1600 | 1621 |
1601 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, | 1622 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, |
1602 state.CommitState()); | 1623 state.CommitState()); |
1603 | 1624 |
1604 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); | 1625 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); |
1605 state.DidDrawIfPossibleCompleted(true); | 1626 state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DID_DRAW); |
1606 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1627 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
1607 } | 1628 } |
1608 | 1629 |
1609 TEST(SchedulerStateMachineTest, ReportIfNotDrawing) { | 1630 TEST(SchedulerStateMachineTest, ReportIfNotDrawing) { |
1610 SchedulerSettings default_scheduler_settings; | 1631 SchedulerSettings default_scheduler_settings; |
1611 StateMachine state(default_scheduler_settings); | 1632 StateMachine state(default_scheduler_settings); |
1612 state.SetCanStart(); | 1633 state.SetCanStart(); |
1613 state.UpdateState(state.NextAction()); | 1634 state.UpdateState(state.NextAction()); |
1614 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 1635 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
1615 | 1636 |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1756 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1777 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
1757 | 1778 |
1758 // The deadline is not triggered early until we enter prefer smoothness mode. | 1779 // The deadline is not triggered early until we enter prefer smoothness mode. |
1759 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineEarly()); | 1780 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineEarly()); |
1760 state.SetSmoothnessTakesPriority(true); | 1781 state.SetSmoothnessTakesPriority(true); |
1761 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineEarly()); | 1782 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineEarly()); |
1762 } | 1783 } |
1763 | 1784 |
1764 } // namespace | 1785 } // namespace |
1765 } // namespace cc | 1786 } // namespace cc |
OLD | NEW |