| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/scheduler/scheduler_state_machine.h" | 5 #include "cc/scheduler/scheduler_state_machine.h" |
| 6 | 6 |
| 7 #include "cc/scheduler/scheduler.h" | 7 #include "cc/scheduler/scheduler.h" |
| 8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
| 9 | 9 |
| 10 #define EXPECT_ACTION_UPDATE_STATE(action) \ |
| 11 EXPECT_EQ(action, state.NextAction()) << *state.AsValue(); \ |
| 12 state.UpdateState(action); |
| 13 |
| 10 namespace cc { | 14 namespace cc { |
| 11 | 15 |
| 12 namespace { | 16 namespace { |
| 13 | 17 |
| 14 const SchedulerStateMachine::CommitState all_commit_states[] = { | 18 const SchedulerStateMachine::CommitState all_commit_states[] = { |
| 15 SchedulerStateMachine::COMMIT_STATE_IDLE, | 19 SchedulerStateMachine::COMMIT_STATE_IDLE, |
| 16 SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, | 20 SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, |
| 17 SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, | 21 SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, |
| 18 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW | 22 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW |
| 19 }; | 23 }; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 34 | 38 |
| 35 OutputSurfaceState output_surface_state() const { | 39 OutputSurfaceState output_surface_state() const { |
| 36 return output_surface_state_; | 40 return output_surface_state_; |
| 37 } | 41 } |
| 38 | 42 |
| 39 bool NeedsCommit() const { return needs_commit_; } | 43 bool NeedsCommit() const { return needs_commit_; } |
| 40 | 44 |
| 41 void SetNeedsRedraw(bool b) { needs_redraw_ = b; } | 45 void SetNeedsRedraw(bool b) { needs_redraw_ = b; } |
| 42 bool NeedsRedraw() const { return needs_redraw_; } | 46 bool NeedsRedraw() const { return needs_redraw_; } |
| 43 | 47 |
| 44 void SetNeedsForcedRedraw(bool b) { needs_forced_redraw_ = b; } | 48 void SetNeedsForcedRedrawForTimeout(bool b) { |
| 45 bool NeedsForcedRedraw() const { return needs_forced_redraw_; } | 49 forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_COMMIT; |
| 50 commit_state_ = COMMIT_STATE_WAITING_FOR_FIRST_DRAW; |
| 51 } |
| 52 bool NeedsForcedRedrawForTimeout() const { |
| 53 return forced_redraw_state_ != FORCED_REDRAW_STATE_IDLE; |
| 54 } |
| 55 |
| 56 void SetNeedsForcedRedrawForReadback() { |
| 57 readback_state_ = READBACK_STATE_WAITING_FOR_DRAW_AND_READBACK; |
| 58 commit_state_ = COMMIT_STATE_WAITING_FOR_FIRST_DRAW; |
| 59 } |
| 60 |
| 61 bool NeedsForcedRedrawForReadback() const { |
| 62 return readback_state_ != READBACK_STATE_IDLE; |
| 63 } |
| 46 | 64 |
| 47 bool CanDraw() const { return can_draw_; } | 65 bool CanDraw() const { return can_draw_; } |
| 48 bool Visible() const { return visible_; } | 66 bool Visible() const { return visible_; } |
| 49 }; | 67 }; |
| 50 | 68 |
| 51 TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) { | 69 TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) { |
| 52 SchedulerSettings default_scheduler_settings; | 70 SchedulerSettings default_scheduler_settings; |
| 53 | 71 |
| 54 // If no commit needed, do nothing. | 72 // If no commit needed, do nothing. |
| 55 { | 73 { |
| 56 StateMachine state(default_scheduler_settings); | 74 StateMachine state(default_scheduler_settings); |
| 57 state.SetCanStart(); | 75 state.SetCanStart(); |
| 58 state.UpdateState(state.NextAction()); | 76 EXPECT_ACTION_UPDATE_STATE( |
| 77 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION) |
| 59 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 78 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 60 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); | 79 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); |
| 61 state.SetNeedsRedraw(false); | 80 state.SetNeedsRedraw(false); |
| 62 state.SetVisible(true); | 81 state.SetVisible(true); |
| 63 | 82 |
| 64 EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread()); | 83 EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread()); |
| 65 | 84 |
| 66 state.DidLeaveBeginFrame(); | 85 state.DidLeaveBeginFrame(); |
| 67 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 86 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 68 EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread()); | 87 EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread()); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 state.SetVisible(true); | 124 state.SetVisible(true); |
| 106 state.UpdateState( | 125 state.UpdateState( |
| 107 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); | 126 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); |
| 108 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, | 127 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, |
| 109 state.CommitState()); | 128 state.CommitState()); |
| 110 EXPECT_FALSE(state.NeedsCommit()); | 129 EXPECT_FALSE(state.NeedsCommit()); |
| 111 EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread()); | 130 EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread()); |
| 112 } | 131 } |
| 113 } | 132 } |
| 114 | 133 |
| 115 TEST(SchedulerStateMachineTest, TestSetForcedRedrawDoesNotSetsNormalRedraw) { | |
| 116 SchedulerSettings default_scheduler_settings; | |
| 117 SchedulerStateMachine state(default_scheduler_settings); | |
| 118 state.SetCanDraw(true); | |
| 119 state.SetNeedsForcedRedraw(); | |
| 120 EXPECT_FALSE(state.RedrawPending()); | |
| 121 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); | |
| 122 } | |
| 123 | |
| 124 TEST(SchedulerStateMachineTest, | 134 TEST(SchedulerStateMachineTest, |
| 125 TestFailedDrawSetsNeedsCommitAndDoesNotDrawAgain) { | 135 TestFailedDrawSetsNeedsCommitAndDoesNotDrawAgain) { |
| 126 SchedulerSettings default_scheduler_settings; | 136 SchedulerSettings default_scheduler_settings; |
| 127 StateMachine state(default_scheduler_settings); | 137 StateMachine state(default_scheduler_settings); |
| 128 state.SetCanStart(); | 138 state.SetCanStart(); |
| 129 state.UpdateState(state.NextAction()); | 139 state.UpdateState(state.NextAction()); |
| 130 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 140 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 131 state.SetVisible(true); | 141 state.SetVisible(true); |
| 132 state.SetCanDraw(true); | 142 state.SetCanDraw(true); |
| 133 state.SetNeedsRedraw(true); | 143 state.SetNeedsRedraw(true); |
| 134 EXPECT_TRUE(state.RedrawPending()); | 144 EXPECT_TRUE(state.RedrawPending()); |
| 135 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); | 145 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); |
| 136 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | 146 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
| 137 | 147 |
| 138 // We're drawing now. | 148 // We're drawing now. |
| 139 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); | 149 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
| 140 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 150 state.NextAction()); |
| 151 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 141 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 152 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 142 EXPECT_FALSE(state.RedrawPending()); | 153 EXPECT_FALSE(state.RedrawPending()); |
| 143 EXPECT_FALSE(state.CommitPending()); | 154 EXPECT_FALSE(state.CommitPending()); |
| 144 | 155 |
| 145 // Failing the draw makes us require a commit. | 156 // Failing the draw makes us require a commit. |
| 146 state.DidDrawIfPossibleCompleted(false); | 157 state.DidDrawIfPossibleCompleted(false); |
| 147 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, | 158 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, |
| 148 state.NextAction()); | 159 state.NextAction()); |
| 149 state.UpdateState( | 160 state.UpdateState( |
| 150 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); | 161 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 161 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 172 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 162 | 173 |
| 163 state.SetVisible(true); | 174 state.SetVisible(true); |
| 164 state.SetCanDraw(true); | 175 state.SetCanDraw(true); |
| 165 state.SetNeedsRedraw(true); | 176 state.SetNeedsRedraw(true); |
| 166 EXPECT_TRUE(state.RedrawPending()); | 177 EXPECT_TRUE(state.RedrawPending()); |
| 167 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); | 178 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); |
| 168 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | 179 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
| 169 | 180 |
| 170 // We're drawing now. | 181 // We're drawing now. |
| 171 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); | 182 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
| 172 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 183 state.NextAction()); |
| 184 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 173 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 185 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 174 EXPECT_FALSE(state.RedrawPending()); | 186 EXPECT_FALSE(state.RedrawPending()); |
| 175 EXPECT_FALSE(state.CommitPending()); | 187 EXPECT_FALSE(state.CommitPending()); |
| 176 | 188 |
| 177 // While still in the same begin frame callback on the main thread, | 189 // While still in the same begin frame callback on the main thread, |
| 178 // set needs redraw again. This should not redraw. | 190 // set needs redraw again. This should not redraw. |
| 179 state.SetNeedsRedraw(true); | 191 state.SetNeedsRedraw(true); |
| 180 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 192 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 181 | 193 |
| 182 // Failing the draw makes us require a commit. | 194 // Failing the draw makes us require a commit. |
| (...skipping 18 matching lines...) Expand all Loading... |
| 201 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, | 213 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, |
| 202 state.NextAction()); | 214 state.NextAction()); |
| 203 state.UpdateState( | 215 state.UpdateState( |
| 204 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); | 216 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); |
| 205 EXPECT_TRUE(state.CommitPending()); | 217 EXPECT_TRUE(state.CommitPending()); |
| 206 | 218 |
| 207 // Then initiate a draw. | 219 // Then initiate a draw. |
| 208 state.SetNeedsRedraw(true); | 220 state.SetNeedsRedraw(true); |
| 209 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); | 221 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); |
| 210 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | 222 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
| 211 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); | 223 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
| 224 state.NextAction()); |
| 212 EXPECT_TRUE(state.RedrawPending()); | 225 EXPECT_TRUE(state.RedrawPending()); |
| 213 | 226 |
| 214 // Fail the draw. | 227 // Fail the draw. |
| 215 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 228 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 216 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 229 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 217 state.DidDrawIfPossibleCompleted(false); | 230 state.DidDrawIfPossibleCompleted(false); |
| 218 EXPECT_TRUE(state.RedrawPending()); | 231 EXPECT_TRUE(state.RedrawPending()); |
| 219 // But the commit is ongoing. | 232 // But the commit is ongoing. |
| 220 EXPECT_TRUE(state.CommitPending()); | 233 EXPECT_TRUE(state.CommitPending()); |
| 221 | 234 |
| 222 // Finish the commit. | 235 // Finish the commit. |
| 223 state.FinishCommit(); | 236 state.FinishCommit(); |
| 224 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); | 237 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); |
| 225 state.UpdateState(SchedulerStateMachine::ACTION_COMMIT); | 238 state.UpdateState(SchedulerStateMachine::ACTION_COMMIT); |
| 226 EXPECT_TRUE(state.RedrawPending()); | 239 EXPECT_TRUE(state.RedrawPending()); |
| 227 | 240 |
| 228 // And we should be allowed to draw again. | 241 // And we should be allowed to draw again. |
| 229 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); | 242 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
| 243 state.NextAction()); |
| 230 } | 244 } |
| 231 | 245 |
| 232 TEST(SchedulerStateMachineTest, | 246 TEST(SchedulerStateMachineTest, |
| 233 TestCommitAfterFailedAndSuccessfulDrawDoesNotAllowDrawInSameFrame) { | 247 TestFailedDrawsWillEventuallyForceADrawAfterTheNextCommit) { |
| 234 SchedulerSettings default_scheduler_settings; | 248 SchedulerSettings scheduler_settings; |
| 235 StateMachine state(default_scheduler_settings); | 249 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced_ = 1; |
| 250 StateMachine state(scheduler_settings); |
| 236 state.SetCanStart(); | 251 state.SetCanStart(); |
| 237 state.UpdateState(state.NextAction()); | 252 state.UpdateState(state.NextAction()); |
| 238 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 253 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 239 state.SetVisible(true); | 254 state.SetVisible(true); |
| 240 state.SetCanDraw(true); | 255 state.SetCanDraw(true); |
| 241 | 256 |
| 242 // Start a commit. | 257 // Start a commit. |
| 243 state.SetNeedsCommit(); | 258 state.SetNeedsCommit(); |
| 244 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, | |
| 245 state.NextAction()); | |
| 246 state.UpdateState( | |
| 247 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); | |
| 248 EXPECT_TRUE(state.CommitPending()); | |
| 249 | |
| 250 // Then initiate a draw. | |
| 251 state.SetNeedsRedraw(true); | |
| 252 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); | |
| 253 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | |
| 254 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); | |
| 255 EXPECT_TRUE(state.RedrawPending()); | |
| 256 | |
| 257 // Fail the draw. | |
| 258 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | |
| 259 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | |
| 260 state.DidDrawIfPossibleCompleted(false); | |
| 261 EXPECT_TRUE(state.RedrawPending()); | |
| 262 // But the commit is ongoing. | |
| 263 EXPECT_TRUE(state.CommitPending()); | |
| 264 | |
| 265 // Force a draw. | |
| 266 state.SetNeedsForcedRedraw(true); | |
| 267 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction()); | |
| 268 | |
| 269 // Do the forced draw. | |
| 270 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_FORCED); | |
| 271 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | |
| 272 EXPECT_FALSE(state.RedrawPending()); | |
| 273 // And the commit is still ongoing. | |
| 274 EXPECT_TRUE(state.CommitPending()); | |
| 275 | |
| 276 // Finish the commit. | |
| 277 state.FinishCommit(); | |
| 278 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); | |
| 279 state.UpdateState(SchedulerStateMachine::ACTION_COMMIT); | |
| 280 EXPECT_TRUE(state.RedrawPending()); | |
| 281 | |
| 282 // And we should not be allowed to draw again in the same frame.. | |
| 283 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | |
| 284 } | |
| 285 | |
| 286 TEST(SchedulerStateMachineTest, | |
| 287 TestFailedDrawsWillEventuallyForceADrawAfterTheNextCommit) { | |
| 288 SchedulerSettings default_scheduler_settings; | |
| 289 StateMachine state(default_scheduler_settings); | |
| 290 state.SetCanStart(); | |
| 291 state.UpdateState(state.NextAction()); | |
| 292 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | |
| 293 state.SetVisible(true); | |
| 294 state.SetCanDraw(true); | |
| 295 state.SetMaximumNumberOfFailedDrawsBeforeDrawIsForced(1); | |
| 296 | |
| 297 // Start a commit. | |
| 298 state.SetNeedsCommit(); | |
| 299 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, | 259 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, |
| 300 state.NextAction()); | 260 state.NextAction()); |
| 301 state.UpdateState( | 261 state.UpdateState( |
| 302 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); | 262 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); |
| 303 EXPECT_TRUE(state.CommitPending()); | 263 EXPECT_TRUE(state.CommitPending()); |
| 304 | 264 |
| 305 // Then initiate a draw. | 265 // Then initiate a draw. |
| 306 state.SetNeedsRedraw(true); | 266 state.SetNeedsRedraw(true); |
| 307 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); | 267 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); |
| 308 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | 268 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
| 309 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); | 269 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
| 270 state.NextAction()); |
| 310 EXPECT_TRUE(state.RedrawPending()); | 271 EXPECT_TRUE(state.RedrawPending()); |
| 311 | 272 |
| 312 // Fail the draw. | 273 // Fail the draw. |
| 313 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 274 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 314 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 275 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 315 state.DidDrawIfPossibleCompleted(false); | 276 state.DidDrawIfPossibleCompleted(false); |
| 316 EXPECT_TRUE(state.RedrawPending()); | 277 EXPECT_TRUE(state.RedrawPending()); |
| 317 // But the commit is ongoing. | 278 // But the commit is ongoing. |
| 318 EXPECT_TRUE(state.CommitPending()); | 279 EXPECT_TRUE(state.CommitPending()); |
| 319 | 280 |
| 320 // Finish the commit. Note, we should not yet be forcing a draw, but should | 281 // Finish the commit. Note, we should not yet be forcing a draw, but should |
| 321 // continue the commit as usual. | 282 // continue the commit as usual. |
| 322 state.FinishCommit(); | 283 state.FinishCommit(); |
| 323 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); | 284 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); |
| 324 state.UpdateState(SchedulerStateMachine::ACTION_COMMIT); | 285 state.UpdateState(SchedulerStateMachine::ACTION_COMMIT); |
| 325 EXPECT_TRUE(state.RedrawPending()); | 286 EXPECT_TRUE(state.RedrawPending()); |
| 326 | 287 |
| 327 // The redraw should be forced in this case. | 288 // The redraw should be forced in this case. |
| 328 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction()); | 289 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED, |
| 290 state.NextAction()); |
| 329 } | 291 } |
| 330 | 292 |
| 331 TEST(SchedulerStateMachineTest, | 293 TEST(SchedulerStateMachineTest, |
| 332 TestFailedDrawIsRetriedInNextBeginFrameForImplThread) { | 294 TestFailedDrawIsRetriedInNextBeginFrameForImplThread) { |
| 333 SchedulerSettings default_scheduler_settings; | 295 SchedulerSettings default_scheduler_settings; |
| 334 StateMachine state(default_scheduler_settings); | 296 StateMachine state(default_scheduler_settings); |
| 335 state.SetCanStart(); | 297 state.SetCanStart(); |
| 336 state.UpdateState(state.NextAction()); | 298 state.UpdateState(state.NextAction()); |
| 337 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 299 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 338 state.SetVisible(true); | 300 state.SetVisible(true); |
| 339 state.SetCanDraw(true); | 301 state.SetCanDraw(true); |
| 340 | 302 |
| 341 // Start a draw. | 303 // Start a draw. |
| 342 state.SetNeedsRedraw(true); | 304 state.SetNeedsRedraw(true); |
| 343 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); | 305 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); |
| 344 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | 306 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
| 345 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); | 307 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
| 308 state.NextAction()); |
| 346 EXPECT_TRUE(state.RedrawPending()); | 309 EXPECT_TRUE(state.RedrawPending()); |
| 347 | 310 |
| 348 // Fail the draw. | 311 // Fail the draw. |
| 349 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 312 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 350 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 313 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 351 state.DidDrawIfPossibleCompleted(false); | 314 state.DidDrawIfPossibleCompleted(false); |
| 352 EXPECT_TRUE(state.RedrawPending()); | 315 EXPECT_TRUE(state.RedrawPending()); |
| 353 | 316 |
| 354 // We should not be trying to draw again now, but we have a commit pending. | 317 // We should not be trying to draw again now, but we have a commit pending. |
| 355 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, | 318 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, |
| 356 state.NextAction()); | 319 state.NextAction()); |
| 357 | 320 |
| 358 state.DidLeaveBeginFrame(); | 321 state.DidLeaveBeginFrame(); |
| 359 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); | 322 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); |
| 360 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | 323 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
| 361 | 324 |
| 362 // We should try to draw again in the next begin frame on the impl thread. | 325 // We should try to draw again in the next begin frame on the impl thread. |
| 363 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); | 326 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
| 327 state.NextAction()); |
| 364 } | 328 } |
| 365 | 329 |
| 366 TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) { | 330 TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) { |
| 367 SchedulerSettings default_scheduler_settings; | 331 SchedulerSettings default_scheduler_settings; |
| 368 StateMachine state(default_scheduler_settings); | 332 StateMachine state(default_scheduler_settings); |
| 369 state.SetCanStart(); | 333 state.SetCanStart(); |
| 370 state.UpdateState(state.NextAction()); | 334 state.UpdateState(state.NextAction()); |
| 371 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 335 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 372 state.SetVisible(true); | 336 state.SetVisible(true); |
| 373 state.SetCanDraw(true); | 337 state.SetCanDraw(true); |
| 374 state.SetNeedsRedraw(true); | 338 state.SetNeedsRedraw(true); |
| 375 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); | 339 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); |
| 376 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | 340 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
| 377 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); | 341 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
| 378 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 342 state.NextAction()); |
| 343 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 379 | 344 |
| 380 // While still in the same begin frame for the impl thread, set needs redraw | 345 // While still in the same begin frame for the impl thread, set needs redraw |
| 381 // again. This should not redraw. | 346 // again. This should not redraw. |
| 382 state.SetNeedsRedraw(true); | 347 state.SetNeedsRedraw(true); |
| 383 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 348 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 384 | 349 |
| 385 // Move to another frame. This should now draw. | 350 // Move to another frame. This should now draw. |
| 386 state.DidDrawIfPossibleCompleted(true); | 351 state.DidDrawIfPossibleCompleted(true); |
| 387 state.DidLeaveBeginFrame(); | 352 state.DidLeaveBeginFrame(); |
| 388 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); | 353 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); |
| 389 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | 354 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
| 390 | 355 |
| 391 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); | 356 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
| 392 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 357 state.NextAction()); |
| 358 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 393 state.DidDrawIfPossibleCompleted(true); | 359 state.DidDrawIfPossibleCompleted(true); |
| 394 EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread()); | 360 EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread()); |
| 395 } | 361 } |
| 396 | 362 |
| 397 TEST(SchedulerStateMachineTest, TestNextActionDrawsOnBeginFrame) { | 363 TEST(SchedulerStateMachineTest, TestNextActionDrawsOnBeginFrame) { |
| 398 SchedulerSettings default_scheduler_settings; | 364 SchedulerSettings default_scheduler_settings; |
| 399 | 365 |
| 400 // When not in BeginFrame, or in BeginFrame but not visible, | 366 // When not in BeginFrame, or in BeginFrame but not visible, |
| 401 // don't draw. | 367 // don't draw. |
| 402 size_t num_commit_states = | 368 size_t num_commit_states = |
| 403 sizeof(all_commit_states) / sizeof(SchedulerStateMachine::CommitState); | 369 sizeof(all_commit_states) / sizeof(SchedulerStateMachine::CommitState); |
| 404 for (size_t i = 0; i < num_commit_states; ++i) { | 370 for (size_t i = 0; i < num_commit_states; ++i) { |
| 405 for (size_t j = 0; j < 2; ++j) { | 371 for (size_t j = 0; j < 2; ++j) { |
| 406 StateMachine state(default_scheduler_settings); | 372 StateMachine state(default_scheduler_settings); |
| 407 state.SetCanStart(); | 373 state.SetCanStart(); |
| 408 state.UpdateState(state.NextAction()); | 374 state.UpdateState(state.NextAction()); |
| 409 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 375 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 410 state.SetCommitState(all_commit_states[i]); | 376 state.SetCommitState(all_commit_states[i]); |
| 411 bool visible = j; | 377 bool visible = j; |
| 412 if (!visible) { | 378 if (!visible) { |
| 413 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | 379 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
| 414 state.SetVisible(false); | 380 state.SetVisible(false); |
| 415 } else { | 381 } else { |
| 416 state.SetVisible(true); | 382 state.SetVisible(true); |
| 417 } | 383 } |
| 418 | 384 |
| 419 // Case 1: needs_commit=false | 385 // Case 1: needs_commit=false |
| 420 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, | 386 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
| 421 state.NextAction()); | 387 state.NextAction()); |
| 422 | 388 |
| 423 // Case 2: needs_commit=true | 389 // Case 2: needs_commit=true |
| 424 state.SetNeedsCommit(); | 390 state.SetNeedsCommit(); |
| 425 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, | 391 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
| 426 state.NextAction()); | 392 state.NextAction()); |
| 427 } | 393 } |
| 428 } | 394 } |
| 429 | 395 |
| 430 // When in BeginFrame, or not in BeginFrame but needs_forced_dedraw | 396 // When in BeginFrame, or not in BeginFrame but needs_forced_dedraw |
| 431 // set, should always draw except if you're ready to commit, in which case | 397 // set, should always draw except if you're ready to commit, in which case |
| 432 // commit. | 398 // commit. |
| 433 for (size_t i = 0; i < num_commit_states; ++i) { | 399 for (size_t i = 0; i < num_commit_states; ++i) { |
| 434 for (size_t j = 0; j < 2; ++j) { | 400 for (size_t j = 0; j < 2; ++j) { |
| 401 bool request_readback = j; |
| 402 |
| 403 // Skip invalid states |
| 404 if (request_readback && |
| 405 (SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW != |
| 406 all_commit_states[i])) |
| 407 continue; |
| 408 |
| 435 StateMachine state(default_scheduler_settings); | 409 StateMachine state(default_scheduler_settings); |
| 436 state.SetCanStart(); | 410 state.SetCanStart(); |
| 437 state.UpdateState(state.NextAction()); | 411 state.UpdateState(state.NextAction()); |
| 438 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 412 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 439 state.SetCanDraw(true); | 413 state.SetCanDraw(true); |
| 440 state.SetCommitState(all_commit_states[i]); | 414 state.SetCommitState(all_commit_states[i]); |
| 441 bool forced_draw = j; | 415 if (!request_readback) { |
| 442 if (!forced_draw) { | |
| 443 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | 416 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
| 444 state.SetNeedsRedraw(true); | 417 state.SetNeedsRedraw(true); |
| 445 state.SetVisible(true); | 418 state.SetVisible(true); |
| 446 } else { | 419 } else { |
| 447 state.SetNeedsForcedRedraw(true); | 420 state.SetNeedsForcedRedrawForReadback(); |
| 448 } | 421 } |
| 449 | 422 |
| 450 SchedulerStateMachine::Action expected_action; | 423 SchedulerStateMachine::Action expected_action; |
| 451 if (all_commit_states[i] != | 424 if (all_commit_states[i] != |
| 452 SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT) { | 425 SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT) { |
| 453 expected_action = | 426 expected_action = |
| 454 forced_draw ? SchedulerStateMachine::ACTION_DRAW_FORCED | 427 request_readback |
| 455 : SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE; | 428 ? SchedulerStateMachine::ACTION_DRAW_AND_READBACK |
| 429 : SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE; |
| 456 } else { | 430 } else { |
| 457 expected_action = SchedulerStateMachine::ACTION_COMMIT; | 431 expected_action = SchedulerStateMachine::ACTION_COMMIT; |
| 458 } | 432 } |
| 459 | 433 |
| 460 // Case 1: needs_commit=false. | 434 // Case 1: needs_commit=false. |
| 461 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); | 435 EXPECT_NE(state.BeginFrameNeededToDrawByImplThread(), request_readback) |
| 436 << *state.AsValue(); |
| 462 EXPECT_EQ(expected_action, state.NextAction()) << *state.AsValue(); | 437 EXPECT_EQ(expected_action, state.NextAction()) << *state.AsValue(); |
| 463 | 438 |
| 464 // Case 2: needs_commit=true. | 439 // Case 2: needs_commit=true. |
| 465 state.SetNeedsCommit(); | 440 state.SetNeedsCommit(); |
| 466 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); | 441 EXPECT_NE(state.BeginFrameNeededToDrawByImplThread(), request_readback) |
| 442 << *state.AsValue(); |
| 467 EXPECT_EQ(expected_action, state.NextAction()) << *state.AsValue(); | 443 EXPECT_EQ(expected_action, state.NextAction()) << *state.AsValue(); |
| 468 } | 444 } |
| 469 } | 445 } |
| 470 } | 446 } |
| 471 | 447 |
| 472 TEST(SchedulerStateMachineTest, TestNoCommitStatesRedrawWhenInvisible) { | 448 TEST(SchedulerStateMachineTest, TestNoCommitStatesRedrawWhenInvisible) { |
| 473 SchedulerSettings default_scheduler_settings; | 449 SchedulerSettings default_scheduler_settings; |
| 474 | 450 |
| 475 size_t num_commit_states = | 451 size_t num_commit_states = |
| 476 sizeof(all_commit_states) / sizeof(SchedulerStateMachine::CommitState); | 452 sizeof(all_commit_states) / sizeof(SchedulerStateMachine::CommitState); |
| 477 for (size_t i = 0; i < num_commit_states; ++i) { | 453 for (size_t i = 0; i < num_commit_states; ++i) { |
| 478 // There shouldn't be any drawing regardless of BeginFrame. | 454 // There shouldn't be any drawing regardless of BeginFrame. |
| 479 for (size_t j = 0; j < 2; ++j) { | 455 for (size_t j = 0; j < 2; ++j) { |
| 480 StateMachine state(default_scheduler_settings); | 456 StateMachine state(default_scheduler_settings); |
| 481 state.SetCanStart(); | 457 state.SetCanStart(); |
| 482 state.UpdateState(state.NextAction()); | 458 state.UpdateState(state.NextAction()); |
| 483 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 459 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 484 state.SetCommitState(all_commit_states[i]); | 460 state.SetCommitState(all_commit_states[i]); |
| 485 state.SetVisible(false); | 461 state.SetVisible(false); |
| 486 state.SetNeedsRedraw(true); | 462 state.SetNeedsRedraw(true); |
| 487 state.SetNeedsForcedRedraw(false); | |
| 488 if (j == 1) | 463 if (j == 1) |
| 489 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | 464 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
| 490 | 465 |
| 491 // Case 1: needs_commit=false. | 466 // Case 1: needs_commit=false. |
| 492 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, | 467 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
| 493 state.NextAction()); | 468 state.NextAction()); |
| 494 | 469 |
| 495 // Case 2: needs_commit=true. | 470 // Case 2: needs_commit=true. |
| 496 state.SetNeedsCommit(); | 471 state.SetNeedsCommit(); |
| 497 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, | 472 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
| 498 state.NextAction()); | 473 state.NextAction()); |
| 499 } | 474 } |
| 500 } | 475 } |
| 501 } | 476 } |
| 502 | 477 |
| 503 TEST(SchedulerStateMachineTest, TestCanRedraw_StopsDraw) { | 478 TEST(SchedulerStateMachineTest, TestCanRedraw_StopsDraw) { |
| 504 SchedulerSettings default_scheduler_settings; | 479 SchedulerSettings default_scheduler_settings; |
| 505 | 480 |
| 506 size_t num_commit_states = | 481 size_t num_commit_states = |
| 507 sizeof(all_commit_states) / sizeof(SchedulerStateMachine::CommitState); | 482 sizeof(all_commit_states) / sizeof(SchedulerStateMachine::CommitState); |
| 508 for (size_t i = 0; i < num_commit_states; ++i) { | 483 for (size_t i = 0; i < num_commit_states; ++i) { |
| 509 // There shouldn't be any drawing regardless of BeginFrame. | 484 // There shouldn't be any drawing regardless of BeginFrame. |
| 510 for (size_t j = 0; j < 2; ++j) { | 485 for (size_t j = 0; j < 2; ++j) { |
| 511 StateMachine state(default_scheduler_settings); | 486 StateMachine state(default_scheduler_settings); |
| 512 state.SetCanStart(); | 487 state.SetCanStart(); |
| 513 state.UpdateState(state.NextAction()); | 488 state.UpdateState(state.NextAction()); |
| 514 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 489 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 515 state.SetCommitState(all_commit_states[i]); | 490 state.SetCommitState(all_commit_states[i]); |
| 516 state.SetVisible(false); | 491 state.SetVisible(false); |
| 517 state.SetNeedsRedraw(true); | 492 state.SetNeedsRedraw(true); |
| 518 state.SetNeedsForcedRedraw(false); | |
| 519 if (j == 1) | 493 if (j == 1) |
| 520 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | 494 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
| 521 | 495 |
| 522 state.SetCanDraw(false); | 496 state.SetCanDraw(false); |
| 523 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, | 497 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
| 524 state.NextAction()); | 498 state.NextAction()); |
| 525 } | 499 } |
| 526 } | 500 } |
| 527 } | 501 } |
| 528 | 502 |
| 529 TEST(SchedulerStateMachineTest, | 503 TEST(SchedulerStateMachineTest, |
| 530 TestCanRedrawWithWaitingForFirstDrawMakesProgress) { | 504 TestCanRedrawWithWaitingForFirstDrawMakesProgress) { |
| 531 SchedulerSettings default_scheduler_settings; | 505 SchedulerSettings default_scheduler_settings; |
| 532 StateMachine state(default_scheduler_settings); | 506 StateMachine state(default_scheduler_settings); |
| 533 state.SetCanStart(); | 507 state.SetCanStart(); |
| 534 state.UpdateState(state.NextAction()); | 508 state.UpdateState(state.NextAction()); |
| 535 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 509 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 536 state.SetCommitState( | 510 |
| 537 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW); | 511 state.SetVisible(true); |
| 512 state.SetNeedsCommit(); |
| 513 EXPECT_ACTION_UPDATE_STATE( |
| 514 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); |
| 515 state.FinishCommit(); |
| 516 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 517 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, |
| 518 state.CommitState()); |
| 519 |
| 538 state.SetNeedsCommit(); | 520 state.SetNeedsCommit(); |
| 539 state.SetNeedsRedraw(true); | 521 state.SetNeedsRedraw(true); |
| 540 state.SetVisible(true); | 522 state.SetVisible(true); |
| 541 state.SetCanDraw(false); | 523 state.SetCanDraw(false); |
| 542 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT, | 524 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT) |
| 543 state.NextAction()); | 525 |
| 544 state.UpdateState(state.NextAction()); | 526 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
| 545 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, | 527 EXPECT_ACTION_UPDATE_STATE( |
| 546 state.NextAction()); | 528 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); |
| 529 state.DidLeaveBeginFrame(); |
| 530 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 547 } | 531 } |
| 548 | 532 |
| 549 TEST(SchedulerStateMachineTest, TestsetNeedsCommitIsNotLost) { | 533 TEST(SchedulerStateMachineTest, TestsetNeedsCommitIsNotLost) { |
| 550 SchedulerSettings default_scheduler_settings; | 534 SchedulerSettings default_scheduler_settings; |
| 551 StateMachine state(default_scheduler_settings); | 535 StateMachine state(default_scheduler_settings); |
| 552 state.SetCanStart(); | 536 state.SetCanStart(); |
| 553 state.UpdateState(state.NextAction()); | 537 state.UpdateState(state.NextAction()); |
| 554 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 538 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 555 state.SetNeedsCommit(); | 539 state.SetNeedsCommit(); |
| 556 state.SetVisible(true); | 540 state.SetVisible(true); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 573 state.CommitState()); | 557 state.CommitState()); |
| 574 | 558 |
| 575 // Expect to commit regardless of BeginFrame state. | 559 // Expect to commit regardless of BeginFrame state. |
| 576 state.DidLeaveBeginFrame(); | 560 state.DidLeaveBeginFrame(); |
| 577 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); | 561 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); |
| 578 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | 562 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
| 579 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); | 563 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); |
| 580 | 564 |
| 581 // Commit and make sure we draw on next BeginFrame | 565 // Commit and make sure we draw on next BeginFrame |
| 582 state.UpdateState(SchedulerStateMachine::ACTION_COMMIT); | 566 state.UpdateState(SchedulerStateMachine::ACTION_COMMIT); |
| 583 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); | 567 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
| 568 state.NextAction()); |
| 584 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, | 569 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, |
| 585 state.CommitState()); | 570 state.CommitState()); |
| 586 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 571 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 587 state.DidDrawIfPossibleCompleted(true); | 572 state.DidDrawIfPossibleCompleted(true); |
| 588 | 573 |
| 589 // Verify that another commit will begin. | 574 // Verify that another commit will begin. |
| 590 state.DidLeaveBeginFrame(); | 575 state.DidLeaveBeginFrame(); |
| 591 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, | 576 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, |
| 592 state.NextAction()); | 577 state.NextAction()); |
| 593 } | 578 } |
| 594 | 579 |
| 595 TEST(SchedulerStateMachineTest, TestFullCycle) { | 580 TEST(SchedulerStateMachineTest, TestFullCycle) { |
| 596 SchedulerSettings default_scheduler_settings; | 581 SchedulerSettings default_scheduler_settings; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 624 state.UpdateState(SchedulerStateMachine::ACTION_COMMIT); | 609 state.UpdateState(SchedulerStateMachine::ACTION_COMMIT); |
| 625 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, | 610 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, |
| 626 state.CommitState()); | 611 state.CommitState()); |
| 627 EXPECT_TRUE(state.NeedsRedraw()); | 612 EXPECT_TRUE(state.NeedsRedraw()); |
| 628 | 613 |
| 629 // Expect to do nothing until BeginFrame. | 614 // Expect to do nothing until BeginFrame. |
| 630 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 615 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 631 | 616 |
| 632 // At BeginFrame, draw. | 617 // At BeginFrame, draw. |
| 633 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | 618 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
| 634 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); | 619 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
| 635 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 620 state.NextAction()); |
| 621 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 636 state.DidDrawIfPossibleCompleted(true); | 622 state.DidDrawIfPossibleCompleted(true); |
| 637 state.DidLeaveBeginFrame(); | 623 state.DidLeaveBeginFrame(); |
| 638 | 624 |
| 639 // Should be synchronized, no draw needed, no action needed. | 625 // Should be synchronized, no draw needed, no action needed. |
| 640 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 626 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); |
| 641 EXPECT_FALSE(state.NeedsRedraw()); | 627 EXPECT_FALSE(state.NeedsRedraw()); |
| 642 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 628 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 643 } | 629 } |
| 644 | 630 |
| 645 TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) { | 631 TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 678 state.UpdateState(SchedulerStateMachine::ACTION_COMMIT); | 664 state.UpdateState(SchedulerStateMachine::ACTION_COMMIT); |
| 679 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, | 665 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, |
| 680 state.CommitState()); | 666 state.CommitState()); |
| 681 EXPECT_TRUE(state.NeedsRedraw()); | 667 EXPECT_TRUE(state.NeedsRedraw()); |
| 682 | 668 |
| 683 // Expect to do nothing until BeginFrame. | 669 // Expect to do nothing until BeginFrame. |
| 684 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 670 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 685 | 671 |
| 686 // At BeginFrame, draw. | 672 // At BeginFrame, draw. |
| 687 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | 673 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
| 688 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); | 674 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
| 689 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); | 675 state.NextAction()); |
| 676 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); |
| 690 state.DidDrawIfPossibleCompleted(true); | 677 state.DidDrawIfPossibleCompleted(true); |
| 691 state.DidLeaveBeginFrame(); | 678 state.DidLeaveBeginFrame(); |
| 692 | 679 |
| 693 // Should be synchronized, no draw needed, no action needed. | 680 // Should be synchronized, no draw needed, no action needed. |
| 694 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 681 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); |
| 695 EXPECT_FALSE(state.NeedsRedraw()); | 682 EXPECT_FALSE(state.NeedsRedraw()); |
| 696 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, | 683 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, |
| 697 state.NextAction()); | 684 state.NextAction()); |
| 698 } | 685 } |
| 699 | 686 |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 784 state.BeginFrameAbortedByMainThread(true); | 771 state.BeginFrameAbortedByMainThread(true); |
| 785 | 772 |
| 786 // Verify that another commit doesn't start on the same frame. | 773 // Verify that another commit doesn't start on the same frame. |
| 787 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 774 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); |
| 788 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 775 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 789 EXPECT_FALSE(state.NeedsCommit()); | 776 EXPECT_FALSE(state.NeedsCommit()); |
| 790 | 777 |
| 791 // Start a new frame; draw because this is the first frame since output | 778 // Start a new frame; draw because this is the first frame since output |
| 792 // surface init'd. | 779 // surface init'd. |
| 793 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | 780 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
| 794 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()) | 781 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
| 782 state.NextAction()) |
| 795 << *state.AsValue(); | 783 << *state.AsValue(); |
| 796 state.DidLeaveBeginFrame(); | 784 state.DidLeaveBeginFrame(); |
| 797 | 785 |
| 798 // Verify another commit doesn't start on another frame either. | 786 // Verify another commit doesn't start on another frame either. |
| 799 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 787 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); |
| 800 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 788 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 801 EXPECT_FALSE(state.NeedsCommit()); | 789 EXPECT_FALSE(state.NeedsCommit()); |
| 802 | 790 |
| 803 // Verify another commit can start if requested, though. | 791 // Verify another commit can start if requested, though. |
| 804 state.SetNeedsCommit(); | 792 state.SetNeedsCommit(); |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 893 state.FinishCommit(); | 881 state.FinishCommit(); |
| 894 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); | 882 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); |
| 895 state.UpdateState(state.NextAction()); | 883 state.UpdateState(state.NextAction()); |
| 896 // Finishing the first commit after initializing an output surface should | 884 // Finishing the first commit after initializing an output surface should |
| 897 // automatically cause a redraw. | 885 // automatically cause a redraw. |
| 898 EXPECT_TRUE(state.RedrawPending()); | 886 EXPECT_TRUE(state.RedrawPending()); |
| 899 | 887 |
| 900 // Once the context is recreated, whether we draw should be based on | 888 // Once the context is recreated, whether we draw should be based on |
| 901 // SetCanDraw. | 889 // SetCanDraw. |
| 902 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | 890 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
| 903 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); | 891 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
| 892 state.NextAction()); |
| 904 state.SetCanDraw(false); | 893 state.SetCanDraw(false); |
| 905 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT, | 894 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT, |
| 906 state.NextAction()); | 895 state.NextAction()); |
| 907 state.SetCanDraw(true); | 896 state.SetCanDraw(true); |
| 908 state.DidLeaveBeginFrame(); | 897 state.DidLeaveBeginFrame(); |
| 909 } | 898 } |
| 910 | 899 |
| 911 TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) { | 900 TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) { |
| 912 SchedulerSettings default_scheduler_settings; | 901 SchedulerSettings default_scheduler_settings; |
| 913 StateMachine state(default_scheduler_settings); | 902 StateMachine state(default_scheduler_settings); |
| 914 state.SetCanStart(); | 903 state.SetCanStart(); |
| 915 state.UpdateState(state.NextAction()); | 904 state.UpdateState(state.NextAction()); |
| 916 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 905 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 917 state.SetVisible(true); | 906 state.SetVisible(true); |
| 918 state.SetCanDraw(true); | 907 state.SetCanDraw(true); |
| 919 | 908 |
| 920 // Get a commit in flight. | 909 // Get a commit in flight. |
| 921 state.SetNeedsCommit(); | 910 state.SetNeedsCommit(); |
| 922 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, | 911 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, |
| 923 state.NextAction()); | 912 state.NextAction()); |
| 924 state.UpdateState(state.NextAction()); | 913 state.UpdateState(state.NextAction()); |
| 925 | 914 |
| 926 // Set damage and expect a draw. | 915 // Set damage and expect a draw. |
| 927 state.SetNeedsRedraw(true); | 916 state.SetNeedsRedraw(true); |
| 928 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | 917 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
| 929 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); | 918 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
| 919 state.NextAction()); |
| 930 state.UpdateState(state.NextAction()); | 920 state.UpdateState(state.NextAction()); |
| 931 state.DidLeaveBeginFrame(); | 921 state.DidLeaveBeginFrame(); |
| 932 | 922 |
| 933 // Cause a lost context while the begin frame is in flight | 923 // Cause a lost context while the begin frame is in flight |
| 934 // for the main thread. | 924 // for the main thread. |
| 935 state.DidLoseOutputSurface(); | 925 state.DidLoseOutputSurface(); |
| 936 | 926 |
| 937 // Ask for another draw. Expect nothing happens. | 927 // Ask for another draw. Expect nothing happens. |
| 938 state.SetNeedsRedraw(true); | 928 state.SetNeedsRedraw(true); |
| 939 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 929 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 972 | 962 |
| 973 // Get a commit in flight. | 963 // Get a commit in flight. |
| 974 state.SetNeedsCommit(); | 964 state.SetNeedsCommit(); |
| 975 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, | 965 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, |
| 976 state.NextAction()); | 966 state.NextAction()); |
| 977 state.UpdateState(state.NextAction()); | 967 state.UpdateState(state.NextAction()); |
| 978 | 968 |
| 979 // Set damage and expect a draw. | 969 // Set damage and expect a draw. |
| 980 state.SetNeedsRedraw(true); | 970 state.SetNeedsRedraw(true); |
| 981 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | 971 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
| 982 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); | 972 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE, |
| 973 state.NextAction()); |
| 983 state.UpdateState(state.NextAction()); | 974 state.UpdateState(state.NextAction()); |
| 984 state.DidLeaveBeginFrame(); | 975 state.DidLeaveBeginFrame(); |
| 985 | 976 |
| 986 // Cause a lost context while the begin frame is in flight | 977 // Cause a lost context while the begin frame is in flight |
| 987 // for the main thread. | 978 // for the main thread. |
| 988 state.DidLoseOutputSurface(); | 979 state.DidLoseOutputSurface(); |
| 989 | 980 |
| 990 // Ask for another draw and also set needs commit. Expect nothing happens. | 981 // Ask for another draw and also set needs commit. Expect nothing happens. |
| 991 state.SetNeedsRedraw(true); | 982 state.SetNeedsRedraw(true); |
| 992 state.SetNeedsCommit(); | 983 state.SetNeedsCommit(); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1019 StateMachine state(default_scheduler_settings); | 1010 StateMachine state(default_scheduler_settings); |
| 1020 state.SetCanStart(); | 1011 state.SetCanStart(); |
| 1021 state.UpdateState(state.NextAction()); | 1012 state.UpdateState(state.NextAction()); |
| 1022 state.DidCreateAndInitializeOutputSurface(); | 1013 state.DidCreateAndInitializeOutputSurface(); |
| 1023 state.SetVisible(true); | 1014 state.SetVisible(true); |
| 1024 state.SetCanDraw(true); | 1015 state.SetCanDraw(true); |
| 1025 | 1016 |
| 1026 // Cause a lost context lost. | 1017 // Cause a lost context lost. |
| 1027 state.DidLoseOutputSurface(); | 1018 state.DidLoseOutputSurface(); |
| 1028 | 1019 |
| 1029 // Ask a forced redraw and verify it ocurrs. | 1020 // Ask a forced redraw and verify it ocurrs, even with a lost context, |
| 1030 state.SetNeedsForcedRedraw(true); | 1021 // independent of the BeginFrame stae. |
| 1031 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | 1022 state.SetNeedsForcedRedrawForReadback(); |
| 1032 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction()); | 1023 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); |
| 1033 state.DidLeaveBeginFrame(); | |
| 1034 | 1024 |
| 1035 // Clear the forced redraw bit. | 1025 // Forced redraws for readbacks need to be followed by a new commit |
| 1036 state.SetNeedsForcedRedraw(false); | 1026 // to replace the readback commit. |
| 1027 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, |
| 1028 state.CommitState()); |
| 1029 state.FinishCommit(); |
| 1030 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 1031 |
| 1032 // We don't yet have an output surface, so we the draw and swap should abort. |
| 1033 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); |
| 1037 | 1034 |
| 1038 // Expect to be told to begin context recreation, independent of | 1035 // Expect to be told to begin context recreation, independent of |
| 1039 // BeginFrame state | 1036 // BeginFrame state. |
| 1040 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, | 1037 EXPECT_ACTION_UPDATE_STATE( |
| 1038 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); |
| 1039 |
| 1040 // Ask a readback and verify it ocurrs. |
| 1041 state.SetNeedsForcedRedrawForReadback(); |
| 1042 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_READBACK, |
| 1041 state.NextAction()); | 1043 state.NextAction()); |
| 1042 state.UpdateState(state.NextAction()); | |
| 1043 | |
| 1044 // Ask a forced redraw and verify it ocurrs. | |
| 1045 state.SetNeedsForcedRedraw(true); | |
| 1046 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | |
| 1047 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction()); | |
| 1048 state.DidLeaveBeginFrame(); | |
| 1049 } | 1044 } |
| 1050 | 1045 |
| 1051 TEST(SchedulerStateMachineTest, DontDrawBeforeCommitAfterLostOutputSurface) { | 1046 TEST(SchedulerStateMachineTest, DontDrawBeforeCommitAfterLostOutputSurface) { |
| 1052 SchedulerSettings default_scheduler_settings; | 1047 SchedulerSettings default_scheduler_settings; |
| 1053 StateMachine state(default_scheduler_settings); | 1048 StateMachine state(default_scheduler_settings); |
| 1054 state.SetCanStart(); | 1049 state.SetCanStart(); |
| 1055 state.UpdateState(state.NextAction()); | 1050 state.UpdateState(state.NextAction()); |
| 1056 state.DidCreateAndInitializeOutputSurface(); | 1051 state.DidCreateAndInitializeOutputSurface(); |
| 1057 state.SetVisible(true); | 1052 state.SetVisible(true); |
| 1058 state.SetCanDraw(true); | 1053 state.SetCanDraw(true); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1073 | 1068 |
| 1074 TEST(SchedulerStateMachineTest, | 1069 TEST(SchedulerStateMachineTest, |
| 1075 TestSendBeginFrameToMainThreadWhenInvisibleAndForceCommit) { | 1070 TestSendBeginFrameToMainThreadWhenInvisibleAndForceCommit) { |
| 1076 SchedulerSettings default_scheduler_settings; | 1071 SchedulerSettings default_scheduler_settings; |
| 1077 StateMachine state(default_scheduler_settings); | 1072 StateMachine state(default_scheduler_settings); |
| 1078 state.SetCanStart(); | 1073 state.SetCanStart(); |
| 1079 state.UpdateState(state.NextAction()); | 1074 state.UpdateState(state.NextAction()); |
| 1080 state.DidCreateAndInitializeOutputSurface(); | 1075 state.DidCreateAndInitializeOutputSurface(); |
| 1081 state.SetVisible(false); | 1076 state.SetVisible(false); |
| 1082 state.SetNeedsCommit(); | 1077 state.SetNeedsCommit(); |
| 1083 state.SetNeedsForcedCommit(); | 1078 state.SetNeedsForcedCommitForReadback(); |
| 1084 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, | 1079 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, |
| 1085 state.NextAction()); | 1080 state.NextAction()); |
| 1086 } | 1081 } |
| 1087 | 1082 |
| 1088 TEST(SchedulerStateMachineTest, | 1083 TEST(SchedulerStateMachineTest, |
| 1089 TestSendBeginFrameToMainThreadWhenCanStartFalseAndForceCommit) { | 1084 TestSendBeginFrameToMainThreadWhenCanStartFalseAndForceCommit) { |
| 1090 SchedulerSettings default_scheduler_settings; | 1085 SchedulerSettings default_scheduler_settings; |
| 1091 StateMachine state(default_scheduler_settings); | 1086 StateMachine state(default_scheduler_settings); |
| 1092 state.SetVisible(true); | 1087 state.SetVisible(true); |
| 1093 state.SetCanDraw(true); | 1088 state.SetCanDraw(true); |
| 1094 state.SetNeedsCommit(); | 1089 state.SetNeedsCommit(); |
| 1095 state.SetNeedsForcedCommit(); | 1090 state.SetNeedsForcedCommitForReadback(); |
| 1096 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, | 1091 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, |
| 1097 state.NextAction()); | 1092 state.NextAction()); |
| 1098 } | 1093 } |
| 1099 | 1094 |
| 1100 TEST(SchedulerStateMachineTest, TestFinishCommitWhenCommitInProgress) { | 1095 TEST(SchedulerStateMachineTest, TestFinishCommitWhenCommitInProgress) { |
| 1101 SchedulerSettings default_scheduler_settings; | 1096 SchedulerSettings default_scheduler_settings; |
| 1102 StateMachine state(default_scheduler_settings); | 1097 StateMachine state(default_scheduler_settings); |
| 1103 state.SetCanStart(); | 1098 state.SetCanStart(); |
| 1104 state.UpdateState(state.NextAction()); | 1099 state.UpdateState(state.NextAction()); |
| 1105 state.DidCreateAndInitializeOutputSurface(); | 1100 state.DidCreateAndInitializeOutputSurface(); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1118 state.UpdateState(state.NextAction()); | 1113 state.UpdateState(state.NextAction()); |
| 1119 | 1114 |
| 1120 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1115 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 1121 } | 1116 } |
| 1122 | 1117 |
| 1123 TEST(SchedulerStateMachineTest, TestFinishCommitWhenForcedCommitInProgress) { | 1118 TEST(SchedulerStateMachineTest, TestFinishCommitWhenForcedCommitInProgress) { |
| 1124 SchedulerSettings default_scheduler_settings; | 1119 SchedulerSettings default_scheduler_settings; |
| 1125 StateMachine state(default_scheduler_settings); | 1120 StateMachine state(default_scheduler_settings); |
| 1126 state.SetCanStart(); | 1121 state.SetCanStart(); |
| 1127 state.UpdateState(state.NextAction()); | 1122 state.UpdateState(state.NextAction()); |
| 1128 state.DidCreateAndInitializeOutputSurface(); | 1123 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 1129 state.SetVisible(false); | 1124 state.SetVisible(false); |
| 1130 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS); | 1125 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS); |
| 1131 state.SetNeedsCommit(); | 1126 state.SetNeedsCommit(); |
| 1132 state.SetNeedsForcedCommit(); | 1127 state.SetNeedsForcedCommitForReadback(); |
| 1133 | 1128 |
| 1129 // The commit for readback interupts the normal commit. |
| 1134 state.FinishCommit(); | 1130 state.FinishCommit(); |
| 1135 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); | 1131 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 1136 state.UpdateState(state.NextAction()); | |
| 1137 | 1132 |
| 1138 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW, | 1133 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, |
| 1139 state.CommitState()); | 1134 state.CommitState()); |
| 1135 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); |
| 1140 | 1136 |
| 1141 // If we are waiting for forced draw then we know a begin frame is already | 1137 // When the readback interrupts the normal commit, we should not get |
| 1142 // in flight for the main thread. | 1138 // another BeginFrame on the impl thread when the readback completes. |
| 1143 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1139 EXPECT_NE(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, |
| 1140 state.NextAction()); |
| 1141 |
| 1142 // The normal commit can then proceed. |
| 1143 state.FinishCommit(); |
| 1144 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 1144 } | 1145 } |
| 1145 | 1146 |
| 1146 TEST(SchedulerStateMachineTest, TestInitialActionsWhenContextLost) { | 1147 TEST(SchedulerStateMachineTest, TestInitialActionsWhenContextLost) { |
| 1147 SchedulerSettings default_scheduler_settings; | 1148 SchedulerSettings default_scheduler_settings; |
| 1148 StateMachine state(default_scheduler_settings); | 1149 StateMachine state(default_scheduler_settings); |
| 1149 state.SetCanStart(); | 1150 state.SetCanStart(); |
| 1150 state.UpdateState(state.NextAction()); | 1151 state.UpdateState(state.NextAction()); |
| 1151 state.DidCreateAndInitializeOutputSurface(); | 1152 state.DidCreateAndInitializeOutputSurface(); |
| 1152 state.SetVisible(true); | 1153 state.SetVisible(true); |
| 1153 state.SetCanDraw(true); | 1154 state.SetCanDraw(true); |
| 1154 state.SetNeedsCommit(); | 1155 state.SetNeedsCommit(); |
| 1155 state.DidLoseOutputSurface(); | 1156 state.DidLoseOutputSurface(); |
| 1156 | 1157 |
| 1157 // When we are visible, we normally want to begin output surface creation | 1158 // When we are visible, we normally want to begin output surface creation |
| 1158 // as soon as possible. | 1159 // as soon as possible. |
| 1159 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, | 1160 EXPECT_ACTION_UPDATE_STATE( |
| 1160 state.NextAction()) << *state.AsValue(); | 1161 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); |
| 1161 state.UpdateState(state.NextAction()); | |
| 1162 | 1162 |
| 1163 state.DidCreateAndInitializeOutputSurface(); | 1163 state.DidCreateAndInitializeOutputSurface(); |
| 1164 EXPECT_EQ(state.output_surface_state(), | 1164 EXPECT_EQ(state.output_surface_state(), |
| 1165 SchedulerStateMachine::OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT); | 1165 SchedulerStateMachine::OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT); |
| 1166 | 1166 |
| 1167 // We should not send a BeginFrame to them main thread when we are invisible, | 1167 // We should not send a BeginFrame to them main thread when we are invisible, |
| 1168 // even if we've lost the output surface and are trying to get the first | 1168 // even if we've lost the output surface and are trying to get the first |
| 1169 // commit, since the main thread will just abort anyway. | 1169 // commit, since the main thread will just abort anyway. |
| 1170 state.SetVisible(false); | 1170 state.SetVisible(false); |
| 1171 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, | 1171 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, |
| 1172 state.NextAction()) << *state.AsValue(); | 1172 state.NextAction()) << *state.AsValue(); |
| 1173 | 1173 |
| 1174 // If there is a forced commit, however, we could be blocking a readback | 1174 // If there is a forced commit, however, we could be blocking a readback |
| 1175 // on the main thread, so we need to unblock it before we can get our | 1175 // on the main thread, so we need to unblock it before we can get our |
| 1176 // output surface, even if we are not visible. | 1176 // output surface, even if we are not visible. |
| 1177 state.SetNeedsForcedCommit(); | 1177 state.SetNeedsForcedCommitForReadback(); |
| 1178 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, | 1178 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, |
| 1179 state.NextAction()) << *state.AsValue(); | 1179 state.NextAction()) |
| 1180 << *state.AsValue(); |
| 1180 } | 1181 } |
| 1181 | 1182 |
| 1182 TEST(SchedulerStateMachineTest, TestImmediateFinishCommit) { | 1183 TEST(SchedulerStateMachineTest, TestImmediateFinishCommit) { |
| 1183 SchedulerSettings default_scheduler_settings; | 1184 SchedulerSettings default_scheduler_settings; |
| 1184 StateMachine state(default_scheduler_settings); | 1185 StateMachine state(default_scheduler_settings); |
| 1185 state.SetCanStart(); | 1186 state.SetCanStart(); |
| 1186 state.UpdateState(state.NextAction()); | 1187 state.UpdateState(state.NextAction()); |
| 1187 state.DidCreateAndInitializeOutputSurface(); | 1188 state.DidCreateAndInitializeOutputSurface(); |
| 1188 state.SetVisible(true); | 1189 state.SetVisible(true); |
| 1189 state.SetCanDraw(true); | 1190 state.SetCanDraw(true); |
| 1190 | 1191 |
| 1191 // Schedule a forced frame, commit it, draw it. | 1192 // Schedule a readback, commit it, draw it. |
| 1192 state.SetNeedsCommit(); | 1193 state.SetNeedsCommit(); |
| 1193 state.SetNeedsForcedCommit(); | 1194 state.SetNeedsForcedCommitForReadback(); |
| 1194 state.UpdateState(state.NextAction()); | 1195 EXPECT_ACTION_UPDATE_STATE( |
| 1196 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); |
| 1195 state.FinishCommit(); | 1197 state.FinishCommit(); |
| 1196 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); | 1198 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); |
| 1197 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, | 1199 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, |
| 1198 state.CommitState()); | 1200 state.CommitState()); |
| 1199 state.UpdateState(state.NextAction()); | 1201 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 1200 | 1202 |
| 1201 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW, | 1203 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, |
| 1202 state.CommitState()); | 1204 state.CommitState()); |
| 1203 | 1205 |
| 1204 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | 1206 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); |
| 1205 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | |
| 1206 state.SetNeedsForcedRedraw(true); | |
| 1207 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction()); | |
| 1208 state.UpdateState(state.NextAction()); | |
| 1209 state.DidDrawIfPossibleCompleted(true); | 1207 state.DidDrawIfPossibleCompleted(true); |
| 1210 state.DidLeaveBeginFrame(); | 1208 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1211 | 1209 |
| 1212 // Should be waiting for the normal begin frame from the main thread. | 1210 // Should be waiting for the normal begin frame from the main thread. |
| 1213 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, | 1211 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, |
| 1214 state.CommitState()); | 1212 state.CommitState()); |
| 1215 } | 1213 } |
| 1216 | 1214 |
| 1217 TEST(SchedulerStateMachineTest, TestImmediateFinishCommitDuringCommit) { | 1215 TEST(SchedulerStateMachineTest, TestImmediateFinishCommitDuringCommit) { |
| 1218 SchedulerSettings default_scheduler_settings; | 1216 SchedulerSettings default_scheduler_settings; |
| 1219 StateMachine state(default_scheduler_settings); | 1217 StateMachine state(default_scheduler_settings); |
| 1220 state.SetCanStart(); | 1218 state.SetCanStart(); |
| 1221 state.UpdateState(state.NextAction()); | 1219 state.UpdateState(state.NextAction()); |
| 1222 state.DidCreateAndInitializeOutputSurface(); | 1220 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 1223 state.SetVisible(true); | 1221 state.SetVisible(true); |
| 1224 state.SetCanDraw(true); | 1222 state.SetCanDraw(true); |
| 1225 | 1223 |
| 1226 // Start a normal commit. | 1224 // Start a normal commit. |
| 1227 state.SetNeedsCommit(); | 1225 state.SetNeedsCommit(); |
| 1228 state.UpdateState(state.NextAction()); | 1226 EXPECT_ACTION_UPDATE_STATE( |
| 1227 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); |
| 1229 | 1228 |
| 1230 // Schedule a forced frame, commit it, draw it. | 1229 // Schedule a readback, commit it, draw it. |
| 1231 state.SetNeedsCommit(); | 1230 state.SetNeedsCommit(); |
| 1232 state.SetNeedsForcedCommit(); | 1231 state.SetNeedsForcedCommitForReadback(); |
| 1233 state.UpdateState(state.NextAction()); | 1232 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1234 state.FinishCommit(); | 1233 state.FinishCommit(); |
| 1235 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); | |
| 1236 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, | 1234 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, |
| 1237 state.CommitState()); | 1235 state.CommitState()); |
| 1238 state.UpdateState(state.NextAction()); | 1236 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 1239 | 1237 |
| 1240 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW, | 1238 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, |
| 1241 state.CommitState()); | 1239 state.CommitState()); |
| 1242 | 1240 |
| 1243 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | 1241 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); |
| 1244 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | |
| 1245 state.SetNeedsForcedRedraw(true); | |
| 1246 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction()); | |
| 1247 state.UpdateState(state.NextAction()); | |
| 1248 state.DidDrawIfPossibleCompleted(true); | 1242 state.DidDrawIfPossibleCompleted(true); |
| 1249 state.DidLeaveBeginFrame(); | 1243 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1250 | 1244 |
| 1251 // Should be waiting for the normal begin frame from the main thread. | 1245 // Should be waiting for the normal begin frame from the main thread. |
| 1252 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, | 1246 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, |
| 1253 state.CommitState()) | 1247 state.CommitState()) |
| 1254 << *state.AsValue(); | 1248 << *state.AsValue(); |
| 1255 } | 1249 } |
| 1256 | 1250 |
| 1257 TEST(SchedulerStateMachineTest, | 1251 TEST(SchedulerStateMachineTest, |
| 1258 ImmediateBeginFrameAbortedByMainThreadWhileInvisible) { | 1252 ImmediateBeginFrameAbortedByMainThreadWhileInvisible) { |
| 1259 SchedulerSettings default_scheduler_settings; | 1253 SchedulerSettings default_scheduler_settings; |
| 1260 StateMachine state(default_scheduler_settings); | 1254 StateMachine state(default_scheduler_settings); |
| 1261 state.SetCanStart(); | 1255 state.SetCanStart(); |
| 1262 state.UpdateState(state.NextAction()); | 1256 state.UpdateState(state.NextAction()); |
| 1263 state.DidCreateAndInitializeOutputSurface(); | 1257 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 1264 state.SetVisible(true); | 1258 state.SetVisible(true); |
| 1265 state.SetCanDraw(true); | 1259 state.SetCanDraw(true); |
| 1266 | 1260 |
| 1267 state.SetNeedsCommit(); | 1261 state.SetNeedsCommit(); |
| 1268 state.UpdateState(state.NextAction()); | 1262 EXPECT_ACTION_UPDATE_STATE( |
| 1263 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); |
| 1269 | 1264 |
| 1270 state.SetNeedsCommit(); | 1265 state.SetNeedsCommit(); |
| 1271 state.SetNeedsForcedCommit(); | 1266 state.SetNeedsForcedCommitForReadback(); |
| 1272 state.UpdateState(state.NextAction()); | 1267 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1273 state.FinishCommit(); | 1268 state.FinishCommit(); |
| 1274 | 1269 |
| 1275 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); | |
| 1276 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, | 1270 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, |
| 1277 state.CommitState()); | 1271 state.CommitState()); |
| 1278 state.UpdateState(state.NextAction()); | 1272 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 1279 | 1273 |
| 1280 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW, | 1274 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, |
| 1281 state.CommitState()); | 1275 state.CommitState()); |
| 1282 | 1276 |
| 1283 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | 1277 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); |
| 1284 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | |
| 1285 state.SetNeedsForcedRedraw(true); | |
| 1286 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction()); | |
| 1287 state.UpdateState(state.NextAction()); | |
| 1288 state.DidDrawIfPossibleCompleted(true); | 1278 state.DidDrawIfPossibleCompleted(true); |
| 1289 state.DidLeaveBeginFrame(); | 1279 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1290 | 1280 |
| 1291 // Should be waiting for the main thread's begin frame. | 1281 // Should be waiting for the main thread's begin frame. |
| 1292 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, | 1282 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, |
| 1293 state.CommitState()) | 1283 state.CommitState()) |
| 1294 << *state.AsValue(); | 1284 << *state.AsValue(); |
| 1295 | 1285 |
| 1296 // Become invisible and abort the main thread's begin frame. | 1286 // Become invisible and abort the main thread's begin frame. |
| 1297 state.SetVisible(false); | 1287 state.SetVisible(false); |
| 1298 state.BeginFrameAbortedByMainThread(false); | 1288 state.BeginFrameAbortedByMainThread(false); |
| 1299 | 1289 |
| 1300 // Should be back in the idle state, but needing a commit. | 1290 // Should be back in the idle state, but needing a commit. |
| 1301 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); | 1291 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); |
| 1302 EXPECT_TRUE(state.NeedsCommit()); | 1292 EXPECT_TRUE(state.NeedsCommit()); |
| 1303 } | 1293 } |
| 1304 | 1294 |
| 1305 TEST(SchedulerStateMachineTest, ImmediateFinishCommitWhileCantDraw) { | 1295 TEST(SchedulerStateMachineTest, ImmediateFinishCommitWhileCantDraw) { |
| 1306 SchedulerSettings default_scheduler_settings; | 1296 SchedulerSettings default_scheduler_settings; |
| 1307 StateMachine state(default_scheduler_settings); | 1297 StateMachine state(default_scheduler_settings); |
| 1308 state.SetCanStart(); | 1298 state.SetCanStart(); |
| 1309 state.UpdateState(state.NextAction()); | 1299 state.UpdateState(state.NextAction()); |
| 1310 state.DidCreateAndInitializeOutputSurface(); | 1300 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 1311 state.SetVisible(true); | 1301 state.SetVisible(true); |
| 1312 state.SetCanDraw(false); | 1302 state.SetCanDraw(false); |
| 1313 | 1303 |
| 1314 state.SetNeedsCommit(); | 1304 state.SetNeedsCommit(); |
| 1315 state.UpdateState(state.NextAction()); | 1305 state.UpdateState(state.NextAction()); |
| 1316 | 1306 |
| 1317 state.SetNeedsCommit(); | 1307 state.SetNeedsCommit(); |
| 1318 state.SetNeedsForcedCommit(); | 1308 state.SetNeedsForcedCommitForReadback(); |
| 1319 state.UpdateState(state.NextAction()); | 1309 state.UpdateState(state.NextAction()); |
| 1320 state.FinishCommit(); | 1310 state.FinishCommit(); |
| 1321 | 1311 |
| 1322 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); | |
| 1323 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, | 1312 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, |
| 1324 state.CommitState()); | 1313 state.CommitState()); |
| 1325 state.UpdateState(state.NextAction()); | 1314 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); |
| 1326 | 1315 |
| 1327 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW, | 1316 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, |
| 1328 state.CommitState()); | 1317 state.CommitState()); |
| 1329 | 1318 |
| 1330 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); | 1319 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); |
| 1331 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | |
| 1332 state.SetNeedsForcedRedraw(true); | |
| 1333 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction()); | |
| 1334 state.UpdateState(state.NextAction()); | |
| 1335 state.DidDrawIfPossibleCompleted(true); | 1320 state.DidDrawIfPossibleCompleted(true); |
| 1336 state.DidLeaveBeginFrame(); | 1321 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| 1337 } | 1322 } |
| 1338 | 1323 |
| 1339 TEST(SchedulerStateMachineTest, ReportIfNotDrawing) { | 1324 TEST(SchedulerStateMachineTest, ReportIfNotDrawing) { |
| 1340 SchedulerSettings default_scheduler_settings; | 1325 SchedulerSettings default_scheduler_settings; |
| 1341 StateMachine state(default_scheduler_settings); | 1326 StateMachine state(default_scheduler_settings); |
| 1342 state.SetCanStart(); | 1327 state.SetCanStart(); |
| 1343 state.UpdateState(state.NextAction()); | 1328 state.UpdateState(state.NextAction()); |
| 1344 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 1329 state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); |
| 1345 | 1330 |
| 1346 state.SetCanDraw(true); | 1331 state.SetCanDraw(true); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1428 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1413 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 1429 | 1414 |
| 1430 state.BeginFrameAbortedByMainThread(true); | 1415 state.BeginFrameAbortedByMainThread(true); |
| 1431 | 1416 |
| 1432 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); | 1417 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
| 1433 EXPECT_FALSE(state.PendingDrawsShouldBeAborted()); | 1418 EXPECT_FALSE(state.PendingDrawsShouldBeAborted()); |
| 1434 } | 1419 } |
| 1435 | 1420 |
| 1436 } // namespace | 1421 } // namespace |
| 1437 } // namespace cc | 1422 } // namespace cc |
| OLD | NEW |