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 |