| 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 "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 24 matching lines...) Expand all Loading... |
| 35 {SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE, | 35 {SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE, |
| 36 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING, | 36 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING, |
| 37 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME, | 37 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME, |
| 38 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE, }; | 38 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE, }; |
| 39 | 39 |
| 40 const SchedulerStateMachine::CommitState all_commit_states[] = { | 40 const SchedulerStateMachine::CommitState all_commit_states[] = { |
| 41 SchedulerStateMachine::COMMIT_STATE_IDLE, | 41 SchedulerStateMachine::COMMIT_STATE_IDLE, |
| 42 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, | 42 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, |
| 43 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED, | 43 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED, |
| 44 SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, | 44 SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, |
| 45 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_ACTIVATION, | 45 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_ACTIVATION}; |
| 46 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW}; | |
| 47 | 46 |
| 48 // Exposes the protected state fields of the SchedulerStateMachine for testing | 47 // Exposes the protected state fields of the SchedulerStateMachine for testing |
| 49 class StateMachine : public SchedulerStateMachine { | 48 class StateMachine : public SchedulerStateMachine { |
| 50 public: | 49 public: |
| 51 explicit StateMachine(const SchedulerSettings& scheduler_settings) | 50 explicit StateMachine(const SchedulerSettings& scheduler_settings) |
| 52 : SchedulerStateMachine(scheduler_settings) {} | 51 : SchedulerStateMachine(scheduler_settings) {} |
| 53 | 52 |
| 54 void CreateAndInitializeOutputSurfaceWithActivatedCommit() { | 53 void CreateAndInitializeOutputSurfaceWithActivatedCommit() { |
| 55 DidCreateAndInitializeOutputSurface(); | 54 DidCreateAndInitializeOutputSurface(); |
| 56 output_surface_state_ = OUTPUT_SURFACE_ACTIVE; | 55 output_surface_state_ = OUTPUT_SURFACE_ACTIVE; |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 state.UpdateState(state.NextAction()); | 168 state.UpdateState(state.NextAction()); |
| 170 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 169 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 171 state.SetVisible(true); | 170 state.SetVisible(true); |
| 172 state.UpdateState(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 171 state.UpdateState(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 173 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, | 172 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, |
| 174 state.CommitState()); | 173 state.CommitState()); |
| 175 EXPECT_FALSE(state.NeedsCommit()); | 174 EXPECT_FALSE(state.NeedsCommit()); |
| 176 } | 175 } |
| 177 } | 176 } |
| 178 | 177 |
| 179 // Explicitly test main_frame_before_draw_enabled = false | |
| 180 TEST(SchedulerStateMachineTest, MainFrameBeforeDrawDisabled) { | |
| 181 SchedulerSettings scheduler_settings; | |
| 182 scheduler_settings.impl_side_painting = true; | |
| 183 scheduler_settings.main_frame_before_draw_enabled = false; | |
| 184 StateMachine state(scheduler_settings); | |
| 185 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); | |
| 186 state.SetCanStart(); | |
| 187 state.UpdateState(state.NextAction()); | |
| 188 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | |
| 189 state.SetNeedsRedraw(false); | |
| 190 state.SetVisible(true); | |
| 191 state.SetCanDraw(true); | |
| 192 state.SetNeedsCommit(); | |
| 193 | |
| 194 EXPECT_TRUE(state.BeginFrameNeeded()); | |
| 195 | |
| 196 // Commit to the pending tree. | |
| 197 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); | |
| 198 EXPECT_ACTION_UPDATE_STATE( | |
| 199 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | |
| 200 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | |
| 201 state.NotifyBeginMainFrameStarted(); | |
| 202 state.NotifyReadyToCommit(); | |
| 203 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | |
| 204 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | |
| 205 EXPECT_EQ(state.CommitState(), | |
| 206 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW); | |
| 207 | |
| 208 state.OnBeginImplFrameDeadline(); | |
| 209 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | |
| 210 EXPECT_EQ(state.CommitState(), | |
| 211 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW); | |
| 212 | |
| 213 // Verify that the next commit doesn't start until the previous | |
| 214 // commit has been drawn. | |
| 215 state.SetNeedsCommit(); | |
| 216 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); | |
| 217 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | |
| 218 | |
| 219 // Make sure that a draw of the active tree doesn't spuriously advance | |
| 220 // the commit state and unblock the next commit. | |
| 221 state.SetNeedsRedraw(true); | |
| 222 state.OnBeginImplFrameDeadline(); | |
| 223 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | |
| 224 EXPECT_ACTION_UPDATE_STATE( | |
| 225 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | |
| 226 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | |
| 227 EXPECT_EQ(state.CommitState(), | |
| 228 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW); | |
| 229 EXPECT_TRUE(state.has_pending_tree()); | |
| 230 | |
| 231 // Verify NotifyReadyToActivate unblocks activation, draw, and | |
| 232 // commit in that order. | |
| 233 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); | |
| 234 | |
| 235 state.NotifyReadyToActivate(); | |
| 236 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); | |
| 237 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | |
| 238 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | |
| 239 EXPECT_EQ(state.CommitState(), | |
| 240 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW); | |
| 241 | |
| 242 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineEarly()); | |
| 243 state.OnBeginImplFrameDeadline(); | |
| 244 EXPECT_ACTION_UPDATE_STATE( | |
| 245 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | |
| 246 state.DidSwapBuffers(); | |
| 247 state.DidSwapBuffersComplete(); | |
| 248 EXPECT_EQ(state.CommitState(), SchedulerStateMachine::COMMIT_STATE_IDLE); | |
| 249 EXPECT_ACTION_UPDATE_STATE( | |
| 250 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | |
| 251 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | |
| 252 EXPECT_EQ(state.CommitState(), | |
| 253 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT); | |
| 254 | |
| 255 state.NotifyBeginMainFrameStarted(); | |
| 256 state.NotifyReadyToCommit(); | |
| 257 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | |
| 258 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | |
| 259 EXPECT_EQ(state.CommitState(), | |
| 260 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW); | |
| 261 } | |
| 262 | |
| 263 // Explicitly test main_frame_before_activation_enabled = true | 178 // Explicitly test main_frame_before_activation_enabled = true |
| 264 TEST(SchedulerStateMachineTest, MainFrameBeforeActivationEnabled) { | 179 TEST(SchedulerStateMachineTest, MainFrameBeforeActivationEnabled) { |
| 265 SchedulerSettings scheduler_settings; | 180 SchedulerSettings scheduler_settings; |
| 266 scheduler_settings.impl_side_painting = true; | 181 scheduler_settings.impl_side_painting = true; |
| 267 scheduler_settings.main_frame_before_activation_enabled = true; | 182 scheduler_settings.main_frame_before_activation_enabled = true; |
| 268 StateMachine state(scheduler_settings); | 183 StateMachine state(scheduler_settings); |
| 269 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); | 184 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); |
| 270 state.SetCanStart(); | 185 state.SetCanStart(); |
| 271 state.UpdateState(state.NextAction()); | 186 state.UpdateState(state.NextAction()); |
| 272 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 187 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 273 state.SetNeedsRedraw(false); | 188 state.SetNeedsRedraw(false); |
| 274 state.SetVisible(true); | 189 state.SetVisible(true); |
| 275 state.SetCanDraw(true); | 190 state.SetCanDraw(true); |
| 276 state.SetNeedsCommit(); | 191 state.SetNeedsCommit(); |
| 277 | 192 |
| 278 EXPECT_TRUE(state.BeginFrameNeeded()); | 193 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 279 | 194 |
| 280 // Commit to the pending tree. | 195 // Commit to the pending tree. |
| 281 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); | 196 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); |
| 282 EXPECT_ACTION_UPDATE_STATE( | 197 EXPECT_ACTION_UPDATE_STATE( |
| 283 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 198 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 284 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 199 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 285 | 200 |
| 286 state.NotifyBeginMainFrameStarted(); | 201 state.NotifyBeginMainFrameStarted(); |
| 287 state.NotifyReadyToCommit(); | 202 state.NotifyReadyToCommit(); |
| 288 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 203 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 289 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 204 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 290 EXPECT_EQ(state.CommitState(), SchedulerStateMachine::COMMIT_STATE_IDLE); | 205 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); |
| 291 | 206 |
| 292 state.OnBeginImplFrameDeadline(); | 207 state.OnBeginImplFrameDeadline(); |
| 293 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 208 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 294 | 209 |
| 295 // Verify that the next commit starts while there is still a pending tree. | 210 // Verify that the next commit starts while there is still a pending tree. |
| 296 state.SetNeedsCommit(); | 211 state.SetNeedsCommit(); |
| 297 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); | 212 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); |
| 298 EXPECT_ACTION_UPDATE_STATE( | 213 EXPECT_ACTION_UPDATE_STATE( |
| 299 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 214 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 300 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 215 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 313 | 228 |
| 314 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineEarly()); | 229 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineEarly()); |
| 315 state.OnBeginImplFrameDeadline(); | 230 state.OnBeginImplFrameDeadline(); |
| 316 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 231 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 317 EXPECT_ACTION_UPDATE_STATE( | 232 EXPECT_ACTION_UPDATE_STATE( |
| 318 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 233 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 319 state.DidSwapBuffers(); | 234 state.DidSwapBuffers(); |
| 320 state.DidSwapBuffersComplete(); | 235 state.DidSwapBuffersComplete(); |
| 321 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 236 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 322 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 237 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 323 EXPECT_EQ(state.CommitState(), SchedulerStateMachine::COMMIT_STATE_IDLE); | 238 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); |
| 324 } | 239 } |
| 325 | 240 |
| 326 TEST(SchedulerStateMachineTest, | 241 TEST(SchedulerStateMachineTest, |
| 327 TestFailedDrawForAnimationCheckerboardSetsNeedsCommitAndDoesNotDrawAgain) { | 242 TestFailedDrawForAnimationCheckerboardSetsNeedsCommitAndDoesNotDrawAgain) { |
| 328 SchedulerSettings default_scheduler_settings; | 243 SchedulerSettings default_scheduler_settings; |
| 329 StateMachine state(default_scheduler_settings); | 244 StateMachine state(default_scheduler_settings); |
| 330 state.SetCanStart(); | 245 state.SetCanStart(); |
| 331 state.UpdateState(state.NextAction()); | 246 state.UpdateState(state.NextAction()); |
| 332 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 247 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 333 state.SetVisible(true); | 248 state.SetVisible(true); |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 427 | 342 |
| 428 // Failing the draw for animation checkerboards makes us require a commit. | 343 // Failing the draw for animation checkerboards makes us require a commit. |
| 429 state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); | 344 state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); |
| 430 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); | 345 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); |
| 431 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 346 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 432 EXPECT_ACTION_UPDATE_STATE( | 347 EXPECT_ACTION_UPDATE_STATE( |
| 433 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 348 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 434 EXPECT_TRUE(state.RedrawPending()); | 349 EXPECT_TRUE(state.RedrawPending()); |
| 435 } | 350 } |
| 436 | 351 |
| 437 void TestFailedDrawsEventuallyForceDrawAfterNextCommit( | 352 TEST(SchedulerStateMachineTest, |
| 438 bool main_frame_before_draw_enabled) { | 353 TestFailedDrawsEventuallyForceDrawAfterNextCommit) { |
| 439 SchedulerSettings scheduler_settings; | 354 SchedulerSettings scheduler_settings; |
| 440 scheduler_settings.main_frame_before_draw_enabled = | |
| 441 main_frame_before_draw_enabled; | |
| 442 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced_ = 1; | 355 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced_ = 1; |
| 443 StateMachine state(scheduler_settings); | 356 StateMachine state(scheduler_settings); |
| 444 state.SetCanStart(); | 357 state.SetCanStart(); |
| 445 state.UpdateState(state.NextAction()); | 358 state.UpdateState(state.NextAction()); |
| 446 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 359 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 447 state.SetVisible(true); | 360 state.SetVisible(true); |
| 448 state.SetCanDraw(true); | 361 state.SetCanDraw(true); |
| 449 | 362 |
| 450 // Start a commit. | 363 // Start a commit. |
| 451 state.SetNeedsCommit(); | 364 state.SetNeedsCommit(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 475 // continue the commit as usual. | 388 // continue the commit as usual. |
| 476 state.NotifyBeginMainFrameStarted(); | 389 state.NotifyBeginMainFrameStarted(); |
| 477 state.NotifyReadyToCommit(); | 390 state.NotifyReadyToCommit(); |
| 478 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 391 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 479 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 392 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 480 EXPECT_TRUE(state.RedrawPending()); | 393 EXPECT_TRUE(state.RedrawPending()); |
| 481 | 394 |
| 482 // The redraw should be forced at the end of the next BeginImplFrame. | 395 // The redraw should be forced at the end of the next BeginImplFrame. |
| 483 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); | 396 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); |
| 484 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 397 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 485 if (main_frame_before_draw_enabled) { | 398 EXPECT_ACTION_UPDATE_STATE( |
| 486 EXPECT_ACTION_UPDATE_STATE( | 399 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 487 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | |
| 488 } | |
| 489 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 400 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 490 state.OnBeginImplFrameDeadline(); | 401 state.OnBeginImplFrameDeadline(); |
| 491 EXPECT_ACTION_UPDATE_STATE( | 402 EXPECT_ACTION_UPDATE_STATE( |
| 492 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED); | 403 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED); |
| 493 state.DidSwapBuffers(); | 404 state.DidSwapBuffers(); |
| 494 state.DidSwapBuffersComplete(); | 405 state.DidSwapBuffersComplete(); |
| 495 } | 406 } |
| 496 | 407 |
| 497 TEST(SchedulerStateMachineTest, | |
| 498 TestFailedDrawsEventuallyForceDrawAfterNextCommit) { | |
| 499 bool main_frame_before_draw_enabled = false; | |
| 500 TestFailedDrawsEventuallyForceDrawAfterNextCommit( | |
| 501 main_frame_before_draw_enabled); | |
| 502 } | |
| 503 | |
| 504 TEST(SchedulerStateMachineTest, | |
| 505 TestFailedDrawsEventuallyForceDrawAfterNextCommit_CommitBeforeDraw) { | |
| 506 bool main_frame_before_draw_enabled = true; | |
| 507 TestFailedDrawsEventuallyForceDrawAfterNextCommit( | |
| 508 main_frame_before_draw_enabled); | |
| 509 } | |
| 510 | |
| 511 TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) { | 408 TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) { |
| 512 SchedulerSettings scheduler_settings; | 409 SchedulerSettings scheduler_settings; |
| 513 int draw_limit = 1; | 410 int draw_limit = 1; |
| 514 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced_ = | 411 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced_ = |
| 515 draw_limit; | 412 draw_limit; |
| 516 scheduler_settings.impl_side_painting = true; | 413 scheduler_settings.impl_side_painting = true; |
| 517 StateMachine state(scheduler_settings); | 414 StateMachine state(scheduler_settings); |
| 518 state.SetCanStart(); | 415 state.SetCanStart(); |
| 519 state.UpdateState(state.NextAction()); | 416 state.UpdateState(state.NextAction()); |
| 520 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 417 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 809 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 706 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 810 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 707 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 811 state.NotifyBeginMainFrameStarted(); | 708 state.NotifyBeginMainFrameStarted(); |
| 812 state.NotifyReadyToCommit(); | 709 state.NotifyReadyToCommit(); |
| 813 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 710 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 814 state.OnBeginImplFrameDeadline(); | 711 state.OnBeginImplFrameDeadline(); |
| 815 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); | 712 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); |
| 816 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 713 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 817 } | 714 } |
| 818 | 715 |
| 819 void TestSetNeedsCommitIsNotLost(bool main_frame_before_draw_enabled) { | 716 TEST(SchedulerStateMachineTest, TestSetNeedsCommitIsNotLost) { |
| 820 SchedulerSettings scheduler_settings; | 717 SchedulerSettings scheduler_settings; |
| 821 scheduler_settings.main_frame_before_draw_enabled = | |
| 822 main_frame_before_draw_enabled; | |
| 823 StateMachine state(scheduler_settings); | 718 StateMachine state(scheduler_settings); |
| 824 state.SetCanStart(); | 719 state.SetCanStart(); |
| 825 state.UpdateState(state.NextAction()); | 720 state.UpdateState(state.NextAction()); |
| 826 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 721 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 827 state.SetNeedsCommit(); | 722 state.SetNeedsCommit(); |
| 828 state.SetVisible(true); | 723 state.SetVisible(true); |
| 829 state.SetCanDraw(true); | 724 state.SetCanDraw(true); |
| 830 | 725 |
| 831 EXPECT_TRUE(state.BeginFrameNeeded()); | 726 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 832 | 727 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 869 | 764 |
| 870 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); | 765 state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); |
| 871 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING, | 766 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING, |
| 872 state.begin_impl_frame_state()); | 767 state.begin_impl_frame_state()); |
| 873 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); | 768 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); |
| 874 | 769 |
| 875 // Finish the commit, then make sure we start the next commit immediately | 770 // Finish the commit, then make sure we start the next commit immediately |
| 876 // and draw on the next BeginImplFrame. | 771 // and draw on the next BeginImplFrame. |
| 877 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 772 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 878 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 773 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 879 if (main_frame_before_draw_enabled) { | 774 EXPECT_ACTION_UPDATE_STATE( |
| 880 EXPECT_ACTION_UPDATE_STATE( | 775 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 881 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | |
| 882 } | |
| 883 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 776 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 884 | 777 |
| 885 state.OnBeginImplFrameDeadline(); | 778 state.OnBeginImplFrameDeadline(); |
| 886 | 779 |
| 887 EXPECT_TRUE(state.active_tree_needs_first_draw()); | 780 EXPECT_TRUE(state.active_tree_needs_first_draw()); |
| 888 EXPECT_ACTION_UPDATE_STATE( | 781 EXPECT_ACTION_UPDATE_STATE( |
| 889 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 782 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 890 state.DidSwapBuffers(); | 783 state.DidSwapBuffers(); |
| 891 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS); | 784 state.DidDrawIfPossibleCompleted(DRAW_SUCCESS); |
| 892 state.DidSwapBuffersComplete(); | 785 state.DidSwapBuffersComplete(); |
| 893 if (!main_frame_before_draw_enabled) { | |
| 894 EXPECT_ACTION_UPDATE_STATE( | |
| 895 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | |
| 896 } | |
| 897 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 786 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 898 } | 787 } |
| 899 | 788 |
| 900 TEST(SchedulerStateMachineTest, TestSetNeedsCommitIsNotLost) { | |
| 901 bool main_frame_before_draw_enabled = false; | |
| 902 TestSetNeedsCommitIsNotLost(main_frame_before_draw_enabled); | |
| 903 } | |
| 904 | |
| 905 TEST(SchedulerStateMachineTest, TestSetNeedsCommitIsNotLost_CommitBeforeDraw) { | |
| 906 bool main_frame_before_draw_enabled = true; | |
| 907 TestSetNeedsCommitIsNotLost(main_frame_before_draw_enabled); | |
| 908 } | |
| 909 | |
| 910 TEST(SchedulerStateMachineTest, TestFullCycle) { | 789 TEST(SchedulerStateMachineTest, TestFullCycle) { |
| 911 SchedulerSettings default_scheduler_settings; | 790 SchedulerSettings default_scheduler_settings; |
| 912 StateMachine state(default_scheduler_settings); | 791 StateMachine state(default_scheduler_settings); |
| 913 state.SetCanStart(); | 792 state.SetCanStart(); |
| 914 state.UpdateState(state.NextAction()); | 793 state.UpdateState(state.NextAction()); |
| 915 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 794 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 916 state.SetVisible(true); | 795 state.SetVisible(true); |
| 917 state.SetCanDraw(true); | 796 state.SetCanDraw(true); |
| 918 | 797 |
| 919 // Start clean and set commit. | 798 // Start clean and set commit. |
| (...skipping 982 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1902 state.SetNeedsAnimate(); | 1781 state.SetNeedsAnimate(); |
| 1903 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1782 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1904 | 1783 |
| 1905 state.OnBeginImplFrameDeadline(); | 1784 state.OnBeginImplFrameDeadline(); |
| 1906 EXPECT_ACTION_UPDATE_STATE( | 1785 EXPECT_ACTION_UPDATE_STATE( |
| 1907 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 1786 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 1908 } | 1787 } |
| 1909 | 1788 |
| 1910 } // namespace | 1789 } // namespace |
| 1911 } // namespace cc | 1790 } // namespace cc |
| OLD | NEW |