Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(196)

Side by Side Diff: cc/scheduler/scheduler_state_machine_unittest.cc

Issue 23503003: cc: Add readback and forced draw states to the Scheduler (Closed) Base URL: http://git.chromium.org/chromium/src.git@schedReorg3
Patch Set: Address enne's commetns Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698