| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include "base/trace_event/trace_event.h" | 9 #include "base/trace_event/trace_event.h" |
| 10 #include "cc/output/begin_frame_args.h" |
| 10 #include "cc/scheduler/scheduler.h" | 11 #include "cc/scheduler/scheduler.h" |
| 11 #include "cc/test/begin_frame_args_test.h" | 12 #include "cc/test/begin_frame_args_test.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
| 13 | 14 |
| 14 // Macro to compare two enum values and get nice output. | 15 // Macro to compare two enum values and get nice output. |
| 15 // Without: | 16 // Without: |
| 16 // Value of: actual() Actual: 7 | 17 // Value of: actual() Actual: 7 |
| 17 // Expected: expected() Which is: 0 | 18 // Expected: expected() Which is: 0 |
| 18 // With: | 19 // With: |
| 19 // Value of: actual() Actual: "ACTION_DRAW" | 20 // Value of: actual() Actual: "ACTION_DRAW" |
| 20 // Expected: expected() Which is: "ACTION_NONE" | 21 // Expected: expected() Which is: "ACTION_NONE" |
| 21 #define EXPECT_ENUM_EQ(enum_tostring, expected, actual) \ | 22 #define EXPECT_ENUM_EQ(enum_tostring, expected, actual) \ |
| 22 EXPECT_STREQ(SchedulerStateMachine::enum_tostring(expected), \ | 23 EXPECT_STREQ(SchedulerStateMachine::enum_tostring(expected), \ |
| 23 SchedulerStateMachine::enum_tostring(actual)) | 24 SchedulerStateMachine::enum_tostring(actual)) |
| 24 | 25 |
| 26 #define EXPECT_SEQUENCE_NUMBERS(current, main_frame, pending_tree, \ |
| 27 active_tree, compositor_frame) \ |
| 28 EXPECT_EQ(current, state.begin_frame_sequence_number()); \ |
| 29 EXPECT_EQ(main_frame, \ |
| 30 state.last_begin_frame_sequence_number_begin_main_frame_sent()); \ |
| 31 EXPECT_EQ(pending_tree, \ |
| 32 state.last_begin_frame_sequence_number_pending_tree_was_fresh()); \ |
| 33 EXPECT_EQ(active_tree, \ |
| 34 state.last_begin_frame_sequence_number_active_tree_was_fresh()); \ |
| 35 EXPECT_EQ( \ |
| 36 compositor_frame, \ |
| 37 state.last_begin_frame_sequence_number_compositor_frame_was_fresh()) |
| 38 |
| 25 #define EXPECT_IMPL_FRAME_STATE(expected) \ | 39 #define EXPECT_IMPL_FRAME_STATE(expected) \ |
| 26 EXPECT_ENUM_EQ(BeginImplFrameStateToString, expected, \ | 40 EXPECT_ENUM_EQ(BeginImplFrameStateToString, expected, \ |
| 27 state.begin_impl_frame_state()) \ | 41 state.begin_impl_frame_state()) \ |
| 28 << state.AsValue()->ToString() | 42 << state.AsValue()->ToString() |
| 29 | 43 |
| 30 #define EXPECT_MAIN_FRAME_STATE(expected) \ | 44 #define EXPECT_MAIN_FRAME_STATE(expected) \ |
| 31 EXPECT_ENUM_EQ(BeginMainFrameStateToString, expected, \ | 45 EXPECT_ENUM_EQ(BeginMainFrameStateToString, expected, \ |
| 32 state.BeginMainFrameState()) | 46 state.BeginMainFrameState()) |
| 33 | 47 |
| 34 #define EXPECT_ACTION(expected) \ | 48 #define EXPECT_ACTION(expected) \ |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 79 public: | 93 public: |
| 80 explicit StateMachine(const SchedulerSettings& scheduler_settings) | 94 explicit StateMachine(const SchedulerSettings& scheduler_settings) |
| 81 : SchedulerStateMachine(scheduler_settings), | 95 : SchedulerStateMachine(scheduler_settings), |
| 82 draw_result_for_test_(DRAW_SUCCESS) {} | 96 draw_result_for_test_(DRAW_SUCCESS) {} |
| 83 | 97 |
| 84 void CreateAndInitializeCompositorFrameSinkWithActivatedCommit() { | 98 void CreateAndInitializeCompositorFrameSinkWithActivatedCommit() { |
| 85 DidCreateAndInitializeCompositorFrameSink(); | 99 DidCreateAndInitializeCompositorFrameSink(); |
| 86 compositor_frame_sink_state_ = COMPOSITOR_FRAME_SINK_ACTIVE; | 100 compositor_frame_sink_state_ = COMPOSITOR_FRAME_SINK_ACTIVE; |
| 87 } | 101 } |
| 88 | 102 |
| 103 void IssueNextBeginImplFrame() { |
| 104 OnBeginImplFrame(0, next_begin_frame_number_++); |
| 105 } |
| 106 |
| 89 void SetBeginMainFrameState(BeginMainFrameState cs) { | 107 void SetBeginMainFrameState(BeginMainFrameState cs) { |
| 90 begin_main_frame_state_ = cs; | 108 begin_main_frame_state_ = cs; |
| 91 } | 109 } |
| 92 BeginMainFrameState BeginMainFrameState() const { | 110 BeginMainFrameState BeginMainFrameState() const { |
| 93 return begin_main_frame_state_; | 111 return begin_main_frame_state_; |
| 94 } | 112 } |
| 95 | 113 |
| 96 ForcedRedrawOnTimeoutState ForcedRedrawState() const { | 114 ForcedRedrawOnTimeoutState ForcedRedrawState() const { |
| 97 return forced_redraw_state_; | 115 return forced_redraw_state_; |
| 98 } | 116 } |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 143 | 161 |
| 144 bool PendingActivationsShouldBeForced() const { | 162 bool PendingActivationsShouldBeForced() const { |
| 145 return SchedulerStateMachine::PendingActivationsShouldBeForced(); | 163 return SchedulerStateMachine::PendingActivationsShouldBeForced(); |
| 146 } | 164 } |
| 147 | 165 |
| 148 bool has_pending_tree() const { return has_pending_tree_; } | 166 bool has_pending_tree() const { return has_pending_tree_; } |
| 149 void SetHasPendingTree(bool has_pending_tree) { | 167 void SetHasPendingTree(bool has_pending_tree) { |
| 150 has_pending_tree_ = has_pending_tree; | 168 has_pending_tree_ = has_pending_tree; |
| 151 } | 169 } |
| 152 | 170 |
| 171 uint64_t begin_frame_sequence_number() const { |
| 172 return begin_frame_sequence_number_; |
| 173 } |
| 174 uint64_t last_begin_frame_sequence_number_begin_main_frame_sent() const { |
| 175 return last_begin_frame_sequence_number_begin_main_frame_sent_; |
| 176 } |
| 177 uint64_t last_begin_frame_sequence_number_pending_tree_was_fresh() const { |
| 178 return last_begin_frame_sequence_number_pending_tree_was_fresh_; |
| 179 } |
| 180 uint64_t last_begin_frame_sequence_number_active_tree_was_fresh() const { |
| 181 return last_begin_frame_sequence_number_active_tree_was_fresh_; |
| 182 } |
| 183 |
| 153 using SchedulerStateMachine::ShouldTriggerBeginImplFrameDeadlineImmediately; | 184 using SchedulerStateMachine::ShouldTriggerBeginImplFrameDeadlineImmediately; |
| 154 using SchedulerStateMachine::ProactiveBeginFrameWanted; | 185 using SchedulerStateMachine::ProactiveBeginFrameWanted; |
| 155 using SchedulerStateMachine::WillCommit; | 186 using SchedulerStateMachine::WillCommit; |
| 156 | 187 |
| 157 protected: | 188 protected: |
| 158 DrawResult draw_result_for_test_; | 189 DrawResult draw_result_for_test_; |
| 190 uint64_t next_begin_frame_number_ = BeginFrameArgs::kStartingFrameNumber; |
| 159 }; | 191 }; |
| 160 | 192 |
| 161 void PerformAction(StateMachine* sm, SchedulerStateMachine::Action action) { | 193 void PerformAction(StateMachine* sm, SchedulerStateMachine::Action action) { |
| 162 switch (action) { | 194 switch (action) { |
| 163 case SchedulerStateMachine::ACTION_NONE: | 195 case SchedulerStateMachine::ACTION_NONE: |
| 164 return; | 196 return; |
| 165 | 197 |
| 166 case SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE: | 198 case SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE: |
| 167 sm->WillActivate(); | 199 sm->WillActivate(); |
| 168 return; | 200 return; |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 264 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); | 296 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); |
| 265 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 297 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 266 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); | 298 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); |
| 267 state.SetBeginMainFrameState( | 299 state.SetBeginMainFrameState( |
| 268 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); | 300 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); |
| 269 state.SetNeedsRedraw(false); | 301 state.SetNeedsRedraw(false); |
| 270 | 302 |
| 271 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 303 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 272 EXPECT_FALSE(state.NeedsCommit()); | 304 EXPECT_FALSE(state.NeedsCommit()); |
| 273 | 305 |
| 274 state.OnBeginImplFrame(); | 306 state.IssueNextBeginImplFrame(); |
| 275 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 307 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 276 | 308 |
| 277 state.OnBeginImplFrameDeadline(); | 309 state.OnBeginImplFrameDeadline(); |
| 278 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 310 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 279 EXPECT_FALSE(state.NeedsCommit()); | 311 EXPECT_FALSE(state.NeedsCommit()); |
| 280 } | 312 } |
| 281 | 313 |
| 282 // If commit requested but not visible yet, do nothing. | 314 // If commit requested but not visible yet, do nothing. |
| 283 { | 315 { |
| 284 StateMachine state(default_scheduler_settings); | 316 StateMachine state(default_scheduler_settings); |
| 285 state.SetBeginMainFrameState( | 317 state.SetBeginMainFrameState( |
| 286 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); | 318 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); |
| 287 state.SetNeedsRedraw(false); | 319 state.SetNeedsRedraw(false); |
| 288 state.SetNeedsBeginMainFrame(); | 320 state.SetNeedsBeginMainFrame(); |
| 289 | 321 |
| 290 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 322 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 291 EXPECT_TRUE(state.NeedsCommit()); | 323 EXPECT_TRUE(state.NeedsCommit()); |
| 292 | 324 |
| 293 state.OnBeginImplFrame(); | 325 state.IssueNextBeginImplFrame(); |
| 294 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 326 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 295 | 327 |
| 296 state.OnBeginImplFrameDeadline(); | 328 state.OnBeginImplFrameDeadline(); |
| 297 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 329 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 298 EXPECT_TRUE(state.NeedsCommit()); | 330 EXPECT_TRUE(state.NeedsCommit()); |
| 299 } | 331 } |
| 300 | 332 |
| 301 // If commit requested, begin a main frame. | 333 // If commit requested, begin a main frame. |
| 302 { | 334 { |
| 303 StateMachine state(default_scheduler_settings); | 335 StateMachine state(default_scheduler_settings); |
| 304 state.SetBeginMainFrameState( | 336 state.SetBeginMainFrameState( |
| 305 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); | 337 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); |
| 306 state.SetVisible(true); | 338 state.SetVisible(true); |
| 307 EXPECT_ACTION_UPDATE_STATE( | 339 EXPECT_ACTION_UPDATE_STATE( |
| 308 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); | 340 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); |
| 309 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 341 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 310 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); | 342 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); |
| 311 state.SetNeedsRedraw(false); | 343 state.SetNeedsRedraw(false); |
| 312 state.SetNeedsBeginMainFrame(); | 344 state.SetNeedsBeginMainFrame(); |
| 313 | 345 |
| 314 // Expect nothing to happen until after OnBeginImplFrame. | 346 // Expect nothing to happen until after OnBeginImplFrame. |
| 315 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 347 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 316 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); | 348 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); |
| 317 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); | 349 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); |
| 318 EXPECT_TRUE(state.NeedsCommit()); | 350 EXPECT_TRUE(state.NeedsCommit()); |
| 319 EXPECT_TRUE(state.BeginFrameNeeded()); | 351 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 320 | 352 |
| 321 state.OnBeginImplFrame(); | 353 state.IssueNextBeginImplFrame(); |
| 322 EXPECT_ACTION_UPDATE_STATE( | 354 EXPECT_ACTION_UPDATE_STATE( |
| 323 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 355 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 324 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); | 356 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); |
| 325 EXPECT_FALSE(state.NeedsCommit()); | 357 EXPECT_FALSE(state.NeedsCommit()); |
| 326 } | 358 } |
| 327 | 359 |
| 328 // If commit requested and can't draw, still begin a main frame. | 360 // If commit requested and can't draw, still begin a main frame. |
| 329 { | 361 { |
| 330 StateMachine state(default_scheduler_settings); | 362 StateMachine state(default_scheduler_settings); |
| 331 state.SetBeginMainFrameState( | 363 state.SetBeginMainFrameState( |
| 332 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); | 364 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); |
| 333 state.SetVisible(true); | 365 state.SetVisible(true); |
| 334 EXPECT_ACTION_UPDATE_STATE( | 366 EXPECT_ACTION_UPDATE_STATE( |
| 335 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); | 367 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); |
| 336 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 368 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 337 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); | 369 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); |
| 338 state.SetNeedsRedraw(false); | 370 state.SetNeedsRedraw(false); |
| 339 state.SetNeedsBeginMainFrame(); | 371 state.SetNeedsBeginMainFrame(); |
| 340 state.SetCanDraw(false); | 372 state.SetCanDraw(false); |
| 341 | 373 |
| 342 // Expect nothing to happen until after OnBeginImplFrame. | 374 // Expect nothing to happen until after OnBeginImplFrame. |
| 343 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 375 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 344 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); | 376 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); |
| 345 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); | 377 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); |
| 346 EXPECT_TRUE(state.BeginFrameNeeded()); | 378 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 347 | 379 |
| 348 state.OnBeginImplFrame(); | 380 state.IssueNextBeginImplFrame(); |
| 349 EXPECT_ACTION_UPDATE_STATE( | 381 EXPECT_ACTION_UPDATE_STATE( |
| 350 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 382 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 351 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); | 383 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); |
| 352 EXPECT_FALSE(state.NeedsCommit()); | 384 EXPECT_FALSE(state.NeedsCommit()); |
| 353 } | 385 } |
| 354 } | 386 } |
| 355 | 387 |
| 356 // Explicitly test main_frame_before_activation_enabled = true | 388 // Explicitly test main_frame_before_activation_enabled = true |
| 357 TEST(SchedulerStateMachineTest, MainFrameBeforeActivationEnabled) { | 389 TEST(SchedulerStateMachineTest, MainFrameBeforeActivationEnabled) { |
| 358 SchedulerSettings scheduler_settings; | 390 SchedulerSettings scheduler_settings; |
| 359 scheduler_settings.main_frame_before_activation_enabled = true; | 391 scheduler_settings.main_frame_before_activation_enabled = true; |
| 360 StateMachine state(scheduler_settings); | 392 StateMachine state(scheduler_settings); |
| 361 state.SetBeginMainFrameState( | 393 state.SetBeginMainFrameState( |
| 362 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); | 394 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); |
| 363 SET_UP_STATE(state) | 395 SET_UP_STATE(state) |
| 364 state.SetNeedsRedraw(false); | 396 state.SetNeedsRedraw(false); |
| 365 state.SetNeedsBeginMainFrame(); | 397 state.SetNeedsBeginMainFrame(); |
| 366 | 398 |
| 367 EXPECT_TRUE(state.BeginFrameNeeded()); | 399 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 368 | 400 |
| 369 // Commit to the pending tree. | 401 // Commit to the pending tree. |
| 370 state.OnBeginImplFrame(); | 402 state.IssueNextBeginImplFrame(); |
| 371 EXPECT_ACTION_UPDATE_STATE( | 403 EXPECT_ACTION_UPDATE_STATE( |
| 372 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 404 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 373 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 405 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 374 | 406 |
| 375 state.NotifyBeginMainFrameStarted(); | 407 state.NotifyBeginMainFrameStarted(); |
| 376 state.NotifyReadyToCommit(); | 408 state.NotifyReadyToCommit(); |
| 377 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 409 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 378 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 410 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 379 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); | 411 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); |
| 380 | 412 |
| 381 state.OnBeginImplFrameDeadline(); | 413 state.OnBeginImplFrameDeadline(); |
| 382 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 414 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 383 | 415 |
| 384 // Verify that the next commit starts while there is still a pending tree. | 416 // Verify that the next commit starts while there is still a pending tree. |
| 385 state.SetNeedsBeginMainFrame(); | 417 state.SetNeedsBeginMainFrame(); |
| 386 state.OnBeginImplFrame(); | 418 state.IssueNextBeginImplFrame(); |
| 387 EXPECT_ACTION_UPDATE_STATE( | 419 EXPECT_ACTION_UPDATE_STATE( |
| 388 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 420 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 389 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 421 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 390 | 422 |
| 391 // Verify the pending commit doesn't overwrite the pending | 423 // Verify the pending commit doesn't overwrite the pending |
| 392 // tree until the pending tree has been activated. | 424 // tree until the pending tree has been activated. |
| 393 state.NotifyBeginMainFrameStarted(); | 425 state.NotifyBeginMainFrameStarted(); |
| 394 state.NotifyReadyToCommit(); | 426 state.NotifyReadyToCommit(); |
| 395 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 427 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 396 | 428 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 413 TEST(SchedulerStateMachineTest, | 445 TEST(SchedulerStateMachineTest, |
| 414 FailedDrawForAnimationCheckerboardSetsNeedsCommitAndRetriesDraw) { | 446 FailedDrawForAnimationCheckerboardSetsNeedsCommitAndRetriesDraw) { |
| 415 SchedulerSettings default_scheduler_settings; | 447 SchedulerSettings default_scheduler_settings; |
| 416 StateMachine state(default_scheduler_settings); | 448 StateMachine state(default_scheduler_settings); |
| 417 SET_UP_STATE(state) | 449 SET_UP_STATE(state) |
| 418 state.SetNeedsRedraw(true); | 450 state.SetNeedsRedraw(true); |
| 419 EXPECT_TRUE(state.RedrawPending()); | 451 EXPECT_TRUE(state.RedrawPending()); |
| 420 EXPECT_TRUE(state.BeginFrameNeeded()); | 452 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 421 | 453 |
| 422 // Start a frame. | 454 // Start a frame. |
| 423 state.OnBeginImplFrame(); | 455 state.IssueNextBeginImplFrame(); |
| 424 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 456 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 425 EXPECT_FALSE(state.CommitPending()); | 457 EXPECT_FALSE(state.CommitPending()); |
| 426 | 458 |
| 427 // Failing a draw triggers request for a new BeginMainFrame. | 459 // Failing a draw triggers request for a new BeginMainFrame. |
| 428 state.OnBeginImplFrameDeadline(); | 460 state.OnBeginImplFrameDeadline(); |
| 429 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); | 461 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); |
| 430 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 462 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| 431 EXPECT_ACTION_UPDATE_STATE( | 463 EXPECT_ACTION_UPDATE_STATE( |
| 432 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 464 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 433 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 465 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 434 state.OnBeginImplFrameIdle(); | 466 state.OnBeginImplFrameIdle(); |
| 435 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 467 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 436 | 468 |
| 437 // It's okay to attempt more draws just in case additional raster | 469 // It's okay to attempt more draws just in case additional raster |
| 438 // finishes and the requested commit wasn't actually necessary. | 470 // finishes and the requested commit wasn't actually necessary. |
| 439 EXPECT_TRUE(state.CommitPending()); | 471 EXPECT_TRUE(state.CommitPending()); |
| 440 EXPECT_TRUE(state.RedrawPending()); | 472 EXPECT_TRUE(state.RedrawPending()); |
| 441 state.OnBeginImplFrame(); | 473 state.IssueNextBeginImplFrame(); |
| 442 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 474 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 443 state.OnBeginImplFrameDeadline(); | 475 state.OnBeginImplFrameDeadline(); |
| 444 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); | 476 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); |
| 445 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 477 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| 446 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 478 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 447 state.OnBeginImplFrameIdle(); | 479 state.OnBeginImplFrameIdle(); |
| 448 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 480 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 449 } | 481 } |
| 450 | 482 |
| 451 TEST(SchedulerStateMachineTest, FailedDrawForMissingHighResNeedsCommit) { | 483 TEST(SchedulerStateMachineTest, FailedDrawForMissingHighResNeedsCommit) { |
| 452 SchedulerSettings default_scheduler_settings; | 484 SchedulerSettings default_scheduler_settings; |
| 453 StateMachine state(default_scheduler_settings); | 485 StateMachine state(default_scheduler_settings); |
| 454 SET_UP_STATE(state) | 486 SET_UP_STATE(state) |
| 455 state.SetNeedsRedraw(true); | 487 state.SetNeedsRedraw(true); |
| 456 EXPECT_TRUE(state.RedrawPending()); | 488 EXPECT_TRUE(state.RedrawPending()); |
| 457 EXPECT_TRUE(state.BeginFrameNeeded()); | 489 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 458 | 490 |
| 459 // Start a frame. | 491 // Start a frame. |
| 460 state.OnBeginImplFrame(); | 492 state.IssueNextBeginImplFrame(); |
| 461 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 493 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 462 EXPECT_FALSE(state.CommitPending()); | 494 EXPECT_FALSE(state.CommitPending()); |
| 463 | 495 |
| 464 // Failing a draw triggers because of high res tiles missing | 496 // Failing a draw triggers because of high res tiles missing |
| 465 // request for a new BeginMainFrame. | 497 // request for a new BeginMainFrame. |
| 466 state.OnBeginImplFrameDeadline(); | 498 state.OnBeginImplFrameDeadline(); |
| 467 state.SetDrawResultForTest(DRAW_ABORTED_MISSING_HIGH_RES_CONTENT); | 499 state.SetDrawResultForTest(DRAW_ABORTED_MISSING_HIGH_RES_CONTENT); |
| 468 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 500 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| 469 EXPECT_ACTION_UPDATE_STATE( | 501 EXPECT_ACTION_UPDATE_STATE( |
| 470 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 502 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 471 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 503 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 472 state.OnBeginImplFrameIdle(); | 504 state.OnBeginImplFrameIdle(); |
| 473 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 505 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 474 | 506 |
| 475 // It doesn't request a draw until we get a new commit though. | 507 // It doesn't request a draw until we get a new commit though. |
| 476 EXPECT_TRUE(state.CommitPending()); | 508 EXPECT_TRUE(state.CommitPending()); |
| 477 EXPECT_FALSE(state.RedrawPending()); | 509 EXPECT_FALSE(state.RedrawPending()); |
| 478 state.OnBeginImplFrame(); | 510 state.IssueNextBeginImplFrame(); |
| 479 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 511 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 480 state.OnBeginImplFrameDeadline(); | 512 state.OnBeginImplFrameDeadline(); |
| 481 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 513 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 482 state.OnBeginImplFrameIdle(); | 514 state.OnBeginImplFrameIdle(); |
| 483 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 515 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 484 | 516 |
| 485 // Finish the commit and activation. | 517 // Finish the commit and activation. |
| 486 state.NotifyBeginMainFrameStarted(); | 518 state.NotifyBeginMainFrameStarted(); |
| 487 state.NotifyReadyToCommit(); | 519 state.NotifyReadyToCommit(); |
| 488 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 520 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 489 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 521 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 490 state.NotifyReadyToActivate(); | 522 state.NotifyReadyToActivate(); |
| 491 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); | 523 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); |
| 492 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 524 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 493 EXPECT_TRUE(state.RedrawPending()); | 525 EXPECT_TRUE(state.RedrawPending()); |
| 494 | 526 |
| 495 // Verify we draw with the new frame. | 527 // Verify we draw with the new frame. |
| 496 state.OnBeginImplFrame(); | 528 state.IssueNextBeginImplFrame(); |
| 497 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 529 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 498 state.OnBeginImplFrameDeadline(); | 530 state.OnBeginImplFrameDeadline(); |
| 499 state.SetDrawResultForTest(DRAW_SUCCESS); | 531 state.SetDrawResultForTest(DRAW_SUCCESS); |
| 500 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 532 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| 501 state.DidSubmitCompositorFrame(); | 533 state.DidSubmitCompositorFrame(); |
| 502 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 534 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 503 state.OnBeginImplFrameIdle(); | 535 state.OnBeginImplFrameIdle(); |
| 504 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 536 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 505 } | 537 } |
| 506 | 538 |
| 507 TEST(SchedulerStateMachineTest, | 539 TEST(SchedulerStateMachineTest, |
| 508 TestFailedDrawsEventuallyForceDrawAfterNextCommit) { | 540 TestFailedDrawsEventuallyForceDrawAfterNextCommit) { |
| 509 SchedulerSettings scheduler_settings; | 541 SchedulerSettings scheduler_settings; |
| 510 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced = 1; | 542 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced = 1; |
| 511 StateMachine state(scheduler_settings); | 543 StateMachine state(scheduler_settings); |
| 512 SET_UP_STATE(state) | 544 SET_UP_STATE(state) |
| 513 | 545 |
| 514 // Start a commit. | 546 // Start a commit. |
| 515 state.SetNeedsBeginMainFrame(); | 547 state.SetNeedsBeginMainFrame(); |
| 516 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 548 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 517 state.OnBeginImplFrame(); | 549 state.IssueNextBeginImplFrame(); |
| 518 EXPECT_ACTION_UPDATE_STATE( | 550 EXPECT_ACTION_UPDATE_STATE( |
| 519 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 551 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 520 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 552 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 521 EXPECT_TRUE(state.CommitPending()); | 553 EXPECT_TRUE(state.CommitPending()); |
| 522 | 554 |
| 523 // Then initiate a draw that fails. | 555 // Then initiate a draw that fails. |
| 524 state.SetNeedsRedraw(true); | 556 state.SetNeedsRedraw(true); |
| 525 state.OnBeginImplFrameDeadline(); | 557 state.OnBeginImplFrameDeadline(); |
| 526 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); | 558 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); |
| 527 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 559 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 538 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 570 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 539 EXPECT_TRUE(state.RedrawPending()); | 571 EXPECT_TRUE(state.RedrawPending()); |
| 540 | 572 |
| 541 // Activate so we're ready for a new main frame. | 573 // Activate so we're ready for a new main frame. |
| 542 state.NotifyReadyToActivate(); | 574 state.NotifyReadyToActivate(); |
| 543 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); | 575 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); |
| 544 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 576 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 545 EXPECT_TRUE(state.RedrawPending()); | 577 EXPECT_TRUE(state.RedrawPending()); |
| 546 | 578 |
| 547 // The redraw should be forced at the end of the next BeginImplFrame. | 579 // The redraw should be forced at the end of the next BeginImplFrame. |
| 548 state.OnBeginImplFrame(); | 580 state.IssueNextBeginImplFrame(); |
| 549 EXPECT_ACTION_UPDATE_STATE( | 581 EXPECT_ACTION_UPDATE_STATE( |
| 550 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 582 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 551 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 583 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 552 state.OnBeginImplFrameDeadline(); | 584 state.OnBeginImplFrameDeadline(); |
| 553 state.SetDrawResultForTest(DRAW_SUCCESS); | 585 state.SetDrawResultForTest(DRAW_SUCCESS); |
| 554 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_FORCED); | 586 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_FORCED); |
| 555 state.DidSubmitCompositorFrame(); | 587 state.DidSubmitCompositorFrame(); |
| 556 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 588 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 557 state.DidReceiveCompositorFrameAck(); | 589 state.DidReceiveCompositorFrameAck(); |
| 558 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 590 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 559 } | 591 } |
| 560 | 592 |
| 561 TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) { | 593 TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) { |
| 562 SchedulerSettings scheduler_settings; | 594 SchedulerSettings scheduler_settings; |
| 563 int draw_limit = 2; | 595 int draw_limit = 2; |
| 564 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced = | 596 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced = |
| 565 draw_limit; | 597 draw_limit; |
| 566 StateMachine state(scheduler_settings); | 598 StateMachine state(scheduler_settings); |
| 567 SET_UP_STATE(state) | 599 SET_UP_STATE(state) |
| 568 | 600 |
| 569 // Start a commit. | 601 // Start a commit. |
| 570 state.SetNeedsBeginMainFrame(); | 602 state.SetNeedsBeginMainFrame(); |
| 571 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 603 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 572 state.OnBeginImplFrame(); | 604 state.IssueNextBeginImplFrame(); |
| 573 EXPECT_ACTION_UPDATE_STATE( | 605 EXPECT_ACTION_UPDATE_STATE( |
| 574 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 606 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 575 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 607 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 576 EXPECT_TRUE(state.CommitPending()); | 608 EXPECT_TRUE(state.CommitPending()); |
| 577 | 609 |
| 578 // Then initiate a draw. | 610 // Then initiate a draw. |
| 579 state.SetNeedsRedraw(true); | 611 state.SetNeedsRedraw(true); |
| 580 state.OnBeginImplFrameDeadline(); | 612 state.OnBeginImplFrameDeadline(); |
| 581 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 613 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| 582 | 614 |
| 583 // Fail the draw enough times to force a redraw. | 615 // Fail the draw enough times to force a redraw. |
| 584 for (int i = 0; i < draw_limit; ++i) { | 616 for (int i = 0; i < draw_limit; ++i) { |
| 585 state.SetNeedsRedraw(true); | 617 state.SetNeedsRedraw(true); |
| 586 state.OnBeginImplFrame(); | 618 state.IssueNextBeginImplFrame(); |
| 587 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 619 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 588 state.OnBeginImplFrameDeadline(); | 620 state.OnBeginImplFrameDeadline(); |
| 589 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); | 621 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); |
| 590 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 622 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| 591 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 623 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 592 state.OnBeginImplFrameIdle(); | 624 state.OnBeginImplFrameIdle(); |
| 593 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 625 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 594 } | 626 } |
| 595 | 627 |
| 596 EXPECT_TRUE(state.BeginFrameNeeded()); | 628 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 597 EXPECT_TRUE(state.RedrawPending()); | 629 EXPECT_TRUE(state.RedrawPending()); |
| 598 // But the commit is ongoing. | 630 // But the commit is ongoing. |
| 599 EXPECT_TRUE(state.CommitPending()); | 631 EXPECT_TRUE(state.CommitPending()); |
| 600 EXPECT_TRUE(state.ForcedRedrawState() == | 632 EXPECT_TRUE(state.ForcedRedrawState() == |
| 601 SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_COMMIT); | 633 SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_COMMIT); |
| 602 | 634 |
| 603 // After failing additional draws, we should still be in a forced | 635 // After failing additional draws, we should still be in a forced |
| 604 // redraw, but not back in IDLE. | 636 // redraw, but not back in IDLE. |
| 605 for (int i = 0; i < draw_limit; ++i) { | 637 for (int i = 0; i < draw_limit; ++i) { |
| 606 state.SetNeedsRedraw(true); | 638 state.SetNeedsRedraw(true); |
| 607 state.OnBeginImplFrame(); | 639 state.IssueNextBeginImplFrame(); |
| 608 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 640 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 609 state.OnBeginImplFrameDeadline(); | 641 state.OnBeginImplFrameDeadline(); |
| 610 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); | 642 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); |
| 611 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 643 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| 612 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 644 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 613 state.OnBeginImplFrameIdle(); | 645 state.OnBeginImplFrameIdle(); |
| 614 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 646 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 615 } | 647 } |
| 616 EXPECT_TRUE(state.RedrawPending()); | 648 EXPECT_TRUE(state.RedrawPending()); |
| 617 EXPECT_TRUE(state.ForcedRedrawState() == | 649 EXPECT_TRUE(state.ForcedRedrawState() == |
| 618 SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_COMMIT); | 650 SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_COMMIT); |
| 619 } | 651 } |
| 620 | 652 |
| 621 TEST(SchedulerStateMachineTest, TestFailedDrawIsRetriedInNextBeginImplFrame) { | 653 TEST(SchedulerStateMachineTest, TestFailedDrawIsRetriedInNextBeginImplFrame) { |
| 622 SchedulerSettings default_scheduler_settings; | 654 SchedulerSettings default_scheduler_settings; |
| 623 StateMachine state(default_scheduler_settings); | 655 StateMachine state(default_scheduler_settings); |
| 624 SET_UP_STATE(state) | 656 SET_UP_STATE(state) |
| 625 | 657 |
| 626 // Start a draw. | 658 // Start a draw. |
| 627 state.SetNeedsRedraw(true); | 659 state.SetNeedsRedraw(true); |
| 628 EXPECT_TRUE(state.BeginFrameNeeded()); | 660 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 629 state.OnBeginImplFrame(); | 661 state.IssueNextBeginImplFrame(); |
| 630 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 662 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 631 state.OnBeginImplFrameDeadline(); | 663 state.OnBeginImplFrameDeadline(); |
| 632 EXPECT_TRUE(state.RedrawPending()); | 664 EXPECT_TRUE(state.RedrawPending()); |
| 633 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); | 665 state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); |
| 634 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 666 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| 635 | 667 |
| 636 // Failing the draw for animation checkerboards makes us require a commit. | 668 // Failing the draw for animation checkerboards makes us require a commit. |
| 637 EXPECT_ACTION_UPDATE_STATE( | 669 EXPECT_ACTION_UPDATE_STATE( |
| 638 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 670 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 639 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 671 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 640 EXPECT_TRUE(state.RedrawPending()); | 672 EXPECT_TRUE(state.RedrawPending()); |
| 641 | 673 |
| 642 // We should not be trying to draw again now, but we have a commit pending. | 674 // We should not be trying to draw again now, but we have a commit pending. |
| 643 EXPECT_TRUE(state.BeginFrameNeeded()); | 675 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 644 state.OnBeginImplFrame(); | 676 state.IssueNextBeginImplFrame(); |
| 645 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 677 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 646 | 678 |
| 647 // We should try to draw again at the end of the next BeginImplFrame on | 679 // We should try to draw again at the end of the next BeginImplFrame on |
| 648 // the impl thread. | 680 // the impl thread. |
| 649 state.OnBeginImplFrameDeadline(); | 681 state.OnBeginImplFrameDeadline(); |
| 650 state.SetDrawResultForTest(DRAW_SUCCESS); | 682 state.SetDrawResultForTest(DRAW_SUCCESS); |
| 651 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 683 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| 652 state.DidSubmitCompositorFrame(); | 684 state.DidSubmitCompositorFrame(); |
| 653 state.DidReceiveCompositorFrameAck(); | 685 state.DidReceiveCompositorFrameAck(); |
| 654 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 686 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 655 } | 687 } |
| 656 | 688 |
| 657 TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) { | 689 TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) { |
| 658 SchedulerSettings default_scheduler_settings; | 690 SchedulerSettings default_scheduler_settings; |
| 659 StateMachine state(default_scheduler_settings); | 691 StateMachine state(default_scheduler_settings); |
| 660 SET_UP_STATE(state) | 692 SET_UP_STATE(state) |
| 661 state.SetNeedsRedraw(true); | 693 state.SetNeedsRedraw(true); |
| 662 | 694 |
| 663 // Draw the first frame. | 695 // Draw the first frame. |
| 664 EXPECT_TRUE(state.BeginFrameNeeded()); | 696 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 665 state.OnBeginImplFrame(); | 697 state.IssueNextBeginImplFrame(); |
| 666 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 698 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 667 | 699 |
| 668 state.OnBeginImplFrameDeadline(); | 700 state.OnBeginImplFrameDeadline(); |
| 669 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 701 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| 670 state.DidSubmitCompositorFrame(); | 702 state.DidSubmitCompositorFrame(); |
| 671 state.DidReceiveCompositorFrameAck(); | 703 state.DidReceiveCompositorFrameAck(); |
| 672 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 704 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 673 | 705 |
| 674 // Before the next BeginImplFrame, set needs redraw again. | 706 // Before the next BeginImplFrame, set needs redraw again. |
| 675 // This should not redraw until the next BeginImplFrame. | 707 // This should not redraw until the next BeginImplFrame. |
| 676 state.SetNeedsRedraw(true); | 708 state.SetNeedsRedraw(true); |
| 677 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 709 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 678 | 710 |
| 679 // Move to another frame. This should now draw. | 711 // Move to another frame. This should now draw. |
| 680 EXPECT_TRUE(state.BeginFrameNeeded()); | 712 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 681 state.OnBeginImplFrame(); | 713 state.IssueNextBeginImplFrame(); |
| 682 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 714 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 683 state.OnBeginImplFrameDeadline(); | 715 state.OnBeginImplFrameDeadline(); |
| 684 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 716 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| 685 state.DidSubmitCompositorFrame(); | 717 state.DidSubmitCompositorFrame(); |
| 686 state.DidReceiveCompositorFrameAck(); | 718 state.DidReceiveCompositorFrameAck(); |
| 687 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 719 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 688 | 720 |
| 689 // We just submitted, so we should proactively request another BeginImplFrame. | 721 // We just submitted, so we should proactively request another BeginImplFrame. |
| 690 EXPECT_TRUE(state.BeginFrameNeeded()); | 722 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 691 } | 723 } |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 809 StateMachine state(default_scheduler_settings); | 841 StateMachine state(default_scheduler_settings); |
| 810 state.SetVisible(true); | 842 state.SetVisible(true); |
| 811 EXPECT_ACTION_UPDATE_STATE( | 843 EXPECT_ACTION_UPDATE_STATE( |
| 812 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); | 844 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); |
| 813 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 845 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 814 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); | 846 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); |
| 815 state.SetBeginMainFrameState(begin_main_frame_states[i]); | 847 state.SetBeginMainFrameState(begin_main_frame_states[i]); |
| 816 state.SetVisible(false); | 848 state.SetVisible(false); |
| 817 state.SetNeedsRedraw(true); | 849 state.SetNeedsRedraw(true); |
| 818 if (j == 1) | 850 if (j == 1) |
| 819 state.OnBeginImplFrame(); | 851 state.IssueNextBeginImplFrame(); |
| 820 | 852 |
| 821 state.SetCanDraw(false); | 853 state.SetCanDraw(false); |
| 822 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, | 854 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, |
| 823 state.NextAction()); | 855 state.NextAction()); |
| 824 } | 856 } |
| 825 } | 857 } |
| 826 } | 858 } |
| 827 | 859 |
| 828 TEST(SchedulerStateMachineTest, | 860 TEST(SchedulerStateMachineTest, |
| 829 TestCanRedrawWithWaitingForFirstDrawMakesProgress) { | 861 TestCanRedrawWithWaitingForFirstDrawMakesProgress) { |
| 830 SchedulerSettings default_scheduler_settings; | 862 SchedulerSettings default_scheduler_settings; |
| 831 StateMachine state(default_scheduler_settings); | 863 StateMachine state(default_scheduler_settings); |
| 832 state.SetVisible(true); | 864 state.SetVisible(true); |
| 833 EXPECT_ACTION_UPDATE_STATE( | 865 EXPECT_ACTION_UPDATE_STATE( |
| 834 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); | 866 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); |
| 835 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 867 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 836 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); | 868 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); |
| 837 | 869 |
| 838 state.SetActiveTreeNeedsFirstDraw(true); | 870 state.SetActiveTreeNeedsFirstDraw(true); |
| 839 state.SetNeedsBeginMainFrame(); | 871 state.SetNeedsBeginMainFrame(); |
| 840 state.SetNeedsRedraw(true); | 872 state.SetNeedsRedraw(true); |
| 841 state.SetCanDraw(false); | 873 state.SetCanDraw(false); |
| 842 state.OnBeginImplFrame(); | 874 state.IssueNextBeginImplFrame(); |
| 843 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_ABORT); | 875 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_ABORT); |
| 844 EXPECT_ACTION_UPDATE_STATE( | 876 EXPECT_ACTION_UPDATE_STATE( |
| 845 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 877 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 846 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 878 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 847 state.NotifyBeginMainFrameStarted(); | 879 state.NotifyBeginMainFrameStarted(); |
| 848 state.NotifyReadyToCommit(); | 880 state.NotifyReadyToCommit(); |
| 849 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 881 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 850 state.NotifyReadyToActivate(); | 882 state.NotifyReadyToActivate(); |
| 851 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); | 883 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); |
| 852 state.OnBeginImplFrameDeadline(); | 884 state.OnBeginImplFrameDeadline(); |
| 853 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_ABORT); | 885 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_ABORT); |
| 854 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 886 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 855 } | 887 } |
| 856 | 888 |
| 857 TEST(SchedulerStateMachineTest, TestSetNeedsBeginMainFrameIsNotLost) { | 889 TEST(SchedulerStateMachineTest, TestSetNeedsBeginMainFrameIsNotLost) { |
| 858 SchedulerSettings scheduler_settings; | 890 SchedulerSettings scheduler_settings; |
| 859 StateMachine state(scheduler_settings); | 891 StateMachine state(scheduler_settings); |
| 860 SET_UP_STATE(state) | 892 SET_UP_STATE(state) |
| 861 state.SetNeedsBeginMainFrame(); | 893 state.SetNeedsBeginMainFrame(); |
| 862 | 894 |
| 863 EXPECT_TRUE(state.BeginFrameNeeded()); | 895 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 864 | 896 |
| 865 // Begin the frame. | 897 // Begin the frame. |
| 866 state.OnBeginImplFrame(); | 898 state.IssueNextBeginImplFrame(); |
| 867 EXPECT_ACTION_UPDATE_STATE( | 899 EXPECT_ACTION_UPDATE_STATE( |
| 868 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 900 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 869 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); | 901 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); |
| 870 | 902 |
| 871 // Now, while the frame is in progress, set another commit. | 903 // Now, while the frame is in progress, set another commit. |
| 872 state.SetNeedsBeginMainFrame(); | 904 state.SetNeedsBeginMainFrame(); |
| 873 EXPECT_TRUE(state.NeedsCommit()); | 905 EXPECT_TRUE(state.NeedsCommit()); |
| 874 | 906 |
| 875 // Let the frame finish. | 907 // Let the frame finish. |
| 876 state.NotifyBeginMainFrameStarted(); | 908 state.NotifyBeginMainFrameStarted(); |
| 877 state.NotifyReadyToCommit(); | 909 state.NotifyReadyToCommit(); |
| 878 EXPECT_MAIN_FRAME_STATE( | 910 EXPECT_MAIN_FRAME_STATE( |
| 879 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_READY_TO_COMMIT); | 911 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_READY_TO_COMMIT); |
| 880 | 912 |
| 881 // Expect to commit regardless of BeginImplFrame state. | 913 // Expect to commit regardless of BeginImplFrame state. |
| 882 EXPECT_IMPL_FRAME_STATE( | 914 EXPECT_IMPL_FRAME_STATE( |
| 883 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME); | 915 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME); |
| 884 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); | 916 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); |
| 885 | 917 |
| 886 state.OnBeginImplFrameDeadline(); | 918 state.OnBeginImplFrameDeadline(); |
| 887 EXPECT_IMPL_FRAME_STATE( | 919 EXPECT_IMPL_FRAME_STATE( |
| 888 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); | 920 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); |
| 889 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); | 921 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); |
| 890 | 922 |
| 891 state.OnBeginImplFrameIdle(); | 923 state.OnBeginImplFrameIdle(); |
| 892 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); | 924 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); |
| 893 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); | 925 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); |
| 894 | 926 |
| 895 state.OnBeginImplFrame(); | 927 state.IssueNextBeginImplFrame(); |
| 896 EXPECT_IMPL_FRAME_STATE( | 928 EXPECT_IMPL_FRAME_STATE( |
| 897 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME); | 929 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME); |
| 898 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); | 930 EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT); |
| 899 | 931 |
| 900 // Finish the commit and activate, then make sure we start the next commit | 932 // Finish the commit and activate, then make sure we start the next commit |
| 901 // immediately and draw on the next BeginImplFrame. | 933 // immediately and draw on the next BeginImplFrame. |
| 902 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 934 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 903 state.NotifyReadyToActivate(); | 935 state.NotifyReadyToActivate(); |
| 904 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); | 936 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); |
| 905 EXPECT_ACTION_UPDATE_STATE( | 937 EXPECT_ACTION_UPDATE_STATE( |
| (...skipping 11 matching lines...) Expand all Loading... |
| 917 | 949 |
| 918 TEST(SchedulerStateMachineTest, TestFullCycle) { | 950 TEST(SchedulerStateMachineTest, TestFullCycle) { |
| 919 SchedulerSettings default_scheduler_settings; | 951 SchedulerSettings default_scheduler_settings; |
| 920 StateMachine state(default_scheduler_settings); | 952 StateMachine state(default_scheduler_settings); |
| 921 SET_UP_STATE(state) | 953 SET_UP_STATE(state) |
| 922 | 954 |
| 923 // Start clean and set commit. | 955 // Start clean and set commit. |
| 924 state.SetNeedsBeginMainFrame(); | 956 state.SetNeedsBeginMainFrame(); |
| 925 | 957 |
| 926 // Begin the frame. | 958 // Begin the frame. |
| 927 state.OnBeginImplFrame(); | 959 state.IssueNextBeginImplFrame(); |
| 928 EXPECT_ACTION_UPDATE_STATE( | 960 EXPECT_ACTION_UPDATE_STATE( |
| 929 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 961 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 930 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); | 962 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); |
| 931 EXPECT_FALSE(state.NeedsCommit()); | 963 EXPECT_FALSE(state.NeedsCommit()); |
| 932 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 964 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 933 | 965 |
| 934 // Tell the scheduler the frame finished. | 966 // Tell the scheduler the frame finished. |
| 935 state.NotifyBeginMainFrameStarted(); | 967 state.NotifyBeginMainFrameStarted(); |
| 936 state.NotifyReadyToCommit(); | 968 state.NotifyReadyToCommit(); |
| 937 EXPECT_MAIN_FRAME_STATE( | 969 EXPECT_MAIN_FRAME_STATE( |
| (...skipping 25 matching lines...) Expand all Loading... |
| 963 | 995 |
| 964 TEST(SchedulerStateMachineTest, CommitWithoutDrawWithPendingTree) { | 996 TEST(SchedulerStateMachineTest, CommitWithoutDrawWithPendingTree) { |
| 965 SchedulerSettings default_scheduler_settings; | 997 SchedulerSettings default_scheduler_settings; |
| 966 StateMachine state(default_scheduler_settings); | 998 StateMachine state(default_scheduler_settings); |
| 967 SET_UP_STATE(state) | 999 SET_UP_STATE(state) |
| 968 | 1000 |
| 969 // Start clean and set commit. | 1001 // Start clean and set commit. |
| 970 state.SetNeedsBeginMainFrame(); | 1002 state.SetNeedsBeginMainFrame(); |
| 971 | 1003 |
| 972 // Make a main frame, commit and activate it. But don't draw it. | 1004 // Make a main frame, commit and activate it. But don't draw it. |
| 973 state.OnBeginImplFrame(); | 1005 state.IssueNextBeginImplFrame(); |
| 974 EXPECT_ACTION_UPDATE_STATE( | 1006 EXPECT_ACTION_UPDATE_STATE( |
| 975 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1007 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 976 state.NotifyBeginMainFrameStarted(); | 1008 state.NotifyBeginMainFrameStarted(); |
| 977 state.NotifyReadyToCommit(); | 1009 state.NotifyReadyToCommit(); |
| 978 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 1010 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 979 state.NotifyReadyToActivate(); | 1011 state.NotifyReadyToActivate(); |
| 980 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); | 1012 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); |
| 981 | 1013 |
| 982 // Try to make a new main frame before drawing. Since we will commit it to a | 1014 // Try to make a new main frame before drawing. Since we will commit it to a |
| 983 // pending tree and not clobber the active tree, we're able to start a new | 1015 // pending tree and not clobber the active tree, we're able to start a new |
| 984 // begin frame and commit it. | 1016 // begin frame and commit it. |
| 985 state.SetNeedsBeginMainFrame(); | 1017 state.SetNeedsBeginMainFrame(); |
| 986 state.OnBeginImplFrame(); | 1018 state.IssueNextBeginImplFrame(); |
| 987 EXPECT_ACTION_UPDATE_STATE( | 1019 EXPECT_ACTION_UPDATE_STATE( |
| 988 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1020 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 989 state.NotifyBeginMainFrameStarted(); | 1021 state.NotifyBeginMainFrameStarted(); |
| 990 state.NotifyReadyToCommit(); | 1022 state.NotifyReadyToCommit(); |
| 991 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 1023 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 992 } | 1024 } |
| 993 | 1025 |
| 994 TEST(SchedulerStateMachineTest, DontCommitWithoutDrawWithoutPendingTree) { | 1026 TEST(SchedulerStateMachineTest, DontCommitWithoutDrawWithoutPendingTree) { |
| 995 SchedulerSettings scheduler_settings; | 1027 SchedulerSettings scheduler_settings; |
| 996 scheduler_settings.commit_to_active_tree = true; | 1028 scheduler_settings.commit_to_active_tree = true; |
| 997 scheduler_settings.main_frame_before_activation_enabled = false; | 1029 scheduler_settings.main_frame_before_activation_enabled = false; |
| 998 StateMachine state(scheduler_settings); | 1030 StateMachine state(scheduler_settings); |
| 999 SET_UP_STATE(state) | 1031 SET_UP_STATE(state) |
| 1000 | 1032 |
| 1001 // Start clean and set commit. | 1033 // Start clean and set commit. |
| 1002 state.SetNeedsBeginMainFrame(); | 1034 state.SetNeedsBeginMainFrame(); |
| 1003 | 1035 |
| 1004 // Make a main frame, commit and activate it. But don't draw it. | 1036 // Make a main frame, commit and activate it. But don't draw it. |
| 1005 state.OnBeginImplFrame(); | 1037 state.IssueNextBeginImplFrame(); |
| 1006 EXPECT_ACTION_UPDATE_STATE( | 1038 EXPECT_ACTION_UPDATE_STATE( |
| 1007 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1039 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1008 state.NotifyBeginMainFrameStarted(); | 1040 state.NotifyBeginMainFrameStarted(); |
| 1009 state.NotifyReadyToCommit(); | 1041 state.NotifyReadyToCommit(); |
| 1010 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 1042 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 1011 state.NotifyReadyToActivate(); | 1043 state.NotifyReadyToActivate(); |
| 1012 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); | 1044 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); |
| 1013 | 1045 |
| 1014 // Try to make a new main frame before drawing, but since we would clobber the | 1046 // Try to make a new main frame before drawing, but since we would clobber the |
| 1015 // active tree, we will not do so. | 1047 // active tree, we will not do so. |
| 1016 state.SetNeedsBeginMainFrame(); | 1048 state.SetNeedsBeginMainFrame(); |
| 1017 state.OnBeginImplFrame(); | 1049 state.IssueNextBeginImplFrame(); |
| 1018 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1050 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1019 } | 1051 } |
| 1020 | 1052 |
| 1021 TEST(SchedulerStateMachineTest, AbortedMainFrameDoesNotResetPendingTree) { | 1053 TEST(SchedulerStateMachineTest, AbortedMainFrameDoesNotResetPendingTree) { |
| 1022 SchedulerSettings scheduler_settings; | 1054 SchedulerSettings scheduler_settings; |
| 1023 scheduler_settings.main_frame_before_activation_enabled = true; | 1055 scheduler_settings.main_frame_before_activation_enabled = true; |
| 1024 StateMachine state(scheduler_settings); | 1056 StateMachine state(scheduler_settings); |
| 1025 SET_UP_STATE(state); | 1057 SET_UP_STATE(state); |
| 1026 | 1058 |
| 1027 // Perform a commit so that we have an active tree. | 1059 // Perform a commit so that we have an active tree. |
| 1028 state.SetNeedsBeginMainFrame(); | 1060 state.SetNeedsBeginMainFrame(); |
| 1029 state.OnBeginImplFrame(); | 1061 state.IssueNextBeginImplFrame(); |
| 1030 EXPECT_ACTION_UPDATE_STATE( | 1062 EXPECT_ACTION_UPDATE_STATE( |
| 1031 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1063 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1032 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1064 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1033 state.NotifyBeginMainFrameStarted(); | 1065 state.NotifyBeginMainFrameStarted(); |
| 1034 state.NotifyReadyToCommit(); | 1066 state.NotifyReadyToCommit(); |
| 1035 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 1067 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 1036 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1068 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1037 EXPECT_TRUE(state.has_pending_tree()); | 1069 EXPECT_TRUE(state.has_pending_tree()); |
| 1038 state.OnBeginImplFrameDeadline(); | 1070 state.OnBeginImplFrameDeadline(); |
| 1039 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1071 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1040 | 1072 |
| 1041 // Ask for another commit but abort it. Verify that we didn't reset pending | 1073 // Ask for another commit but abort it. Verify that we didn't reset pending |
| 1042 // tree state. | 1074 // tree state. |
| 1043 state.SetNeedsBeginMainFrame(); | 1075 state.SetNeedsBeginMainFrame(); |
| 1044 state.OnBeginImplFrame(); | 1076 state.IssueNextBeginImplFrame(); |
| 1045 EXPECT_ACTION_UPDATE_STATE( | 1077 EXPECT_ACTION_UPDATE_STATE( |
| 1046 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1078 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1047 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1079 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1048 EXPECT_TRUE(state.has_pending_tree()); | 1080 EXPECT_TRUE(state.has_pending_tree()); |
| 1049 state.NotifyBeginMainFrameStarted(); | 1081 state.NotifyBeginMainFrameStarted(); |
| 1050 state.BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES); | 1082 state.BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES); |
| 1051 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1083 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1052 EXPECT_TRUE(state.has_pending_tree()); | 1084 EXPECT_TRUE(state.has_pending_tree()); |
| 1053 state.OnBeginImplFrameDeadline(); | 1085 state.OnBeginImplFrameDeadline(); |
| 1054 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1086 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1055 | 1087 |
| 1056 // Ask for another commit that doesn't abort. | 1088 // Ask for another commit that doesn't abort. |
| 1057 state.SetNeedsBeginMainFrame(); | 1089 state.SetNeedsBeginMainFrame(); |
| 1058 state.OnBeginImplFrame(); | 1090 state.IssueNextBeginImplFrame(); |
| 1059 EXPECT_ACTION_UPDATE_STATE( | 1091 EXPECT_ACTION_UPDATE_STATE( |
| 1060 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1092 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1061 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1093 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1062 state.NotifyBeginMainFrameStarted(); | 1094 state.NotifyBeginMainFrameStarted(); |
| 1063 state.NotifyReadyToCommit(); | 1095 state.NotifyReadyToCommit(); |
| 1064 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1096 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1065 EXPECT_TRUE(state.has_pending_tree()); | 1097 EXPECT_TRUE(state.has_pending_tree()); |
| 1066 | 1098 |
| 1067 // Verify that commit is delayed until the pending tree is activated. | 1099 // Verify that commit is delayed until the pending tree is activated. |
| 1068 state.NotifyReadyToActivate(); | 1100 state.NotifyReadyToActivate(); |
| 1069 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); | 1101 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); |
| 1070 EXPECT_FALSE(state.has_pending_tree()); | 1102 EXPECT_FALSE(state.has_pending_tree()); |
| 1071 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 1103 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 1072 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1104 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1073 EXPECT_TRUE(state.has_pending_tree()); | 1105 EXPECT_TRUE(state.has_pending_tree()); |
| 1074 } | 1106 } |
| 1075 | 1107 |
| 1076 TEST(SchedulerStateMachineTest, TestFullCycleWithCommitToActive) { | 1108 TEST(SchedulerStateMachineTest, TestFullCycleWithCommitToActive) { |
| 1077 SchedulerSettings scheduler_settings; | 1109 SchedulerSettings scheduler_settings; |
| 1078 scheduler_settings.commit_to_active_tree = true; | 1110 scheduler_settings.commit_to_active_tree = true; |
| 1079 scheduler_settings.main_frame_before_activation_enabled = false; | 1111 scheduler_settings.main_frame_before_activation_enabled = false; |
| 1080 StateMachine state(scheduler_settings); | 1112 StateMachine state(scheduler_settings); |
| 1081 SET_UP_STATE(state) | 1113 SET_UP_STATE(state) |
| 1082 | 1114 |
| 1083 // Start clean and set commit. | 1115 // Start clean and set commit. |
| 1084 state.SetNeedsBeginMainFrame(); | 1116 state.SetNeedsBeginMainFrame(); |
| 1085 | 1117 |
| 1086 // Begin the frame. | 1118 // Begin the frame. |
| 1087 state.OnBeginImplFrame(); | 1119 state.OnBeginImplFrame(0, 10); |
| 1088 EXPECT_ACTION_UPDATE_STATE( | 1120 EXPECT_ACTION_UPDATE_STATE( |
| 1089 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1121 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1090 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); | 1122 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); |
| 1091 EXPECT_FALSE(state.NeedsCommit()); | 1123 EXPECT_FALSE(state.NeedsCommit()); |
| 1092 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1124 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1125 EXPECT_SEQUENCE_NUMBERS(10u, 10u, BeginFrameArgs::kInvalidFrameNumber, |
| 1126 BeginFrameArgs::kInvalidFrameNumber, |
| 1127 BeginFrameArgs::kInvalidFrameNumber); |
| 1093 | 1128 |
| 1094 // Tell the scheduler the frame finished. | 1129 // Tell the scheduler the frame finished. |
| 1095 state.NotifyBeginMainFrameStarted(); | 1130 state.NotifyBeginMainFrameStarted(); |
| 1096 state.NotifyReadyToCommit(); | 1131 state.NotifyReadyToCommit(); |
| 1097 EXPECT_MAIN_FRAME_STATE( | 1132 EXPECT_MAIN_FRAME_STATE( |
| 1098 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_READY_TO_COMMIT); | 1133 SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_READY_TO_COMMIT); |
| 1099 // Commit. | 1134 // Commit. |
| 1100 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 1135 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 1136 EXPECT_SEQUENCE_NUMBERS(10u, 10u, 10u, BeginFrameArgs::kInvalidFrameNumber, |
| 1137 BeginFrameArgs::kInvalidFrameNumber); |
| 1101 // Commit always calls NotifyReadyToActivate in this mode. | 1138 // Commit always calls NotifyReadyToActivate in this mode. |
| 1102 state.NotifyReadyToActivate(); | 1139 state.NotifyReadyToActivate(); |
| 1103 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); | 1140 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); |
| 1104 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1141 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1142 EXPECT_SEQUENCE_NUMBERS(10u, 10u, 10u, 10u, |
| 1143 BeginFrameArgs::kInvalidFrameNumber); |
| 1105 | 1144 |
| 1106 // No draw because we haven't received NotifyReadyToDraw yet. | 1145 // No draw because we haven't received NotifyReadyToDraw yet. |
| 1107 state.OnBeginImplFrameDeadline(); | 1146 state.OnBeginImplFrameDeadline(); |
| 1108 EXPECT_TRUE(state.active_tree_needs_first_draw()); | 1147 EXPECT_TRUE(state.active_tree_needs_first_draw()); |
| 1109 EXPECT_TRUE(state.needs_redraw()); | 1148 EXPECT_TRUE(state.needs_redraw()); |
| 1110 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1149 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1150 EXPECT_SEQUENCE_NUMBERS(10u, 10u, 10u, 10u, |
| 1151 BeginFrameArgs::kInvalidFrameNumber); |
| 1111 | 1152 |
| 1112 // Can't BeginMainFrame yet since last commit hasn't been drawn yet. | 1153 // Can't BeginMainFrame yet since last commit hasn't been drawn yet. |
| 1113 state.SetNeedsBeginMainFrame(); | 1154 state.SetNeedsBeginMainFrame(); |
| 1114 state.OnBeginImplFrame(); | 1155 state.OnBeginImplFrame(0, 11); |
| 1115 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1156 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1157 EXPECT_SEQUENCE_NUMBERS(11u, 10u, 10u, 10u, |
| 1158 BeginFrameArgs::kInvalidFrameNumber); |
| 1116 | 1159 |
| 1117 // Now call ready to draw which will allow the draw to happen and | 1160 // Now call ready to draw which will allow the draw to happen and |
| 1118 // BeginMainFrame to be sent. | 1161 // BeginMainFrame to be sent. |
| 1119 state.NotifyReadyToDraw(); | 1162 state.NotifyReadyToDraw(); |
| 1120 state.OnBeginImplFrameDeadline(); | 1163 state.OnBeginImplFrameDeadline(); |
| 1121 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 1164 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| 1165 EXPECT_SEQUENCE_NUMBERS(11u, 10u, 10u, 10u, 10u); |
| 1122 // Submit throttled from this point. | 1166 // Submit throttled from this point. |
| 1123 state.DidSubmitCompositorFrame(); | 1167 state.DidSubmitCompositorFrame(); |
| 1124 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1168 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1125 | 1169 |
| 1126 // Can't BeginMainFrame yet since we're submit-frame throttled. | 1170 // Can't BeginMainFrame yet since we're submit-frame throttled. |
| 1127 state.OnBeginImplFrame(); | 1171 state.OnBeginImplFrame(0, 12); |
| 1128 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1172 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1173 EXPECT_SEQUENCE_NUMBERS(12u, 10u, 10u, 10u, 10u); |
| 1129 | 1174 |
| 1130 // CompositorFrameAck unblocks BeginMainFrame. | 1175 // CompositorFrameAck unblocks BeginMainFrame. |
| 1131 state.DidReceiveCompositorFrameAck(); | 1176 state.DidReceiveCompositorFrameAck(); |
| 1132 EXPECT_ACTION_UPDATE_STATE( | 1177 EXPECT_ACTION_UPDATE_STATE( |
| 1133 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1178 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1179 EXPECT_SEQUENCE_NUMBERS(12u, 12u, 10u, 10u, 10u); |
| 1134 state.NotifyBeginMainFrameStarted(); | 1180 state.NotifyBeginMainFrameStarted(); |
| 1135 state.NotifyReadyToCommit(); | 1181 state.NotifyReadyToCommit(); |
| 1136 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 1182 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 1183 EXPECT_SEQUENCE_NUMBERS(12u, 12u, 12u, 10u, 10u); |
| 1137 state.NotifyReadyToActivate(); | 1184 state.NotifyReadyToActivate(); |
| 1138 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); | 1185 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); |
| 1139 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1186 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1187 EXPECT_SEQUENCE_NUMBERS(12u, 12u, 12u, 12u, 10u); |
| 1140 | 1188 |
| 1141 // Draw the newly activated tree. | 1189 // Draw the newly activated tree. |
| 1142 state.NotifyReadyToDraw(); | 1190 state.NotifyReadyToDraw(); |
| 1143 state.OnBeginImplFrameDeadline(); | 1191 state.OnBeginImplFrameDeadline(); |
| 1144 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 1192 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| 1145 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1193 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1194 EXPECT_SEQUENCE_NUMBERS(12u, 12u, 12u, 12u, 12u); |
| 1146 } | 1195 } |
| 1147 | 1196 |
| 1148 TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) { | 1197 TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) { |
| 1149 SchedulerSettings default_scheduler_settings; | 1198 SchedulerSettings default_scheduler_settings; |
| 1150 StateMachine state(default_scheduler_settings); | 1199 StateMachine state(default_scheduler_settings); |
| 1151 SET_UP_STATE(state) | 1200 SET_UP_STATE(state) |
| 1152 | 1201 |
| 1153 // Start clean and set commit. | 1202 // Start clean and set commit. |
| 1154 state.SetNeedsBeginMainFrame(); | 1203 state.SetNeedsBeginMainFrame(); |
| 1155 | 1204 |
| 1156 // Begin the frame. | 1205 // Begin the frame. |
| 1157 state.OnBeginImplFrame(); | 1206 state.IssueNextBeginImplFrame(); |
| 1158 EXPECT_ACTION_UPDATE_STATE( | 1207 EXPECT_ACTION_UPDATE_STATE( |
| 1159 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1208 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1160 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); | 1209 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); |
| 1161 EXPECT_FALSE(state.NeedsCommit()); | 1210 EXPECT_FALSE(state.NeedsCommit()); |
| 1162 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1211 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1163 | 1212 |
| 1164 // Request another commit while the commit is in flight. | 1213 // Request another commit while the commit is in flight. |
| 1165 state.SetNeedsBeginMainFrame(); | 1214 state.SetNeedsBeginMainFrame(); |
| 1166 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1215 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1167 | 1216 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1186 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 1235 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| 1187 state.DidSubmitCompositorFrame(); | 1236 state.DidSubmitCompositorFrame(); |
| 1188 state.DidReceiveCompositorFrameAck(); | 1237 state.DidReceiveCompositorFrameAck(); |
| 1189 | 1238 |
| 1190 // Should be synchronized, no draw needed, no action needed. | 1239 // Should be synchronized, no draw needed, no action needed. |
| 1191 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1240 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1192 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); | 1241 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); |
| 1193 EXPECT_FALSE(state.needs_redraw()); | 1242 EXPECT_FALSE(state.needs_redraw()); |
| 1194 | 1243 |
| 1195 // Next BeginImplFrame should initiate second commit. | 1244 // Next BeginImplFrame should initiate second commit. |
| 1196 state.OnBeginImplFrame(); | 1245 state.IssueNextBeginImplFrame(); |
| 1197 EXPECT_ACTION_UPDATE_STATE( | 1246 EXPECT_ACTION_UPDATE_STATE( |
| 1198 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1247 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1199 } | 1248 } |
| 1200 | 1249 |
| 1201 TEST(SchedulerStateMachineTest, TestNoRequestCommitWhenInvisible) { | 1250 TEST(SchedulerStateMachineTest, TestNoRequestCommitWhenInvisible) { |
| 1202 SchedulerSettings default_scheduler_settings; | 1251 SchedulerSettings default_scheduler_settings; |
| 1203 StateMachine state(default_scheduler_settings); | 1252 StateMachine state(default_scheduler_settings); |
| 1204 state.SetVisible(true); | 1253 state.SetVisible(true); |
| 1205 EXPECT_ACTION_UPDATE_STATE( | 1254 EXPECT_ACTION_UPDATE_STATE( |
| 1206 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); | 1255 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1249 // "EarlyOut_CompositorFrameSinkLost" cases. | 1298 // "EarlyOut_CompositorFrameSinkLost" cases. |
| 1250 TEST(SchedulerStateMachineTest, TestAbortBeginMainFrameBecauseInvisible) { | 1299 TEST(SchedulerStateMachineTest, TestAbortBeginMainFrameBecauseInvisible) { |
| 1251 SchedulerSettings default_scheduler_settings; | 1300 SchedulerSettings default_scheduler_settings; |
| 1252 StateMachine state(default_scheduler_settings); | 1301 StateMachine state(default_scheduler_settings); |
| 1253 SET_UP_STATE(state) | 1302 SET_UP_STATE(state) |
| 1254 | 1303 |
| 1255 // Start clean and set commit. | 1304 // Start clean and set commit. |
| 1256 state.SetNeedsBeginMainFrame(); | 1305 state.SetNeedsBeginMainFrame(); |
| 1257 | 1306 |
| 1258 // Begin the frame while visible. | 1307 // Begin the frame while visible. |
| 1259 state.OnBeginImplFrame(); | 1308 state.IssueNextBeginImplFrame(); |
| 1260 EXPECT_ACTION_UPDATE_STATE( | 1309 EXPECT_ACTION_UPDATE_STATE( |
| 1261 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1310 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1262 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); | 1311 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); |
| 1263 EXPECT_FALSE(state.NeedsCommit()); | 1312 EXPECT_FALSE(state.NeedsCommit()); |
| 1264 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1313 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1265 | 1314 |
| 1266 // Become invisible and abort BeginMainFrame. | 1315 // Become invisible and abort BeginMainFrame. |
| 1267 state.SetVisible(false); | 1316 state.SetVisible(false); |
| 1268 state.NotifyBeginMainFrameStarted(); | 1317 state.NotifyBeginMainFrameStarted(); |
| 1269 state.BeginMainFrameAborted(CommitEarlyOutReason::ABORTED_NOT_VISIBLE); | 1318 state.BeginMainFrameAborted(CommitEarlyOutReason::ABORTED_NOT_VISIBLE); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1283 // Become visible again. | 1332 // Become visible again. |
| 1284 state.SetVisible(true); | 1333 state.SetVisible(true); |
| 1285 | 1334 |
| 1286 // Although we have aborted on this frame and haven't cancelled the commit | 1335 // Although we have aborted on this frame and haven't cancelled the commit |
| 1287 // (i.e. need another), don't send another BeginMainFrame yet. | 1336 // (i.e. need another), don't send another BeginMainFrame yet. |
| 1288 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); | 1337 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); |
| 1289 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); | 1338 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
| 1290 EXPECT_TRUE(state.NeedsCommit()); | 1339 EXPECT_TRUE(state.NeedsCommit()); |
| 1291 | 1340 |
| 1292 // Start a new frame. | 1341 // Start a new frame. |
| 1293 state.OnBeginImplFrame(); | 1342 state.IssueNextBeginImplFrame(); |
| 1294 EXPECT_ACTION_UPDATE_STATE( | 1343 EXPECT_ACTION_UPDATE_STATE( |
| 1295 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1344 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1296 | 1345 |
| 1297 // We should be starting the commit now. | 1346 // We should be starting the commit now. |
| 1298 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); | 1347 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); |
| 1299 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1348 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1300 } | 1349 } |
| 1301 | 1350 |
| 1302 // See ProxyMain::BeginMainFrame "EarlyOut_NoUpdates" case. | 1351 // See ProxyMain::BeginMainFrame "EarlyOut_NoUpdates" case. |
| 1303 TEST(SchedulerStateMachineTest, TestAbortBeginMainFrameBecauseCommitNotNeeded) { | 1352 TEST(SchedulerStateMachineTest, TestAbortBeginMainFrameBecauseCommitNotNeeded) { |
| 1304 SchedulerSettings default_scheduler_settings; | 1353 SchedulerSettings default_scheduler_settings; |
| 1305 StateMachine state(default_scheduler_settings); | 1354 StateMachine state(default_scheduler_settings); |
| 1306 state.SetVisible(true); | 1355 state.SetVisible(true); |
| 1307 EXPECT_ACTION_UPDATE_STATE( | 1356 EXPECT_ACTION_UPDATE_STATE( |
| 1308 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); | 1357 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); |
| 1309 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1358 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1310 state.DidCreateAndInitializeCompositorFrameSink(); | 1359 state.DidCreateAndInitializeCompositorFrameSink(); |
| 1311 state.SetCanDraw(true); | 1360 state.SetCanDraw(true); |
| 1312 | 1361 |
| 1313 // Get into a begin frame / commit state. | 1362 // Get into a begin frame / commit state. |
| 1314 state.SetNeedsBeginMainFrame(); | 1363 state.SetNeedsBeginMainFrame(); |
| 1315 state.OnBeginImplFrame(); | 1364 state.IssueNextBeginImplFrame(); |
| 1316 EXPECT_ACTION_UPDATE_STATE( | 1365 EXPECT_ACTION_UPDATE_STATE( |
| 1317 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1366 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1318 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); | 1367 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); |
| 1319 EXPECT_FALSE(state.NeedsCommit()); | 1368 EXPECT_FALSE(state.NeedsCommit()); |
| 1320 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); | 1369 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
| 1321 | 1370 |
| 1322 // Abort the commit, true means that the BeginMainFrame was sent but there | 1371 // Abort the commit, true means that the BeginMainFrame was sent but there |
| 1323 // was no work to do on the main thread. | 1372 // was no work to do on the main thread. |
| 1324 state.NotifyBeginMainFrameStarted(); | 1373 state.NotifyBeginMainFrameStarted(); |
| 1325 state.BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES); | 1374 state.BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES); |
| 1326 | 1375 |
| 1327 // NeedsCommit should now be false because the commit was actually handled. | 1376 // NeedsCommit should now be false because the commit was actually handled. |
| 1328 EXPECT_FALSE(state.NeedsCommit()); | 1377 EXPECT_FALSE(state.NeedsCommit()); |
| 1329 | 1378 |
| 1330 // Since the commit was aborted, we don't need to try and draw. | 1379 // Since the commit was aborted, we don't need to try and draw. |
| 1331 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1380 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1332 state.OnBeginImplFrameDeadline(); | 1381 state.OnBeginImplFrameDeadline(); |
| 1333 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1382 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1334 | 1383 |
| 1335 // Verify another commit doesn't start on another frame either. | 1384 // Verify another commit doesn't start on another frame either. |
| 1336 EXPECT_FALSE(state.NeedsCommit()); | 1385 EXPECT_FALSE(state.NeedsCommit()); |
| 1337 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); | 1386 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); |
| 1338 | 1387 |
| 1339 state.OnBeginImplFrame(); | 1388 state.IssueNextBeginImplFrame(); |
| 1340 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1389 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1341 state.OnBeginImplFrameDeadline(); | 1390 state.OnBeginImplFrameDeadline(); |
| 1342 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1391 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1343 | 1392 |
| 1344 // Verify another commit can start if requested, though. | 1393 // Verify another commit can start if requested, though. |
| 1345 state.SetNeedsBeginMainFrame(); | 1394 state.SetNeedsBeginMainFrame(); |
| 1346 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); | 1395 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); |
| 1347 state.OnBeginImplFrame(); | 1396 state.IssueNextBeginImplFrame(); |
| 1348 EXPECT_ACTION(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1397 EXPECT_ACTION(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1349 } | 1398 } |
| 1350 | 1399 |
| 1351 TEST(SchedulerStateMachineTest, TestFirstContextCreation) { | 1400 TEST(SchedulerStateMachineTest, TestFirstContextCreation) { |
| 1352 SchedulerSettings default_scheduler_settings; | 1401 SchedulerSettings default_scheduler_settings; |
| 1353 StateMachine state(default_scheduler_settings); | 1402 StateMachine state(default_scheduler_settings); |
| 1354 state.SetVisible(true); | 1403 state.SetVisible(true); |
| 1355 state.SetCanDraw(true); | 1404 state.SetCanDraw(true); |
| 1356 | 1405 |
| 1357 EXPECT_ACTION_UPDATE_STATE( | 1406 EXPECT_ACTION_UPDATE_STATE( |
| 1358 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); | 1407 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); |
| 1359 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); | 1408 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); |
| 1360 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1409 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1361 | 1410 |
| 1362 // Check that the first init does not SetNeedsBeginMainFrame. | 1411 // Check that the first init does not SetNeedsBeginMainFrame. |
| 1363 state.OnBeginImplFrame(); | 1412 state.IssueNextBeginImplFrame(); |
| 1364 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1413 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1365 state.OnBeginImplFrameDeadline(); | 1414 state.OnBeginImplFrameDeadline(); |
| 1366 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1415 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1367 | 1416 |
| 1368 // Check that a needs commit initiates a BeginMainFrame. | 1417 // Check that a needs commit initiates a BeginMainFrame. |
| 1369 state.SetNeedsBeginMainFrame(); | 1418 state.SetNeedsBeginMainFrame(); |
| 1370 state.OnBeginImplFrame(); | 1419 state.IssueNextBeginImplFrame(); |
| 1371 EXPECT_ACTION_UPDATE_STATE( | 1420 EXPECT_ACTION_UPDATE_STATE( |
| 1372 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1421 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1373 } | 1422 } |
| 1374 | 1423 |
| 1375 TEST(SchedulerStateMachineTest, TestContextLostWhenCompletelyIdle) { | 1424 TEST(SchedulerStateMachineTest, TestContextLostWhenCompletelyIdle) { |
| 1376 SchedulerSettings default_scheduler_settings; | 1425 SchedulerSettings default_scheduler_settings; |
| 1377 StateMachine state(default_scheduler_settings); | 1426 StateMachine state(default_scheduler_settings); |
| 1378 SET_UP_STATE(state) | 1427 SET_UP_STATE(state) |
| 1379 | 1428 |
| 1380 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION, | 1429 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION, |
| 1381 state.NextAction()); | 1430 state.NextAction()); |
| 1382 state.DidLoseCompositorFrameSink(); | 1431 state.DidLoseCompositorFrameSink(); |
| 1383 | 1432 |
| 1384 EXPECT_ACTION_UPDATE_STATE( | 1433 EXPECT_ACTION_UPDATE_STATE( |
| 1385 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); | 1434 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); |
| 1386 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1435 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1387 | 1436 |
| 1388 // Once context recreation begins, nothing should happen. | 1437 // Once context recreation begins, nothing should happen. |
| 1389 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1438 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1390 | 1439 |
| 1391 // Recreate the context. | 1440 // Recreate the context. |
| 1392 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); | 1441 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); |
| 1393 | 1442 |
| 1394 // When the context is recreated, we should begin a commit. | 1443 // When the context is recreated, we should begin a commit. |
| 1395 state.OnBeginImplFrame(); | 1444 state.IssueNextBeginImplFrame(); |
| 1396 EXPECT_ACTION_UPDATE_STATE( | 1445 EXPECT_ACTION_UPDATE_STATE( |
| 1397 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1446 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1398 } | 1447 } |
| 1399 | 1448 |
| 1400 TEST(SchedulerStateMachineTest, | 1449 TEST(SchedulerStateMachineTest, |
| 1401 TestContextLostWhenIdleAndCommitRequestedWhileRecreating) { | 1450 TestContextLostWhenIdleAndCommitRequestedWhileRecreating) { |
| 1402 SchedulerSettings default_scheduler_settings; | 1451 SchedulerSettings default_scheduler_settings; |
| 1403 StateMachine state(default_scheduler_settings); | 1452 StateMachine state(default_scheduler_settings); |
| 1404 SET_UP_STATE(state) | 1453 SET_UP_STATE(state) |
| 1405 | 1454 |
| 1406 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION, | 1455 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION, |
| 1407 state.NextAction()); | 1456 state.NextAction()); |
| 1408 state.DidLoseCompositorFrameSink(); | 1457 state.DidLoseCompositorFrameSink(); |
| 1409 EXPECT_EQ(state.compositor_frame_sink_state(), | 1458 EXPECT_EQ(state.compositor_frame_sink_state(), |
| 1410 SchedulerStateMachine::COMPOSITOR_FRAME_SINK_NONE); | 1459 SchedulerStateMachine::COMPOSITOR_FRAME_SINK_NONE); |
| 1411 | 1460 |
| 1412 EXPECT_ACTION_UPDATE_STATE( | 1461 EXPECT_ACTION_UPDATE_STATE( |
| 1413 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); | 1462 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); |
| 1414 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1463 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1415 | 1464 |
| 1416 // Once context recreation begins, nothing should happen. | 1465 // Once context recreation begins, nothing should happen. |
| 1417 state.OnBeginImplFrame(); | 1466 state.IssueNextBeginImplFrame(); |
| 1418 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1467 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1419 state.OnBeginImplFrameDeadline(); | 1468 state.OnBeginImplFrameDeadline(); |
| 1420 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1469 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1421 | 1470 |
| 1422 // While context is recreating, commits shouldn't begin. | 1471 // While context is recreating, commits shouldn't begin. |
| 1423 state.SetNeedsBeginMainFrame(); | 1472 state.SetNeedsBeginMainFrame(); |
| 1424 state.OnBeginImplFrame(); | 1473 state.IssueNextBeginImplFrame(); |
| 1425 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1474 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1426 state.OnBeginImplFrameDeadline(); | 1475 state.OnBeginImplFrameDeadline(); |
| 1427 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1476 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1428 | 1477 |
| 1429 // Recreate the context | 1478 // Recreate the context |
| 1430 state.DidCreateAndInitializeCompositorFrameSink(); | 1479 state.DidCreateAndInitializeCompositorFrameSink(); |
| 1431 EXPECT_EQ( | 1480 EXPECT_EQ( |
| 1432 state.compositor_frame_sink_state(), | 1481 state.compositor_frame_sink_state(), |
| 1433 SchedulerStateMachine::COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_COMMIT); | 1482 SchedulerStateMachine::COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_COMMIT); |
| 1434 EXPECT_FALSE(state.RedrawPending()); | 1483 EXPECT_FALSE(state.RedrawPending()); |
| 1435 | 1484 |
| 1436 // When the context is recreated, we wait until the next BeginImplFrame | 1485 // When the context is recreated, we wait until the next BeginImplFrame |
| 1437 // before starting. | 1486 // before starting. |
| 1438 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1487 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1439 | 1488 |
| 1440 // When the BeginFrame comes in we should begin a commit | 1489 // When the BeginFrame comes in we should begin a commit |
| 1441 state.OnBeginImplFrame(); | 1490 state.IssueNextBeginImplFrame(); |
| 1442 EXPECT_ACTION_UPDATE_STATE( | 1491 EXPECT_ACTION_UPDATE_STATE( |
| 1443 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1492 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1444 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1493 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1445 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); | 1494 EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT); |
| 1446 | 1495 |
| 1447 // Until that commit finishes, we shouldn't be drawing. | 1496 // Until that commit finishes, we shouldn't be drawing. |
| 1448 state.OnBeginImplFrameDeadline(); | 1497 state.OnBeginImplFrameDeadline(); |
| 1449 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1498 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1450 | 1499 |
| 1451 // Finish the commit, which should make the surface active. | 1500 // Finish the commit, which should make the surface active. |
| 1452 state.NotifyBeginMainFrameStarted(); | 1501 state.NotifyBeginMainFrameStarted(); |
| 1453 state.NotifyReadyToCommit(); | 1502 state.NotifyReadyToCommit(); |
| 1454 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 1503 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 1455 EXPECT_EQ(state.compositor_frame_sink_state(), | 1504 EXPECT_EQ(state.compositor_frame_sink_state(), |
| 1456 SchedulerStateMachine:: | 1505 SchedulerStateMachine:: |
| 1457 COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_ACTIVATION); | 1506 COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_ACTIVATION); |
| 1458 state.NotifyReadyToActivate(); | 1507 state.NotifyReadyToActivate(); |
| 1459 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); | 1508 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); |
| 1460 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1509 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1461 EXPECT_EQ(state.compositor_frame_sink_state(), | 1510 EXPECT_EQ(state.compositor_frame_sink_state(), |
| 1462 SchedulerStateMachine::COMPOSITOR_FRAME_SINK_ACTIVE); | 1511 SchedulerStateMachine::COMPOSITOR_FRAME_SINK_ACTIVE); |
| 1463 | 1512 |
| 1464 // Finishing the first commit after initializing an CompositorFrameSink should | 1513 // Finishing the first commit after initializing an CompositorFrameSink should |
| 1465 // automatically cause a redraw. | 1514 // automatically cause a redraw. |
| 1466 EXPECT_TRUE(state.RedrawPending()); | 1515 EXPECT_TRUE(state.RedrawPending()); |
| 1467 state.OnBeginImplFrame(); | 1516 state.IssueNextBeginImplFrame(); |
| 1468 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1517 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1469 state.OnBeginImplFrameDeadline(); | 1518 state.OnBeginImplFrameDeadline(); |
| 1470 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 1519 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| 1471 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1520 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1472 EXPECT_FALSE(state.RedrawPending()); | 1521 EXPECT_FALSE(state.RedrawPending()); |
| 1473 | 1522 |
| 1474 // Next frame as no work to do. | 1523 // Next frame as no work to do. |
| 1475 state.OnBeginImplFrame(); | 1524 state.IssueNextBeginImplFrame(); |
| 1476 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1525 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1477 state.OnBeginImplFrameDeadline(); | 1526 state.OnBeginImplFrameDeadline(); |
| 1478 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1527 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1479 | 1528 |
| 1480 // Once the context is recreated, whether we draw should be based on | 1529 // Once the context is recreated, whether we draw should be based on |
| 1481 // SetCanDraw if waiting on first draw after activate. | 1530 // SetCanDraw if waiting on first draw after activate. |
| 1482 state.SetNeedsRedraw(true); | 1531 state.SetNeedsRedraw(true); |
| 1483 state.OnBeginImplFrame(); | 1532 state.IssueNextBeginImplFrame(); |
| 1484 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1533 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1485 state.OnBeginImplFrameDeadline(); | 1534 state.OnBeginImplFrameDeadline(); |
| 1486 EXPECT_ACTION(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 1535 EXPECT_ACTION(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| 1487 state.SetCanDraw(false); | 1536 state.SetCanDraw(false); |
| 1488 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); | 1537 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
| 1489 state.SetCanDraw(true); | 1538 state.SetCanDraw(true); |
| 1490 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 1539 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| 1491 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1540 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1492 | 1541 |
| 1493 // Once the context is recreated, whether we draw should be based on | 1542 // Once the context is recreated, whether we draw should be based on |
| 1494 // SetCanDraw if waiting on first draw after activate. | 1543 // SetCanDraw if waiting on first draw after activate. |
| 1495 state.SetNeedsRedraw(true); | 1544 state.SetNeedsRedraw(true); |
| 1496 state.SetNeedsBeginMainFrame(); | 1545 state.SetNeedsBeginMainFrame(); |
| 1497 state.OnBeginImplFrame(); | 1546 state.IssueNextBeginImplFrame(); |
| 1498 EXPECT_ACTION_UPDATE_STATE( | 1547 EXPECT_ACTION_UPDATE_STATE( |
| 1499 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1548 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1500 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1549 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1501 // Activate so we need the first draw | 1550 // Activate so we need the first draw |
| 1502 state.NotifyBeginMainFrameStarted(); | 1551 state.NotifyBeginMainFrameStarted(); |
| 1503 state.NotifyReadyToCommit(); | 1552 state.NotifyReadyToCommit(); |
| 1504 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 1553 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 1505 state.NotifyReadyToActivate(); | 1554 state.NotifyReadyToActivate(); |
| 1506 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); | 1555 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); |
| 1507 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1556 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1519 TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) { | 1568 TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) { |
| 1520 SchedulerSettings scheduler_settings; | 1569 SchedulerSettings scheduler_settings; |
| 1521 StateMachine state(scheduler_settings); | 1570 StateMachine state(scheduler_settings); |
| 1522 SET_UP_STATE(state) | 1571 SET_UP_STATE(state) |
| 1523 | 1572 |
| 1524 // Get a commit in flight. | 1573 // Get a commit in flight. |
| 1525 state.SetNeedsBeginMainFrame(); | 1574 state.SetNeedsBeginMainFrame(); |
| 1526 | 1575 |
| 1527 // Set damage and expect a draw. | 1576 // Set damage and expect a draw. |
| 1528 state.SetNeedsRedraw(true); | 1577 state.SetNeedsRedraw(true); |
| 1529 state.OnBeginImplFrame(); | 1578 state.OnBeginImplFrame(0, 10); |
| 1530 EXPECT_ACTION_UPDATE_STATE( | 1579 EXPECT_ACTION_UPDATE_STATE( |
| 1531 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1580 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1532 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1581 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1533 state.OnBeginImplFrameDeadline(); | 1582 state.OnBeginImplFrameDeadline(); |
| 1534 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 1583 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| 1535 state.DidSubmitCompositorFrame(); | 1584 state.DidSubmitCompositorFrame(); |
| 1536 state.DidReceiveCompositorFrameAck(); | 1585 state.DidReceiveCompositorFrameAck(); |
| 1537 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1586 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1587 EXPECT_SEQUENCE_NUMBERS(10u, 10u, BeginFrameArgs::kInvalidFrameNumber, |
| 1588 BeginFrameArgs::kInvalidFrameNumber, |
| 1589 BeginFrameArgs::kInvalidFrameNumber); |
| 1538 | 1590 |
| 1539 // Cause a lost context while the BeginMainFrame is in flight. | 1591 // Cause a lost context while the BeginMainFrame is in flight. |
| 1540 state.DidLoseCompositorFrameSink(); | 1592 state.DidLoseCompositorFrameSink(); |
| 1593 EXPECT_FALSE(state.BeginFrameNeeded()); |
| 1541 | 1594 |
| 1542 // Ask for another draw. Expect nothing happens. | 1595 // Ask for another draw. Expect nothing happens. |
| 1543 state.SetNeedsRedraw(true); | 1596 state.SetNeedsRedraw(true); |
| 1544 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); | 1597 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
| 1545 | 1598 |
| 1546 // Finish the frame, commit and activate. | 1599 // Finish the frame, commit and activate. |
| 1547 state.NotifyBeginMainFrameStarted(); | 1600 state.NotifyBeginMainFrameStarted(); |
| 1548 state.NotifyReadyToCommit(); | 1601 state.NotifyReadyToCommit(); |
| 1549 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 1602 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 1603 EXPECT_SEQUENCE_NUMBERS(10u, 10u, 10u, BeginFrameArgs::kInvalidFrameNumber, |
| 1604 BeginFrameArgs::kInvalidFrameNumber); |
| 1550 state.NotifyReadyToActivate(); | 1605 state.NotifyReadyToActivate(); |
| 1551 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); | 1606 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); |
| 1607 EXPECT_SEQUENCE_NUMBERS(10u, 10u, 10u, 10u, |
| 1608 BeginFrameArgs::kInvalidFrameNumber); |
| 1552 | 1609 |
| 1553 // We will abort the draw when the CompositorFrameSink is lost if we are | 1610 // We will abort the draw when the CompositorFrameSink is lost if we are |
| 1554 // waiting for the first draw to unblock the main thread. | 1611 // waiting for the first draw to unblock the main thread. |
| 1555 EXPECT_TRUE(state.active_tree_needs_first_draw()); | 1612 EXPECT_TRUE(state.active_tree_needs_first_draw()); |
| 1556 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_ABORT); | 1613 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_ABORT); |
| 1614 EXPECT_SEQUENCE_NUMBERS(10u, 10u, 10u, 10u, |
| 1615 BeginFrameArgs::kInvalidFrameNumber); |
| 1557 | 1616 |
| 1558 // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE | 1617 // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE |
| 1559 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); | 1618 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); |
| 1560 EXPECT_ACTION( | 1619 EXPECT_ACTION( |
| 1561 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); | 1620 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); |
| 1562 | 1621 |
| 1563 state.OnBeginImplFrame(); | 1622 state.OnBeginImplFrame(0, 11); |
| 1564 EXPECT_IMPL_FRAME_STATE( | 1623 EXPECT_IMPL_FRAME_STATE( |
| 1565 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME); | 1624 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME); |
| 1566 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); | 1625 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
| 1626 EXPECT_SEQUENCE_NUMBERS(11u, 10u, 10u, 10u, |
| 1627 BeginFrameArgs::kInvalidFrameNumber); |
| 1567 | 1628 |
| 1568 state.OnBeginImplFrameDeadline(); | 1629 state.OnBeginImplFrameDeadline(); |
| 1569 EXPECT_IMPL_FRAME_STATE( | 1630 EXPECT_IMPL_FRAME_STATE( |
| 1570 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); | 1631 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); |
| 1571 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); | 1632 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
| 1633 EXPECT_SEQUENCE_NUMBERS(11u, 10u, 10u, 11u, 11u); |
| 1572 } | 1634 } |
| 1573 | 1635 |
| 1574 TEST(SchedulerStateMachineTest, | 1636 TEST(SchedulerStateMachineTest, |
| 1575 TestContextLostWhileCommitInProgressAndAnotherCommitRequested) { | 1637 TestContextLostWhileCommitInProgressAndAnotherCommitRequested) { |
| 1576 SchedulerSettings scheduler_settings; | 1638 SchedulerSettings scheduler_settings; |
| 1577 StateMachine state(scheduler_settings); | 1639 StateMachine state(scheduler_settings); |
| 1578 SET_UP_STATE(state) | 1640 SET_UP_STATE(state) |
| 1579 | 1641 |
| 1580 // Get a commit in flight. | 1642 // Get a commit in flight. |
| 1581 state.SetNeedsBeginMainFrame(); | 1643 state.SetNeedsBeginMainFrame(); |
| 1582 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1644 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1583 | 1645 |
| 1584 // Set damage and expect a draw. | 1646 // Set damage and expect a draw. |
| 1585 state.SetNeedsRedraw(true); | 1647 state.SetNeedsRedraw(true); |
| 1586 state.OnBeginImplFrame(); | 1648 state.IssueNextBeginImplFrame(); |
| 1587 EXPECT_ACTION_UPDATE_STATE( | 1649 EXPECT_ACTION_UPDATE_STATE( |
| 1588 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1650 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1589 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1651 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1590 state.OnBeginImplFrameDeadline(); | 1652 state.OnBeginImplFrameDeadline(); |
| 1591 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 1653 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| 1592 state.DidSubmitCompositorFrame(); | 1654 state.DidSubmitCompositorFrame(); |
| 1593 state.DidReceiveCompositorFrameAck(); | 1655 state.DidReceiveCompositorFrameAck(); |
| 1594 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1656 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1595 | 1657 |
| 1596 // Cause a lost context while the BeginMainFrame is in flight. | 1658 // Cause a lost context while the BeginMainFrame is in flight. |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1610 EXPECT_TRUE(state.active_tree_needs_first_draw()); | 1672 EXPECT_TRUE(state.active_tree_needs_first_draw()); |
| 1611 | 1673 |
| 1612 // Because the CompositorFrameSink is missing, we expect the draw to abort. | 1674 // Because the CompositorFrameSink is missing, we expect the draw to abort. |
| 1613 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_ABORT); | 1675 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_ABORT); |
| 1614 | 1676 |
| 1615 // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE | 1677 // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE |
| 1616 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); | 1678 EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); |
| 1617 EXPECT_ACTION( | 1679 EXPECT_ACTION( |
| 1618 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); | 1680 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); |
| 1619 | 1681 |
| 1620 state.OnBeginImplFrame(); | 1682 state.IssueNextBeginImplFrame(); |
| 1621 EXPECT_IMPL_FRAME_STATE( | 1683 EXPECT_IMPL_FRAME_STATE( |
| 1622 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME); | 1684 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME); |
| 1623 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); | 1685 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
| 1624 | 1686 |
| 1625 state.OnBeginImplFrameDeadline(); | 1687 state.OnBeginImplFrameDeadline(); |
| 1626 EXPECT_IMPL_FRAME_STATE( | 1688 EXPECT_IMPL_FRAME_STATE( |
| 1627 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); | 1689 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); |
| 1628 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); | 1690 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
| 1629 | 1691 |
| 1630 state.OnBeginImplFrameIdle(); | 1692 state.OnBeginImplFrameIdle(); |
| 1631 EXPECT_ACTION_UPDATE_STATE( | 1693 EXPECT_ACTION_UPDATE_STATE( |
| 1632 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); | 1694 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); |
| 1633 | 1695 |
| 1634 // After we get a new CompositorFrameSink, the commit flow should start. | 1696 // After we get a new CompositorFrameSink, the commit flow should start. |
| 1635 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); | 1697 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); |
| 1636 state.OnBeginImplFrame(); | 1698 state.IssueNextBeginImplFrame(); |
| 1637 EXPECT_ACTION_UPDATE_STATE( | 1699 EXPECT_ACTION_UPDATE_STATE( |
| 1638 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1700 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1639 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1701 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1640 state.NotifyBeginMainFrameStarted(); | 1702 state.NotifyBeginMainFrameStarted(); |
| 1641 state.NotifyReadyToCommit(); | 1703 state.NotifyReadyToCommit(); |
| 1642 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 1704 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 1643 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1705 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1644 state.NotifyReadyToActivate(); | 1706 state.NotifyReadyToActivate(); |
| 1645 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); | 1707 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); |
| 1646 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1708 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1660 state.SetNeedsRedraw(true); | 1722 state.SetNeedsRedraw(true); |
| 1661 | 1723 |
| 1662 // Cause a lost CompositorFrameSink, and restore it. | 1724 // Cause a lost CompositorFrameSink, and restore it. |
| 1663 state.DidLoseCompositorFrameSink(); | 1725 state.DidLoseCompositorFrameSink(); |
| 1664 EXPECT_ACTION_UPDATE_STATE( | 1726 EXPECT_ACTION_UPDATE_STATE( |
| 1665 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); | 1727 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); |
| 1666 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1728 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1667 state.DidCreateAndInitializeCompositorFrameSink(); | 1729 state.DidCreateAndInitializeCompositorFrameSink(); |
| 1668 | 1730 |
| 1669 EXPECT_FALSE(state.RedrawPending()); | 1731 EXPECT_FALSE(state.RedrawPending()); |
| 1670 state.OnBeginImplFrame(); | 1732 state.IssueNextBeginImplFrame(); |
| 1671 EXPECT_ACTION(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1733 EXPECT_ACTION(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1672 } | 1734 } |
| 1673 | 1735 |
| 1674 TEST(SchedulerStateMachineTest, | 1736 TEST(SchedulerStateMachineTest, |
| 1675 TestPendingActivationsShouldBeForcedAfterLostCompositorFrameSink) { | 1737 TestPendingActivationsShouldBeForcedAfterLostCompositorFrameSink) { |
| 1676 SchedulerSettings default_scheduler_settings; | 1738 SchedulerSettings default_scheduler_settings; |
| 1677 StateMachine state(default_scheduler_settings); | 1739 StateMachine state(default_scheduler_settings); |
| 1678 SET_UP_STATE(state) | 1740 SET_UP_STATE(state) |
| 1679 | 1741 |
| 1680 state.SetBeginMainFrameState( | 1742 state.SetBeginMainFrameState( |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1723 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1785 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1724 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); | 1786 state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit(); |
| 1725 state.SetVisible(false); | 1787 state.SetVisible(false); |
| 1726 state.SetNeedsBeginMainFrame(); | 1788 state.SetNeedsBeginMainFrame(); |
| 1727 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); | 1789 EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
| 1728 EXPECT_FALSE(state.BeginFrameNeeded()); | 1790 EXPECT_FALSE(state.BeginFrameNeeded()); |
| 1729 | 1791 |
| 1730 // When become visible again, the needs commit should still be pending. | 1792 // When become visible again, the needs commit should still be pending. |
| 1731 state.SetVisible(true); | 1793 state.SetVisible(true); |
| 1732 EXPECT_TRUE(state.BeginFrameNeeded()); | 1794 EXPECT_TRUE(state.BeginFrameNeeded()); |
| 1733 state.OnBeginImplFrame(); | 1795 state.IssueNextBeginImplFrame(); |
| 1734 EXPECT_ACTION_UPDATE_STATE( | 1796 EXPECT_ACTION_UPDATE_STATE( |
| 1735 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1797 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1736 } | 1798 } |
| 1737 | 1799 |
| 1738 TEST(SchedulerStateMachineTest, TestFinishCommitWhenCommitInProgress) { | 1800 TEST(SchedulerStateMachineTest, TestFinishCommitWhenCommitInProgress) { |
| 1739 SchedulerSettings default_scheduler_settings; | 1801 SchedulerSettings default_scheduler_settings; |
| 1740 StateMachine state(default_scheduler_settings); | 1802 StateMachine state(default_scheduler_settings); |
| 1741 state.SetVisible(true); | 1803 state.SetVisible(true); |
| 1742 EXPECT_ACTION_UPDATE_STATE( | 1804 EXPECT_ACTION_UPDATE_STATE( |
| 1743 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); | 1805 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1887 } | 1949 } |
| 1888 | 1950 |
| 1889 TEST(SchedulerStateMachineTest, | 1951 TEST(SchedulerStateMachineTest, |
| 1890 TestTriggerDeadlineImmediatelyAfterAbortedCommit) { | 1952 TestTriggerDeadlineImmediatelyAfterAbortedCommit) { |
| 1891 SchedulerSettings default_scheduler_settings; | 1953 SchedulerSettings default_scheduler_settings; |
| 1892 StateMachine state(default_scheduler_settings); | 1954 StateMachine state(default_scheduler_settings); |
| 1893 SET_UP_STATE(state) | 1955 SET_UP_STATE(state) |
| 1894 | 1956 |
| 1895 // This test mirrors what happens during the first frame of a scroll gesture. | 1957 // This test mirrors what happens during the first frame of a scroll gesture. |
| 1896 // First we get the input event and a BeginFrame. | 1958 // First we get the input event and a BeginFrame. |
| 1897 state.OnBeginImplFrame(); | 1959 state.IssueNextBeginImplFrame(); |
| 1898 | 1960 |
| 1899 // As a response the compositor requests a redraw and a commit to tell the | 1961 // As a response the compositor requests a redraw and a commit to tell the |
| 1900 // main thread about the new scroll offset. | 1962 // main thread about the new scroll offset. |
| 1901 state.SetNeedsRedraw(true); | 1963 state.SetNeedsRedraw(true); |
| 1902 state.SetNeedsBeginMainFrame(); | 1964 state.SetNeedsBeginMainFrame(); |
| 1903 | 1965 |
| 1904 // We should start the commit normally. | 1966 // We should start the commit normally. |
| 1905 EXPECT_ACTION_UPDATE_STATE( | 1967 EXPECT_ACTION_UPDATE_STATE( |
| 1906 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 1968 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1907 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1969 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1922 StateMachine& state = *state_ptr; | 1984 StateMachine& state = *state_ptr; |
| 1923 | 1985 |
| 1924 state.NotifyBeginMainFrameStarted(); | 1986 state.NotifyBeginMainFrameStarted(); |
| 1925 state.NotifyReadyToCommit(); | 1987 state.NotifyReadyToCommit(); |
| 1926 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 1988 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 1927 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1989 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1928 state.NotifyReadyToActivate(); | 1990 state.NotifyReadyToActivate(); |
| 1929 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); | 1991 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); |
| 1930 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1992 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1931 | 1993 |
| 1932 state.OnBeginImplFrame(); | 1994 state.IssueNextBeginImplFrame(); |
| 1933 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 1995 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1934 | 1996 |
| 1935 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); | 1997 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); |
| 1936 state.OnBeginImplFrameDeadline(); | 1998 state.OnBeginImplFrameDeadline(); |
| 1937 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 1999 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| 1938 state.DidSubmitCompositorFrame(); | 2000 state.DidSubmitCompositorFrame(); |
| 1939 } | 2001 } |
| 1940 | 2002 |
| 1941 TEST(SchedulerStateMachineTest, TestImplLatencyTakesPriority) { | 2003 TEST(SchedulerStateMachineTest, TestImplLatencyTakesPriority) { |
| 1942 SchedulerSettings default_scheduler_settings; | 2004 SchedulerSettings default_scheduler_settings; |
| 1943 StateMachine state(default_scheduler_settings); | 2005 StateMachine state(default_scheduler_settings); |
| 1944 SET_UP_STATE(state) | 2006 SET_UP_STATE(state) |
| 1945 | 2007 |
| 1946 // This test ensures that impl-draws are prioritized over main thread updates | 2008 // This test ensures that impl-draws are prioritized over main thread updates |
| 1947 // in prefer impl latency mode. | 2009 // in prefer impl latency mode. |
| 1948 state.SetNeedsRedraw(true); | 2010 state.SetNeedsRedraw(true); |
| 1949 state.SetNeedsBeginMainFrame(); | 2011 state.SetNeedsBeginMainFrame(); |
| 1950 state.OnBeginImplFrame(); | 2012 state.IssueNextBeginImplFrame(); |
| 1951 EXPECT_ACTION_UPDATE_STATE( | 2013 EXPECT_ACTION_UPDATE_STATE( |
| 1952 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 2014 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 1953 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2015 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1954 | 2016 |
| 1955 // Verify the deadline is not triggered early until we enter | 2017 // Verify the deadline is not triggered early until we enter |
| 1956 // prefer impl latency mode. | 2018 // prefer impl latency mode. |
| 1957 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); | 2019 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); |
| 1958 state.SetTreePrioritiesAndScrollState( | 2020 state.SetTreePrioritiesAndScrollState( |
| 1959 SMOOTHNESS_TAKES_PRIORITY, | 2021 SMOOTHNESS_TAKES_PRIORITY, |
| 1960 ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER); | 2022 ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1977 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2039 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1978 | 2040 |
| 1979 // Finish the previous commit and draw it. | 2041 // Finish the previous commit and draw it. |
| 1980 FinishPreviousCommitAndDrawWithoutExitingDeadline(&state); | 2042 FinishPreviousCommitAndDrawWithoutExitingDeadline(&state); |
| 1981 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2043 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1982 | 2044 |
| 1983 // Verify we do not send another BeginMainFrame if was are submit-frame | 2045 // Verify we do not send another BeginMainFrame if was are submit-frame |
| 1984 // throttled and did not just submit one. | 2046 // throttled and did not just submit one. |
| 1985 state.SetNeedsBeginMainFrame(); | 2047 state.SetNeedsBeginMainFrame(); |
| 1986 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2048 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1987 state.OnBeginImplFrame(); | 2049 state.IssueNextBeginImplFrame(); |
| 1988 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2050 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1989 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); | 2051 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); |
| 1990 state.OnBeginImplFrameDeadline(); | 2052 state.OnBeginImplFrameDeadline(); |
| 1991 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2053 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1992 } | 2054 } |
| 1993 | 2055 |
| 1994 TEST(SchedulerStateMachineTest, | 2056 TEST(SchedulerStateMachineTest, |
| 1995 TestTriggerDeadlineImmediatelyOnLostCompositorFrameSink) { | 2057 TestTriggerDeadlineImmediatelyOnLostCompositorFrameSink) { |
| 1996 SchedulerSettings default_scheduler_settings; | 2058 SchedulerSettings default_scheduler_settings; |
| 1997 StateMachine state(default_scheduler_settings); | 2059 StateMachine state(default_scheduler_settings); |
| 1998 SET_UP_STATE(state) | 2060 SET_UP_STATE(state) |
| 1999 | 2061 |
| 2000 state.SetNeedsBeginMainFrame(); | 2062 state.SetNeedsBeginMainFrame(); |
| 2001 | 2063 |
| 2002 state.OnBeginImplFrame(); | 2064 state.IssueNextBeginImplFrame(); |
| 2003 EXPECT_ACTION_UPDATE_STATE( | 2065 EXPECT_ACTION_UPDATE_STATE( |
| 2004 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 2066 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 2005 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2067 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2006 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); | 2068 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); |
| 2007 | 2069 |
| 2008 state.DidLoseCompositorFrameSink(); | 2070 state.DidLoseCompositorFrameSink(); |
| 2009 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2071 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2010 // The deadline should be triggered immediately when CompositorFrameSink is | 2072 // The deadline should be triggered immediately when CompositorFrameSink is |
| 2011 // lost. | 2073 // lost. |
| 2012 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); | 2074 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); |
| 2013 } | 2075 } |
| 2014 | 2076 |
| 2015 TEST(SchedulerStateMachineTest, TestTriggerDeadlineImmediatelyWhenInvisible) { | 2077 TEST(SchedulerStateMachineTest, TestTriggerDeadlineImmediatelyWhenInvisible) { |
| 2016 SchedulerSettings default_scheduler_settings; | 2078 SchedulerSettings default_scheduler_settings; |
| 2017 StateMachine state(default_scheduler_settings); | 2079 StateMachine state(default_scheduler_settings); |
| 2018 SET_UP_STATE(state) | 2080 SET_UP_STATE(state) |
| 2019 | 2081 |
| 2020 state.SetNeedsBeginMainFrame(); | 2082 state.SetNeedsBeginMainFrame(); |
| 2021 | 2083 |
| 2022 state.OnBeginImplFrame(); | 2084 state.IssueNextBeginImplFrame(); |
| 2023 EXPECT_ACTION_UPDATE_STATE( | 2085 EXPECT_ACTION_UPDATE_STATE( |
| 2024 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 2086 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 2025 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2087 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2026 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); | 2088 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); |
| 2027 | 2089 |
| 2028 state.SetVisible(false); | 2090 state.SetVisible(false); |
| 2029 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2091 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2030 EXPECT_TRUE(state.PendingActivationsShouldBeForced()); | 2092 EXPECT_TRUE(state.PendingActivationsShouldBeForced()); |
| 2031 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); | 2093 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); |
| 2032 } | 2094 } |
| 2033 | 2095 |
| 2034 TEST(SchedulerStateMachineTest, | 2096 TEST(SchedulerStateMachineTest, |
| 2035 TestTriggerDeadlineImmediatelyWhenBeginFrameSourcePaused) { | 2097 TestTriggerDeadlineImmediatelyWhenBeginFrameSourcePaused) { |
| 2036 SchedulerSettings default_scheduler_settings; | 2098 SchedulerSettings default_scheduler_settings; |
| 2037 StateMachine state(default_scheduler_settings); | 2099 StateMachine state(default_scheduler_settings); |
| 2038 SET_UP_STATE(state) | 2100 SET_UP_STATE(state) |
| 2039 | 2101 |
| 2040 state.SetNeedsBeginMainFrame(); | 2102 state.SetNeedsBeginMainFrame(); |
| 2041 | 2103 |
| 2042 state.OnBeginImplFrame(); | 2104 state.IssueNextBeginImplFrame(); |
| 2043 EXPECT_ACTION_UPDATE_STATE( | 2105 EXPECT_ACTION_UPDATE_STATE( |
| 2044 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 2106 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 2045 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2107 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2046 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); | 2108 EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); |
| 2047 | 2109 |
| 2048 state.SetBeginFrameSourcePaused(true); | 2110 state.SetBeginFrameSourcePaused(true); |
| 2049 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2111 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2050 EXPECT_TRUE(state.PendingActivationsShouldBeForced()); | 2112 EXPECT_TRUE(state.PendingActivationsShouldBeForced()); |
| 2051 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); | 2113 EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); |
| 2052 } | 2114 } |
| 2053 | 2115 |
| 2054 TEST(SchedulerStateMachineTest, TestDeferCommit) { | 2116 TEST(SchedulerStateMachineTest, TestDeferCommit) { |
| 2055 SchedulerSettings settings; | 2117 SchedulerSettings settings; |
| 2056 StateMachine state(settings); | 2118 StateMachine state(settings); |
| 2057 SET_UP_STATE(state) | 2119 SET_UP_STATE(state) |
| 2058 | 2120 |
| 2059 state.SetDeferCommits(true); | 2121 state.SetDeferCommits(true); |
| 2060 | 2122 |
| 2061 state.SetNeedsBeginMainFrame(); | 2123 state.SetNeedsBeginMainFrame(); |
| 2062 EXPECT_FALSE(state.BeginFrameNeeded()); | 2124 EXPECT_FALSE(state.BeginFrameNeeded()); |
| 2063 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2125 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2064 | 2126 |
| 2065 state.OnBeginImplFrame(); | 2127 state.IssueNextBeginImplFrame(); |
| 2066 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2128 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2067 | 2129 |
| 2068 state.OnBeginImplFrameDeadline(); | 2130 state.OnBeginImplFrameDeadline(); |
| 2069 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2131 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2070 | 2132 |
| 2071 state.SetDeferCommits(false); | 2133 state.SetDeferCommits(false); |
| 2072 state.OnBeginImplFrame(); | 2134 state.IssueNextBeginImplFrame(); |
| 2073 EXPECT_ACTION_UPDATE_STATE( | 2135 EXPECT_ACTION_UPDATE_STATE( |
| 2074 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 2136 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 2075 } | 2137 } |
| 2076 | 2138 |
| 2077 TEST(SchedulerStateMachineTest, EarlyOutCommitWantsProactiveBeginFrame) { | 2139 TEST(SchedulerStateMachineTest, EarlyOutCommitWantsProactiveBeginFrame) { |
| 2078 SchedulerSettings settings; | 2140 SchedulerSettings settings; |
| 2079 StateMachine state(settings); | 2141 StateMachine state(settings); |
| 2080 SET_UP_STATE(state); | 2142 SET_UP_STATE(state); |
| 2081 | 2143 |
| 2082 EXPECT_FALSE(state.ProactiveBeginFrameWanted()); | 2144 EXPECT_FALSE(state.ProactiveBeginFrameWanted()); |
| 2083 bool commit_has_no_updates = true; | 2145 bool commit_has_no_updates = true; |
| 2084 state.WillCommit(commit_has_no_updates); | 2146 state.WillCommit(commit_has_no_updates); |
| 2085 EXPECT_TRUE(state.ProactiveBeginFrameWanted()); | 2147 EXPECT_TRUE(state.ProactiveBeginFrameWanted()); |
| 2086 state.OnBeginImplFrame(); | 2148 state.IssueNextBeginImplFrame(); |
| 2087 EXPECT_FALSE(state.ProactiveBeginFrameWanted()); | 2149 EXPECT_FALSE(state.ProactiveBeginFrameWanted()); |
| 2088 } | 2150 } |
| 2089 | 2151 |
| 2090 TEST(SchedulerStateMachineTest, | 2152 TEST(SchedulerStateMachineTest, |
| 2091 NoCompositorFrameSinkCreationWhileCommitPending) { | 2153 NoCompositorFrameSinkCreationWhileCommitPending) { |
| 2092 SchedulerSettings settings; | 2154 SchedulerSettings settings; |
| 2093 StateMachine state(settings); | 2155 StateMachine state(settings); |
| 2094 SET_UP_STATE(state); | 2156 SET_UP_STATE(state); |
| 2095 | 2157 |
| 2096 // Set up the request for a commit and start a frame. | 2158 // Set up the request for a commit and start a frame. |
| 2097 state.SetNeedsBeginMainFrame(); | 2159 state.SetNeedsBeginMainFrame(); |
| 2098 state.OnBeginImplFrame(); | 2160 state.IssueNextBeginImplFrame(); |
| 2099 PerformAction(&state, SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 2161 PerformAction(&state, SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 2100 | 2162 |
| 2101 // Lose the CompositorFrameSink. | 2163 // Lose the CompositorFrameSink. |
| 2102 state.DidLoseCompositorFrameSink(); | 2164 state.DidLoseCompositorFrameSink(); |
| 2103 | 2165 |
| 2104 // The scheduler shouldn't trigger the CompositorFrameSink creation till the | 2166 // The scheduler shouldn't trigger the CompositorFrameSink creation till the |
| 2105 // previous commit has been cleared. | 2167 // previous commit has been cleared. |
| 2106 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2168 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2107 | 2169 |
| 2108 // Trigger the deadline and ensure that the scheduler does not trigger any | 2170 // Trigger the deadline and ensure that the scheduler does not trigger any |
| 2109 // actions until we receive a response for the pending commit. | 2171 // actions until we receive a response for the pending commit. |
| 2110 state.OnBeginImplFrameDeadline(); | 2172 state.OnBeginImplFrameDeadline(); |
| 2111 state.OnBeginImplFrameIdle(); | 2173 state.OnBeginImplFrameIdle(); |
| 2112 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 2174 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2113 | 2175 |
| 2114 // Abort the commit, since that is what we expect the main thread to do if the | 2176 // Abort the commit, since that is what we expect the main thread to do if the |
| 2115 // CompositorFrameSink was lost due to a synchronous call from the main thread | 2177 // CompositorFrameSink was lost due to a synchronous call from the main thread |
| 2116 // to release the CompositorFrameSink. | 2178 // to release the CompositorFrameSink. |
| 2117 state.NotifyBeginMainFrameStarted(); | 2179 state.NotifyBeginMainFrameStarted(); |
| 2118 state.BeginMainFrameAborted( | 2180 state.BeginMainFrameAborted( |
| 2119 CommitEarlyOutReason::ABORTED_COMPOSITOR_FRAME_SINK_LOST); | 2181 CommitEarlyOutReason::ABORTED_COMPOSITOR_FRAME_SINK_LOST); |
| 2120 | 2182 |
| 2121 // The scheduler should begin the CompositorFrameSink creation now. | 2183 // The scheduler should begin the CompositorFrameSink creation now. |
| 2122 EXPECT_ACTION_UPDATE_STATE( | 2184 EXPECT_ACTION_UPDATE_STATE( |
| 2123 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); | 2185 SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION); |
| 2124 } | 2186 } |
| 2125 | 2187 |
| 2188 TEST(SchedulerStateMachineTest, TestBeginFrameFreshnessInitialState) { |
| 2189 SchedulerSettings default_scheduler_settings; |
| 2190 StateMachine state(default_scheduler_settings); |
| 2191 SET_UP_STATE(state) |
| 2192 |
| 2193 // Initially, we report a invalid frame numbers. |
| 2194 EXPECT_SEQUENCE_NUMBERS( |
| 2195 BeginFrameArgs::kInvalidFrameNumber, BeginFrameArgs::kInvalidFrameNumber, |
| 2196 BeginFrameArgs::kInvalidFrameNumber, BeginFrameArgs::kInvalidFrameNumber, |
| 2197 BeginFrameArgs::kInvalidFrameNumber); |
| 2198 } |
| 2199 |
| 2200 TEST(SchedulerStateMachineTest, TestBeginFrameFreshnessWithoutUpdates) { |
| 2201 // Setup without any requested updates. |
| 2202 SchedulerSettings default_scheduler_settings; |
| 2203 StateMachine state(default_scheduler_settings); |
| 2204 SET_UP_STATE(state) |
| 2205 state.SetNeedsRedraw(false); |
| 2206 EXPECT_FALSE(state.RedrawPending()); |
| 2207 EXPECT_FALSE(state.NeedsCommit()); |
| 2208 |
| 2209 // OnBeginImplFrame() updates the sequence number. |
| 2210 state.OnBeginImplFrame(0, 10); |
| 2211 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2212 EXPECT_SEQUENCE_NUMBERS(10u, BeginFrameArgs::kInvalidFrameNumber, |
| 2213 BeginFrameArgs::kInvalidFrameNumber, |
| 2214 BeginFrameArgs::kInvalidFrameNumber, |
| 2215 BeginFrameArgs::kInvalidFrameNumber); |
| 2216 |
| 2217 // When no updates are required, OnBeginImplFrameDeadline() updates active |
| 2218 // tree and compositor frame freshness. |
| 2219 state.OnBeginImplFrameDeadline(); |
| 2220 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2221 EXPECT_SEQUENCE_NUMBERS(10u, BeginFrameArgs::kInvalidFrameNumber, |
| 2222 BeginFrameArgs::kInvalidFrameNumber, 10u, 10u); |
| 2223 state.OnBeginImplFrameIdle(); |
| 2224 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2225 } |
| 2226 |
| 2227 TEST(SchedulerStateMachineTest, TestBeginFrameFreshnessWithImplFrameUpdates) { |
| 2228 // Setup with an impl-thread draw requested. |
| 2229 SchedulerSettings default_scheduler_settings; |
| 2230 StateMachine state(default_scheduler_settings); |
| 2231 SET_UP_STATE(state) |
| 2232 state.SetNeedsRedraw(true); |
| 2233 EXPECT_TRUE(state.RedrawPending()); |
| 2234 EXPECT_FALSE(state.NeedsCommit()); |
| 2235 |
| 2236 // OnBeginImplFrame() updates the sequence number. |
| 2237 state.OnBeginImplFrame(0, 10); |
| 2238 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2239 EXPECT_SEQUENCE_NUMBERS(10u, BeginFrameArgs::kInvalidFrameNumber, |
| 2240 BeginFrameArgs::kInvalidFrameNumber, |
| 2241 BeginFrameArgs::kInvalidFrameNumber, |
| 2242 BeginFrameArgs::kInvalidFrameNumber); |
| 2243 |
| 2244 // With only an impl-thread draw requested, OnBeginImplFrameDeadline() |
| 2245 // updates the active tree freshness. |
| 2246 state.OnBeginImplFrameDeadline(); |
| 2247 EXPECT_SEQUENCE_NUMBERS(10u, BeginFrameArgs::kInvalidFrameNumber, |
| 2248 BeginFrameArgs::kInvalidFrameNumber, 10u, |
| 2249 BeginFrameArgs::kInvalidFrameNumber); |
| 2250 |
| 2251 // Compositor frame freshness is updated when active tree is drawn. |
| 2252 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| 2253 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2254 EXPECT_FALSE(state.RedrawPending()); |
| 2255 state.DidSubmitCompositorFrame(); |
| 2256 state.DidReceiveCompositorFrameAck(); |
| 2257 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2258 EXPECT_SEQUENCE_NUMBERS(10u, BeginFrameArgs::kInvalidFrameNumber, |
| 2259 BeginFrameArgs::kInvalidFrameNumber, 10u, 10u); |
| 2260 state.OnBeginImplFrameIdle(); |
| 2261 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2262 } |
| 2263 |
| 2264 TEST(SchedulerStateMachineTest, TestBeginFrameFreshnessWithMainFrameUpdates) { |
| 2265 // Setup with a BeginMainFrame requested. |
| 2266 SchedulerSettings default_scheduler_settings; |
| 2267 StateMachine state(default_scheduler_settings); |
| 2268 SET_UP_STATE(state) |
| 2269 state.SetNeedsRedraw(false); |
| 2270 state.SetNeedsBeginMainFrameForTest(true); |
| 2271 EXPECT_FALSE(state.RedrawPending()); |
| 2272 EXPECT_TRUE(state.NeedsCommit()); |
| 2273 |
| 2274 // OnBeginImplFrame() updates the sequence number, WillSendBeginMainFrame() |
| 2275 // updates begin_main_frame_sent sequence number. |
| 2276 state.OnBeginImplFrame(0, 10); |
| 2277 EXPECT_ACTION_UPDATE_STATE( |
| 2278 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 2279 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2280 EXPECT_FALSE(state.NeedsCommit()); |
| 2281 EXPECT_TRUE(state.CommitPending()); |
| 2282 EXPECT_SEQUENCE_NUMBERS(10u, 10u, BeginFrameArgs::kInvalidFrameNumber, |
| 2283 BeginFrameArgs::kInvalidFrameNumber, |
| 2284 BeginFrameArgs::kInvalidFrameNumber); |
| 2285 |
| 2286 // When a BeginMainFrame is needed, OnBeginImplFrameDeadline() updates no |
| 2287 // freshness numbers. |
| 2288 state.OnBeginImplFrameDeadline(); |
| 2289 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2290 EXPECT_SEQUENCE_NUMBERS(10u, 10u, BeginFrameArgs::kInvalidFrameNumber, |
| 2291 BeginFrameArgs::kInvalidFrameNumber, |
| 2292 BeginFrameArgs::kInvalidFrameNumber); |
| 2293 state.OnBeginImplFrameIdle(); |
| 2294 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2295 |
| 2296 // When a main frame is in progress, OnBeginImplFrameDeadline() updates no |
| 2297 // freshness numbers. |
| 2298 state.NotifyBeginMainFrameStarted(); |
| 2299 state.OnBeginImplFrame(0, 11); |
| 2300 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2301 state.OnBeginImplFrameDeadline(); |
| 2302 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2303 EXPECT_SEQUENCE_NUMBERS(11u, 10u, BeginFrameArgs::kInvalidFrameNumber, |
| 2304 BeginFrameArgs::kInvalidFrameNumber, |
| 2305 BeginFrameArgs::kInvalidFrameNumber); |
| 2306 state.OnBeginImplFrameIdle(); |
| 2307 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2308 |
| 2309 // Pending tree freshness is updated when the new pending tree is committed. |
| 2310 state.NotifyReadyToCommit(); |
| 2311 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 2312 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2313 EXPECT_FALSE(state.CommitPending()); |
| 2314 EXPECT_TRUE(state.has_pending_tree()); |
| 2315 EXPECT_SEQUENCE_NUMBERS(11u, 10u, 10u, BeginFrameArgs::kInvalidFrameNumber, |
| 2316 BeginFrameArgs::kInvalidFrameNumber); |
| 2317 |
| 2318 // If no further BeginMainFrame is needed, OnBeginFrameImplDeadline() |
| 2319 // updates the pending tree's frame number. |
| 2320 state.OnBeginImplFrame(0, 12); |
| 2321 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2322 EXPECT_SEQUENCE_NUMBERS(12u, 10u, 10u, BeginFrameArgs::kInvalidFrameNumber, |
| 2323 BeginFrameArgs::kInvalidFrameNumber); |
| 2324 state.OnBeginImplFrameDeadline(); |
| 2325 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2326 EXPECT_SEQUENCE_NUMBERS(12u, 10u, 12u, BeginFrameArgs::kInvalidFrameNumber, |
| 2327 BeginFrameArgs::kInvalidFrameNumber); |
| 2328 state.OnBeginImplFrameIdle(); |
| 2329 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2330 |
| 2331 // If a further BeginMainFrame is needed, OnBeginFrameImplDeadline() |
| 2332 // updates no freshness numbers. |
| 2333 state.SetNeedsBeginMainFrameForTest(true); |
| 2334 EXPECT_TRUE(state.NeedsCommit()); |
| 2335 state.OnBeginImplFrame(0, 13); |
| 2336 // BMF will be sent only after pending_tree activation. |
| 2337 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2338 state.OnBeginImplFrameDeadline(); |
| 2339 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2340 EXPECT_SEQUENCE_NUMBERS(13u, 10u, 12u, BeginFrameArgs::kInvalidFrameNumber, |
| 2341 BeginFrameArgs::kInvalidFrameNumber); |
| 2342 state.OnBeginImplFrameIdle(); |
| 2343 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2344 |
| 2345 // Active tree freshness is updated when pending frame is activated. |
| 2346 state.NotifyReadyToActivate(); |
| 2347 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE); |
| 2348 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2349 EXPECT_FALSE(state.has_pending_tree()); |
| 2350 EXPECT_SEQUENCE_NUMBERS(13u, 10u, 12u, 12u, |
| 2351 BeginFrameArgs::kInvalidFrameNumber); |
| 2352 EXPECT_TRUE(state.RedrawPending()); |
| 2353 |
| 2354 // BMF requested above will be sent after activation. |
| 2355 state.OnBeginImplFrame(0, 14); |
| 2356 EXPECT_ACTION_UPDATE_STATE( |
| 2357 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 2358 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2359 |
| 2360 // Active tree freshness is updated when commit didn't have updates, but |
| 2361 // compositor frame freshness is not updated. |
| 2362 state.NotifyBeginMainFrameStarted(); |
| 2363 state.BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES); |
| 2364 EXPECT_SEQUENCE_NUMBERS(14u, 14u, 12u, 14u, |
| 2365 BeginFrameArgs::kInvalidFrameNumber); |
| 2366 |
| 2367 // Compositor frame freshness is updated when active tree is drawn. |
| 2368 state.OnBeginImplFrameDeadline(); |
| 2369 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| 2370 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2371 EXPECT_FALSE(state.RedrawPending()); |
| 2372 state.DidSubmitCompositorFrame(); |
| 2373 state.DidReceiveCompositorFrameAck(); |
| 2374 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2375 EXPECT_SEQUENCE_NUMBERS(14u, 14u, 12u, 14u, 14u); |
| 2376 state.OnBeginImplFrameIdle(); |
| 2377 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2378 |
| 2379 // When no updates are required, OnBeginImplFrameDeadline() updates active |
| 2380 // tree and compositor frame freshness. |
| 2381 state.OnBeginImplFrame(0, 15); |
| 2382 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2383 state.OnBeginImplFrameDeadline(); |
| 2384 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2385 EXPECT_SEQUENCE_NUMBERS(15u, 14u, 12u, 15u, 15u); |
| 2386 state.OnBeginImplFrameIdle(); |
| 2387 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2388 |
| 2389 // Active tree and compositor frame freshness are updated when commit doesn't |
| 2390 // have updates and compositor frame was fresh before. |
| 2391 state.SetNeedsBeginMainFrameForTest(true); |
| 2392 EXPECT_TRUE(state.NeedsCommit()); |
| 2393 state.OnBeginImplFrame(0, 16); |
| 2394 EXPECT_ACTION_UPDATE_STATE( |
| 2395 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 2396 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2397 EXPECT_FALSE(state.NeedsCommit()); |
| 2398 EXPECT_TRUE(state.CommitPending()); |
| 2399 state.NotifyBeginMainFrameStarted(); |
| 2400 state.BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES); |
| 2401 EXPECT_SEQUENCE_NUMBERS(16u, 16u, 12u, 16u, 16u); |
| 2402 state.OnBeginImplFrameDeadline(); |
| 2403 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2404 EXPECT_SEQUENCE_NUMBERS(16u, 16u, 12u, 16u, 16u); |
| 2405 state.OnBeginImplFrameIdle(); |
| 2406 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2407 |
| 2408 // When the source changes, the current frame number is updated and frame |
| 2409 // numbers for freshness are reset to invalid numbers. |
| 2410 state.OnBeginImplFrame(1, 5); |
| 2411 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2412 EXPECT_SEQUENCE_NUMBERS(5u, BeginFrameArgs::kInvalidFrameNumber, |
| 2413 BeginFrameArgs::kInvalidFrameNumber, |
| 2414 BeginFrameArgs::kInvalidFrameNumber, |
| 2415 BeginFrameArgs::kInvalidFrameNumber); |
| 2416 |
| 2417 // When no updates are required, OnBeginImplFrameDeadline() updates active |
| 2418 // tree and compositor frame freshness. |
| 2419 state.OnBeginImplFrameDeadline(); |
| 2420 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2421 EXPECT_SEQUENCE_NUMBERS(5u, BeginFrameArgs::kInvalidFrameNumber, |
| 2422 BeginFrameArgs::kInvalidFrameNumber, 5u, 5u); |
| 2423 state.OnBeginImplFrameIdle(); |
| 2424 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2425 } |
| 2426 |
| 2427 TEST(SchedulerStateMachineTest, |
| 2428 TestBeginFrameFreshnessWithNoUpdatesCommitAndPendingTree) { |
| 2429 // Setup with main_frame_before_activation_enabled, a pending tree, and a |
| 2430 // new BeginMainFrame requested. |
| 2431 SchedulerSettings settings; |
| 2432 settings.main_frame_before_activation_enabled = true; |
| 2433 StateMachine state(settings); |
| 2434 SET_UP_STATE(state) |
| 2435 state.SetHasPendingTree(true); |
| 2436 state.SetNeedsRedraw(false); |
| 2437 state.SetNeedsBeginMainFrameForTest(true); |
| 2438 EXPECT_FALSE(state.RedrawPending()); |
| 2439 EXPECT_TRUE(state.NeedsCommit()); |
| 2440 |
| 2441 // OnBeginImplFrame() updates the sequence number, WillSendBeginMainFrame() |
| 2442 // updates begin_main_frame_sent sequence number. |
| 2443 state.OnBeginImplFrame(0, 10); |
| 2444 EXPECT_ACTION_UPDATE_STATE( |
| 2445 SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); |
| 2446 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2447 EXPECT_FALSE(state.NeedsCommit()); |
| 2448 EXPECT_TRUE(state.CommitPending()); |
| 2449 EXPECT_SEQUENCE_NUMBERS(10u, 10u, BeginFrameArgs::kInvalidFrameNumber, |
| 2450 BeginFrameArgs::kInvalidFrameNumber, |
| 2451 BeginFrameArgs::kInvalidFrameNumber); |
| 2452 |
| 2453 // Pending tree freshness is updated when commit didn't have updates, but an |
| 2454 // older pending tree is still pending. |
| 2455 state.NotifyBeginMainFrameStarted(); |
| 2456 state.BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES); |
| 2457 EXPECT_SEQUENCE_NUMBERS(10u, 10u, 10u, BeginFrameArgs::kInvalidFrameNumber, |
| 2458 BeginFrameArgs::kInvalidFrameNumber); |
| 2459 |
| 2460 // As no further BeginMainFrame is needed, OnBeginFrameImplDeadline() |
| 2461 // updates the pending tree's frame number, but without any visible change. |
| 2462 state.OnBeginImplFrameDeadline(); |
| 2463 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2464 EXPECT_SEQUENCE_NUMBERS(10u, 10u, 10u, BeginFrameArgs::kInvalidFrameNumber, |
| 2465 BeginFrameArgs::kInvalidFrameNumber); |
| 2466 state.OnBeginImplFrameIdle(); |
| 2467 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 2468 } |
| 2469 |
| 2126 } // namespace | 2470 } // namespace |
| 2127 } // namespace cc | 2471 } // namespace cc |
| OLD | NEW |