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

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

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

Powered by Google App Engine
This is Rietveld 408576698