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

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

Powered by Google App Engine
This is Rietveld 408576698