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

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

Issue 16871016: cc: Use BeginFrameArgs (Closed) Base URL: http://git.chromium.org/chromium/src.git@bfargs2
Patch Set: Fixed all existing tests! New tests pending... Created 7 years, 5 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.ToString(); \
12 if (action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE || \
13 action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED) { \
14 if (SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW == \
15 state.CommitState() && \
16 SchedulerStateMachine::OUTPUT_SURFACE_ACTIVE != \
17 state.output_surface_state()) \
18 return; \
19 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE, \
20 state.begin_frame_state()) << state.ToString(); \
21 } \
22 state.UpdateState(action); \
23 if (action == SchedulerStateMachine::ACTION_NONE) { \
24 state.AdvanceBeginFrameStateWhenNoActionsRemain(); \
25 }
26
10 namespace cc { 27 namespace cc {
11 28
12 namespace { 29 namespace {
13 30
31 const SchedulerStateMachine::BeginFrameState all_begin_frame_states[] = {
32 SchedulerStateMachine::BEGIN_FRAME_STATE_IDLE,
33 SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_BEGIN_FRAME,
34 SchedulerStateMachine::BEGIN_FRAME_STATE_DEADLINE_PENDING,
35 SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE,
36 };
37
14 const SchedulerStateMachine::CommitState all_commit_states[] = { 38 const SchedulerStateMachine::CommitState all_commit_states[] = {
15 SchedulerStateMachine::COMMIT_STATE_IDLE, 39 SchedulerStateMachine::COMMIT_STATE_IDLE,
16 SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 40 SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
17 SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, 41 SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
18 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW 42 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_ACTIVATION,
43 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
44 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW,
19 }; 45 };
20 46
21 // Exposes the protected state fields of the SchedulerStateMachine for testing 47 // Exposes the protected state fields of the SchedulerStateMachine for testing
22 class StateMachine : public SchedulerStateMachine { 48 class StateMachine : public SchedulerStateMachine {
23 public: 49 public:
24 explicit StateMachine(const SchedulerSettings& scheduler_settings) 50 explicit StateMachine(const SchedulerSettings& scheduler_settings)
25 : SchedulerStateMachine(scheduler_settings) {} 51 : SchedulerStateMachine(scheduler_settings) {}
26 void SetCommitState(CommitState cs) { commit_state_ = cs; } 52 void SetCommitState(CommitState cs) { commit_state_ = cs; }
27 CommitState CommitState() const { return commit_state_; } 53 CommitState CommitState() const { return commit_state_; }
28 54
55 void SetBeginFrameState(BeginFrameState bfs) { begin_frame_state_ = bfs; }
56 BeginFrameState begin_frame_state() const { return begin_frame_state_; }
57
58 OutputSurfaceState output_surface_state() {
59 return output_surface_state_;
60 }
61
29 bool NeedsCommit() const { return needs_commit_; } 62 bool NeedsCommit() const { return needs_commit_; }
30 63
31 void SetNeedsRedraw(bool b) { needs_redraw_ = b; } 64 void SetNeedsRedraw(bool b) { needs_redraw_ = b; }
32 bool NeedsRedraw() const { return needs_redraw_; } 65 bool NeedsRedraw() const { return needs_redraw_; }
33 66
34 void SetNeedsForcedRedraw(bool b) { needs_forced_redraw_ = b; } 67 void SetNeedsForcedRedrawForTimeout(bool b) {
35 bool NeedsForcedRedraw() const { return needs_forced_redraw_; } 68 forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_COMMIT;
69 }
70 bool NeedsForcedRedrawForTimeout() const {
71 return forced_redraw_state_ != FORCED_REDRAW_STATE_IDLE;
72 }
73
74 void SetNeedsForcedRedrawForReadback() {
75 readback_state_ = READBACK_STATE_WAITING_FOR_DRAW_AND_READBACK;
76 }
77
78 bool NeedsForcedRedrawForReadback() const {
79 return readback_state_ != READBACK_STATE_IDLE;
80 }
36 81
37 bool CanDraw() const { return can_draw_; } 82 bool CanDraw() const { return can_draw_; }
38 bool Visible() const { return visible_; } 83 bool Visible() const { return visible_; }
39 }; 84 };
40 85
41 TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) { 86 TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) {
42 SchedulerSettings default_scheduler_settings; 87 SchedulerSettings default_scheduler_settings;
43 88
44 // If no commit needed, do nothing. 89 // If no commit needed, do nothing.
45 { 90 {
46 StateMachine state(default_scheduler_settings); 91 StateMachine state(default_scheduler_settings);
47 state.SetCanStart(); 92 state.SetCanStart();
48 state.UpdateState(state.NextAction()); 93 state.UpdateState(state.NextAction());
49 state.DidCreateAndInitializeOutputSurface(); 94 state.DidCreateAndInitializeOutputSurface();
50 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); 95 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE);
51 state.SetNeedsRedraw(false); 96 state.SetNeedsRedraw(false);
52 state.SetVisible(true); 97 state.SetVisible(true);
53 98
54 EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread()); 99 EXPECT_FALSE(state.BeginFrameNeededByImplThread());
55 100
56 state.DidLeaveBeginFrame(); 101 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
57 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 102 EXPECT_FALSE(state.BeginFrameNeededByImplThread());
58 EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread()); 103 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
59 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 104
60 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 105 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
106 state.OnBeginFrameDeadline();
61 } 107 }
62 108
63 // If commit requested but can_start is still false, do nothing. 109 // If commit requested but can_start is still false, do nothing.
64 { 110 {
65 StateMachine state(default_scheduler_settings); 111 StateMachine state(default_scheduler_settings);
66 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); 112 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE);
67 state.SetNeedsRedraw(false); 113 state.SetNeedsRedraw(false);
68 state.SetVisible(true); 114 state.SetVisible(true);
69 115
70 EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread()); 116 EXPECT_FALSE(state.BeginFrameNeededByImplThread());
71 117
72 state.DidLeaveBeginFrame(); 118 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
73 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 119 EXPECT_FALSE(state.BeginFrameNeededByImplThread());
74 EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread()); 120 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
75 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 121 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
76 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 122 state.OnBeginFrameDeadline();
77 } 123 }
78 124
79 // If commit requested, begin a main frame. 125 // If commit requested, begin a main frame.
80 { 126 {
81 StateMachine state(default_scheduler_settings); 127 StateMachine state(default_scheduler_settings);
82 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); 128 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE);
83 state.SetCanStart(); 129 state.SetCanStart();
84 state.SetNeedsRedraw(false); 130 state.SetNeedsRedraw(false);
85 state.SetVisible(true); 131 state.SetVisible(true);
86 EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread()); 132 EXPECT_FALSE(state.BeginFrameNeededByImplThread());
87 } 133 }
88 134
89 // Begin the frame, make sure needs_commit and commit_state update correctly. 135 // Begin the frame, make sure needs_commit and commit_state update correctly.
90 { 136 {
91 StateMachine state(default_scheduler_settings); 137 StateMachine state(default_scheduler_settings);
92 state.SetCanStart(); 138 state.SetCanStart();
93 state.UpdateState(state.NextAction()); 139 state.UpdateState(state.NextAction());
94 state.DidCreateAndInitializeOutputSurface(); 140 state.DidCreateAndInitializeOutputSurface();
95 state.SetVisible(true); 141 state.SetVisible(true);
96 state.UpdateState( 142 state.UpdateState(
97 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); 143 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
98 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 144 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
99 state.CommitState()); 145 state.CommitState());
100 EXPECT_FALSE(state.NeedsCommit()); 146 EXPECT_FALSE(state.NeedsCommit());
101 EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread()); 147 EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread());
102 } 148 }
103 } 149 }
104 150
105 TEST(SchedulerStateMachineTest, TestSetForcedRedrawDoesNotSetsNormalRedraw) { 151 TEST(SchedulerStateMachineTest, TestSetForcedRedrawDoesNotSetsNormalRedraw) {
106 SchedulerSettings default_scheduler_settings; 152 SchedulerSettings default_scheduler_settings;
107 SchedulerStateMachine state(default_scheduler_settings); 153 StateMachine state(default_scheduler_settings);
108 state.SetCanDraw(true); 154 state.SetCanDraw(true);
109 state.SetNeedsForcedRedraw(); 155 state.SetNeedsForcedRedrawForReadback();
110 EXPECT_FALSE(state.RedrawPending()); 156 EXPECT_FALSE(state.RedrawPending());
111 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); 157 EXPECT_FALSE(state.BeginFrameNeededByImplThread());
112 } 158 }
113 159
114 TEST(SchedulerStateMachineTest, 160 TEST(SchedulerStateMachineTest,
115 TestFailedDrawSetsNeedsCommitAndDoesNotDrawAgain) { 161 TestFailedDrawSetsNeedsCommitAndDoesNotDrawAgain) {
116 SchedulerSettings default_scheduler_settings; 162 SchedulerSettings default_scheduler_settings;
117 SchedulerStateMachine state(default_scheduler_settings); 163 StateMachine state(default_scheduler_settings);
118 state.SetCanStart(); 164 state.SetCanStart();
119 state.UpdateState(state.NextAction()); 165 state.UpdateState(state.NextAction());
120 state.DidCreateAndInitializeOutputSurface(); 166 state.DidCreateAndInitializeOutputSurface();
121 state.SetVisible(true); 167 state.SetVisible(true);
122 state.SetCanDraw(true); 168 state.SetCanDraw(true);
123 state.SetNeedsRedraw(); 169 state.SetNeedsRedraw(true);
124 EXPECT_TRUE(state.RedrawPending()); 170 EXPECT_TRUE(state.RedrawPending());
125 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); 171 EXPECT_TRUE(state.BeginFrameNeededByImplThread());
126 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 172 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
173 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
174 state.OnBeginFrameDeadline();
127 175
128 // We're drawing now. 176 // We're drawing now.
129 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); 177 EXPECT_ACTION_UPDATE_STATE(
130 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 178 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
131 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 179 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
180
132 EXPECT_FALSE(state.RedrawPending()); 181 EXPECT_FALSE(state.RedrawPending());
133 EXPECT_FALSE(state.CommitPending()); 182 EXPECT_FALSE(state.CommitPending());
134 183
135 // Failing the draw makes us require a commit. 184 // Failing the draw makes us require a commit.
136 state.DidDrawIfPossibleCompleted(false); 185 state.DidDrawIfPossibleCompleted(false);
137 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 186 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
138 state.NextAction()); 187 EXPECT_ACTION_UPDATE_STATE(
139 state.UpdateState(
140 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); 188 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
141 EXPECT_TRUE(state.RedrawPending()); 189 EXPECT_TRUE(state.RedrawPending());
142 EXPECT_TRUE(state.CommitPending()); 190 EXPECT_TRUE(state.CommitPending());
143 } 191 }
144 192
145 TEST(SchedulerStateMachineTest, 193 TEST(SchedulerStateMachineTest,
146 TestsetNeedsRedrawDuringFailedDrawDoesNotRemoveNeedsRedraw) { 194 TestsetNeedsRedrawDuringFailedDrawDoesNotRemoveNeedsRedraw) {
147 SchedulerSettings default_scheduler_settings; 195 SchedulerSettings default_scheduler_settings;
148 SchedulerStateMachine state(default_scheduler_settings); 196 StateMachine state(default_scheduler_settings);
149 state.SetCanStart(); 197 state.SetCanStart();
150 state.UpdateState(state.NextAction()); 198 state.UpdateState(state.NextAction());
151 state.DidCreateAndInitializeOutputSurface(); 199 state.DidCreateAndInitializeOutputSurface();
152 200
153 state.SetVisible(true); 201 state.SetVisible(true);
154 state.SetCanDraw(true); 202 state.SetCanDraw(true);
155 state.SetNeedsRedraw(); 203 state.SetNeedsRedraw(true);
156 EXPECT_TRUE(state.RedrawPending()); 204 EXPECT_TRUE(state.RedrawPending());
157 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); 205 EXPECT_TRUE(state.BeginFrameNeededByImplThread());
158 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 206 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
207 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
208 state.OnBeginFrameDeadline();
159 209
160 // We're drawing now. 210 // We're drawing now.
161 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); 211 EXPECT_ACTION_UPDATE_STATE(
162 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 212 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
163 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 213 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
164 EXPECT_FALSE(state.RedrawPending()); 214 EXPECT_FALSE(state.RedrawPending());
165 EXPECT_FALSE(state.CommitPending()); 215 EXPECT_FALSE(state.CommitPending());
166 216
167 // While still in the same begin frame callback on the main thread, 217 // While still in the same begin frame callback on the main thread,
168 // set needs redraw again. This should not redraw. 218 // set needs redraw again. This should not redraw.
169 state.SetNeedsRedraw(); 219 state.SetNeedsRedraw(true);
170 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 220 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
171 221
172 // Failing the draw makes us require a commit. 222 // Failing the draw makes us require a commit.
173 state.DidDrawIfPossibleCompleted(false); 223 state.DidDrawIfPossibleCompleted(false);
174 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 224 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
175 state.NextAction()); 225 EXPECT_ACTION_UPDATE_STATE(
226 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
176 EXPECT_TRUE(state.RedrawPending()); 227 EXPECT_TRUE(state.RedrawPending());
177 } 228 }
178 229
179 TEST(SchedulerStateMachineTest, 230 TEST(SchedulerStateMachineTest,
180 TestCommitAfterFailedDrawAllowsDrawInSameFrame) {
181 SchedulerSettings default_scheduler_settings;
182 SchedulerStateMachine state(default_scheduler_settings);
183 state.SetCanStart();
184 state.UpdateState(state.NextAction());
185 state.DidCreateAndInitializeOutputSurface();
186 state.SetVisible(true);
187 state.SetCanDraw(true);
188
189 // Start a commit.
190 state.SetNeedsCommit();
191 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
192 state.NextAction());
193 state.UpdateState(
194 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
195 EXPECT_TRUE(state.CommitPending());
196
197 // Then initiate a draw.
198 state.SetNeedsRedraw();
199 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread());
200 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
201 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
202 EXPECT_TRUE(state.RedrawPending());
203
204 // Fail the draw.
205 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
206 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
207 state.DidDrawIfPossibleCompleted(false);
208 EXPECT_TRUE(state.RedrawPending());
209 // But the commit is ongoing.
210 EXPECT_TRUE(state.CommitPending());
211
212 // Finish the commit.
213 state.FinishCommit();
214 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
215 state.UpdateState(SchedulerStateMachine::ACTION_COMMIT);
216 EXPECT_TRUE(state.RedrawPending());
217
218 // And we should be allowed to draw again.
219 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
220 }
221
222 TEST(SchedulerStateMachineTest,
223 TestCommitAfterFailedAndSuccessfulDrawDoesNotAllowDrawInSameFrame) {
224 SchedulerSettings default_scheduler_settings;
225 SchedulerStateMachine state(default_scheduler_settings);
226 state.SetCanStart();
227 state.UpdateState(state.NextAction());
228 state.DidCreateAndInitializeOutputSurface();
229 state.SetVisible(true);
230 state.SetCanDraw(true);
231
232 // Start a commit.
233 state.SetNeedsCommit();
234 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
235 state.NextAction());
236 state.UpdateState(
237 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
238 EXPECT_TRUE(state.CommitPending());
239
240 // Then initiate a draw.
241 state.SetNeedsRedraw();
242 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread());
243 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
244 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
245 EXPECT_TRUE(state.RedrawPending());
246
247 // Fail the draw.
248 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
249 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
250 state.DidDrawIfPossibleCompleted(false);
251 EXPECT_TRUE(state.RedrawPending());
252 // But the commit is ongoing.
253 EXPECT_TRUE(state.CommitPending());
254
255 // Force a draw.
256 state.SetNeedsForcedRedraw();
257 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction());
258
259 // Do the forced draw.
260 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_FORCED);
261 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
262 EXPECT_FALSE(state.RedrawPending());
263 // And the commit is still ongoing.
264 EXPECT_TRUE(state.CommitPending());
265
266 // Finish the commit.
267 state.FinishCommit();
268 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
269 state.UpdateState(SchedulerStateMachine::ACTION_COMMIT);
270 EXPECT_TRUE(state.RedrawPending());
271
272 // And we should not be allowed to draw again in the same frame..
273 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
274 }
275
276 TEST(SchedulerStateMachineTest,
277 TestFailedDrawsWillEventuallyForceADrawAfterTheNextCommit) { 231 TestFailedDrawsWillEventuallyForceADrawAfterTheNextCommit) {
278 SchedulerSettings default_scheduler_settings; 232 SchedulerSettings default_scheduler_settings;
279 SchedulerStateMachine state(default_scheduler_settings); 233 StateMachine state(default_scheduler_settings);
280 state.SetCanStart(); 234 state.SetCanStart();
281 state.UpdateState(state.NextAction()); 235 state.UpdateState(state.NextAction());
282 state.DidCreateAndInitializeOutputSurface(); 236 state.DidCreateAndInitializeOutputSurface();
283 state.SetVisible(true); 237 state.SetVisible(true);
284 state.SetCanDraw(true); 238 state.SetCanDraw(true);
285 state.SetMaximumNumberOfFailedDrawsBeforeDrawIsForced(1); 239 state.SetMaximumNumberOfFailedDrawsBeforeDrawIsForced(1);
286 240
287 // Start a commit. 241 // Start a commit.
288 state.SetNeedsCommit(); 242 state.SetNeedsCommit();
289 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 243 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
290 state.NextAction()); 244 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
291 state.UpdateState( 245 EXPECT_ACTION_UPDATE_STATE(
292 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); 246 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
247 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
293 EXPECT_TRUE(state.CommitPending()); 248 EXPECT_TRUE(state.CommitPending());
294 249
295 // Then initiate a draw. 250 // Then initiate a draw.
296 state.SetNeedsRedraw(); 251 state.SetNeedsRedraw(true);
297 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); 252 state.OnBeginFrameDeadline();
298 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 253 EXPECT_ACTION_UPDATE_STATE(
299 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); 254 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
300 EXPECT_TRUE(state.RedrawPending());
301 255
302 // Fail the draw. 256 // Fail the draw.
303 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
304 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
305 state.DidDrawIfPossibleCompleted(false); 257 state.DidDrawIfPossibleCompleted(false);
258 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
259 EXPECT_TRUE(state.BeginFrameNeededByImplThread());
306 EXPECT_TRUE(state.RedrawPending()); 260 EXPECT_TRUE(state.RedrawPending());
307 // But the commit is ongoing. 261 // But the commit is ongoing.
308 EXPECT_TRUE(state.CommitPending()); 262 EXPECT_TRUE(state.CommitPending());
309 263
310 // Finish the commit. Note, we should not yet be forcing a draw, but should 264 // Finish the commit. Note, we should not yet be forcing a draw, but should
311 // continue the commit as usual. 265 // continue the commit as usual.
312 state.FinishCommit(); 266 state.FinishCommit();
313 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); 267 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
314 state.UpdateState(SchedulerStateMachine::ACTION_COMMIT); 268 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
315 EXPECT_TRUE(state.RedrawPending()); 269 EXPECT_TRUE(state.RedrawPending());
316 270
317 // The redraw should be forced in this case. 271 // The redraw should be forced at the end of the next BeginFrame.
318 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction()); 272 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
273 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
274 state.OnBeginFrameDeadline();
275 EXPECT_ACTION_UPDATE_STATE(
276 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED);
319 } 277 }
320 278
321 TEST(SchedulerStateMachineTest, 279 TEST(SchedulerStateMachineTest,
322 TestFailedDrawIsRetriedInNextBeginFrameForImplThread) { 280 TestFailedDrawIsRetriedInNextBeginFrameForImplThread) {
323 SchedulerSettings default_scheduler_settings; 281 SchedulerSettings default_scheduler_settings;
324 SchedulerStateMachine state(default_scheduler_settings); 282 StateMachine state(default_scheduler_settings);
325 state.SetCanStart(); 283 state.SetCanStart();
326 state.UpdateState(state.NextAction()); 284 state.UpdateState(state.NextAction());
327 state.DidCreateAndInitializeOutputSurface(); 285 state.DidCreateAndInitializeOutputSurface();
328 state.SetVisible(true); 286 state.SetVisible(true);
329 state.SetCanDraw(true); 287 state.SetCanDraw(true);
330 288
331 // Start a draw. 289 // Start a draw.
332 state.SetNeedsRedraw(); 290 state.SetNeedsRedraw(true);
333 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); 291 EXPECT_TRUE(state.BeginFrameNeededByImplThread());
334 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 292 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
335 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); 293 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
294 state.OnBeginFrameDeadline();
336 EXPECT_TRUE(state.RedrawPending()); 295 EXPECT_TRUE(state.RedrawPending());
296 EXPECT_ACTION_UPDATE_STATE(
297 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
337 298
338 // Fail the draw. 299 // Fail the draw
339 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
340 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
341 state.DidDrawIfPossibleCompleted(false); 300 state.DidDrawIfPossibleCompleted(false);
301 EXPECT_ACTION_UPDATE_STATE(
302 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
303 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
342 EXPECT_TRUE(state.RedrawPending()); 304 EXPECT_TRUE(state.RedrawPending());
343 305
344 // We should not be trying to draw again now, but we have a commit pending. 306 // We should not be trying to draw again now, but we have a commit pending.
345 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 307 EXPECT_TRUE(state.BeginFrameNeededByImplThread());
346 state.NextAction()); 308 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
309 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
347 310
348 state.DidLeaveBeginFrame(); 311 // We should try to draw again at the end of the next BeginFrame on
349 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); 312 // the impl thread.
350 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 313 state.OnBeginFrameDeadline();
351 314 EXPECT_ACTION_UPDATE_STATE(
352 // We should try to draw again in the next begin frame on the impl thread. 315 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
353 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); 316 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
354 } 317 }
355 318
356 TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) { 319 TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) {
357 SchedulerSettings default_scheduler_settings; 320 SchedulerSettings default_scheduler_settings;
358 SchedulerStateMachine state(default_scheduler_settings); 321 StateMachine state(default_scheduler_settings);
359 state.SetCanStart(); 322 state.SetCanStart();
360 state.UpdateState(state.NextAction()); 323 state.UpdateState(state.NextAction());
361 state.DidCreateAndInitializeOutputSurface(); 324 state.DidCreateAndInitializeOutputSurface();
362 state.SetVisible(true); 325 state.SetVisible(true);
363 state.SetCanDraw(true); 326 state.SetCanDraw(true);
364 state.SetNeedsRedraw(); 327 state.SetNeedsRedraw(true);
365 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread());
366 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
367 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
368 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
369 328
370 // While still in the same begin frame for the impl thread, set needs redraw 329 // Draw the first frame.
371 // again. This should not redraw. 330 EXPECT_TRUE(state.BeginFrameNeededByImplThread());
372 state.SetNeedsRedraw(); 331 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
373 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 332 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
333
334 state.OnBeginFrameDeadline();
335 EXPECT_ACTION_UPDATE_STATE(
336 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
337 state.DidDrawIfPossibleCompleted(true);
338 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
339
340 // Before the next begin frame for the impl thread, set needs redraw
341 // again. This should not redraw until the next begin frame.
342 state.SetNeedsRedraw(true);
343 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
374 344
375 // Move to another frame. This should now draw. 345 // Move to another frame. This should now draw.
346 EXPECT_TRUE(state.BeginFrameNeededByImplThread());
347 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
348
349 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
350
351 state.OnBeginFrameDeadline();
352 EXPECT_ACTION_UPDATE_STATE(
353 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
376 state.DidDrawIfPossibleCompleted(true); 354 state.DidDrawIfPossibleCompleted(true);
377 state.DidLeaveBeginFrame(); 355 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
378 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); 356 EXPECT_FALSE(state.BeginFrameNeededByImplThread());
379 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
380
381 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction());
382 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
383 state.DidDrawIfPossibleCompleted(true);
384 EXPECT_FALSE(state.BeginFrameNeededToDrawByImplThread());
385 } 357 }
386 358
387 TEST(SchedulerStateMachineTest, TestNextActionDrawsOnBeginFrame) { 359 TEST(SchedulerStateMachineTest, TestNextActionDrawsOnBeginFrame) {
388 SchedulerSettings default_scheduler_settings; 360 SchedulerSettings default_scheduler_settings;
389 361
390 // When not in BeginFrame, or in BeginFrame but not visible, 362 // When not in BeginFrame deadline, or in BeginFrame deadline but not visible,
391 // don't draw. 363 // don't draw.
392 size_t num_commit_states = 364 size_t num_commit_states = sizeof(all_commit_states) /
393 sizeof(all_commit_states) / sizeof(SchedulerStateMachine::CommitState); 365 sizeof(SchedulerStateMachine::CommitState);
366 size_t num_begin_frame_states = sizeof(all_begin_frame_states) /
367 sizeof(SchedulerStateMachine::BeginFrameState);
394 for (size_t i = 0; i < num_commit_states; ++i) { 368 for (size_t i = 0; i < num_commit_states; ++i) {
395 for (size_t j = 0; j < 2; ++j) { 369 for (size_t j = 0; j < num_begin_frame_states; ++j) {
370 // We aren't testing forced draws here.
371 if (SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW ==
372 all_commit_states[i])
373 continue;
374
396 StateMachine state(default_scheduler_settings); 375 StateMachine state(default_scheduler_settings);
397 state.SetCanStart(); 376 state.SetCanStart();
398 state.UpdateState(state.NextAction()); 377 state.UpdateState(state.NextAction());
399 state.DidCreateAndInitializeOutputSurface(); 378 state.DidCreateAndInitializeOutputSurface();
400 state.SetCommitState(all_commit_states[i]); 379 state.SetCommitState(all_commit_states[i]);
401 bool visible = j; 380 state.SetBeginFrameState(all_begin_frame_states[j]);
402 if (!visible) { 381 bool visible = (all_begin_frame_states[j] ==
403 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 382 SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE);
404 state.SetVisible(false); 383 state.SetVisible(visible);
405 } else {
406 state.SetVisible(true);
407 }
408 384
409 // Case 1: needs_commit=false 385 // Case 1: needs_commit=false
410 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, 386 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
411 state.NextAction()); 387 state.NextAction());
412 388
413 // Case 2: needs_commit=true 389 // Case 2: needs_commit=true
414 state.SetNeedsCommit(); 390 state.SetNeedsCommit();
415 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, 391 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
416 state.NextAction()); 392 state.NextAction());
417 } 393 }
418 } 394 }
419 395
420 // When in BeginFrame, or not in BeginFrame but needs_forced_dedraw 396 // When in BeginFrame deadline we should always draw for SetNeedsRedraw or
421 // set, should always draw except if you're ready to commit, in which case 397 // SetNeedsForcedRedrawForReadback have been called... except if we're
422 // commit. 398 // ready to commit, in which case we expect a commit first.
423 for (size_t i = 0; i < num_commit_states; ++i) { 399 for (size_t i = 0; i < num_commit_states; ++i) {
424 for (size_t j = 0; j < 2; ++j) { 400 for (size_t j = 0; j < 2; ++j) {
401 bool forced_draw_for_readback = j;
402 // Skip invalid states
403 if ((SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW ==
404 all_commit_states[i]) &&
405 !forced_draw_for_readback)
406 continue;
407
425 StateMachine state(default_scheduler_settings); 408 StateMachine state(default_scheduler_settings);
426 state.SetCanStart(); 409 state.SetCanStart();
427 state.UpdateState(state.NextAction()); 410 state.UpdateState(state.NextAction());
428 state.DidCreateAndInitializeOutputSurface(); 411 state.DidCreateAndInitializeOutputSurface();
429 state.SetCanDraw(true); 412 state.SetCanDraw(true);
430 state.SetCommitState(all_commit_states[i]); 413 state.SetCommitState(all_commit_states[i]);
431 bool forced_draw = j; 414 state.SetBeginFrameState(
432 if (!forced_draw) { 415 SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE);
433 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 416 if (!forced_draw_for_readback) {
434 state.SetNeedsRedraw(true); 417 state.SetNeedsRedraw(true);
435 state.SetVisible(true); 418 state.SetVisible(true);
436 } else { 419 } else {
437 state.SetNeedsForcedRedraw(true); 420 state.SetNeedsForcedRedrawForReadback();
438 } 421 }
439 422
440 SchedulerStateMachine::Action expected_action; 423 SchedulerStateMachine::Action expected_action;
441 if (all_commit_states[i] != 424 if (all_commit_states[i] ==
442 SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT) { 425 SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT) {
426 expected_action = SchedulerStateMachine::ACTION_COMMIT;
427 } else if (forced_draw_for_readback) {
428 if (all_commit_states[i] ==
429 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW)
430 expected_action = SchedulerStateMachine::ACTION_DRAW_AND_READBACK;
431 else
432 expected_action = SchedulerStateMachine::ACTION_NONE;
433 } else {
443 expected_action = 434 expected_action =
444 forced_draw ? SchedulerStateMachine::ACTION_DRAW_FORCED 435 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE;
445 : SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE;
446 } else {
447 expected_action = SchedulerStateMachine::ACTION_COMMIT;
448 } 436 }
449 437
450 // Case 1: needs_commit=false. 438 // Case 1: needs_commit=false.
451 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); 439 EXPECT_EQ(state.BeginFrameNeededByImplThread(),
440 !forced_draw_for_readback);
452 EXPECT_EQ(expected_action, state.NextAction()); 441 EXPECT_EQ(expected_action, state.NextAction());
453 442
454 // Case 2: needs_commit=true. 443 // Case 2: needs_commit=true.
455 state.SetNeedsCommit(); 444 state.SetNeedsCommit();
456 EXPECT_TRUE(state.BeginFrameNeededToDrawByImplThread()); 445 EXPECT_EQ(state.BeginFrameNeededByImplThread(),
446 !forced_draw_for_readback);
457 EXPECT_EQ(expected_action, state.NextAction()); 447 EXPECT_EQ(expected_action, state.NextAction());
458 } 448 }
459 } 449 }
460 } 450 }
461 451
462 TEST(SchedulerStateMachineTest, TestNoCommitStatesRedrawWhenInvisible) { 452 TEST(SchedulerStateMachineTest, TestNoCommitStatesRedrawWhenInvisible) {
463 SchedulerSettings default_scheduler_settings; 453 SchedulerSettings default_scheduler_settings;
464 454
465 size_t num_commit_states = 455 size_t num_commit_states =
466 sizeof(all_commit_states) / sizeof(SchedulerStateMachine::CommitState); 456 sizeof(all_commit_states) / sizeof(SchedulerStateMachine::CommitState);
467 for (size_t i = 0; i < num_commit_states; ++i) { 457 for (size_t i = 0; i < num_commit_states; ++i) {
468 // There shouldn't be any drawing regardless of BeginFrame. 458 // There shouldn't be any drawing regardless of BeginFrame.
469 for (size_t j = 0; j < 2; ++j) { 459 for (size_t j = 0; j < 2; ++j) {
470 StateMachine state(default_scheduler_settings); 460 StateMachine state(default_scheduler_settings);
471 state.SetCanStart(); 461 state.SetCanStart();
472 state.UpdateState(state.NextAction()); 462 state.UpdateState(state.NextAction());
473 state.DidCreateAndInitializeOutputSurface(); 463 state.DidCreateAndInitializeOutputSurface();
474 state.SetCommitState(all_commit_states[i]); 464 state.SetCommitState(all_commit_states[i]);
475 state.SetVisible(false); 465 state.SetVisible(false);
476 state.SetNeedsRedraw(true); 466 state.SetNeedsRedraw(true);
477 state.SetNeedsForcedRedraw(false); 467 state.SetNeedsForcedRedrawForReadback();
478 if (j == 1) 468 if (j == 1) {
479 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 469 state.SetBeginFrameState(
470 SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE);
471 }
480 472
481 // Case 1: needs_commit=false. 473 // Case 1: needs_commit=false.
482 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, 474 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
483 state.NextAction()); 475 state.NextAction());
484 476
485 // Case 2: needs_commit=true. 477 // Case 2: needs_commit=true.
486 state.SetNeedsCommit(); 478 state.SetNeedsCommit();
487 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, 479 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
488 state.NextAction()); 480 state.NextAction());
489 } 481 }
490 } 482 }
491 } 483 }
492 484
493 TEST(SchedulerStateMachineTest, TestCanRedraw_StopsDraw) { 485 TEST(SchedulerStateMachineTest, TestCanRedraw_StopsDraw) {
494 SchedulerSettings default_scheduler_settings; 486 SchedulerSettings default_scheduler_settings;
495 487
496 size_t num_commit_states = 488 size_t num_commit_states =
497 sizeof(all_commit_states) / sizeof(SchedulerStateMachine::CommitState); 489 sizeof(all_commit_states) / sizeof(SchedulerStateMachine::CommitState);
498 for (size_t i = 0; i < num_commit_states; ++i) { 490 for (size_t i = 0; i < num_commit_states; ++i) {
499 // There shouldn't be any drawing regardless of BeginFrame. 491 // There shouldn't be any drawing regardless of BeginFrame.
500 for (size_t j = 0; j < 2; ++j) { 492 for (size_t j = 0; j < 2; ++j) {
501 StateMachine state(default_scheduler_settings); 493 StateMachine state(default_scheduler_settings);
502 state.SetCanStart(); 494 state.SetCanStart();
503 state.UpdateState(state.NextAction()); 495 state.UpdateState(state.NextAction());
504 state.DidCreateAndInitializeOutputSurface(); 496 state.DidCreateAndInitializeOutputSurface();
505 state.SetCommitState(all_commit_states[i]); 497 state.SetCommitState(all_commit_states[i]);
506 state.SetVisible(false); 498 state.SetVisible(false);
507 state.SetNeedsRedraw(true); 499 state.SetNeedsRedraw(true);
508 state.SetNeedsForcedRedraw(false); 500 state.SetNeedsForcedRedrawForReadback();
509 if (j == 1) 501 if (j == 1)
510 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 502 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
511 503
512 state.SetCanDraw(false); 504 state.SetCanDraw(false);
513 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, 505 EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
514 state.NextAction()); 506 state.NextAction());
515 } 507 }
516 } 508 }
517 } 509 }
518 510
519 TEST(SchedulerStateMachineTest, 511 TEST(SchedulerStateMachineTest,
520 TestCanRedrawWithWaitingForFirstDrawMakesProgress) { 512 TestCanRedrawWithWaitingForFirstDrawMakesProgress) {
521 SchedulerSettings default_scheduler_settings; 513 SchedulerSettings default_scheduler_settings;
522 StateMachine state(default_scheduler_settings); 514 StateMachine state(default_scheduler_settings);
523 state.SetCanStart(); 515 state.SetCanStart();
524 state.UpdateState(state.NextAction()); 516 state.UpdateState(state.NextAction());
525 state.DidCreateAndInitializeOutputSurface(); 517 state.DidCreateAndInitializeOutputSurface();
526 state.SetCommitState( 518 state.SetCommitState(
527 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW); 519 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW);
528 state.SetNeedsCommit(); 520 state.SetNeedsCommit();
529 state.SetNeedsRedraw(true); 521 state.SetNeedsRedraw(true);
530 state.SetVisible(true); 522 state.SetVisible(true);
531 state.SetCanDraw(false); 523 state.SetCanDraw(false);
532 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 524 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
533 state.NextAction()); 525 EXPECT_ACTION_UPDATE_STATE(
526 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
527 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
534 } 528 }
535 529
536 TEST(SchedulerStateMachineTest, TestsetNeedsCommitIsNotLost) { 530 TEST(SchedulerStateMachineTest, TestsetNeedsCommitIsNotLost) {
537 SchedulerSettings default_scheduler_settings; 531 SchedulerSettings default_scheduler_settings;
538 StateMachine state(default_scheduler_settings); 532 StateMachine state(default_scheduler_settings);
539 state.SetCanStart(); 533 state.SetCanStart();
540 state.UpdateState(state.NextAction()); 534 state.UpdateState(state.NextAction());
541 state.DidCreateAndInitializeOutputSurface(); 535 state.DidCreateAndInitializeOutputSurface();
542 state.SetNeedsCommit(); 536 state.SetNeedsCommit();
543 state.SetVisible(true); 537 state.SetVisible(true);
544 state.SetCanDraw(true); 538 state.SetCanDraw(true);
545 539
540 EXPECT_TRUE(state.BeginFrameNeededByImplThread());
541
546 // Begin the frame. 542 // Begin the frame.
547 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 543 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
548 state.NextAction()); 544 EXPECT_ACTION_UPDATE_STATE(
549 state.UpdateState(state.NextAction()); 545 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
550 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 546 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
551 state.CommitState()); 547 state.CommitState());
552 548
553 // Now, while the frame is in progress, set another commit. 549 // Now, while the frame is in progress, set another commit.
554 state.SetNeedsCommit(); 550 state.SetNeedsCommit();
555 EXPECT_TRUE(state.NeedsCommit()); 551 EXPECT_TRUE(state.NeedsCommit());
556 552
557 // Let the frame finish. 553 // Let the frame finish.
558 state.FinishCommit(); 554 state.FinishCommit();
559 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, 555 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
560 state.CommitState()); 556 state.CommitState());
561 557
562 // Expect to commit regardless of BeginFrame state. 558 // Expect to commit regardless of BeginFrame state.
563 state.DidLeaveBeginFrame(); 559 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_BEGIN_FRAME,
560 state.begin_frame_state());
564 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); 561 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
565 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 562
563 state.AdvanceBeginFrameStateWhenNoActionsRemain();
564 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_DEADLINE_PENDING,
565 state.begin_frame_state());
566 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
567
568 state.OnBeginFrameDeadline();
569 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE,
570 state.begin_frame_state());
571 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
572
573 state.AdvanceBeginFrameStateWhenNoActionsRemain();
574 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_IDLE,
575 state.begin_frame_state());
576 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
577
578 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
579 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_BEGIN_FRAME,
580 state.begin_frame_state());
566 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); 581 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
567 582
568 // Commit and make sure we draw on next BeginFrame 583 // Commit and make sure we draw on next BeginFrame
569 state.UpdateState(SchedulerStateMachine::ACTION_COMMIT); 584 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
570 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); 585 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
586 state.OnBeginFrameDeadline();
571 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 587 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
572 state.CommitState()); 588 state.CommitState());
573 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 589 EXPECT_ACTION_UPDATE_STATE(
590 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
574 state.DidDrawIfPossibleCompleted(true); 591 state.DidDrawIfPossibleCompleted(true);
575 592
576 // Verify that another commit will begin. 593 // Verify that another commit will start immediately after draw.
577 state.DidLeaveBeginFrame(); 594 EXPECT_ACTION_UPDATE_STATE(
578 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 595 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
579 state.NextAction()); 596 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
580 } 597 }
581 598
582 TEST(SchedulerStateMachineTest, TestFullCycle) { 599 TEST(SchedulerStateMachineTest, TestFullCycle) {
583 SchedulerSettings default_scheduler_settings; 600 SchedulerSettings default_scheduler_settings;
584 StateMachine state(default_scheduler_settings); 601 StateMachine state(default_scheduler_settings);
585 state.SetCanStart(); 602 state.SetCanStart();
586 state.UpdateState(state.NextAction()); 603 state.UpdateState(state.NextAction());
587 state.DidCreateAndInitializeOutputSurface(); 604 state.DidCreateAndInitializeOutputSurface();
588 state.SetVisible(true); 605 state.SetVisible(true);
589 state.SetCanDraw(true); 606 state.SetCanDraw(true);
590 607
591 // Start clean and set commit. 608 // Start clean and set commit.
592 state.SetNeedsCommit(); 609 state.SetNeedsCommit();
593 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
594 state.NextAction());
595 610
596 // Begin the frame. 611 // Begin the frame.
597 state.UpdateState( 612 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
613 EXPECT_ACTION_UPDATE_STATE(
598 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); 614 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
599 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 615 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
600 state.CommitState()); 616 state.CommitState());
601 EXPECT_FALSE(state.NeedsCommit()); 617 EXPECT_FALSE(state.NeedsCommit());
602 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 618 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
603 619
604 // Tell the scheduler the frame finished. 620 // Tell the scheduler the frame finished.
605 state.FinishCommit(); 621 state.FinishCommit();
606 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, 622 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
607 state.CommitState()); 623 state.CommitState());
608 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
609 624
610 // Commit. 625 // Commit.
611 state.UpdateState(SchedulerStateMachine::ACTION_COMMIT); 626 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
612 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 627 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
613 state.CommitState()); 628 state.CommitState());
614 EXPECT_TRUE(state.NeedsRedraw()); 629 EXPECT_TRUE(state.NeedsRedraw());
615 630
616 // Expect to do nothing until BeginFrame. 631 // Expect to do nothing until BeginFrame deadline
617 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 632 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
618 633
619 // At BeginFrame, draw. 634 // At BeginFrame deadline, draw.
620 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 635 state.OnBeginFrameDeadline();
621 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); 636 EXPECT_ACTION_UPDATE_STATE(
622 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 637 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
623 state.DidDrawIfPossibleCompleted(true); 638 state.DidDrawIfPossibleCompleted(true);
624 state.DidLeaveBeginFrame();
625 639
626 // Should be synchronized, no draw needed, no action needed. 640 // Should be synchronized, no draw needed, no action needed.
641 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
627 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); 642 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
628 EXPECT_FALSE(state.NeedsRedraw()); 643 EXPECT_FALSE(state.NeedsRedraw());
629 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
630 } 644 }
631 645
632 TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) { 646 TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) {
633 SchedulerSettings default_scheduler_settings; 647 SchedulerSettings default_scheduler_settings;
634 StateMachine state(default_scheduler_settings); 648 StateMachine state(default_scheduler_settings);
635 state.SetCanStart(); 649 state.SetCanStart();
636 state.UpdateState(state.NextAction()); 650 state.UpdateState(state.NextAction());
637 state.DidCreateAndInitializeOutputSurface(); 651 state.DidCreateAndInitializeOutputSurface();
638 state.SetVisible(true); 652 state.SetVisible(true);
639 state.SetCanDraw(true); 653 state.SetCanDraw(true);
640 654
641 // Start clean and set commit. 655 // Start clean and set commit.
642 state.SetNeedsCommit(); 656 state.SetNeedsCommit();
643 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
644 state.NextAction());
645 657
646 // Begin the frame. 658 // Begin the frame.
647 state.UpdateState( 659 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
660 EXPECT_ACTION_UPDATE_STATE(
648 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); 661 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
649 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 662 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
650 state.CommitState()); 663 state.CommitState());
651 EXPECT_FALSE(state.NeedsCommit()); 664 EXPECT_FALSE(state.NeedsCommit());
652 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 665 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
653 666
654 // Request another commit while the commit is in flight. 667 // Request another commit while the commit is in flight.
655 state.SetNeedsCommit(); 668 state.SetNeedsCommit();
656 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 669 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
657 670
658 // Tell the scheduler the frame finished. 671 // Tell the scheduler the frame finished.
659 state.FinishCommit(); 672 state.FinishCommit();
660 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, 673 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
661 state.CommitState()); 674 state.CommitState());
662 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
663 675
664 // Commit. 676 // First commit.
665 state.UpdateState(SchedulerStateMachine::ACTION_COMMIT); 677 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
666 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 678 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
667 state.CommitState()); 679 state.CommitState());
668 EXPECT_TRUE(state.NeedsRedraw()); 680 EXPECT_TRUE(state.NeedsRedraw());
669 681
670 // Expect to do nothing until BeginFrame. 682 // Expect to do nothing until BeginFrame deadline.
671 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 683 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
672 684
673 // At BeginFrame, draw. 685 // At BeginFrame deadline, draw.
674 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 686 state.OnBeginFrameDeadline();
675 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); 687 EXPECT_ACTION_UPDATE_STATE(
676 state.UpdateState(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); 688 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
677 state.DidDrawIfPossibleCompleted(true); 689 state.DidDrawIfPossibleCompleted(true);
678 state.DidLeaveBeginFrame();
679 690
680 // Should be synchronized, no draw needed, no action needed. 691 // Should be synchronized, no draw needed, no action needed.
692 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
681 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); 693 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
682 EXPECT_FALSE(state.NeedsRedraw()); 694 EXPECT_FALSE(state.NeedsRedraw());
683 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 695
684 state.NextAction()); 696 // Next BeginFrame should initiate second commit.
697 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
698 EXPECT_ACTION_UPDATE_STATE(
699 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
685 } 700 }
686 701
687 TEST(SchedulerStateMachineTest, TestRequestCommitInvisible) { 702 TEST(SchedulerStateMachineTest, TestRequestCommitInvisible) {
688 SchedulerSettings default_scheduler_settings; 703 SchedulerSettings default_scheduler_settings;
689 StateMachine state(default_scheduler_settings); 704 StateMachine state(default_scheduler_settings);
690 state.SetCanStart(); 705 state.SetCanStart();
691 state.UpdateState(state.NextAction()); 706 state.UpdateState(state.NextAction());
692 state.DidCreateAndInitializeOutputSurface(); 707 state.DidCreateAndInitializeOutputSurface();
693 state.SetNeedsCommit(); 708 state.SetNeedsCommit();
694 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 709 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
695 } 710 }
696 711
697 TEST(SchedulerStateMachineTest, TestGoesInvisibleBeforeFinishCommit) { 712 TEST(SchedulerStateMachineTest, TestGoesInvisibleBeforeFinishCommit) {
698 SchedulerSettings default_scheduler_settings; 713 SchedulerSettings default_scheduler_settings;
699 StateMachine state(default_scheduler_settings); 714 StateMachine state(default_scheduler_settings);
700 state.SetCanStart(); 715 state.SetCanStart();
701 state.UpdateState(state.NextAction()); 716 state.UpdateState(state.NextAction());
702 state.DidCreateAndInitializeOutputSurface(); 717 state.DidCreateAndInitializeOutputSurface();
703 state.SetVisible(true); 718 state.SetVisible(true);
704 state.SetCanDraw(true); 719 state.SetCanDraw(true);
705 720
706 // Start clean and set commit. 721 // Start clean and set commit.
707 state.SetNeedsCommit(); 722 state.SetNeedsCommit();
708 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
709 state.NextAction());
710 723
711 // Begin the frame while visible. 724 // Begin the frame while visible.
712 state.UpdateState( 725 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
726 EXPECT_ACTION_UPDATE_STATE(
713 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); 727 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
714 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 728 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
715 state.CommitState()); 729 state.CommitState());
716 EXPECT_FALSE(state.NeedsCommit()); 730 EXPECT_FALSE(state.NeedsCommit());
717 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 731 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
718 732
719 // Become invisible and abort the main thread's begin frame. 733 // Become invisible and abort the main thread's begin frame.
720 state.SetVisible(false); 734 state.SetVisible(false);
721 state.BeginFrameAbortedByMainThread(); 735 state.BeginFrameAbortedByMainThread();
722 736
723 // We should now be back in the idle state as if we didn't start a frame at 737 // We should now be back in the idle state as if we never started the frame.
724 // all.
725 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); 738 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
726 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 739 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
740
741 // We shouldn't do anything on the BeginFrame deadline.
742 state.OnBeginFrameDeadline();
743 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
727 744
728 // Become visible again. 745 // Become visible again.
729 state.SetVisible(true); 746 state.SetVisible(true);
730 747
731 // We should be beginning a frame now. 748 // We should handle the aborted commit on the next BeginFrame.
749 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
732 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); 750 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
733 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 751 EXPECT_ACTION_UPDATE_STATE(
734 state.NextAction()); 752 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
735
736 // Begin the frame.
737 state.UpdateState(state.NextAction());
738 753
739 // We should be starting the commit now. 754 // We should be starting the commit now.
740 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 755 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
741 state.CommitState()); 756 state.CommitState());
757 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
742 } 758 }
743 759
744 TEST(SchedulerStateMachineTest, TestFirstContextCreation) { 760 TEST(SchedulerStateMachineTest, TestFirstContextCreation) {
745 SchedulerSettings default_scheduler_settings; 761 SchedulerSettings default_scheduler_settings;
746 StateMachine state(default_scheduler_settings); 762 StateMachine state(default_scheduler_settings);
747 state.SetCanStart(); 763 state.SetCanStart();
748 state.SetVisible(true); 764 state.SetVisible(true);
749 state.SetCanDraw(true); 765 state.SetCanDraw(true);
750 766
751 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 767 EXPECT_ACTION_UPDATE_STATE(
752 state.NextAction()); 768 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION);
753 state.UpdateState(state.NextAction());
754 state.DidCreateAndInitializeOutputSurface(); 769 state.DidCreateAndInitializeOutputSurface();
755 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 770 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
756 771
757 // Check that the first init does not SetNeedsCommit. 772 // Check that the first init does not SetNeedsCommit.
773 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
774 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
775 state.OnBeginFrameDeadline();
776 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
777
778 // Check that a needs commit initiates a BeginFrame to the main thread.
758 state.SetNeedsCommit(); 779 state.SetNeedsCommit();
759 EXPECT_NE(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 780 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
781 EXPECT_ACTION_UPDATE_STATE(
782 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
760 } 783 }
761 784
762 TEST(SchedulerStateMachineTest, TestContextLostWhenCompletelyIdle) { 785 TEST(SchedulerStateMachineTest, TestContextLostWhenCompletelyIdle) {
763 SchedulerSettings default_scheduler_settings; 786 SchedulerSettings default_scheduler_settings;
764 StateMachine state(default_scheduler_settings); 787 StateMachine state(default_scheduler_settings);
765 state.SetCanStart(); 788 state.SetCanStart();
766 state.UpdateState(state.NextAction()); 789 state.UpdateState(state.NextAction());
767 state.DidCreateAndInitializeOutputSurface(); 790 state.DidCreateAndInitializeOutputSurface();
768 791
769 state.SetVisible(true); 792 state.SetVisible(true);
770 state.SetCanDraw(true); 793 state.SetCanDraw(true);
771 794
772 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 795 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
773 state.NextAction()); 796 state.NextAction());
774 state.DidLoseOutputSurface(); 797 state.DidLoseOutputSurface();
775 798
776 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 799 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
777 state.NextAction()); 800 state.NextAction());
778 state.UpdateState(state.NextAction()); 801 state.UpdateState(state.NextAction());
779 802
780 // Once context recreation begins, nothing should happen. 803 // Once context recreation begins, nothing should happen.
781 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 804 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
782 805
783 // Recreate the context. 806 // Recreate the context.
784 state.DidCreateAndInitializeOutputSurface(); 807 state.DidCreateAndInitializeOutputSurface();
785 808
786 // When the context is recreated, we should begin a commit. 809 // When the context is recreated, we should begin a commit.
787 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 810 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
788 state.NextAction()); 811 EXPECT_ACTION_UPDATE_STATE(
789 state.UpdateState(state.NextAction()); 812 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
790 } 813 }
791 814
792 TEST(SchedulerStateMachineTest, 815 TEST(SchedulerStateMachineTest,
793 TestContextLostWhenIdleAndCommitRequestedWhileRecreating) { 816 TestContextLostWhenIdleAndCommitRequestedWhileRecreating) {
794 SchedulerSettings default_scheduler_settings; 817 SchedulerSettings default_scheduler_settings;
795 StateMachine state(default_scheduler_settings); 818 StateMachine state(default_scheduler_settings);
796 state.SetCanStart(); 819 state.SetCanStart();
797 state.UpdateState(state.NextAction()); 820 state.UpdateState(state.NextAction());
798 state.DidCreateAndInitializeOutputSurface(); 821 state.DidCreateAndInitializeOutputSurface();
799 state.SetVisible(true); 822 state.SetVisible(true);
800 state.SetCanDraw(true); 823 state.SetCanDraw(true);
801 824
802 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 825 EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
803 state.NextAction()); 826 state.NextAction());
804 state.DidLoseOutputSurface(); 827 state.DidLoseOutputSurface();
805 828
806 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 829 EXPECT_ACTION_UPDATE_STATE(
807 state.NextAction()); 830 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION);
808 state.UpdateState(state.NextAction());
809 831
810 // Once context recreation begins, nothing should happen. 832 // Once context recreation begins, nothing should happen.
811 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 833 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
834 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
835 state.OnBeginFrameDeadline();
836 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
812 837
813 // While context is recreating, commits shouldn't begin. 838 // While context is recreating, commits shouldn't begin.
814 state.SetNeedsCommit(); 839 state.SetNeedsCommit();
815 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 840 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
841 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
842 state.OnBeginFrameDeadline();
843 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
816 844
817 // Recreate the context 845 // Recreate the context
818 state.DidCreateAndInitializeOutputSurface(); 846 state.DidCreateAndInitializeOutputSurface();
819 847
820 // When the context is recreated, we should begin a commit 848 // When the context is recreated, we should begin a commit
821 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 849 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
822 state.NextAction()); 850 EXPECT_ACTION_UPDATE_STATE(
823 state.UpdateState(state.NextAction()); 851 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
852 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
853 state.FinishCommit();
854 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
855 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
824 856
825 // Once the context is recreated, whether we draw should be based on 857 // Once the context is recreated, whether we draw should be based on
826 // SetCanDraw. 858 // SetCanDraw.
859 state.OnBeginFrameDeadline();
827 state.SetNeedsRedraw(true); 860 state.SetNeedsRedraw(true);
828 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 861 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
829 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); 862 state.NextAction());
830 state.SetCanDraw(false); 863 state.SetCanDraw(false);
831 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 864 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
832 state.SetCanDraw(true); 865 state.SetCanDraw(true);
833 state.DidLeaveBeginFrame(); 866 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
867 state.NextAction());
834 } 868 }
835 869
836 TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) { 870 TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) {
837 SchedulerSettings default_scheduler_settings; 871 SchedulerSettings default_scheduler_settings;
838 StateMachine state(default_scheduler_settings); 872 StateMachine state(default_scheduler_settings);
839 state.SetCanStart(); 873 state.SetCanStart();
840 state.UpdateState(state.NextAction()); 874 state.UpdateState(state.NextAction());
841 state.DidCreateAndInitializeOutputSurface(); 875 state.DidCreateAndInitializeOutputSurface();
842 state.SetVisible(true); 876 state.SetVisible(true);
843 state.SetCanDraw(true); 877 state.SetCanDraw(true);
844 878
845 // Get a commit in flight. 879 // Get a commit in flight.
846 state.SetNeedsCommit(); 880 state.SetNeedsCommit();
847 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 881 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
848 state.NextAction());
849 state.UpdateState(state.NextAction());
850 882
851 // Set damage and expect a draw. 883 // Set damage and expect a draw.
852 state.SetNeedsRedraw(true); 884 state.SetNeedsRedraw(true);
853 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 885 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
854 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); 886 EXPECT_ACTION_UPDATE_STATE(
855 state.UpdateState(state.NextAction()); 887 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
856 state.DidLeaveBeginFrame(); 888 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
889 state.OnBeginFrameDeadline();
890 EXPECT_ACTION_UPDATE_STATE(
891 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
892 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
857 893
858 // Cause a lost context while the begin frame is in flight 894 // Cause a lost context while the begin frame is in flight
859 // for the main thread. 895 // for the main thread.
860 state.DidLoseOutputSurface(); 896 state.DidLoseOutputSurface();
861 897
862 // Ask for another draw. Expect nothing happens. 898 // Ask for another draw. Expect nothing happens.
863 state.SetNeedsRedraw(true); 899 state.SetNeedsRedraw(true);
864 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 900 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
865 901
866 // Finish the frame, and commit. 902 // Finish the frame, and commit.
867 state.FinishCommit(); 903 state.FinishCommit();
868 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); 904 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
869 state.UpdateState(state.NextAction());
870 905
906 // We still attempt to draw when output surface is lost if we are waiting
907 // for the first draw to unblock the main thread.
871 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 908 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
872 state.CommitState()); 909 state.CommitState());
873 910 EXPECT_ACTION_UPDATE_STATE(
874 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); 911 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
875 state.UpdateState(state.NextAction());
876 912
877 // Expect to be told to begin context recreation, independent of 913 // Expect to be told to begin context recreation, independent of
878 // BeginFrame state. 914 // BeginFrame state.
879 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 915 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_IDLE,
916 state.begin_frame_state());
880 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 917 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
881 state.NextAction()); 918 state.NextAction());
882 state.DidLeaveBeginFrame(); 919
920 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
921 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_BEGIN_FRAME,
922 state.begin_frame_state());
923 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
924 state.NextAction());
925
926 state.AdvanceBeginFrameStateWhenNoActionsRemain();
927 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_DEADLINE_PENDING,
928 state.begin_frame_state());
929 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
930 state.NextAction());
931
932 state.OnBeginFrameDeadline();
933 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE,
934 state.begin_frame_state());
883 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 935 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
884 state.NextAction()); 936 state.NextAction());
885 } 937 }
886 938
887 TEST(SchedulerStateMachineTest, 939 TEST(SchedulerStateMachineTest,
888 TestContextLostWhileCommitInProgressAndAnotherCommitRequested) { 940 TestContextLostWhileCommitInProgressAndAnotherCommitRequested) {
889 SchedulerSettings default_scheduler_settings; 941 SchedulerSettings default_scheduler_settings;
890 StateMachine state(default_scheduler_settings); 942 StateMachine state(default_scheduler_settings);
891 state.SetCanStart(); 943 state.SetCanStart();
892 state.UpdateState(state.NextAction()); 944 state.UpdateState(state.NextAction());
893 state.DidCreateAndInitializeOutputSurface(); 945 state.DidCreateAndInitializeOutputSurface();
894 state.SetVisible(true); 946 state.SetVisible(true);
895 state.SetCanDraw(true); 947 state.SetCanDraw(true);
896 948
897 // Get a commit in flight. 949 // Get a commit in flight.
898 state.SetNeedsCommit(); 950 state.SetNeedsCommit();
899 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 951 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
900 state.NextAction());
901 state.UpdateState(state.NextAction());
902 952
903 // Set damage and expect a draw. 953 // Set damage and expect a draw.
904 state.SetNeedsRedraw(true); 954 state.SetNeedsRedraw(true);
905 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 955 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
906 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); 956 EXPECT_ACTION_UPDATE_STATE(
907 state.UpdateState(state.NextAction()); 957 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
908 state.DidLeaveBeginFrame(); 958 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
959 state.OnBeginFrameDeadline();
960 EXPECT_ACTION_UPDATE_STATE(
961 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
962 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
909 963
910 // Cause a lost context while the begin frame is in flight 964 // Cause a lost context while the begin frame is in flight
911 // for the main thread. 965 // for the main thread.
912 state.DidLoseOutputSurface(); 966 state.DidLoseOutputSurface();
913 967
914 // Ask for another draw and also set needs commit. Expect nothing happens. 968 // Ask for another draw and also set needs commit. Expect nothing happens.
915 state.SetNeedsRedraw(true); 969 state.SetNeedsRedraw(true);
916 state.SetNeedsCommit(); 970 state.SetNeedsCommit();
917 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 971 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
918 972
919 // Finish the frame, and commit. 973 // Finish the frame, and commit.
920 state.FinishCommit(); 974 state.FinishCommit();
921 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); 975 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
922 state.UpdateState(state.NextAction());
923
924 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 976 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW,
925 state.CommitState()); 977 state.CommitState());
926 978 EXPECT_ACTION_UPDATE_STATE(
927 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.NextAction()); 979 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
928 state.UpdateState(state.NextAction());
929 980
930 // Expect to be told to begin context recreation, independent of 981 // Expect to be told to begin context recreation, independent of
931 // BeginFrame state 982 // BeginFrame state
932 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 983 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_IDLE,
984 state.begin_frame_state());
933 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 985 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
934 state.NextAction()); 986 state.NextAction());
935 state.DidLeaveBeginFrame(); 987
988 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
989 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_BEGIN_FRAME,
990 state.begin_frame_state());
936 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 991 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
937 state.NextAction()); 992 state.NextAction());
993
994 state.AdvanceBeginFrameStateWhenNoActionsRemain();
995 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_DEADLINE_PENDING,
996 state.begin_frame_state());
997 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
998 state.NextAction());
999
1000 state.OnBeginFrameDeadline();
1001 EXPECT_EQ(SchedulerStateMachine::BEGIN_FRAME_STATE_INSIDE_DEADLINE,
1002 state.begin_frame_state());
1003 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
1004 state.NextAction());
1005
1006 // After we get a new output surface, the commit flow should start.
1007 state.DidCreateAndInitializeOutputSurface();
1008 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
1009 EXPECT_ACTION_UPDATE_STATE(
1010 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
1011 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1012 state.FinishCommit();
1013 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1014 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1015 state.OnBeginFrameDeadline();
1016 EXPECT_ACTION_UPDATE_STATE(
1017 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
1018 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
938 } 1019 }
939 1020
940 TEST(SchedulerStateMachineTest, TestFinishAllRenderingWhileContextLost) { 1021 TEST(SchedulerStateMachineTest, TestFinishAllRenderingWhileContextLost) {
941 SchedulerSettings default_scheduler_settings; 1022 SchedulerSettings default_scheduler_settings;
942 StateMachine state(default_scheduler_settings); 1023 StateMachine state(default_scheduler_settings);
943 state.SetCanStart(); 1024 state.SetCanStart();
944 state.UpdateState(state.NextAction()); 1025 state.UpdateState(state.NextAction());
945 state.DidCreateAndInitializeOutputSurface(); 1026 state.DidCreateAndInitializeOutputSurface();
946 state.SetVisible(true); 1027 state.SetVisible(true);
947 state.SetCanDraw(true); 1028 state.SetCanDraw(true);
948 1029
949 // Cause a lost context lost. 1030 // Cause a lost context lost.
950 state.DidLoseOutputSurface(); 1031 state.DidLoseOutputSurface();
951 1032
952 // Ask a forced redraw and verify it ocurrs. 1033 // Ask a forced redraw for readback and verify it ocurrs.
953 state.SetNeedsForcedRedraw(true); 1034 state.SetCommitState(
954 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 1035 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW);
955 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction()); 1036 state.SetNeedsForcedRedrawForReadback();
956 state.DidLeaveBeginFrame(); 1037 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
1038 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
1039 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
957 1040
958 // Clear the forced redraw bit. 1041 // Forced redraws for readbacks need to be followed by a new commit
959 state.SetNeedsForcedRedraw(false); 1042 // to replace the readback commit.
1043 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
1044 state.CommitState());
1045 state.FinishCommit();
1046 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1047 EXPECT_ACTION_UPDATE_STATE(
1048 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
960 1049
961 // Expect to be told to begin context recreation, independent of 1050 // Expect to be told to begin context recreation, independent of
962 // BeginFrame state 1051 // BeginFrame state
963 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 1052 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
964 state.NextAction()); 1053 EXPECT_ACTION_UPDATE_STATE(
965 state.UpdateState(state.NextAction()); 1054 SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION);
1055
1056 state.OnBeginFrameDeadline();
1057 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
966 1058
967 // Ask a forced redraw and verify it ocurrs. 1059 // Ask a forced redraw and verify it ocurrs.
968 state.SetNeedsForcedRedraw(true); 1060 state.SetCommitState(
969 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 1061 SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW);
970 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction()); 1062 state.SetNeedsForcedRedrawForReadback();
971 state.DidLeaveBeginFrame(); 1063 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
1064 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1065 state.OnBeginFrameDeadline();
1066 EXPECT_ACTION_UPDATE_STATE(
1067 SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED);
1068 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
972 } 1069 }
973 1070
974 TEST(SchedulerStateMachineTest, DontDrawBeforeCommitAfterLostOutputSurface) { 1071 TEST(SchedulerStateMachineTest, DontDrawBeforeCommitAfterLostOutputSurface) {
975 SchedulerSettings default_scheduler_settings; 1072 SchedulerSettings default_scheduler_settings;
976 StateMachine state(default_scheduler_settings); 1073 StateMachine state(default_scheduler_settings);
977 state.SetCanStart(); 1074 state.SetCanStart();
978 state.UpdateState(state.NextAction()); 1075 state.UpdateState(state.NextAction());
979 state.DidCreateAndInitializeOutputSurface(); 1076 state.DidCreateAndInitializeOutputSurface();
980 state.SetVisible(true); 1077 state.SetVisible(true);
981 state.SetCanDraw(true); 1078 state.SetCanDraw(true);
982 1079
983 state.SetNeedsRedraw(true); 1080 state.SetNeedsRedraw(true);
984 1081
985 // Cause a lost output surface, and restore it. 1082 // Cause a lost output surface, and restore it.
986 state.DidLoseOutputSurface(); 1083 state.DidLoseOutputSurface();
987 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION, 1084 EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
988 state.NextAction()); 1085 state.NextAction());
989 state.UpdateState(state.NextAction()); 1086 state.UpdateState(state.NextAction());
990 state.DidCreateAndInitializeOutputSurface(); 1087 state.DidCreateAndInitializeOutputSurface();
991 1088
992 EXPECT_FALSE(state.RedrawPending()); 1089 EXPECT_FALSE(state.RedrawPending());
1090 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
993 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 1091 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
994 state.NextAction()); 1092 state.NextAction());
995 } 1093 }
996 1094
997 TEST(SchedulerStateMachineTest, 1095 TEST(SchedulerStateMachineTest,
998 TestSendBeginFrameToMainThreadWhenInvisibleAndForceCommit) { 1096 TestSendBeginFrameToMainThreadWhenInvisibleAndForceCommit) {
999 SchedulerSettings default_scheduler_settings; 1097 SchedulerSettings default_scheduler_settings;
1000 StateMachine state(default_scheduler_settings); 1098 StateMachine state(default_scheduler_settings);
1001 state.SetCanStart(); 1099 state.SetCanStart();
1002 state.UpdateState(state.NextAction()); 1100 state.UpdateState(state.NextAction());
1003 state.DidCreateAndInitializeOutputSurface(); 1101 state.DidCreateAndInitializeOutputSurface();
1004 state.SetVisible(false); 1102 state.SetVisible(false);
1005 state.SetNeedsCommit(); 1103 state.SetNeedsCommit();
1006 state.SetNeedsForcedCommit(); 1104 state.SetNeedsForcedCommitForReadback();
1007 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 1105 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
1008 state.NextAction()); 1106 state.NextAction());
1009 } 1107 }
1010 1108
1011 TEST(SchedulerStateMachineTest, 1109 TEST(SchedulerStateMachineTest,
1012 TestSendBeginFrameToMainThreadWhenCanStartFalseAndForceCommit) { 1110 TestSendBeginFrameToMainThreadWhenCanStartFalseAndForceCommit) {
1013 SchedulerSettings default_scheduler_settings; 1111 SchedulerSettings default_scheduler_settings;
1014 StateMachine state(default_scheduler_settings); 1112 StateMachine state(default_scheduler_settings);
1015 state.SetVisible(true); 1113 state.SetVisible(true);
1016 state.SetCanDraw(true); 1114 state.SetCanDraw(true);
1017 state.SetNeedsCommit(); 1115 state.SetNeedsCommit();
1018 state.SetNeedsForcedCommit(); 1116 state.SetNeedsForcedCommitForReadback();
1019 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 1117 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
1020 state.NextAction()); 1118 state.NextAction());
1021 } 1119 }
1022 1120
1023 TEST(SchedulerStateMachineTest, TestFinishCommitWhenCommitInProgress) { 1121 TEST(SchedulerStateMachineTest, TestFinishCommitWhenCommitInProgress) {
1024 SchedulerSettings default_scheduler_settings; 1122 SchedulerSettings default_scheduler_settings;
1025 StateMachine state(default_scheduler_settings); 1123 StateMachine state(default_scheduler_settings);
1026 state.SetCanStart(); 1124 state.SetCanStart();
1027 state.UpdateState(state.NextAction()); 1125 state.UpdateState(state.NextAction());
1028 state.DidCreateAndInitializeOutputSurface(); 1126 state.DidCreateAndInitializeOutputSurface();
(...skipping 13 matching lines...) Expand all
1042 1140
1043 TEST(SchedulerStateMachineTest, TestFinishCommitWhenForcedCommitInProgress) { 1141 TEST(SchedulerStateMachineTest, TestFinishCommitWhenForcedCommitInProgress) {
1044 SchedulerSettings default_scheduler_settings; 1142 SchedulerSettings default_scheduler_settings;
1045 StateMachine state(default_scheduler_settings); 1143 StateMachine state(default_scheduler_settings);
1046 state.SetCanStart(); 1144 state.SetCanStart();
1047 state.UpdateState(state.NextAction()); 1145 state.UpdateState(state.NextAction());
1048 state.DidCreateAndInitializeOutputSurface(); 1146 state.DidCreateAndInitializeOutputSurface();
1049 state.SetVisible(false); 1147 state.SetVisible(false);
1050 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS); 1148 state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS);
1051 state.SetNeedsCommit(); 1149 state.SetNeedsCommit();
1052 state.SetNeedsForcedCommit(); 1150 state.SetNeedsForcedCommitForReadback();
1053 1151
1152 // The commit for readback interupts the normal commit.
1054 state.FinishCommit(); 1153 state.FinishCommit();
1055 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); 1154 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1056 state.UpdateState(state.NextAction());
1057 1155
1058 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW, 1156 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW,
1059 state.CommitState()); 1157 state.CommitState());
1158 EXPECT_ACTION_UPDATE_STATE(
1159 SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
1060 1160
1061 // If we are waiting for forced draw then we know a begin frame is already 1161 // When the readback interrupts the normal commit, we should not get
1062 // in flight for the main thread. 1162 // another BeginFrame on the impl thread when the readback completes.
1063 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 1163 EXPECT_NE(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
1164 state.NextAction());
1165
1166 // The normal commit can then proceed.
1167 state.FinishCommit();
1168 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1064 } 1169 }
1065 1170
1066 TEST(SchedulerStateMachineTest, TestSendBeginFrameToMainThreadWhenContextLost) { 1171 TEST(SchedulerStateMachineTest, TestSendBeginFrameToMainThreadWhenContextLost) {
1067 SchedulerSettings default_scheduler_settings; 1172 SchedulerSettings default_scheduler_settings;
1068 StateMachine state(default_scheduler_settings); 1173 StateMachine state(default_scheduler_settings);
1069 state.SetCanStart(); 1174 state.SetCanStart();
1070 state.UpdateState(state.NextAction()); 1175 state.UpdateState(state.NextAction());
1071 state.DidCreateAndInitializeOutputSurface(); 1176 state.DidCreateAndInitializeOutputSurface();
1072 state.SetVisible(true); 1177 state.SetVisible(true);
1073 state.SetCanDraw(true); 1178 state.SetCanDraw(true);
1074 state.SetNeedsCommit(); 1179 state.SetNeedsCommit();
1075 state.SetNeedsForcedCommit(); 1180 state.SetNeedsForcedCommitForReadback();
1076 state.DidLoseOutputSurface(); 1181 state.DidLoseOutputSurface();
1077 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, 1182 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
1078 state.NextAction()); 1183 state.NextAction());
1079 } 1184 }
1080 1185
1081 TEST(SchedulerStateMachineTest, TestImmediateFinishCommit) { 1186 TEST(SchedulerStateMachineTest, TestImmediateFinishCommit) {
1082 SchedulerSettings default_scheduler_settings; 1187 SchedulerSettings default_scheduler_settings;
1083 StateMachine state(default_scheduler_settings); 1188 StateMachine state(default_scheduler_settings);
1084 state.SetCanStart(); 1189 state.SetCanStart();
1085 state.UpdateState(state.NextAction()); 1190 state.UpdateState(state.NextAction());
1086 state.DidCreateAndInitializeOutputSurface(); 1191 state.DidCreateAndInitializeOutputSurface();
1087 state.SetVisible(true); 1192 state.SetVisible(true);
1088 state.SetCanDraw(true); 1193 state.SetCanDraw(true);
1089 1194
1090 // Schedule a forced frame, commit it, draw it. 1195 // Schedule a readback, commit it, draw it.
1091 state.SetNeedsCommit(); 1196 state.SetNeedsCommit();
1092 state.SetNeedsForcedCommit(); 1197 state.SetNeedsForcedCommitForReadback();
1093 state.UpdateState(state.NextAction()); 1198 EXPECT_ACTION_UPDATE_STATE(
1199 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
1094 state.FinishCommit(); 1200 state.FinishCommit();
1095 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); 1201
1096 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, 1202 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
1097 state.CommitState()); 1203 state.CommitState());
1098 state.UpdateState(state.NextAction()); 1204 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1099 1205
1100 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW, 1206 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW,
1101 state.CommitState()); 1207 state.CommitState());
1102 1208
1103 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 1209 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
1104 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
1105 state.SetNeedsForcedRedraw(true);
1106 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction());
1107 state.UpdateState(state.NextAction());
1108 state.DidDrawIfPossibleCompleted(true); 1210 state.DidDrawIfPossibleCompleted(true);
1109 state.DidLeaveBeginFrame(); 1211
1212 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1110 1213
1111 // Should be waiting for the normal begin frame from the main thread. 1214 // Should be waiting for the normal begin frame from the main thread.
1112 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 1215 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
1113 state.CommitState()); 1216 state.CommitState());
1114 } 1217 }
1115 1218
1116 TEST(SchedulerStateMachineTest, TestImmediateFinishCommitDuringCommit) { 1219 TEST(SchedulerStateMachineTest, TestImmediateFinishCommitDuringCommit) {
1117 SchedulerSettings default_scheduler_settings; 1220 SchedulerSettings default_scheduler_settings;
1118 StateMachine state(default_scheduler_settings); 1221 StateMachine state(default_scheduler_settings);
1119 state.SetCanStart(); 1222 state.SetCanStart();
1120 state.UpdateState(state.NextAction()); 1223 state.UpdateState(state.NextAction());
1121 state.DidCreateAndInitializeOutputSurface(); 1224 state.DidCreateAndInitializeOutputSurface();
1122 state.SetVisible(true); 1225 state.SetVisible(true);
1123 state.SetCanDraw(true); 1226 state.SetCanDraw(true);
1124 1227
1125 // Start a normal commit. 1228 // Start a normal commit.
1126 state.SetNeedsCommit(); 1229 state.SetNeedsCommit();
1127 state.UpdateState(state.NextAction()); 1230 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1128 1231
1129 // Schedule a forced frame, commit it, draw it. 1232 // Schedule a readback, commit it, draw it.
1130 state.SetNeedsCommit(); 1233 state.SetNeedsForcedCommitForReadback();
1131 state.SetNeedsForcedCommit(); 1234 EXPECT_ACTION_UPDATE_STATE(
1132 state.UpdateState(state.NextAction()); 1235 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
1133 state.FinishCommit(); 1236 state.FinishCommit();
1134 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
1135 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, 1237 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
1136 state.CommitState()); 1238 state.CommitState());
1137 state.UpdateState(state.NextAction()); 1239 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1138 1240
1139 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW, 1241 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW,
1140 state.CommitState()); 1242 state.CommitState());
1141 1243 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
1142 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting());
1143 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
1144 state.SetNeedsForcedRedraw(true);
1145 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction());
1146 state.UpdateState(state.NextAction());
1147 state.DidDrawIfPossibleCompleted(true); 1244 state.DidDrawIfPossibleCompleted(true);
1148 state.DidLeaveBeginFrame(); 1245 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1149 1246
1150 // Should be waiting for the normal begin frame from the main thread. 1247 // Should be waiting for the normal begin frame from the main thread.
1151 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 1248 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
1152 state.CommitState()) << state.ToString(); 1249 state.CommitState()) << state.ToString();
1153 } 1250 }
1154 1251
1155 TEST(SchedulerStateMachineTest, 1252 TEST(SchedulerStateMachineTest,
1156 ImmediateBeginFrameAbortedByMainThreadWhileInvisible) { 1253 ImmediateBeginFrameAbortedByMainThreadWhileInvisible) {
1157 SchedulerSettings default_scheduler_settings; 1254 SchedulerSettings default_scheduler_settings;
1158 StateMachine state(default_scheduler_settings); 1255 StateMachine state(default_scheduler_settings);
1159 state.SetCanStart(); 1256 state.SetCanStart();
1160 state.UpdateState(state.NextAction()); 1257 state.UpdateState(state.NextAction());
1161 state.DidCreateAndInitializeOutputSurface(); 1258 state.DidCreateAndInitializeOutputSurface();
1162 state.SetVisible(true); 1259 state.SetVisible(true);
1163 state.SetCanDraw(true); 1260 state.SetCanDraw(true);
1164 1261
1165 state.SetNeedsCommit(); 1262 state.SetNeedsCommit();
1166 state.UpdateState(state.NextAction()); 1263 state.UpdateState(state.NextAction());
1167 1264
1168 state.SetNeedsCommit(); 1265 state.SetNeedsCommit();
1169 state.SetNeedsForcedCommit(); 1266 state.SetNeedsForcedCommitForReadback();
1170 state.UpdateState(state.NextAction()); 1267 EXPECT_ACTION_UPDATE_STATE(
1268 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
1171 state.FinishCommit(); 1269 state.FinishCommit();
1172 1270
1173 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
1174 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, 1271 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
1175 state.CommitState()); 1272 state.CommitState());
1176 state.UpdateState(state.NextAction()); 1273 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
1177 1274
1178 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW, 1275 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW,
1179 state.CommitState()); 1276 state.CommitState());
1180 1277
1181 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 1278 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
1182 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
1183 state.SetNeedsForcedRedraw(true);
1184 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction());
1185 state.UpdateState(state.NextAction());
1186 state.DidDrawIfPossibleCompleted(true); 1279 state.DidDrawIfPossibleCompleted(true);
1187 state.DidLeaveBeginFrame(); 1280 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1188 1281
1189 // Should be waiting for the main thread's begin frame. 1282 // Should be waiting for the main thread's begin frame.
1190 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, 1283 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS,
1191 state.CommitState()) << state.ToString(); 1284 state.CommitState()) << state.ToString();
1192 1285
1193 // Become invisible and abort the main thread's begin frame. 1286 // Become invisible and abort the main thread's begin frame.
1194 state.SetVisible(false); 1287 state.SetVisible(false);
1195 state.BeginFrameAbortedByMainThread(); 1288 state.BeginFrameAbortedByMainThread();
1196 1289
1197 // Should be back in the idle state, but needing a commit. 1290 // Should be back in the idle state, but needing a commit.
1198 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); 1291 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
1199 EXPECT_TRUE(state.NeedsCommit()); 1292 EXPECT_TRUE(state.NeedsCommit());
1200 } 1293 }
1201 1294
1202 TEST(SchedulerStateMachineTest, ImmediateFinishCommitWhileCantDraw) { 1295 TEST(SchedulerStateMachineTest, ImmediateFinishCommitWhileCantDraw) {
1203 SchedulerSettings default_scheduler_settings; 1296 SchedulerSettings default_scheduler_settings;
1204 StateMachine state(default_scheduler_settings); 1297 StateMachine state(default_scheduler_settings);
1205 state.SetCanStart(); 1298 state.SetCanStart();
1206 state.UpdateState(state.NextAction()); 1299 state.UpdateState(state.NextAction());
1207 state.DidCreateAndInitializeOutputSurface(); 1300 state.DidCreateAndInitializeOutputSurface();
1208 state.SetVisible(true); 1301 state.SetVisible(true);
1209 state.SetCanDraw(false); 1302 state.SetCanDraw(false);
1210 1303
1211 state.SetNeedsCommit(); 1304 state.SetNeedsCommit();
1212 state.UpdateState(state.NextAction()); 1305 state.UpdateState(state.NextAction());
1213 1306
1214 state.SetNeedsCommit(); 1307 state.SetNeedsCommit();
1215 state.SetNeedsForcedCommit(); 1308 state.SetNeedsForcedCommitForReadback();
1216 state.UpdateState(state.NextAction()); 1309 state.UpdateState(state.NextAction());
1217 state.FinishCommit(); 1310 state.FinishCommit();
1218 1311
1219 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); 1312 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
1220 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, 1313 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
1221 state.CommitState()); 1314 state.CommitState());
1222 state.UpdateState(state.NextAction()); 1315 state.UpdateState(state.NextAction());
1223 1316
1224 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW, 1317 EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW,
1225 state.CommitState()); 1318 state.CommitState());
1226 1319
1227 state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); 1320 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK);
1228 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
1229 state.SetNeedsForcedRedraw(true);
1230 EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_FORCED, state.NextAction());
1231 state.UpdateState(state.NextAction());
1232 state.DidDrawIfPossibleCompleted(true); 1321 state.DidDrawIfPossibleCompleted(true);
1233 state.DidLeaveBeginFrame(); 1322 EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
1234 } 1323 }
1235 1324
1236 TEST(SchedulerStateMachineTest, ReportIfNotDrawing) { 1325 TEST(SchedulerStateMachineTest, ReportIfNotDrawing) {
1237 SchedulerSettings default_scheduler_settings; 1326 SchedulerSettings default_scheduler_settings;
1238 SchedulerStateMachine state(default_scheduler_settings); 1327 StateMachine state(default_scheduler_settings);
1239 1328
1240 state.SetCanDraw(true); 1329 state.SetCanDraw(true);
1241 state.SetVisible(true); 1330 state.SetVisible(true);
1242 EXPECT_FALSE(state.DrawSuspendedUntilCommit()); 1331 EXPECT_FALSE(state.DrawSuspendedUntilCommit());
1243 1332
1244 state.SetCanDraw(false); 1333 state.SetCanDraw(false);
1245 state.SetVisible(true); 1334 state.SetVisible(true);
1246 EXPECT_TRUE(state.DrawSuspendedUntilCommit()); 1335 EXPECT_TRUE(state.DrawSuspendedUntilCommit());
1247 1336
1248 state.SetCanDraw(true); 1337 state.SetCanDraw(true);
1249 state.SetVisible(false); 1338 state.SetVisible(false);
1250 EXPECT_TRUE(state.DrawSuspendedUntilCommit()); 1339 EXPECT_TRUE(state.DrawSuspendedUntilCommit());
1251 1340
1252 state.SetCanDraw(false); 1341 state.SetCanDraw(false);
1253 state.SetVisible(false); 1342 state.SetVisible(false);
1254 EXPECT_TRUE(state.DrawSuspendedUntilCommit()); 1343 EXPECT_TRUE(state.DrawSuspendedUntilCommit());
1255 1344
1256 state.SetCanDraw(true); 1345 state.SetCanDraw(true);
1257 state.SetVisible(true); 1346 state.SetVisible(true);
1258 EXPECT_FALSE(state.DrawSuspendedUntilCommit()); 1347 EXPECT_FALSE(state.DrawSuspendedUntilCommit());
1259 } 1348 }
1260 1349
1261 TEST(SchedulerStateMachineTest, ReportIfNotDrawingFromAcquiredTextures) { 1350 TEST(SchedulerStateMachineTest, ReportIfNotDrawingFromAcquiredTextures) {
1262 SchedulerSettings default_scheduler_settings; 1351 SchedulerSettings default_scheduler_settings;
1263 SchedulerStateMachine state(default_scheduler_settings); 1352 StateMachine state(default_scheduler_settings);
1264 state.SetCanStart(); 1353 state.SetCanStart();
1265 state.UpdateState(state.NextAction()); 1354 state.UpdateState(state.NextAction());
1266 state.DidCreateAndInitializeOutputSurface(); 1355 state.DidCreateAndInitializeOutputSurface();
1267 state.SetCanDraw(true); 1356 state.SetCanDraw(true);
1268 state.SetVisible(true); 1357 state.SetVisible(true);
1269 EXPECT_FALSE(state.DrawSuspendedUntilCommit()); 1358 EXPECT_FALSE(state.DrawSuspendedUntilCommit());
1270 1359
1271 state.SetMainThreadNeedsLayerTextures(); 1360 state.SetMainThreadNeedsLayerTextures();
1272 EXPECT_EQ( 1361 EXPECT_ACTION_UPDATE_STATE(
1273 SchedulerStateMachine::ACTION_ACQUIRE_LAYER_TEXTURES_FOR_MAIN_THREAD, 1362 SchedulerStateMachine::ACTION_ACQUIRE_LAYER_TEXTURES_FOR_MAIN_THREAD);
1274 state.NextAction()); 1363 EXPECT_TRUE(state.DrawSuspendedUntilCommit());
1275 state.UpdateState(state.NextAction()); 1364
1365 state.SetNeedsCommit();
1366 state.OnBeginFrame(BeginFrameArgs::CreateForTesting());
1367 EXPECT_ACTION_UPDATE_STATE(
1368 SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD);
1276 EXPECT_TRUE(state.DrawSuspendedUntilCommit()); 1369 EXPECT_TRUE(state.DrawSuspendedUntilCommit());
1277 1370
1278 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); 1371 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
1279
1280 state.SetNeedsCommit();
1281 EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD,
1282 state.NextAction());
1283
1284 state.UpdateState(state.NextAction());
1285 EXPECT_TRUE(state.DrawSuspendedUntilCommit());
1286
1287 EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
1288 1372
1289 state.FinishCommit(); 1373 state.FinishCommit();
1290 EXPECT_TRUE(state.DrawSuspendedUntilCommit()); 1374 EXPECT_TRUE(state.DrawSuspendedUntilCommit());
1291 1375
1292 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); 1376 EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
1293 1377
1294 state.UpdateState(state.NextAction()); 1378 state.UpdateState(state.NextAction());
1295 EXPECT_FALSE(state.DrawSuspendedUntilCommit()); 1379 EXPECT_FALSE(state.DrawSuspendedUntilCommit());
1296 } 1380 }
1297 1381
1298 } // namespace 1382 } // namespace
1299 } // namespace cc 1383 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698