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

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

Powered by Google App Engine
This is Rietveld 408576698