| 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 "cc/test/output_test_common.h" |
| 8 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
| 9 | 10 |
| 10 #define EXPECT_ACTION_UPDATE_STATE(action) \ | 11 #define EXPECT_ACTION_UPDATE_STATE(action) \ |
| 11 EXPECT_EQ(action, state.NextAction()) << *state.AsValue(); \ | 12 EXPECT_EQ(action, state.NextAction()) << *state.AsValue(); \ |
| 12 if (action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE || \ | 13 if (action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE || \ |
| 13 action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED) { \ | 14 action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED) { \ |
| 14 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE, \ | 15 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE, \ |
| 15 state.begin_impl_frame_state()) \ | 16 state.begin_impl_frame_state()) \ |
| 16 << *state.AsValue(); \ | 17 << *state.AsValue(); \ |
| 17 } \ | 18 } \ |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION) | 125 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION) |
| 125 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 126 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 126 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); | 127 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); |
| 127 state.SetNeedsRedraw(false); | 128 state.SetNeedsRedraw(false); |
| 128 state.SetVisible(true); | 129 state.SetVisible(true); |
| 129 | 130 |
| 130 EXPECT_FALSE(state.BeginFrameNeeded()); | 131 EXPECT_FALSE(state.BeginFrameNeeded()); |
| 131 | 132 |
| 132 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 133 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 133 EXPECT_FALSE(state.BeginFrameNeeded()); | 134 EXPECT_FALSE(state.BeginFrameNeeded()); |
| 134 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 135 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 135 | 136 |
| 136 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 137 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 137 state.OnBeginImplFrameDeadline(); | 138 state.OnBeginImplFrameDeadline(); |
| 138 } | 139 } |
| 139 | 140 |
| 140 // If commit requested but can_start is still false, do nothing. | 141 // If commit requested but can_start is still false, do nothing. |
| 141 { | 142 { |
| 142 StateMachine state(default_scheduler_settings); | 143 StateMachine state(default_scheduler_settings); |
| 143 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); | 144 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); |
| 144 state.SetNeedsRedraw(false); | 145 state.SetNeedsRedraw(false); |
| 145 state.SetVisible(true); | 146 state.SetVisible(true); |
| 146 state.SetNeedsCommit(); | 147 state.SetNeedsCommit(); |
| 147 | 148 |
| 148 EXPECT_FALSE(state.BeginFrameNeeded()); | 149 EXPECT_FALSE(state.BeginFrameNeeded()); |
| 149 | 150 |
| 150 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 151 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 151 EXPECT_FALSE(state.BeginFrameNeeded()); | 152 EXPECT_FALSE(state.BeginFrameNeeded()); |
| 152 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 153 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 153 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 154 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 154 state.OnBeginImplFrameDeadline(); | 155 state.OnBeginImplFrameDeadline(); |
| 155 } | 156 } |
| 156 | 157 |
| 157 // If commit requested, begin a main frame. | 158 // If commit requested, begin a main frame. |
| 158 { | 159 { |
| 159 StateMachine state(default_scheduler_settings); | 160 StateMachine state(default_scheduler_settings); |
| 160 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); | 161 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); |
| 161 state.SetCanStart(); | 162 state.SetCanStart(); |
| 162 state.UpdateState(state.NextAction()); | 163 state.UpdateState(state.NextAction()); |
| 163 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 164 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 164 state.SetNeedsRedraw(false); | 165 state.SetNeedsRedraw(false); |
| 165 state.SetVisible(true); | 166 state.SetVisible(true); |
| 166 state.SetNeedsCommit(); | 167 state.SetNeedsCommit(); |
| 167 | 168 |
| 168 EXPECT_TRUE(state.BeginFrameNeeded()); | 169 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 169 | 170 |
| 170 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 171 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 171 EXPECT_ACTION_UPDATE_STATE( | 172 EXPECT_ACTION_UPDATE_STATE( |
| 172 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 173 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 173 } | 174 } |
| 174 | 175 |
| 175 // Begin the frame, make sure needs_commit and commit_state update correctly. | 176 // Begin the frame, make sure needs_commit and commit_state update correctly. |
| 176 { | 177 { |
| 177 StateMachine state(default_scheduler_settings); | 178 StateMachine state(default_scheduler_settings); |
| 178 state.SetCanStart(); | 179 state.SetCanStart(); |
| 179 state.UpdateState(state.NextAction()); | 180 state.UpdateState(state.NextAction()); |
| 180 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 181 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 197 state.UpdateState(state.NextAction()); | 198 state.UpdateState(state.NextAction()); |
| 198 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 199 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 199 state.SetNeedsRedraw(false); | 200 state.SetNeedsRedraw(false); |
| 200 state.SetVisible(true); | 201 state.SetVisible(true); |
| 201 state.SetCanDraw(true); | 202 state.SetCanDraw(true); |
| 202 state.SetNeedsCommit(); | 203 state.SetNeedsCommit(); |
| 203 | 204 |
| 204 EXPECT_TRUE(state.BeginFrameNeeded()); | 205 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 205 | 206 |
| 206 // Commit to the pending tree. | 207 // Commit to the pending tree. |
| 207 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 208 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 208 EXPECT_ACTION_UPDATE_STATE( | 209 EXPECT_ACTION_UPDATE_STATE( |
| 209 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 210 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 210 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 211 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 211 state.NotifyBeginMainFrameStarted(); | 212 state.NotifyBeginMainFrameStarted(); |
| 212 state.NotifyReadyToCommit(); | 213 state.NotifyReadyToCommit(); |
| 213 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 214 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 214 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 215 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 215 EXPECT_EQ(state.CommitState(), | 216 EXPECT_EQ(state.CommitState(), |
| 216 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW); | 217 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW); |
| 217 | 218 |
| 218 state.OnBeginImplFrameDeadline(); | 219 state.OnBeginImplFrameDeadline(); |
| 219 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 220 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 220 EXPECT_EQ(state.CommitState(), | 221 EXPECT_EQ(state.CommitState(), |
| 221 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW); | 222 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW); |
| 222 | 223 |
| 223 // Verify that the next commit doesn't start until the previous | 224 // Verify that the next commit doesn't start until the previous |
| 224 // commit has been drawn. | 225 // commit has been drawn. |
| 225 state.SetNeedsCommit(); | 226 state.SetNeedsCommit(); |
| 226 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 227 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 227 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 228 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 228 | 229 |
| 229 // Verify NotifyReadyToActivate unblocks activation, draw, and | 230 // Verify NotifyReadyToActivate unblocks activation, draw, and |
| 230 // commit in that order. | 231 // commit in that order. |
| 231 state.NotifyReadyToActivate(); | 232 state.NotifyReadyToActivate(); |
| 232 EXPECT_ACTION_UPDATE_STATE( | 233 EXPECT_ACTION_UPDATE_STATE( |
| 233 SchedulerStateMachine::ACTION_ACTIVATE_PENDING_TREE); | 234 SchedulerStateMachine::ACTION_ACTIVATE_PENDING_TREE); |
| 234 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 235 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 235 EXPECT_EQ(state.CommitState(), | 236 EXPECT_EQ(state.CommitState(), |
| 236 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW); | 237 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 266 state.UpdateState(state.NextAction()); | 267 state.UpdateState(state.NextAction()); |
| 267 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 268 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 268 state.SetNeedsRedraw(false); | 269 state.SetNeedsRedraw(false); |
| 269 state.SetVisible(true); | 270 state.SetVisible(true); |
| 270 state.SetCanDraw(true); | 271 state.SetCanDraw(true); |
| 271 state.SetNeedsCommit(); | 272 state.SetNeedsCommit(); |
| 272 | 273 |
| 273 EXPECT_TRUE(state.BeginFrameNeeded()); | 274 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 274 | 275 |
| 275 // Commit to the pending tree. | 276 // Commit to the pending tree. |
| 276 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 277 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 277 EXPECT_ACTION_UPDATE_STATE( | 278 EXPECT_ACTION_UPDATE_STATE( |
| 278 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 279 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 279 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 280 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 280 | 281 |
| 281 state.NotifyBeginMainFrameStarted(); | 282 state.NotifyBeginMainFrameStarted(); |
| 282 state.NotifyReadyToCommit(); | 283 state.NotifyReadyToCommit(); |
| 283 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 284 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 284 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 285 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 285 EXPECT_EQ(state.CommitState(), SchedulerStateMachine::COMMIT_STATE_IDLE); | 286 EXPECT_EQ(state.CommitState(), SchedulerStateMachine::COMMIT_STATE_IDLE); |
| 286 | 287 |
| 287 state.OnBeginImplFrameDeadline(); | 288 state.OnBeginImplFrameDeadline(); |
| 288 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 289 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 289 | 290 |
| 290 // Verify that the next commit starts while there is still a pending tree. | 291 // Verify that the next commit starts while there is still a pending tree. |
| 291 state.SetNeedsCommit(); | 292 state.SetNeedsCommit(); |
| 292 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 293 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 293 EXPECT_ACTION_UPDATE_STATE( | 294 EXPECT_ACTION_UPDATE_STATE( |
| 294 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 295 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 295 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 296 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 296 | 297 |
| 297 // Verify the pending commit doesn't overwrite the pending | 298 // Verify the pending commit doesn't overwrite the pending |
| 298 // tree until the pending tree has been activated. | 299 // tree until the pending tree has been activated. |
| 299 state.NotifyBeginMainFrameStarted(); | 300 state.NotifyBeginMainFrameStarted(); |
| 300 state.NotifyReadyToCommit(); | 301 state.NotifyReadyToCommit(); |
| 301 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 302 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 302 | 303 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 322 SchedulerSettings default_scheduler_settings; | 323 SchedulerSettings default_scheduler_settings; |
| 323 StateMachine state(default_scheduler_settings); | 324 StateMachine state(default_scheduler_settings); |
| 324 state.SetCanStart(); | 325 state.SetCanStart(); |
| 325 state.UpdateState(state.NextAction()); | 326 state.UpdateState(state.NextAction()); |
| 326 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 327 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 327 state.SetVisible(true); | 328 state.SetVisible(true); |
| 328 state.SetCanDraw(true); | 329 state.SetCanDraw(true); |
| 329 state.SetNeedsRedraw(true); | 330 state.SetNeedsRedraw(true); |
| 330 EXPECT_TRUE(state.RedrawPending()); | 331 EXPECT_TRUE(state.RedrawPending()); |
| 331 EXPECT_TRUE(state.BeginFrameNeeded()); | 332 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 332 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 333 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 333 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 334 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 334 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 335 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 335 state.OnBeginImplFrameDeadline(); | 336 state.OnBeginImplFrameDeadline(); |
| 336 | 337 |
| 337 // We're drawing now. | 338 // We're drawing now. |
| 338 EXPECT_ACTION_UPDATE_STATE( | 339 EXPECT_ACTION_UPDATE_STATE( |
| 339 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 340 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 340 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 341 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 341 | 342 |
| 342 EXPECT_FALSE(state.RedrawPending()); | 343 EXPECT_FALSE(state.RedrawPending()); |
| 343 EXPECT_FALSE(state.CommitPending()); | 344 EXPECT_FALSE(state.CommitPending()); |
| 344 | 345 |
| 345 // Failing the draw makes us require a commit. | 346 // Failing the draw makes us require a commit. |
| 346 state.DidDrawIfPossibleCompleted( | 347 state.DidDrawIfPossibleCompleted( |
| 347 DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); | 348 DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); |
| 348 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 349 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 349 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 350 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 350 EXPECT_ACTION_UPDATE_STATE( | 351 EXPECT_ACTION_UPDATE_STATE( |
| 351 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 352 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 352 EXPECT_TRUE(state.RedrawPending()); | 353 EXPECT_TRUE(state.RedrawPending()); |
| 353 EXPECT_TRUE(state.CommitPending()); | 354 EXPECT_TRUE(state.CommitPending()); |
| 354 } | 355 } |
| 355 | 356 |
| 356 TEST(SchedulerStateMachineTest, TestFailedDrawForMissingHighResNeedsCommit) { | 357 TEST(SchedulerStateMachineTest, TestFailedDrawForMissingHighResNeedsCommit) { |
| 357 SchedulerSettings default_scheduler_settings; | 358 SchedulerSettings default_scheduler_settings; |
| 358 StateMachine state(default_scheduler_settings); | 359 StateMachine state(default_scheduler_settings); |
| 359 state.SetCanStart(); | 360 state.SetCanStart(); |
| 360 state.UpdateState(state.NextAction()); | 361 state.UpdateState(state.NextAction()); |
| 361 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 362 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 362 state.SetVisible(true); | 363 state.SetVisible(true); |
| 363 state.SetCanDraw(true); | 364 state.SetCanDraw(true); |
| 364 state.SetNeedsRedraw(true); | 365 state.SetNeedsRedraw(true); |
| 365 EXPECT_TRUE(state.RedrawPending()); | 366 EXPECT_TRUE(state.RedrawPending()); |
| 366 EXPECT_TRUE(state.BeginFrameNeeded()); | 367 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 367 | 368 |
| 368 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 369 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 369 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 370 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 370 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 371 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 371 state.OnBeginImplFrameDeadline(); | 372 state.OnBeginImplFrameDeadline(); |
| 372 EXPECT_ACTION_UPDATE_STATE( | 373 EXPECT_ACTION_UPDATE_STATE( |
| 373 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 374 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 374 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 375 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 375 EXPECT_FALSE(state.RedrawPending()); | 376 EXPECT_FALSE(state.RedrawPending()); |
| 376 EXPECT_FALSE(state.CommitPending()); | 377 EXPECT_FALSE(state.CommitPending()); |
| 377 | 378 |
| 378 // Missing high res content requires a commit (but not a redraw) | 379 // Missing high res content requires a commit (but not a redraw) |
| 379 state.DidDrawIfPossibleCompleted( | 380 state.DidDrawIfPossibleCompleted( |
| 380 DrawSwapReadbackResult::DRAW_ABORTED_MISSING_HIGH_RES_CONTENT); | 381 DrawSwapReadbackResult::DRAW_ABORTED_MISSING_HIGH_RES_CONTENT); |
| 381 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 382 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 382 EXPECT_ACTION_UPDATE_STATE( | 383 EXPECT_ACTION_UPDATE_STATE( |
| 383 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 384 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 384 EXPECT_FALSE(state.RedrawPending()); | 385 EXPECT_FALSE(state.RedrawPending()); |
| 385 EXPECT_TRUE(state.CommitPending()); | 386 EXPECT_TRUE(state.CommitPending()); |
| 386 } | 387 } |
| 387 | 388 |
| 388 TEST(SchedulerStateMachineTest, | 389 TEST(SchedulerStateMachineTest, |
| 389 TestsetNeedsRedrawDuringFailedDrawDoesNotRemoveNeedsRedraw) { | 390 TestsetNeedsRedrawDuringFailedDrawDoesNotRemoveNeedsRedraw) { |
| 390 SchedulerSettings default_scheduler_settings; | 391 SchedulerSettings default_scheduler_settings; |
| 391 StateMachine state(default_scheduler_settings); | 392 StateMachine state(default_scheduler_settings); |
| 392 state.SetCanStart(); | 393 state.SetCanStart(); |
| 393 state.UpdateState(state.NextAction()); | 394 state.UpdateState(state.NextAction()); |
| 394 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 395 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 395 | 396 |
| 396 state.SetVisible(true); | 397 state.SetVisible(true); |
| 397 state.SetCanDraw(true); | 398 state.SetCanDraw(true); |
| 398 state.SetNeedsRedraw(true); | 399 state.SetNeedsRedraw(true); |
| 399 EXPECT_TRUE(state.RedrawPending()); | 400 EXPECT_TRUE(state.RedrawPending()); |
| 400 EXPECT_TRUE(state.BeginFrameNeeded()); | 401 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 401 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 402 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 402 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 403 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 403 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 404 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 404 state.OnBeginImplFrameDeadline(); | 405 state.OnBeginImplFrameDeadline(); |
| 405 | 406 |
| 406 // We're drawing now. | 407 // We're drawing now. |
| 407 EXPECT_ACTION_UPDATE_STATE( | 408 EXPECT_ACTION_UPDATE_STATE( |
| 408 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 409 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 409 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 410 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 410 EXPECT_FALSE(state.RedrawPending()); | 411 EXPECT_FALSE(state.RedrawPending()); |
| 411 EXPECT_FALSE(state.CommitPending()); | 412 EXPECT_FALSE(state.CommitPending()); |
| 412 | 413 |
| 413 // While still in the same BeginMainFrame callback on the main thread, | 414 // While still in the same BeginMainFrame callback on the main thread, |
| 414 // set needs redraw again. This should not redraw. | 415 // set needs redraw again. This should not redraw. |
| 415 state.SetNeedsRedraw(true); | 416 state.SetNeedsRedraw(true); |
| 416 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 417 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 417 | 418 |
| 418 // Failing the draw for animation checkerboards makes us require a commit. | 419 // Failing the draw for animation checkerboards makes us require a commit. |
| 419 state.DidDrawIfPossibleCompleted( | 420 state.DidDrawIfPossibleCompleted( |
| 420 DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); | 421 DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); |
| 421 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 422 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 422 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 423 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 423 EXPECT_ACTION_UPDATE_STATE( | 424 EXPECT_ACTION_UPDATE_STATE( |
| 424 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 425 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 425 EXPECT_TRUE(state.RedrawPending()); | 426 EXPECT_TRUE(state.RedrawPending()); |
| 426 } | 427 } |
| 427 | 428 |
| 428 void TestFailedDrawsEventuallyForceDrawAfterNextCommit( | 429 void TestFailedDrawsEventuallyForceDrawAfterNextCommit( |
| 429 bool main_frame_before_draw_enabled) { | 430 bool main_frame_before_draw_enabled) { |
| 430 SchedulerSettings scheduler_settings; | 431 SchedulerSettings scheduler_settings; |
| 431 scheduler_settings.main_frame_before_draw_enabled = | 432 scheduler_settings.main_frame_before_draw_enabled = |
| 432 main_frame_before_draw_enabled; | 433 main_frame_before_draw_enabled; |
| 433 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced_ = 1; | 434 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced_ = 1; |
| 434 StateMachine state(scheduler_settings); | 435 StateMachine state(scheduler_settings); |
| 435 state.SetCanStart(); | 436 state.SetCanStart(); |
| 436 state.UpdateState(state.NextAction()); | 437 state.UpdateState(state.NextAction()); |
| 437 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 438 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 438 state.SetVisible(true); | 439 state.SetVisible(true); |
| 439 state.SetCanDraw(true); | 440 state.SetCanDraw(true); |
| 440 | 441 |
| 441 // Start a commit. | 442 // Start a commit. |
| 442 state.SetNeedsCommit(); | 443 state.SetNeedsCommit(); |
| 443 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 444 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 444 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 445 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 445 EXPECT_ACTION_UPDATE_STATE( | 446 EXPECT_ACTION_UPDATE_STATE( |
| 446 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 447 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 447 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 448 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 448 EXPECT_TRUE(state.CommitPending()); | 449 EXPECT_TRUE(state.CommitPending()); |
| 449 | 450 |
| 450 // Then initiate a draw. | 451 // Then initiate a draw. |
| 451 state.SetNeedsRedraw(true); | 452 state.SetNeedsRedraw(true); |
| 452 state.OnBeginImplFrameDeadline(); | 453 state.OnBeginImplFrameDeadline(); |
| 453 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 454 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 454 EXPECT_ACTION_UPDATE_STATE( | 455 EXPECT_ACTION_UPDATE_STATE( |
| (...skipping 10 matching lines...) Expand all Loading... |
| 465 | 466 |
| 466 // Finish the commit. Note, we should not yet be forcing a draw, but should | 467 // Finish the commit. Note, we should not yet be forcing a draw, but should |
| 467 // continue the commit as usual. | 468 // continue the commit as usual. |
| 468 state.NotifyBeginMainFrameStarted(); | 469 state.NotifyBeginMainFrameStarted(); |
| 469 state.NotifyReadyToCommit(); | 470 state.NotifyReadyToCommit(); |
| 470 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 471 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 471 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 472 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 472 EXPECT_TRUE(state.RedrawPending()); | 473 EXPECT_TRUE(state.RedrawPending()); |
| 473 | 474 |
| 474 // The redraw should be forced at the end of the next BeginImplFrame. | 475 // The redraw should be forced at the end of the next BeginImplFrame. |
| 475 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 476 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 476 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 477 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 477 if (main_frame_before_draw_enabled) { | 478 if (main_frame_before_draw_enabled) { |
| 478 EXPECT_ACTION_UPDATE_STATE( | 479 EXPECT_ACTION_UPDATE_STATE( |
| 479 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 480 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 480 } | 481 } |
| 481 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 482 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 482 state.OnBeginImplFrameDeadline(); | 483 state.OnBeginImplFrameDeadline(); |
| 483 EXPECT_ACTION_UPDATE_STATE( | 484 EXPECT_ACTION_UPDATE_STATE( |
| 484 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED); | 485 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED); |
| 485 } | 486 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 507 StateMachine state(scheduler_settings); | 508 StateMachine state(scheduler_settings); |
| 508 state.SetCanStart(); | 509 state.SetCanStart(); |
| 509 state.UpdateState(state.NextAction()); | 510 state.UpdateState(state.NextAction()); |
| 510 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 511 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 511 state.SetVisible(true); | 512 state.SetVisible(true); |
| 512 state.SetCanDraw(true); | 513 state.SetCanDraw(true); |
| 513 | 514 |
| 514 // Start a commit. | 515 // Start a commit. |
| 515 state.SetNeedsCommit(); | 516 state.SetNeedsCommit(); |
| 516 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 517 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 517 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 518 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 518 EXPECT_ACTION_UPDATE_STATE( | 519 EXPECT_ACTION_UPDATE_STATE( |
| 519 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 520 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 520 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 521 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 521 EXPECT_TRUE(state.CommitPending()); | 522 EXPECT_TRUE(state.CommitPending()); |
| 522 | 523 |
| 523 // Then initiate a draw. | 524 // Then initiate a draw. |
| 524 state.SetNeedsRedraw(true); | 525 state.SetNeedsRedraw(true); |
| 525 state.OnBeginImplFrameDeadline(); | 526 state.OnBeginImplFrameDeadline(); |
| 526 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 527 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 527 EXPECT_ACTION_UPDATE_STATE( | 528 EXPECT_ACTION_UPDATE_STATE( |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 568 StateMachine state(default_scheduler_settings); | 569 StateMachine state(default_scheduler_settings); |
| 569 state.SetCanStart(); | 570 state.SetCanStart(); |
| 570 state.UpdateState(state.NextAction()); | 571 state.UpdateState(state.NextAction()); |
| 571 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 572 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 572 state.SetVisible(true); | 573 state.SetVisible(true); |
| 573 state.SetCanDraw(true); | 574 state.SetCanDraw(true); |
| 574 | 575 |
| 575 // Start a draw. | 576 // Start a draw. |
| 576 state.SetNeedsRedraw(true); | 577 state.SetNeedsRedraw(true); |
| 577 EXPECT_TRUE(state.BeginFrameNeeded()); | 578 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 578 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 579 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 579 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 580 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 580 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 581 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 581 state.OnBeginImplFrameDeadline(); | 582 state.OnBeginImplFrameDeadline(); |
| 582 EXPECT_TRUE(state.RedrawPending()); | 583 EXPECT_TRUE(state.RedrawPending()); |
| 583 EXPECT_ACTION_UPDATE_STATE( | 584 EXPECT_ACTION_UPDATE_STATE( |
| 584 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 585 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 585 | 586 |
| 586 // Failing the draw for animation checkerboards makes us require a commit. | 587 // Failing the draw for animation checkerboards makes us require a commit. |
| 587 state.DidDrawIfPossibleCompleted( | 588 state.DidDrawIfPossibleCompleted( |
| 588 DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); | 589 DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); |
| 589 EXPECT_ACTION_UPDATE_STATE( | 590 EXPECT_ACTION_UPDATE_STATE( |
| 590 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 591 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 591 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 592 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 592 EXPECT_TRUE(state.RedrawPending()); | 593 EXPECT_TRUE(state.RedrawPending()); |
| 593 | 594 |
| 594 // We should not be trying to draw again now, but we have a commit pending. | 595 // We should not be trying to draw again now, but we have a commit pending. |
| 595 EXPECT_TRUE(state.BeginFrameNeeded()); | 596 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 596 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 597 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 597 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 598 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 598 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 599 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 599 | 600 |
| 600 // We should try to draw again at the end of the next BeginImplFrame on | 601 // We should try to draw again at the end of the next BeginImplFrame on |
| 601 // the impl thread. | 602 // the impl thread. |
| 602 state.OnBeginImplFrameDeadline(); | 603 state.OnBeginImplFrameDeadline(); |
| 603 EXPECT_ACTION_UPDATE_STATE( | 604 EXPECT_ACTION_UPDATE_STATE( |
| 604 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 605 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 605 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 606 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 606 } | 607 } |
| 607 | 608 |
| 608 TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) { | 609 TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) { |
| 609 SchedulerSettings default_scheduler_settings; | 610 SchedulerSettings default_scheduler_settings; |
| 610 StateMachine state(default_scheduler_settings); | 611 StateMachine state(default_scheduler_settings); |
| 611 state.SetCanStart(); | 612 state.SetCanStart(); |
| 612 state.UpdateState(state.NextAction()); | 613 state.UpdateState(state.NextAction()); |
| 613 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 614 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 614 state.SetVisible(true); | 615 state.SetVisible(true); |
| 615 state.SetCanDraw(true); | 616 state.SetCanDraw(true); |
| 616 state.SetNeedsRedraw(true); | 617 state.SetNeedsRedraw(true); |
| 617 | 618 |
| 618 // Draw the first frame. | 619 // Draw the first frame. |
| 619 EXPECT_TRUE(state.BeginFrameNeeded()); | 620 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 620 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 621 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 621 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 622 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 622 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 623 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 623 | 624 |
| 624 state.OnBeginImplFrameDeadline(); | 625 state.OnBeginImplFrameDeadline(); |
| 625 EXPECT_ACTION_UPDATE_STATE( | 626 EXPECT_ACTION_UPDATE_STATE( |
| 626 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 627 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 627 state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DRAW_SUCCESS); | 628 state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DRAW_SUCCESS); |
| 628 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 629 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 629 | 630 |
| 630 // Before the next BeginImplFrame, set needs redraw again. | 631 // Before the next BeginImplFrame, set needs redraw again. |
| 631 // This should not redraw until the next BeginImplFrame. | 632 // This should not redraw until the next BeginImplFrame. |
| 632 state.SetNeedsRedraw(true); | 633 state.SetNeedsRedraw(true); |
| 633 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 634 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 634 | 635 |
| 635 // Move to another frame. This should now draw. | 636 // Move to another frame. This should now draw. |
| 636 EXPECT_TRUE(state.BeginFrameNeeded()); | 637 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 637 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 638 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 638 | 639 |
| 639 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 640 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 640 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 641 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 641 | 642 |
| 642 state.OnBeginImplFrameDeadline(); | 643 state.OnBeginImplFrameDeadline(); |
| 643 EXPECT_ACTION_UPDATE_STATE( | 644 EXPECT_ACTION_UPDATE_STATE( |
| 644 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 645 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 645 state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DRAW_SUCCESS); | 646 state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DRAW_SUCCESS); |
| 646 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 647 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 647 | 648 |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 776 // There shouldn't be any drawing regardless of BeginImplFrame. | 777 // There shouldn't be any drawing regardless of BeginImplFrame. |
| 777 for (size_t j = 0; j < 2; ++j) { | 778 for (size_t j = 0; j < 2; ++j) { |
| 778 StateMachine state(default_scheduler_settings); | 779 StateMachine state(default_scheduler_settings); |
| 779 state.SetCanStart(); | 780 state.SetCanStart(); |
| 780 state.UpdateState(state.NextAction()); | 781 state.UpdateState(state.NextAction()); |
| 781 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 782 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 782 state.SetCommitState(all_commit_states[i]); | 783 state.SetCommitState(all_commit_states[i]); |
| 783 state.SetVisible(false); | 784 state.SetVisible(false); |
| 784 state.SetNeedsRedraw(true); | 785 state.SetNeedsRedraw(true); |
| 785 if (j == 1) | 786 if (j == 1) |
| 786 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 787 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 787 | 788 |
| 788 state.SetCanDraw(false); | 789 state.SetCanDraw(false); |
| 789 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, | 790 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
| 790 state.NextAction()); | 791 state.NextAction()); |
| 791 } | 792 } |
| 792 } | 793 } |
| 793 } | 794 } |
| 794 | 795 |
| 795 TEST(SchedulerStateMachineTest, | 796 TEST(SchedulerStateMachineTest, |
| 796 TestCanRedrawWithWaitingForFirstDrawMakesProgress) { | 797 TestCanRedrawWithWaitingForFirstDrawMakesProgress) { |
| 797 SchedulerSettings default_scheduler_settings; | 798 SchedulerSettings default_scheduler_settings; |
| 798 StateMachine state(default_scheduler_settings); | 799 StateMachine state(default_scheduler_settings); |
| 799 state.SetCanStart(); | 800 state.SetCanStart(); |
| 800 state.UpdateState(state.NextAction()); | 801 state.UpdateState(state.NextAction()); |
| 801 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 802 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 802 | 803 |
| 803 state.SetActiveTreeNeedsFirstDraw(true); | 804 state.SetActiveTreeNeedsFirstDraw(true); |
| 804 state.SetNeedsCommit(); | 805 state.SetNeedsCommit(); |
| 805 state.SetNeedsRedraw(true); | 806 state.SetNeedsRedraw(true); |
| 806 state.SetVisible(true); | 807 state.SetVisible(true); |
| 807 state.SetCanDraw(false); | 808 state.SetCanDraw(false); |
| 808 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 809 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 809 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); | 810 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); |
| 810 EXPECT_ACTION_UPDATE_STATE( | 811 EXPECT_ACTION_UPDATE_STATE( |
| 811 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 812 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 812 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 813 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 813 state.NotifyBeginMainFrameStarted(); | 814 state.NotifyBeginMainFrameStarted(); |
| 814 state.NotifyReadyToCommit(); | 815 state.NotifyReadyToCommit(); |
| 815 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 816 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 816 state.OnBeginImplFrameDeadline(); | 817 state.OnBeginImplFrameDeadline(); |
| 817 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); | 818 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); |
| 818 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 819 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 819 } | 820 } |
| 820 | 821 |
| 821 void TestSetNeedsCommitIsNotLost(bool main_frame_before_draw_enabled) { | 822 void TestSetNeedsCommitIsNotLost(bool main_frame_before_draw_enabled) { |
| 822 SchedulerSettings scheduler_settings; | 823 SchedulerSettings scheduler_settings; |
| 823 scheduler_settings.main_frame_before_draw_enabled = | 824 scheduler_settings.main_frame_before_draw_enabled = |
| 824 main_frame_before_draw_enabled; | 825 main_frame_before_draw_enabled; |
| 825 StateMachine state(scheduler_settings); | 826 StateMachine state(scheduler_settings); |
| 826 state.SetCanStart(); | 827 state.SetCanStart(); |
| 827 state.UpdateState(state.NextAction()); | 828 state.UpdateState(state.NextAction()); |
| 828 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 829 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 829 state.SetNeedsCommit(); | 830 state.SetNeedsCommit(); |
| 830 state.SetVisible(true); | 831 state.SetVisible(true); |
| 831 state.SetCanDraw(true); | 832 state.SetCanDraw(true); |
| 832 | 833 |
| 833 EXPECT_TRUE(state.BeginFrameNeeded()); | 834 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 834 | 835 |
| 835 // Begin the frame. | 836 // Begin the frame. |
| 836 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 837 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 837 EXPECT_ACTION_UPDATE_STATE( | 838 EXPECT_ACTION_UPDATE_STATE( |
| 838 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 839 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 839 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, | 840 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, |
| 840 state.CommitState()); | 841 state.CommitState()); |
| 841 | 842 |
| 842 // Now, while the frame is in progress, set another commit. | 843 // Now, while the frame is in progress, set another commit. |
| 843 state.SetNeedsCommit(); | 844 state.SetNeedsCommit(); |
| 844 EXPECT_TRUE(state.NeedsCommit()); | 845 EXPECT_TRUE(state.NeedsCommit()); |
| 845 | 846 |
| 846 // Let the frame finish. | 847 // Let the frame finish. |
| (...skipping 15 matching lines...) Expand all Loading... |
| 862 state.OnBeginImplFrameDeadline(); | 863 state.OnBeginImplFrameDeadline(); |
| 863 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE, | 864 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE, |
| 864 state.begin_impl_frame_state()); | 865 state.begin_impl_frame_state()); |
| 865 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); | 866 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); |
| 866 | 867 |
| 867 state.OnBeginImplFrameIdle(); | 868 state.OnBeginImplFrameIdle(); |
| 868 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE, | 869 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE, |
| 869 state.begin_impl_frame_state()); | 870 state.begin_impl_frame_state()); |
| 870 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); | 871 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); |
| 871 | 872 |
| 872 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 873 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 873 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING, | 874 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING, |
| 874 state.begin_impl_frame_state()); | 875 state.begin_impl_frame_state()); |
| 875 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); | 876 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); |
| 876 | 877 |
| 877 // Finish the commit, then make sure we start the next commit immediately | 878 // Finish the commit, then make sure we start the next commit immediately |
| 878 // and draw on the next BeginImplFrame. | 879 // and draw on the next BeginImplFrame. |
| 879 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 880 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 880 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 881 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 881 if (main_frame_before_draw_enabled) { | 882 if (main_frame_before_draw_enabled) { |
| 882 EXPECT_ACTION_UPDATE_STATE( | 883 EXPECT_ACTION_UPDATE_STATE( |
| (...skipping 30 matching lines...) Expand all Loading... |
| 913 state.SetCanStart(); | 914 state.SetCanStart(); |
| 914 state.UpdateState(state.NextAction()); | 915 state.UpdateState(state.NextAction()); |
| 915 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 916 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 916 state.SetVisible(true); | 917 state.SetVisible(true); |
| 917 state.SetCanDraw(true); | 918 state.SetCanDraw(true); |
| 918 | 919 |
| 919 // Start clean and set commit. | 920 // Start clean and set commit. |
| 920 state.SetNeedsCommit(); | 921 state.SetNeedsCommit(); |
| 921 | 922 |
| 922 // Begin the frame. | 923 // Begin the frame. |
| 923 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 924 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 924 EXPECT_ACTION_UPDATE_STATE( | 925 EXPECT_ACTION_UPDATE_STATE( |
| 925 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 926 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 926 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, | 927 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, |
| 927 state.CommitState()); | 928 state.CommitState()); |
| 928 EXPECT_FALSE(state.NeedsCommit()); | 929 EXPECT_FALSE(state.NeedsCommit()); |
| 929 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 930 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 930 | 931 |
| 931 // Tell the scheduler the frame finished. | 932 // Tell the scheduler the frame finished. |
| 932 state.NotifyBeginMainFrameStarted(); | 933 state.NotifyBeginMainFrameStarted(); |
| 933 state.NotifyReadyToCommit(); | 934 state.NotifyReadyToCommit(); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 961 state.SetCanStart(); | 962 state.SetCanStart(); |
| 962 state.UpdateState(state.NextAction()); | 963 state.UpdateState(state.NextAction()); |
| 963 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 964 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 964 state.SetVisible(true); | 965 state.SetVisible(true); |
| 965 state.SetCanDraw(true); | 966 state.SetCanDraw(true); |
| 966 | 967 |
| 967 // Start clean and set commit. | 968 // Start clean and set commit. |
| 968 state.SetNeedsCommit(); | 969 state.SetNeedsCommit(); |
| 969 | 970 |
| 970 // Begin the frame. | 971 // Begin the frame. |
| 971 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 972 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 972 EXPECT_ACTION_UPDATE_STATE( | 973 EXPECT_ACTION_UPDATE_STATE( |
| 973 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 974 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 974 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, | 975 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, |
| 975 state.CommitState()); | 976 state.CommitState()); |
| 976 EXPECT_FALSE(state.NeedsCommit()); | 977 EXPECT_FALSE(state.NeedsCommit()); |
| 977 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 978 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 978 | 979 |
| 979 // Request another commit while the commit is in flight. | 980 // Request another commit while the commit is in flight. |
| 980 state.SetNeedsCommit(); | 981 state.SetNeedsCommit(); |
| 981 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 982 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1000 EXPECT_ACTION_UPDATE_STATE( | 1001 EXPECT_ACTION_UPDATE_STATE( |
| 1001 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 1002 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 1002 state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DRAW_SUCCESS); | 1003 state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DRAW_SUCCESS); |
| 1003 | 1004 |
| 1004 // Should be synchronized, no draw needed, no action needed. | 1005 // Should be synchronized, no draw needed, no action needed. |
| 1005 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1006 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1006 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 1007 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); |
| 1007 EXPECT_FALSE(state.needs_redraw()); | 1008 EXPECT_FALSE(state.needs_redraw()); |
| 1008 | 1009 |
| 1009 // Next BeginImplFrame should initiate second commit. | 1010 // Next BeginImplFrame should initiate second commit. |
| 1010 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 1011 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 1011 EXPECT_ACTION_UPDATE_STATE( | 1012 EXPECT_ACTION_UPDATE_STATE( |
| 1012 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1013 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1013 } | 1014 } |
| 1014 | 1015 |
| 1015 TEST(SchedulerStateMachineTest, TestRequestCommitInvisible) { | 1016 TEST(SchedulerStateMachineTest, TestRequestCommitInvisible) { |
| 1016 SchedulerSettings default_scheduler_settings; | 1017 SchedulerSettings default_scheduler_settings; |
| 1017 StateMachine state(default_scheduler_settings); | 1018 StateMachine state(default_scheduler_settings); |
| 1018 state.SetCanStart(); | 1019 state.SetCanStart(); |
| 1019 state.UpdateState(state.NextAction()); | 1020 state.UpdateState(state.NextAction()); |
| 1020 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 1021 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 1021 state.SetNeedsCommit(); | 1022 state.SetNeedsCommit(); |
| 1022 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1023 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1023 } | 1024 } |
| 1024 | 1025 |
| 1025 TEST(SchedulerStateMachineTest, TestGoesInvisibleBeforeFinishCommit) { | 1026 TEST(SchedulerStateMachineTest, TestGoesInvisibleBeforeFinishCommit) { |
| 1026 SchedulerSettings default_scheduler_settings; | 1027 SchedulerSettings default_scheduler_settings; |
| 1027 StateMachine state(default_scheduler_settings); | 1028 StateMachine state(default_scheduler_settings); |
| 1028 state.SetCanStart(); | 1029 state.SetCanStart(); |
| 1029 state.UpdateState(state.NextAction()); | 1030 state.UpdateState(state.NextAction()); |
| 1030 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 1031 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 1031 state.SetVisible(true); | 1032 state.SetVisible(true); |
| 1032 state.SetCanDraw(true); | 1033 state.SetCanDraw(true); |
| 1033 | 1034 |
| 1034 // Start clean and set commit. | 1035 // Start clean and set commit. |
| 1035 state.SetNeedsCommit(); | 1036 state.SetNeedsCommit(); |
| 1036 | 1037 |
| 1037 // Begin the frame while visible. | 1038 // Begin the frame while visible. |
| 1038 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 1039 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 1039 EXPECT_ACTION_UPDATE_STATE( | 1040 EXPECT_ACTION_UPDATE_STATE( |
| 1040 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1041 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1041 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, | 1042 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, |
| 1042 state.CommitState()); | 1043 state.CommitState()); |
| 1043 EXPECT_FALSE(state.NeedsCommit()); | 1044 EXPECT_FALSE(state.NeedsCommit()); |
| 1044 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1045 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1045 | 1046 |
| 1046 // Become invisible and abort BeginMainFrame. | 1047 // Become invisible and abort BeginMainFrame. |
| 1047 state.SetVisible(false); | 1048 state.SetVisible(false); |
| 1048 state.BeginMainFrameAborted(false); | 1049 state.BeginMainFrameAborted(false); |
| 1049 | 1050 |
| 1050 // We should now be back in the idle state as if we never started the frame. | 1051 // We should now be back in the idle state as if we never started the frame. |
| 1051 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 1052 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); |
| 1052 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1053 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1053 | 1054 |
| 1054 // We shouldn't do anything on the BeginImplFrame deadline. | 1055 // We shouldn't do anything on the BeginImplFrame deadline. |
| 1055 state.OnBeginImplFrameDeadline(); | 1056 state.OnBeginImplFrameDeadline(); |
| 1056 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1057 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1057 | 1058 |
| 1058 // Become visible again. | 1059 // Become visible again. |
| 1059 state.SetVisible(true); | 1060 state.SetVisible(true); |
| 1060 | 1061 |
| 1061 // Although we have aborted on this frame and haven't cancelled the commit | 1062 // Although we have aborted on this frame and haven't cancelled the commit |
| 1062 // (i.e. need another), don't send another BeginMainFrame yet. | 1063 // (i.e. need another), don't send another BeginMainFrame yet. |
| 1063 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 1064 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); |
| 1064 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1065 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 1065 EXPECT_TRUE(state.NeedsCommit()); | 1066 EXPECT_TRUE(state.NeedsCommit()); |
| 1066 | 1067 |
| 1067 // Start a new frame. | 1068 // Start a new frame. |
| 1068 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 1069 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 1069 EXPECT_ACTION_UPDATE_STATE( | 1070 EXPECT_ACTION_UPDATE_STATE( |
| 1070 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1071 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1071 | 1072 |
| 1072 // We should be starting the commit now. | 1073 // We should be starting the commit now. |
| 1073 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, | 1074 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, |
| 1074 state.CommitState()); | 1075 state.CommitState()); |
| 1075 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1076 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1076 } | 1077 } |
| 1077 | 1078 |
| 1078 TEST(SchedulerStateMachineTest, AbortBeginMainFrameAndCancelCommit) { | 1079 TEST(SchedulerStateMachineTest, AbortBeginMainFrameAndCancelCommit) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1097 // Abort the commit, cancelling future commits. | 1098 // Abort the commit, cancelling future commits. |
| 1098 state.BeginMainFrameAborted(true); | 1099 state.BeginMainFrameAborted(true); |
| 1099 | 1100 |
| 1100 // Verify that another commit doesn't start on the same frame. | 1101 // Verify that another commit doesn't start on the same frame. |
| 1101 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 1102 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); |
| 1102 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1103 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 1103 EXPECT_FALSE(state.NeedsCommit()); | 1104 EXPECT_FALSE(state.NeedsCommit()); |
| 1104 | 1105 |
| 1105 // Start a new frame; draw because this is the first frame since output | 1106 // Start a new frame; draw because this is the first frame since output |
| 1106 // surface init'd. | 1107 // surface init'd. |
| 1107 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 1108 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 1108 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 1109 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 1109 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1110 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1110 state.OnBeginImplFrameDeadline(); | 1111 state.OnBeginImplFrameDeadline(); |
| 1111 EXPECT_ACTION_UPDATE_STATE( | 1112 EXPECT_ACTION_UPDATE_STATE( |
| 1112 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 1113 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 1113 | 1114 |
| 1114 // Verify another commit doesn't start on another frame either. | 1115 // Verify another commit doesn't start on another frame either. |
| 1115 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 1116 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); |
| 1116 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1117 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 1117 EXPECT_FALSE(state.NeedsCommit()); | 1118 EXPECT_FALSE(state.NeedsCommit()); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1129 state.SetCanStart(); | 1130 state.SetCanStart(); |
| 1130 state.SetVisible(true); | 1131 state.SetVisible(true); |
| 1131 state.SetCanDraw(true); | 1132 state.SetCanDraw(true); |
| 1132 | 1133 |
| 1133 EXPECT_ACTION_UPDATE_STATE( | 1134 EXPECT_ACTION_UPDATE_STATE( |
| 1134 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); | 1135 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); |
| 1135 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 1136 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 1136 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1137 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1137 | 1138 |
| 1138 // Check that the first init does not SetNeedsCommit. | 1139 // Check that the first init does not SetNeedsCommit. |
| 1139 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 1140 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 1140 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1141 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1141 state.OnBeginImplFrameDeadline(); | 1142 state.OnBeginImplFrameDeadline(); |
| 1142 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1143 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1143 | 1144 |
| 1144 // Check that a needs commit initiates a BeginMainFrame. | 1145 // Check that a needs commit initiates a BeginMainFrame. |
| 1145 state.SetNeedsCommit(); | 1146 state.SetNeedsCommit(); |
| 1146 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 1147 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 1147 EXPECT_ACTION_UPDATE_STATE( | 1148 EXPECT_ACTION_UPDATE_STATE( |
| 1148 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1149 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1149 } | 1150 } |
| 1150 | 1151 |
| 1151 TEST(SchedulerStateMachineTest, TestContextLostWhenCompletelyIdle) { | 1152 TEST(SchedulerStateMachineTest, TestContextLostWhenCompletelyIdle) { |
| 1152 SchedulerSettings default_scheduler_settings; | 1153 SchedulerSettings default_scheduler_settings; |
| 1153 StateMachine state(default_scheduler_settings); | 1154 StateMachine state(default_scheduler_settings); |
| 1154 state.SetCanStart(); | 1155 state.SetCanStart(); |
| 1155 state.UpdateState(state.NextAction()); | 1156 state.UpdateState(state.NextAction()); |
| 1156 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 1157 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 1157 | 1158 |
| 1158 state.SetVisible(true); | 1159 state.SetVisible(true); |
| 1159 state.SetCanDraw(true); | 1160 state.SetCanDraw(true); |
| 1160 | 1161 |
| 1161 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, | 1162 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, |
| 1162 state.NextAction()); | 1163 state.NextAction()); |
| 1163 state.DidLoseOutputSurface(); | 1164 state.DidLoseOutputSurface(); |
| 1164 | 1165 |
| 1165 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, | 1166 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, |
| 1166 state.NextAction()); | 1167 state.NextAction()); |
| 1167 state.UpdateState(state.NextAction()); | 1168 state.UpdateState(state.NextAction()); |
| 1168 | 1169 |
| 1169 // Once context recreation begins, nothing should happen. | 1170 // Once context recreation begins, nothing should happen. |
| 1170 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1171 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1171 | 1172 |
| 1172 // Recreate the context. | 1173 // Recreate the context. |
| 1173 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 1174 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 1174 | 1175 |
| 1175 // When the context is recreated, we should begin a commit. | 1176 // When the context is recreated, we should begin a commit. |
| 1176 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 1177 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 1177 EXPECT_ACTION_UPDATE_STATE( | 1178 EXPECT_ACTION_UPDATE_STATE( |
| 1178 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1179 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1179 } | 1180 } |
| 1180 | 1181 |
| 1181 TEST(SchedulerStateMachineTest, | 1182 TEST(SchedulerStateMachineTest, |
| 1182 TestContextLostWhenIdleAndCommitRequestedWhileRecreating) { | 1183 TestContextLostWhenIdleAndCommitRequestedWhileRecreating) { |
| 1183 SchedulerSettings default_scheduler_settings; | 1184 SchedulerSettings default_scheduler_settings; |
| 1184 StateMachine state(default_scheduler_settings); | 1185 StateMachine state(default_scheduler_settings); |
| 1185 state.SetCanStart(); | 1186 state.SetCanStart(); |
| 1186 state.UpdateState(state.NextAction()); | 1187 state.UpdateState(state.NextAction()); |
| 1187 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 1188 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 1188 state.SetVisible(true); | 1189 state.SetVisible(true); |
| 1189 state.SetCanDraw(true); | 1190 state.SetCanDraw(true); |
| 1190 | 1191 |
| 1191 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, | 1192 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, |
| 1192 state.NextAction()); | 1193 state.NextAction()); |
| 1193 state.DidLoseOutputSurface(); | 1194 state.DidLoseOutputSurface(); |
| 1194 | 1195 |
| 1195 EXPECT_ACTION_UPDATE_STATE( | 1196 EXPECT_ACTION_UPDATE_STATE( |
| 1196 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); | 1197 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); |
| 1197 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1198 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1198 | 1199 |
| 1199 // Once context recreation begins, nothing should happen. | 1200 // Once context recreation begins, nothing should happen. |
| 1200 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 1201 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 1201 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1202 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1202 state.OnBeginImplFrameDeadline(); | 1203 state.OnBeginImplFrameDeadline(); |
| 1203 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1204 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1204 | 1205 |
| 1205 // While context is recreating, commits shouldn't begin. | 1206 // While context is recreating, commits shouldn't begin. |
| 1206 state.SetNeedsCommit(); | 1207 state.SetNeedsCommit(); |
| 1207 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 1208 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 1208 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1209 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1209 state.OnBeginImplFrameDeadline(); | 1210 state.OnBeginImplFrameDeadline(); |
| 1210 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1211 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1211 | 1212 |
| 1212 // Recreate the context | 1213 // Recreate the context |
| 1213 state.DidCreateAndInitializeOutputSurface(); | 1214 state.DidCreateAndInitializeOutputSurface(); |
| 1214 EXPECT_FALSE(state.RedrawPending()); | 1215 EXPECT_FALSE(state.RedrawPending()); |
| 1215 | 1216 |
| 1216 // When the context is recreated, we should begin a commit | 1217 // When the context is recreated, we should begin a commit |
| 1217 EXPECT_ACTION_UPDATE_STATE( | 1218 EXPECT_ACTION_UPDATE_STATE( |
| 1218 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1219 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1219 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1220 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1220 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, | 1221 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, |
| 1221 state.CommitState()); | 1222 state.CommitState()); |
| 1222 | 1223 |
| 1223 state.NotifyBeginMainFrameStarted(); | 1224 state.NotifyBeginMainFrameStarted(); |
| 1224 state.NotifyReadyToCommit(); | 1225 state.NotifyReadyToCommit(); |
| 1225 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 1226 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 1226 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1227 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1227 // Finishing the first commit after initializing an output surface should | 1228 // Finishing the first commit after initializing an output surface should |
| 1228 // automatically cause a redraw. | 1229 // automatically cause a redraw. |
| 1229 EXPECT_TRUE(state.RedrawPending()); | 1230 EXPECT_TRUE(state.RedrawPending()); |
| 1230 | 1231 |
| 1231 // Once the context is recreated, whether we draw should be based on | 1232 // Once the context is recreated, whether we draw should be based on |
| 1232 // SetCanDraw. | 1233 // SetCanDraw. |
| 1233 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 1234 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 1234 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 1235 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 1235 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1236 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1236 state.OnBeginImplFrameDeadline(); | 1237 state.OnBeginImplFrameDeadline(); |
| 1237 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, | 1238 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
| 1238 state.NextAction()); | 1239 state.NextAction()); |
| 1239 state.SetCanDraw(false); | 1240 state.SetCanDraw(false); |
| 1240 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT, | 1241 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT, |
| 1241 state.NextAction()); | 1242 state.NextAction()); |
| 1242 state.SetCanDraw(true); | 1243 state.SetCanDraw(true); |
| 1243 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, | 1244 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
| 1244 state.NextAction()); | 1245 state.NextAction()); |
| 1245 } | 1246 } |
| 1246 | 1247 |
| 1247 TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) { | 1248 TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) { |
| 1248 SchedulerSettings scheduler_settings; | 1249 SchedulerSettings scheduler_settings; |
| 1249 StateMachine state(scheduler_settings); | 1250 StateMachine state(scheduler_settings); |
| 1250 state.SetCanStart(); | 1251 state.SetCanStart(); |
| 1251 state.UpdateState(state.NextAction()); | 1252 state.UpdateState(state.NextAction()); |
| 1252 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 1253 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 1253 state.SetVisible(true); | 1254 state.SetVisible(true); |
| 1254 state.SetCanDraw(true); | 1255 state.SetCanDraw(true); |
| 1255 | 1256 |
| 1256 // Get a commit in flight. | 1257 // Get a commit in flight. |
| 1257 state.SetNeedsCommit(); | 1258 state.SetNeedsCommit(); |
| 1258 | 1259 |
| 1259 // Set damage and expect a draw. | 1260 // Set damage and expect a draw. |
| 1260 state.SetNeedsRedraw(true); | 1261 state.SetNeedsRedraw(true); |
| 1261 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 1262 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 1262 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 1263 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 1263 EXPECT_ACTION_UPDATE_STATE( | 1264 EXPECT_ACTION_UPDATE_STATE( |
| 1264 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1265 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1265 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1266 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1266 state.OnBeginImplFrameDeadline(); | 1267 state.OnBeginImplFrameDeadline(); |
| 1267 EXPECT_ACTION_UPDATE_STATE( | 1268 EXPECT_ACTION_UPDATE_STATE( |
| 1268 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 1269 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 1269 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1270 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1270 | 1271 |
| 1271 // Cause a lost context while the BeginMainFrame is in flight. | 1272 // Cause a lost context while the BeginMainFrame is in flight. |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1284 // waiting for the first draw to unblock the main thread. | 1285 // waiting for the first draw to unblock the main thread. |
| 1285 EXPECT_TRUE(state.active_tree_needs_first_draw()); | 1286 EXPECT_TRUE(state.active_tree_needs_first_draw()); |
| 1286 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); | 1287 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); |
| 1287 | 1288 |
| 1288 // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE | 1289 // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE |
| 1289 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE, | 1290 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE, |
| 1290 state.begin_impl_frame_state()); | 1291 state.begin_impl_frame_state()); |
| 1291 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, | 1292 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, |
| 1292 state.NextAction()); | 1293 state.NextAction()); |
| 1293 | 1294 |
| 1294 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 1295 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 1295 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING, | 1296 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING, |
| 1296 state.begin_impl_frame_state()); | 1297 state.begin_impl_frame_state()); |
| 1297 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1298 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 1298 | 1299 |
| 1299 state.OnBeginImplFrameDeadlinePending(); | 1300 state.OnBeginImplFrameDeadlinePending(); |
| 1300 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME, | 1301 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME, |
| 1301 state.begin_impl_frame_state()); | 1302 state.begin_impl_frame_state()); |
| 1302 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1303 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 1303 | 1304 |
| 1304 state.OnBeginImplFrameDeadline(); | 1305 state.OnBeginImplFrameDeadline(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1316 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 1317 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 1317 state.SetVisible(true); | 1318 state.SetVisible(true); |
| 1318 state.SetCanDraw(true); | 1319 state.SetCanDraw(true); |
| 1319 | 1320 |
| 1320 // Get a commit in flight. | 1321 // Get a commit in flight. |
| 1321 state.SetNeedsCommit(); | 1322 state.SetNeedsCommit(); |
| 1322 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1323 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1323 | 1324 |
| 1324 // Set damage and expect a draw. | 1325 // Set damage and expect a draw. |
| 1325 state.SetNeedsRedraw(true); | 1326 state.SetNeedsRedraw(true); |
| 1326 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 1327 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 1327 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 1328 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 1328 EXPECT_ACTION_UPDATE_STATE( | 1329 EXPECT_ACTION_UPDATE_STATE( |
| 1329 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1330 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1330 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1331 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1331 state.OnBeginImplFrameDeadline(); | 1332 state.OnBeginImplFrameDeadline(); |
| 1332 EXPECT_ACTION_UPDATE_STATE( | 1333 EXPECT_ACTION_UPDATE_STATE( |
| 1333 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 1334 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 1334 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1335 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1335 | 1336 |
| 1336 // Cause a lost context while the BeginMainFrame is in flight. | 1337 // Cause a lost context while the BeginMainFrame is in flight. |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1349 | 1350 |
| 1350 // Because the output surface is missing, we expect the draw to abort. | 1351 // Because the output surface is missing, we expect the draw to abort. |
| 1351 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); | 1352 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); |
| 1352 | 1353 |
| 1353 // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE | 1354 // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE |
| 1354 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE, | 1355 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE, |
| 1355 state.begin_impl_frame_state()); | 1356 state.begin_impl_frame_state()); |
| 1356 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, | 1357 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, |
| 1357 state.NextAction()); | 1358 state.NextAction()); |
| 1358 | 1359 |
| 1359 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 1360 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 1360 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING, | 1361 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING, |
| 1361 state.begin_impl_frame_state()); | 1362 state.begin_impl_frame_state()); |
| 1362 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1363 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 1363 | 1364 |
| 1364 state.OnBeginImplFrameDeadlinePending(); | 1365 state.OnBeginImplFrameDeadlinePending(); |
| 1365 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME, | 1366 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME, |
| 1366 state.begin_impl_frame_state()); | 1367 state.begin_impl_frame_state()); |
| 1367 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1368 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 1368 | 1369 |
| 1369 state.OnBeginImplFrameDeadline(); | 1370 state.OnBeginImplFrameDeadline(); |
| 1370 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE, | 1371 EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE, |
| 1371 state.begin_impl_frame_state()); | 1372 state.begin_impl_frame_state()); |
| 1372 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1373 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 1373 | 1374 |
| 1374 state.OnBeginImplFrameIdle(); | 1375 state.OnBeginImplFrameIdle(); |
| 1375 EXPECT_ACTION_UPDATE_STATE( | 1376 EXPECT_ACTION_UPDATE_STATE( |
| 1376 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); | 1377 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); |
| 1377 | 1378 |
| 1378 // After we get a new output surface, the commit flow should start. | 1379 // After we get a new output surface, the commit flow should start. |
| 1379 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 1380 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 1380 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 1381 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 1381 EXPECT_ACTION_UPDATE_STATE( | 1382 EXPECT_ACTION_UPDATE_STATE( |
| 1382 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1383 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1383 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1384 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1384 state.NotifyBeginMainFrameStarted(); | 1385 state.NotifyBeginMainFrameStarted(); |
| 1385 state.NotifyReadyToCommit(); | 1386 state.NotifyReadyToCommit(); |
| 1386 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 1387 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 1387 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1388 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1388 state.OnBeginImplFrameDeadline(); | 1389 state.OnBeginImplFrameDeadline(); |
| 1389 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 1390 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 1390 EXPECT_ACTION_UPDATE_STATE( | 1391 EXPECT_ACTION_UPDATE_STATE( |
| 1391 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 1392 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 1392 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1393 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1393 } | 1394 } |
| 1394 | 1395 |
| 1395 TEST(SchedulerStateMachineTest, TestFinishAllRenderingWhileContextLost) { | 1396 TEST(SchedulerStateMachineTest, TestFinishAllRenderingWhileContextLost) { |
| 1396 SchedulerSettings default_scheduler_settings; | 1397 SchedulerSettings default_scheduler_settings; |
| 1397 StateMachine state(default_scheduler_settings); | 1398 StateMachine state(default_scheduler_settings); |
| 1398 state.SetCanStart(); | 1399 state.SetCanStart(); |
| 1399 state.UpdateState(state.NextAction()); | 1400 state.UpdateState(state.NextAction()); |
| 1400 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 1401 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 1401 state.SetVisible(true); | 1402 state.SetVisible(true); |
| 1402 state.SetCanDraw(true); | 1403 state.SetCanDraw(true); |
| 1403 | 1404 |
| 1404 // Cause a lost context lost. | 1405 // Cause a lost context lost. |
| 1405 state.DidLoseOutputSurface(); | 1406 state.DidLoseOutputSurface(); |
| 1406 | 1407 |
| 1407 // Ask a forced redraw for readback and verify it ocurrs. | 1408 // Ask a forced redraw for readback and verify it ocurrs. |
| 1408 state.SetNeedsForcedRedrawForReadback(); | 1409 state.SetNeedsForcedRedrawForReadback(); |
| 1409 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 1410 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 1410 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); | 1411 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); |
| 1411 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1412 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1412 | 1413 |
| 1413 // Forced redraws for readbacks need to be followed by a new commit | 1414 // Forced redraws for readbacks need to be followed by a new commit |
| 1414 // to replace the readback commit. | 1415 // to replace the readback commit. |
| 1415 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, | 1416 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, |
| 1416 state.CommitState()); | 1417 state.CommitState()); |
| 1417 state.NotifyBeginMainFrameStarted(); | 1418 state.NotifyBeginMainFrameStarted(); |
| 1418 state.NotifyReadyToCommit(); | 1419 state.NotifyReadyToCommit(); |
| 1419 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 1420 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1449 state.SetNeedsRedraw(true); | 1450 state.SetNeedsRedraw(true); |
| 1450 | 1451 |
| 1451 // Cause a lost output surface, and restore it. | 1452 // Cause a lost output surface, and restore it. |
| 1452 state.DidLoseOutputSurface(); | 1453 state.DidLoseOutputSurface(); |
| 1453 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, | 1454 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, |
| 1454 state.NextAction()); | 1455 state.NextAction()); |
| 1455 state.UpdateState(state.NextAction()); | 1456 state.UpdateState(state.NextAction()); |
| 1456 state.DidCreateAndInitializeOutputSurface(); | 1457 state.DidCreateAndInitializeOutputSurface(); |
| 1457 | 1458 |
| 1458 EXPECT_FALSE(state.RedrawPending()); | 1459 EXPECT_FALSE(state.RedrawPending()); |
| 1459 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 1460 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 1460 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME, | 1461 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME, |
| 1461 state.NextAction()); | 1462 state.NextAction()); |
| 1462 } | 1463 } |
| 1463 | 1464 |
| 1464 TEST(SchedulerStateMachineTest, | 1465 TEST(SchedulerStateMachineTest, |
| 1465 TestPendingActivationsShouldBeForcedAfterLostOutputSurface) { | 1466 TestPendingActivationsShouldBeForcedAfterLostOutputSurface) { |
| 1466 SchedulerSettings settings; | 1467 SchedulerSettings settings; |
| 1467 settings.impl_side_painting = true; | 1468 settings.impl_side_painting = true; |
| 1468 StateMachine state(settings); | 1469 StateMachine state(settings); |
| 1469 state.SetCanStart(); | 1470 state.SetCanStart(); |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1542 SchedulerStateMachine::READBACK_STATE_WAITING_FOR_REPLACEMENT_COMMIT, | 1543 SchedulerStateMachine::READBACK_STATE_WAITING_FOR_REPLACEMENT_COMMIT, |
| 1543 state.readback_state()); | 1544 state.readback_state()); |
| 1544 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, | 1545 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, |
| 1545 state.CommitState()); | 1546 state.CommitState()); |
| 1546 | 1547 |
| 1547 // Finish the replacement commit. | 1548 // Finish the replacement commit. |
| 1548 state.NotifyBeginMainFrameStarted(); | 1549 state.NotifyBeginMainFrameStarted(); |
| 1549 state.NotifyReadyToCommit(); | 1550 state.NotifyReadyToCommit(); |
| 1550 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 1551 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 1551 | 1552 |
| 1552 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 1553 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 1553 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 1554 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 1554 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1555 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1555 state.OnBeginImplFrameDeadline(); | 1556 state.OnBeginImplFrameDeadline(); |
| 1556 EXPECT_ACTION_UPDATE_STATE( | 1557 EXPECT_ACTION_UPDATE_STATE( |
| 1557 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 1558 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 1558 EXPECT_EQ(SchedulerStateMachine::READBACK_STATE_IDLE, state.readback_state()); | 1559 EXPECT_EQ(SchedulerStateMachine::READBACK_STATE_IDLE, state.readback_state()); |
| 1559 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1560 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1560 } | 1561 } |
| 1561 | 1562 |
| 1562 TEST(SchedulerStateMachineTest, TestFinishCommitWhenCommitInProgress) { | 1563 TEST(SchedulerStateMachineTest, TestFinishCommitWhenCommitInProgress) { |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1647 if (settings.main_frame_before_draw_enabled) { | 1648 if (settings.main_frame_before_draw_enabled) { |
| 1648 // New replacement commit is scheduled. | 1649 // New replacement commit is scheduled. |
| 1649 EXPECT_ACTION_UPDATE_STATE( | 1650 EXPECT_ACTION_UPDATE_STATE( |
| 1650 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1651 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1651 // Forced commit is started. | 1652 // Forced commit is started. |
| 1652 EXPECT_EQ(SchedulerStateMachine::READBACK_STATE_WAITING_FOR_COMMIT, | 1653 EXPECT_EQ(SchedulerStateMachine::READBACK_STATE_WAITING_FOR_COMMIT, |
| 1653 state.readback_state()); | 1654 state.readback_state()); |
| 1654 } | 1655 } |
| 1655 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1656 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1656 | 1657 |
| 1657 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 1658 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 1658 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 1659 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 1659 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1660 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1660 // Perform the draw & swap of replacement commit. | 1661 // Perform the draw & swap of replacement commit. |
| 1661 state.OnBeginImplFrameDeadline(); | 1662 state.OnBeginImplFrameDeadline(); |
| 1662 EXPECT_ACTION_UPDATE_STATE( | 1663 EXPECT_ACTION_UPDATE_STATE( |
| 1663 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 1664 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 1664 if (!settings.main_frame_before_draw_enabled) { | 1665 if (!settings.main_frame_before_draw_enabled) { |
| 1665 // New replacement commit is scheduled. | 1666 // New replacement commit is scheduled. |
| 1666 EXPECT_ACTION_UPDATE_STATE( | 1667 EXPECT_ACTION_UPDATE_STATE( |
| 1667 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1668 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1687 state.CommitState()); | 1688 state.CommitState()); |
| 1688 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1689 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1689 | 1690 |
| 1690 // Finish the replacement commit and draw it. | 1691 // Finish the replacement commit and draw it. |
| 1691 state.NotifyBeginMainFrameStarted(); | 1692 state.NotifyBeginMainFrameStarted(); |
| 1692 state.NotifyReadyToCommit(); | 1693 state.NotifyReadyToCommit(); |
| 1693 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 1694 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 1694 state.NotifyReadyToActivate(); | 1695 state.NotifyReadyToActivate(); |
| 1695 EXPECT_ACTION_UPDATE_STATE( | 1696 EXPECT_ACTION_UPDATE_STATE( |
| 1696 SchedulerStateMachine::ACTION_ACTIVATE_PENDING_TREE); | 1697 SchedulerStateMachine::ACTION_ACTIVATE_PENDING_TREE); |
| 1697 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 1698 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 1698 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 1699 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 1699 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1700 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1700 state.OnBeginImplFrameDeadline(); | 1701 state.OnBeginImplFrameDeadline(); |
| 1701 EXPECT_ACTION_UPDATE_STATE( | 1702 EXPECT_ACTION_UPDATE_STATE( |
| 1702 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 1703 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 1703 EXPECT_EQ(SchedulerStateMachine::READBACK_STATE_IDLE, state.readback_state()); | 1704 EXPECT_EQ(SchedulerStateMachine::READBACK_STATE_IDLE, state.readback_state()); |
| 1704 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1705 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1705 } | 1706 } |
| 1706 | 1707 |
| 1707 // Explicitly test when main_frame_before_draw_enabled = true. | 1708 // Explicitly test when main_frame_before_draw_enabled = true. |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1737 // is idle because main_frame_before_activation is enabled. | 1738 // is idle because main_frame_before_activation is enabled. |
| 1738 state.SetCommitState( | 1739 state.SetCommitState( |
| 1739 SchedulerStateMachine::COMMIT_STATE_IDLE); | 1740 SchedulerStateMachine::COMMIT_STATE_IDLE); |
| 1740 state.SetReadbackState( | 1741 state.SetReadbackState( |
| 1741 SchedulerStateMachine::READBACK_STATE_WAITING_FOR_REPLACEMENT_ACTIVATION); | 1742 SchedulerStateMachine::READBACK_STATE_WAITING_FOR_REPLACEMENT_ACTIVATION); |
| 1742 state.SetHasPendingTree(true); | 1743 state.SetHasPendingTree(true); |
| 1743 | 1744 |
| 1744 // New commit is requested and scheduled when impl-side painting is in | 1745 // New commit is requested and scheduled when impl-side painting is in |
| 1745 // progress. | 1746 // progress. |
| 1746 state.SetNeedsCommit(); | 1747 state.SetNeedsCommit(); |
| 1747 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 1748 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 1748 EXPECT_ACTION_UPDATE_STATE( | 1749 EXPECT_ACTION_UPDATE_STATE( |
| 1749 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1750 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1750 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1751 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1751 | 1752 |
| 1752 // Forced commit is requested during the impl-side painting. | 1753 // Forced commit is requested during the impl-side painting. |
| 1753 state.SetNeedsForcedCommitForReadback(); | 1754 state.SetNeedsForcedCommitForReadback(); |
| 1754 EXPECT_FALSE(state.NeedsCommit()); | 1755 EXPECT_FALSE(state.NeedsCommit()); |
| 1755 | 1756 |
| 1756 state.OnBeginImplFrameDeadline(); | 1757 state.OnBeginImplFrameDeadline(); |
| 1757 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1758 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1758 | 1759 |
| 1759 state.NotifyReadyToActivate(); | 1760 state.NotifyReadyToActivate(); |
| 1760 EXPECT_ACTION_UPDATE_STATE( | 1761 EXPECT_ACTION_UPDATE_STATE( |
| 1761 SchedulerStateMachine::ACTION_ACTIVATE_PENDING_TREE); | 1762 SchedulerStateMachine::ACTION_ACTIVATE_PENDING_TREE); |
| 1762 // Replacement commit for requested forced commit is already scheduled. | 1763 // Replacement commit for requested forced commit is already scheduled. |
| 1763 EXPECT_EQ(SchedulerStateMachine::READBACK_STATE_WAITING_FOR_COMMIT, | 1764 EXPECT_EQ(SchedulerStateMachine::READBACK_STATE_WAITING_FOR_COMMIT, |
| 1764 state.readback_state()); | 1765 state.readback_state()); |
| 1765 EXPECT_FALSE(state.NeedsCommit()); | 1766 EXPECT_FALSE(state.NeedsCommit()); |
| 1766 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1767 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1767 | 1768 |
| 1768 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 1769 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 1769 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 1770 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 1770 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1771 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1771 // Perform the draw & swap of replacement commit. | 1772 // Perform the draw & swap of replacement commit. |
| 1772 state.OnBeginImplFrameDeadline(); | 1773 state.OnBeginImplFrameDeadline(); |
| 1773 EXPECT_ACTION_UPDATE_STATE( | 1774 EXPECT_ACTION_UPDATE_STATE( |
| 1774 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 1775 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 1775 EXPECT_ACTION_UPDATE_STATE( | 1776 EXPECT_ACTION_UPDATE_STATE( |
| 1776 SchedulerStateMachine::ACTION_NONE); | 1777 SchedulerStateMachine::ACTION_NONE); |
| 1777 | 1778 |
| 1778 // forced commit is started. | 1779 // forced commit is started. |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1989 settings.impl_side_painting = true; | 1990 settings.impl_side_painting = true; |
| 1990 StateMachine state(settings); | 1991 StateMachine state(settings); |
| 1991 state.SetCanStart(); | 1992 state.SetCanStart(); |
| 1992 state.UpdateState(state.NextAction()); | 1993 state.UpdateState(state.NextAction()); |
| 1993 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 1994 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 1994 state.SetVisible(true); | 1995 state.SetVisible(true); |
| 1995 state.SetCanDraw(true); | 1996 state.SetCanDraw(true); |
| 1996 | 1997 |
| 1997 // This test mirrors what happens during the first frame of a scroll gesture. | 1998 // This test mirrors what happens during the first frame of a scroll gesture. |
| 1998 // First we get the input event and a BeginFrame. | 1999 // First we get the input event and a BeginFrame. |
| 1999 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 2000 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 2000 | 2001 |
| 2001 // As a response the compositor requests a redraw and a commit to tell the | 2002 // As a response the compositor requests a redraw and a commit to tell the |
| 2002 // main thread about the new scroll offset. | 2003 // main thread about the new scroll offset. |
| 2003 state.SetNeedsRedraw(true); | 2004 state.SetNeedsRedraw(true); |
| 2004 state.SetNeedsCommit(); | 2005 state.SetNeedsCommit(); |
| 2005 | 2006 |
| 2006 // We should start the commit normally. | 2007 // We should start the commit normally. |
| 2007 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 2008 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 2008 EXPECT_ACTION_UPDATE_STATE( | 2009 EXPECT_ACTION_UPDATE_STATE( |
| 2009 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 2010 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2023 settings.impl_side_painting = true; | 2024 settings.impl_side_painting = true; |
| 2024 StateMachine state(settings); | 2025 StateMachine state(settings); |
| 2025 state.SetCanStart(); | 2026 state.SetCanStart(); |
| 2026 state.UpdateState(state.NextAction()); | 2027 state.UpdateState(state.NextAction()); |
| 2027 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 2028 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 2028 state.SetVisible(true); | 2029 state.SetVisible(true); |
| 2029 state.SetCanDraw(true); | 2030 state.SetCanDraw(true); |
| 2030 | 2031 |
| 2031 // This test ensures that impl-draws are prioritized over main thread updates | 2032 // This test ensures that impl-draws are prioritized over main thread updates |
| 2032 // in prefer smoothness mode. | 2033 // in prefer smoothness mode. |
| 2033 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 2034 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 2034 state.SetNeedsRedraw(true); | 2035 state.SetNeedsRedraw(true); |
| 2035 state.SetNeedsCommit(); | 2036 state.SetNeedsCommit(); |
| 2036 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 2037 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 2037 EXPECT_ACTION_UPDATE_STATE( | 2038 EXPECT_ACTION_UPDATE_STATE( |
| 2038 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 2039 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 2039 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2040 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2040 | 2041 |
| 2041 // The deadline is not triggered early until we enter prefer smoothness mode. | 2042 // The deadline is not triggered early until we enter prefer smoothness mode. |
| 2042 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineEarly()); | 2043 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineEarly()); |
| 2043 state.SetSmoothnessTakesPriority(true); | 2044 state.SetSmoothnessTakesPriority(true); |
| 2044 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineEarly()); | 2045 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineEarly()); |
| 2045 } | 2046 } |
| 2046 | 2047 |
| 2047 TEST(SchedulerStateMachineTest, TestSetNeedsAnimate) { | 2048 TEST(SchedulerStateMachineTest, TestSetNeedsAnimate) { |
| 2048 SchedulerSettings settings; | 2049 SchedulerSettings settings; |
| 2049 settings.impl_side_painting = true; | 2050 settings.impl_side_painting = true; |
| 2050 StateMachine state(settings); | 2051 StateMachine state(settings); |
| 2051 state.SetCanStart(); | 2052 state.SetCanStart(); |
| 2052 state.UpdateState(state.NextAction()); | 2053 state.UpdateState(state.NextAction()); |
| 2053 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 2054 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 2054 state.SetVisible(true); | 2055 state.SetVisible(true); |
| 2055 state.SetCanDraw(true); | 2056 state.SetCanDraw(true); |
| 2056 | 2057 |
| 2057 // Test requesting an animation that, when run, causes us to draw. | 2058 // Test requesting an animation that, when run, causes us to draw. |
| 2058 state.SetNeedsAnimate(); | 2059 state.SetNeedsAnimate(); |
| 2059 EXPECT_TRUE(state.BeginFrameNeeded()); | 2060 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 2060 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2061 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2061 | 2062 |
| 2062 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 2063 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 2063 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 2064 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 2064 | 2065 |
| 2065 state.OnBeginImplFrameDeadlinePending(); | 2066 state.OnBeginImplFrameDeadlinePending(); |
| 2066 state.OnBeginImplFrameDeadline(); | 2067 state.OnBeginImplFrameDeadline(); |
| 2067 EXPECT_ACTION_UPDATE_STATE( | 2068 EXPECT_ACTION_UPDATE_STATE( |
| 2068 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 2069 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 2069 } | 2070 } |
| 2070 | 2071 |
| 2071 TEST(SchedulerStateMachineTest, TestAnimateBeforeCommit) { | 2072 TEST(SchedulerStateMachineTest, TestAnimateBeforeCommit) { |
| 2072 SchedulerSettings settings; | 2073 SchedulerSettings settings; |
| 2073 settings.impl_side_painting = true; | 2074 settings.impl_side_painting = true; |
| 2074 StateMachine state(settings); | 2075 StateMachine state(settings); |
| 2075 state.SetCanStart(); | 2076 state.SetCanStart(); |
| 2076 state.UpdateState(state.NextAction()); | 2077 state.UpdateState(state.NextAction()); |
| 2077 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 2078 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 2078 state.SetVisible(true); | 2079 state.SetVisible(true); |
| 2079 state.SetCanDraw(true); | 2080 state.SetCanDraw(true); |
| 2080 | 2081 |
| 2081 // Check that animations are updated before we start a commit. | 2082 // Check that animations are updated before we start a commit. |
| 2082 state.SetNeedsAnimate(); | 2083 state.SetNeedsAnimate(); |
| 2083 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2084 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2084 state.SetNeedsCommit(); | 2085 state.SetNeedsCommit(); |
| 2085 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2086 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2086 EXPECT_TRUE(state.BeginFrameNeeded()); | 2087 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 2087 | 2088 |
| 2088 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 2089 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 2089 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 2090 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 2090 EXPECT_ACTION_UPDATE_STATE( | 2091 EXPECT_ACTION_UPDATE_STATE( |
| 2091 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 2092 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 2092 | 2093 |
| 2093 state.OnBeginImplFrameDeadlinePending(); | 2094 state.OnBeginImplFrameDeadlinePending(); |
| 2094 state.OnBeginImplFrameDeadline(); | 2095 state.OnBeginImplFrameDeadline(); |
| 2095 EXPECT_ACTION_UPDATE_STATE( | 2096 EXPECT_ACTION_UPDATE_STATE( |
| 2096 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 2097 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 2097 } | 2098 } |
| 2098 | 2099 |
| 2099 TEST(SchedulerStateMachineTest, TestSetNeedsAnimateAfterAnimate) { | 2100 TEST(SchedulerStateMachineTest, TestSetNeedsAnimateAfterAnimate) { |
| 2100 SchedulerSettings settings; | 2101 SchedulerSettings settings; |
| 2101 settings.impl_side_painting = true; | 2102 settings.impl_side_painting = true; |
| 2102 StateMachine state(settings); | 2103 StateMachine state(settings); |
| 2103 state.SetCanStart(); | 2104 state.SetCanStart(); |
| 2104 state.UpdateState(state.NextAction()); | 2105 state.UpdateState(state.NextAction()); |
| 2105 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 2106 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 2106 state.SetVisible(true); | 2107 state.SetVisible(true); |
| 2107 state.SetCanDraw(true); | 2108 state.SetCanDraw(true); |
| 2108 | 2109 |
| 2109 // Test requesting an animation after we have already animated during this | 2110 // Test requesting an animation after we have already animated during this |
| 2110 // frame. | 2111 // frame. |
| 2111 state.SetNeedsRedraw(true); | 2112 state.SetNeedsRedraw(true); |
| 2112 EXPECT_TRUE(state.BeginFrameNeeded()); | 2113 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 2113 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2114 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2114 | 2115 |
| 2115 state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 2116 state.OnBeginImplFrame(BeginFrameArgsCreateForTesting()); |
| 2116 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); | 2117 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); |
| 2117 | 2118 |
| 2118 state.SetNeedsAnimate(); | 2119 state.SetNeedsAnimate(); |
| 2119 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2120 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2120 | 2121 |
| 2121 state.OnBeginImplFrameDeadline(); | 2122 state.OnBeginImplFrameDeadline(); |
| 2122 EXPECT_ACTION_UPDATE_STATE( | 2123 EXPECT_ACTION_UPDATE_STATE( |
| 2123 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 2124 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 2124 } | 2125 } |
| 2125 | 2126 |
| 2126 } // namespace | 2127 } // namespace |
| 2127 } // namespace cc | 2128 } // namespace cc |
| OLD | NEW |