OLD | NEW |
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 #include "cc/scheduler/scheduler.h" | 4 #include "cc/scheduler/scheduler.h" |
5 | 5 |
6 #include <string> | 6 #include <string> |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/memory/scoped_vector.h" | 10 #include "base/memory/scoped_vector.h" |
(...skipping 21 matching lines...) Expand all Loading... |
32 namespace cc { | 32 namespace cc { |
33 namespace { | 33 namespace { |
34 | 34 |
35 class FakeSchedulerClient; | 35 class FakeSchedulerClient; |
36 | 36 |
37 void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler, | 37 void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler, |
38 FakeSchedulerClient* client); | 38 FakeSchedulerClient* client); |
39 | 39 |
40 class FakeSchedulerClient : public SchedulerClient { | 40 class FakeSchedulerClient : public SchedulerClient { |
41 public: | 41 public: |
42 FakeSchedulerClient() | 42 FakeSchedulerClient() : needs_begin_frame_(false), automatic_swap_ack_(true) { |
43 : needs_begin_impl_frame_(false), automatic_swap_ack_(true) { | |
44 Reset(); | 43 Reset(); |
45 } | 44 } |
46 | 45 |
47 void Reset() { | 46 void Reset() { |
48 actions_.clear(); | 47 actions_.clear(); |
49 states_.clear(); | 48 states_.clear(); |
50 draw_will_happen_ = true; | 49 draw_will_happen_ = true; |
51 swap_will_happen_if_draw_happens_ = true; | 50 swap_will_happen_if_draw_happens_ = true; |
52 num_draws_ = 0; | 51 num_draws_ = 0; |
53 log_anticipated_draw_time_change_ = false; | 52 log_anticipated_draw_time_change_ = false; |
54 } | 53 } |
55 | 54 |
56 Scheduler* CreateScheduler(const SchedulerSettings& settings) { | 55 Scheduler* CreateScheduler(const SchedulerSettings& settings) { |
57 task_runner_ = new base::TestSimpleTaskRunner; | 56 task_runner_ = new base::TestSimpleTaskRunner; |
58 scheduler_ = Scheduler::Create(this, settings, 0, task_runner_); | 57 scheduler_ = Scheduler::Create(this, settings, 0, task_runner_); |
59 return scheduler_.get(); | 58 return scheduler_.get(); |
60 } | 59 } |
61 | 60 |
62 // Most tests don't care about DidAnticipatedDrawTimeChange, so only record it | 61 // Most tests don't care about DidAnticipatedDrawTimeChange, so only record it |
63 // for tests that do. | 62 // for tests that do. |
64 void set_log_anticipated_draw_time_change(bool log) { | 63 void set_log_anticipated_draw_time_change(bool log) { |
65 log_anticipated_draw_time_change_ = log; | 64 log_anticipated_draw_time_change_ = log; |
66 } | 65 } |
67 bool needs_begin_impl_frame() { return needs_begin_impl_frame_; } | 66 bool needs_begin_frame() { return needs_begin_frame_; } |
68 int num_draws() const { return num_draws_; } | 67 int num_draws() const { return num_draws_; } |
69 int num_actions_() const { return static_cast<int>(actions_.size()); } | 68 int num_actions_() const { return static_cast<int>(actions_.size()); } |
70 const char* Action(int i) const { return actions_[i]; } | 69 const char* Action(int i) const { return actions_[i]; } |
71 base::Value& StateForAction(int i) const { return *states_[i]; } | 70 base::Value& StateForAction(int i) const { return *states_[i]; } |
72 base::TimeTicks posted_begin_impl_frame_deadline() const { | 71 base::TimeTicks posted_begin_impl_frame_deadline() const { |
73 return posted_begin_impl_frame_deadline_; | 72 return posted_begin_impl_frame_deadline_; |
74 } | 73 } |
75 | 74 |
76 base::TestSimpleTaskRunner& task_runner() { return *task_runner_; } | 75 base::TestSimpleTaskRunner& task_runner() { return *task_runner_; } |
77 | 76 |
(...skipping 15 matching lines...) Expand all Loading... |
93 swap_will_happen_if_draw_happens_ = swap_will_happen_if_draw_happens; | 92 swap_will_happen_if_draw_happens_ = swap_will_happen_if_draw_happens; |
94 } | 93 } |
95 void SetAutomaticSwapAck(bool automatic_swap_ack) { | 94 void SetAutomaticSwapAck(bool automatic_swap_ack) { |
96 automatic_swap_ack_ = automatic_swap_ack; | 95 automatic_swap_ack_ = automatic_swap_ack; |
97 } | 96 } |
98 | 97 |
99 // SchedulerClient implementation. | 98 // SchedulerClient implementation. |
100 virtual void SetNeedsBeginFrame(bool enable) OVERRIDE { | 99 virtual void SetNeedsBeginFrame(bool enable) OVERRIDE { |
101 actions_.push_back("SetNeedsBeginFrame"); | 100 actions_.push_back("SetNeedsBeginFrame"); |
102 states_.push_back(scheduler_->StateAsValue().release()); | 101 states_.push_back(scheduler_->StateAsValue().release()); |
103 needs_begin_impl_frame_ = enable; | 102 needs_begin_frame_ = enable; |
104 } | 103 } |
105 virtual void WillBeginImplFrame(const BeginFrameArgs& args) OVERRIDE { | 104 virtual void WillBeginImplFrame(const BeginFrameArgs& args) OVERRIDE { |
106 actions_.push_back("WillBeginImplFrame"); | 105 actions_.push_back("WillBeginImplFrame"); |
107 states_.push_back(scheduler_->StateAsValue().release()); | 106 states_.push_back(scheduler_->StateAsValue().release()); |
108 } | 107 } |
109 virtual void ScheduledActionSendBeginMainFrame() OVERRIDE { | 108 virtual void ScheduledActionSendBeginMainFrame() OVERRIDE { |
110 actions_.push_back("ScheduledActionSendBeginMainFrame"); | 109 actions_.push_back("ScheduledActionSendBeginMainFrame"); |
111 states_.push_back(scheduler_->StateAsValue().release()); | 110 states_.push_back(scheduler_->StateAsValue().release()); |
112 } | 111 } |
113 virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible() | 112 virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible() |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
178 virtual base::TimeDelta BeginMainFrameToCommitDurationEstimate() OVERRIDE { | 177 virtual base::TimeDelta BeginMainFrameToCommitDurationEstimate() OVERRIDE { |
179 return base::TimeDelta(); | 178 return base::TimeDelta(); |
180 } | 179 } |
181 virtual base::TimeDelta CommitToActivateDurationEstimate() OVERRIDE { | 180 virtual base::TimeDelta CommitToActivateDurationEstimate() OVERRIDE { |
182 return base::TimeDelta(); | 181 return base::TimeDelta(); |
183 } | 182 } |
184 | 183 |
185 virtual void DidBeginImplFrameDeadline() OVERRIDE {} | 184 virtual void DidBeginImplFrameDeadline() OVERRIDE {} |
186 | 185 |
187 protected: | 186 protected: |
188 bool needs_begin_impl_frame_; | 187 bool needs_begin_frame_; |
189 bool draw_will_happen_; | 188 bool draw_will_happen_; |
190 bool swap_will_happen_if_draw_happens_; | 189 bool swap_will_happen_if_draw_happens_; |
191 bool automatic_swap_ack_; | 190 bool automatic_swap_ack_; |
192 int num_draws_; | 191 int num_draws_; |
193 bool log_anticipated_draw_time_change_; | 192 bool log_anticipated_draw_time_change_; |
194 base::TimeTicks posted_begin_impl_frame_deadline_; | 193 base::TimeTicks posted_begin_impl_frame_deadline_; |
195 std::vector<const char*> actions_; | 194 std::vector<const char*> actions_; |
196 ScopedVector<base::Value> states_; | 195 ScopedVector<base::Value> states_; |
197 scoped_ptr<Scheduler> scheduler_; | 196 scoped_ptr<Scheduler> scheduler_; |
198 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; | 197 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
199 }; | 198 }; |
200 | 199 |
201 void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler, | 200 void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler, |
202 FakeSchedulerClient* client) { | 201 FakeSchedulerClient* client) { |
| 202 bool client_initiates_begin_frame = |
| 203 scheduler->settings().begin_frame_scheduling_enabled && |
| 204 scheduler->settings().throttle_frame_production; |
| 205 |
203 scheduler->DidCreateAndInitializeOutputSurface(); | 206 scheduler->DidCreateAndInitializeOutputSurface(); |
204 scheduler->SetNeedsCommit(); | 207 scheduler->SetNeedsCommit(); |
205 scheduler->NotifyBeginMainFrameStarted(); | 208 scheduler->NotifyBeginMainFrameStarted(); |
206 scheduler->NotifyReadyToCommit(); | 209 scheduler->NotifyReadyToCommit(); |
207 // Go through the motions to draw the commit. | 210 // Go through the motions to draw the commit. |
208 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 211 if (client_initiates_begin_frame) |
| 212 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 213 else |
| 214 client->task_runner().RunPendingTasks(); // Run posted BeginFrame. |
209 | 215 |
210 // Run the posted deadline task. | 216 // Run the posted deadline task. |
211 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 217 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
212 client->task_runner().RunPendingTasks(); | 218 client->task_runner().RunPendingTasks(); |
213 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 219 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
214 | 220 |
215 // We need another BeginImplFrame so Scheduler calls | 221 // We need another BeginImplFrame so Scheduler calls |
216 // SetNeedsBeginFrame(false). | 222 // SetNeedsBeginFrame(false). |
217 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 223 if (client_initiates_begin_frame) |
| 224 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 225 else |
| 226 client->task_runner().RunPendingTasks(); // Run posted BeginFrame. |
218 | 227 |
219 // Run the posted deadline task. | 228 // Run the posted deadline task. |
220 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 229 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
221 client->task_runner().RunPendingTasks(); | 230 client->task_runner().RunPendingTasks(); |
222 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 231 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
223 } | 232 } |
224 | 233 |
225 TEST(SchedulerTest, InitializeOutputSurfaceDoesNotBeginImplFrame) { | 234 TEST(SchedulerTest, InitializeOutputSurfaceDoesNotBeginImplFrame) { |
226 FakeSchedulerClient client; | 235 FakeSchedulerClient client; |
227 SchedulerSettings default_scheduler_settings; | 236 SchedulerSettings default_scheduler_settings; |
(...skipping 15 matching lines...) Expand all Loading... |
243 scheduler->SetCanStart(); | 252 scheduler->SetCanStart(); |
244 scheduler->SetVisible(true); | 253 scheduler->SetVisible(true); |
245 scheduler->SetCanDraw(true); | 254 scheduler->SetCanDraw(true); |
246 | 255 |
247 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); | 256 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
248 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 257 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
249 | 258 |
250 // SetNeedsCommit should begin the frame on the next BeginImplFrame. | 259 // SetNeedsCommit should begin the frame on the next BeginImplFrame. |
251 client.Reset(); | 260 client.Reset(); |
252 scheduler->SetNeedsCommit(); | 261 scheduler->SetNeedsCommit(); |
253 EXPECT_TRUE(client.needs_begin_impl_frame()); | 262 EXPECT_TRUE(client.needs_begin_frame()); |
254 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); | 263 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); |
255 client.Reset(); | 264 client.Reset(); |
256 | 265 |
257 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 266 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
258 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 267 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
259 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); | 268 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
260 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 269 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
261 EXPECT_TRUE(client.needs_begin_impl_frame()); | 270 EXPECT_TRUE(client.needs_begin_frame()); |
262 client.Reset(); | 271 client.Reset(); |
263 | 272 |
264 // If we don't swap on the deadline, we need to request another | 273 // If we don't swap on the deadline, we wait for the next BeginFrame. |
265 // BeginImplFrame. | |
266 client.task_runner().RunPendingTasks(); // Run posted deadline. | 274 client.task_runner().RunPendingTasks(); // Run posted deadline. |
267 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); | 275 EXPECT_EQ(0, client.num_actions_()); |
268 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 276 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
269 EXPECT_TRUE(client.needs_begin_impl_frame()); | 277 EXPECT_TRUE(client.needs_begin_frame()); |
270 client.Reset(); | 278 client.Reset(); |
271 | 279 |
272 // NotifyReadyToCommit should trigger the commit. | 280 // NotifyReadyToCommit should trigger the commit. |
273 scheduler->NotifyBeginMainFrameStarted(); | 281 scheduler->NotifyBeginMainFrameStarted(); |
274 scheduler->NotifyReadyToCommit(); | 282 scheduler->NotifyReadyToCommit(); |
275 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 283 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
276 EXPECT_TRUE(client.needs_begin_impl_frame()); | 284 EXPECT_TRUE(client.needs_begin_frame()); |
277 client.Reset(); | 285 client.Reset(); |
278 | 286 |
279 // BeginImplFrame should prepare the draw. | 287 // BeginImplFrame should prepare the draw. |
280 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 288 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
281 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | 289 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
282 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 290 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
283 EXPECT_TRUE(client.needs_begin_impl_frame()); | 291 EXPECT_TRUE(client.needs_begin_frame()); |
284 client.Reset(); | 292 client.Reset(); |
285 | 293 |
286 // BeginImplFrame deadline should draw. | 294 // BeginImplFrame deadline should draw. |
287 client.task_runner().RunPendingTasks(); // Run posted deadline. | 295 client.task_runner().RunPendingTasks(); // Run posted deadline. |
288 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); | 296 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
289 EXPECT_ACTION("SetNeedsBeginFrame", client, 1, 2); | |
290 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 297 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
291 EXPECT_TRUE(client.needs_begin_impl_frame()); | 298 EXPECT_TRUE(client.needs_begin_frame()); |
292 client.Reset(); | 299 client.Reset(); |
293 | 300 |
294 // The following BeginImplFrame deadline should SetNeedsBeginFrame(false) | 301 // The following BeginImplFrame deadline should SetNeedsBeginFrame(false) |
295 // to avoid excessive toggles. | 302 // to avoid excessive toggles. |
296 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 303 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
297 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | 304 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
298 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 305 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
299 client.Reset(); | 306 client.Reset(); |
300 | 307 |
301 client.task_runner().RunPendingTasks(); // Run posted deadline. | 308 client.task_runner().RunPendingTasks(); // Run posted deadline. |
302 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); | 309 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); |
303 EXPECT_FALSE(client.needs_begin_impl_frame()); | 310 EXPECT_FALSE(client.needs_begin_frame()); |
304 client.Reset(); | 311 client.Reset(); |
305 } | 312 } |
306 | 313 |
307 TEST(SchedulerTest, RequestCommitAfterBeginMainFrameSent) { | 314 TEST(SchedulerTest, RequestCommitAfterBeginMainFrameSent) { |
308 FakeSchedulerClient client; | 315 FakeSchedulerClient client; |
309 SchedulerSettings scheduler_settings; | 316 SchedulerSettings scheduler_settings; |
310 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); | 317 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); |
311 scheduler->SetCanStart(); | 318 scheduler->SetCanStart(); |
312 scheduler->SetVisible(true); | 319 scheduler->SetVisible(true); |
313 scheduler->SetCanDraw(true); | 320 scheduler->SetCanDraw(true); |
314 | 321 |
315 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); | 322 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
316 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 323 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
317 client.Reset(); | 324 client.Reset(); |
318 | 325 |
319 // SetNeedsCommit should begin the frame. | 326 // SetNeedsCommit should begin the frame. |
320 scheduler->SetNeedsCommit(); | 327 scheduler->SetNeedsCommit(); |
321 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); | 328 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); |
322 | 329 |
323 client.Reset(); | 330 client.Reset(); |
324 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 331 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
325 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 332 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
326 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); | 333 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
327 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 334 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
328 | 335 |
329 EXPECT_TRUE(client.needs_begin_impl_frame()); | 336 EXPECT_TRUE(client.needs_begin_frame()); |
330 client.Reset(); | 337 client.Reset(); |
331 | 338 |
332 // Now SetNeedsCommit again. Calling here means we need a second commit. | 339 // Now SetNeedsCommit again. Calling here means we need a second commit. |
333 scheduler->SetNeedsCommit(); | 340 scheduler->SetNeedsCommit(); |
334 EXPECT_EQ(client.num_actions_(), 0); | 341 EXPECT_EQ(client.num_actions_(), 0); |
335 client.Reset(); | 342 client.Reset(); |
336 | 343 |
337 // Finish the first commit. | 344 // Finish the first commit. |
338 scheduler->NotifyBeginMainFrameStarted(); | 345 scheduler->NotifyBeginMainFrameStarted(); |
339 scheduler->NotifyReadyToCommit(); | 346 scheduler->NotifyReadyToCommit(); |
340 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 347 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
341 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 348 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
342 client.Reset(); | 349 client.Reset(); |
343 client.task_runner().RunPendingTasks(); // Run posted deadline. | 350 client.task_runner().RunPendingTasks(); // Run posted deadline. |
344 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); | 351 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
345 EXPECT_ACTION("SetNeedsBeginFrame", client, 1, 2); | |
346 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 352 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
347 | 353 |
348 // Because we just swapped, the Scheduler should also request the next | 354 // Because we just swapped, the Scheduler should also request the next |
349 // BeginImplFrame from the OutputSurface. | 355 // BeginImplFrame from the OutputSurface. |
350 EXPECT_TRUE(client.needs_begin_impl_frame()); | 356 EXPECT_TRUE(client.needs_begin_frame()); |
351 client.Reset(); | 357 client.Reset(); |
352 // Since another commit is needed, the next BeginImplFrame should initiate | 358 // Since another commit is needed, the next BeginImplFrame should initiate |
353 // the second commit. | 359 // the second commit. |
354 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 360 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
355 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 361 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
356 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); | 362 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
357 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 363 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
358 client.Reset(); | 364 client.Reset(); |
359 | 365 |
360 // Finishing the commit before the deadline should post a new deadline task | 366 // Finishing the commit before the deadline should post a new deadline task |
361 // to trigger the deadline early. | 367 // to trigger the deadline early. |
362 scheduler->NotifyBeginMainFrameStarted(); | 368 scheduler->NotifyBeginMainFrameStarted(); |
363 scheduler->NotifyReadyToCommit(); | 369 scheduler->NotifyReadyToCommit(); |
364 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 370 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
365 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 371 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
366 client.Reset(); | 372 client.Reset(); |
367 client.task_runner().RunPendingTasks(); // Run posted deadline. | 373 client.task_runner().RunPendingTasks(); // Run posted deadline. |
368 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); | 374 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
369 EXPECT_ACTION("SetNeedsBeginFrame", client, 1, 2); | |
370 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 375 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
371 EXPECT_TRUE(client.needs_begin_impl_frame()); | 376 EXPECT_TRUE(client.needs_begin_frame()); |
372 client.Reset(); | 377 client.Reset(); |
373 | 378 |
374 // On the next BeginImplFrame, verify we go back to a quiescent state and | 379 // On the next BeginImplFrame, verify we go back to a quiescent state and |
375 // no longer request BeginImplFrames. | 380 // no longer request BeginImplFrames. |
376 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 381 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
377 client.task_runner().RunPendingTasks(); // Run posted deadline. | 382 client.task_runner().RunPendingTasks(); // Run posted deadline. |
378 EXPECT_FALSE(client.needs_begin_impl_frame()); | 383 EXPECT_FALSE(client.needs_begin_frame()); |
379 client.Reset(); | 384 client.Reset(); |
380 } | 385 } |
381 | 386 |
382 class SchedulerClientThatsetNeedsDrawInsideDraw : public FakeSchedulerClient { | 387 class SchedulerClientThatsetNeedsDrawInsideDraw : public FakeSchedulerClient { |
383 public: | 388 public: |
384 virtual void ScheduledActionSendBeginMainFrame() OVERRIDE {} | 389 virtual void ScheduledActionSendBeginMainFrame() OVERRIDE {} |
385 virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible() | 390 virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible() |
386 OVERRIDE { | 391 OVERRIDE { |
387 // Only SetNeedsRedraw the first time this is called | 392 // Only SetNeedsRedraw the first time this is called |
388 if (!num_draws_) | 393 if (!num_draws_) |
(...skipping 23 matching lines...) Expand all Loading... |
412 SchedulerSettings default_scheduler_settings; | 417 SchedulerSettings default_scheduler_settings; |
413 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 418 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
414 scheduler->SetCanStart(); | 419 scheduler->SetCanStart(); |
415 scheduler->SetVisible(true); | 420 scheduler->SetVisible(true); |
416 scheduler->SetCanDraw(true); | 421 scheduler->SetCanDraw(true); |
417 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 422 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
418 client.Reset(); | 423 client.Reset(); |
419 | 424 |
420 scheduler->SetNeedsRedraw(); | 425 scheduler->SetNeedsRedraw(); |
421 EXPECT_TRUE(scheduler->RedrawPending()); | 426 EXPECT_TRUE(scheduler->RedrawPending()); |
422 EXPECT_TRUE(client.needs_begin_impl_frame()); | 427 EXPECT_TRUE(client.needs_begin_frame()); |
423 EXPECT_EQ(0, client.num_draws()); | 428 EXPECT_EQ(0, client.num_draws()); |
424 | 429 |
425 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 430 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
426 client.task_runner().RunPendingTasks(); // Run posted deadline. | 431 client.task_runner().RunPendingTasks(); // Run posted deadline. |
427 EXPECT_EQ(1, client.num_draws()); | 432 EXPECT_EQ(1, client.num_draws()); |
428 EXPECT_TRUE(scheduler->RedrawPending()); | 433 EXPECT_TRUE(scheduler->RedrawPending()); |
429 EXPECT_TRUE(client.needs_begin_impl_frame()); | 434 EXPECT_TRUE(client.needs_begin_frame()); |
430 | 435 |
431 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 436 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
432 client.task_runner().RunPendingTasks(); // Run posted deadline. | 437 client.task_runner().RunPendingTasks(); // Run posted deadline. |
433 EXPECT_EQ(2, client.num_draws()); | 438 EXPECT_EQ(2, client.num_draws()); |
434 EXPECT_FALSE(scheduler->RedrawPending()); | 439 EXPECT_FALSE(scheduler->RedrawPending()); |
435 EXPECT_TRUE(client.needs_begin_impl_frame()); | 440 EXPECT_TRUE(client.needs_begin_frame()); |
436 | 441 |
437 // We stop requesting BeginImplFrames after a BeginImplFrame where we don't | 442 // We stop requesting BeginImplFrames after a BeginImplFrame where we don't |
438 // swap. | 443 // swap. |
439 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 444 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
440 client.task_runner().RunPendingTasks(); // Run posted deadline. | 445 client.task_runner().RunPendingTasks(); // Run posted deadline. |
441 EXPECT_EQ(2, client.num_draws()); | 446 EXPECT_EQ(2, client.num_draws()); |
442 EXPECT_FALSE(scheduler->RedrawPending()); | 447 EXPECT_FALSE(scheduler->RedrawPending()); |
443 EXPECT_FALSE(client.needs_begin_impl_frame()); | 448 EXPECT_FALSE(client.needs_begin_frame()); |
444 } | 449 } |
445 | 450 |
446 // Test that requesting redraw inside a failed draw doesn't lose the request. | 451 // Test that requesting redraw inside a failed draw doesn't lose the request. |
447 TEST(SchedulerTest, RequestRedrawInsideFailedDraw) { | 452 TEST(SchedulerTest, RequestRedrawInsideFailedDraw) { |
448 SchedulerClientThatsetNeedsDrawInsideDraw client; | 453 SchedulerClientThatsetNeedsDrawInsideDraw client; |
449 SchedulerSettings default_scheduler_settings; | 454 SchedulerSettings default_scheduler_settings; |
450 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 455 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
451 scheduler->SetCanStart(); | 456 scheduler->SetCanStart(); |
452 scheduler->SetVisible(true); | 457 scheduler->SetVisible(true); |
453 scheduler->SetCanDraw(true); | 458 scheduler->SetCanDraw(true); |
454 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 459 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
455 client.Reset(); | 460 client.Reset(); |
456 | 461 |
457 client.SetDrawWillHappen(false); | 462 client.SetDrawWillHappen(false); |
458 | 463 |
459 scheduler->SetNeedsRedraw(); | 464 scheduler->SetNeedsRedraw(); |
460 EXPECT_TRUE(scheduler->RedrawPending()); | 465 EXPECT_TRUE(scheduler->RedrawPending()); |
461 EXPECT_TRUE(client.needs_begin_impl_frame()); | 466 EXPECT_TRUE(client.needs_begin_frame()); |
462 EXPECT_EQ(0, client.num_draws()); | 467 EXPECT_EQ(0, client.num_draws()); |
463 | 468 |
464 // Fail the draw. | 469 // Fail the draw. |
465 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 470 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
466 client.task_runner().RunPendingTasks(); // Run posted deadline. | 471 client.task_runner().RunPendingTasks(); // Run posted deadline. |
467 EXPECT_EQ(1, client.num_draws()); | 472 EXPECT_EQ(1, client.num_draws()); |
468 | 473 |
469 // We have a commit pending and the draw failed, and we didn't lose the redraw | 474 // We have a commit pending and the draw failed, and we didn't lose the redraw |
470 // request. | 475 // request. |
471 EXPECT_TRUE(scheduler->CommitPending()); | 476 EXPECT_TRUE(scheduler->CommitPending()); |
472 EXPECT_TRUE(scheduler->RedrawPending()); | 477 EXPECT_TRUE(scheduler->RedrawPending()); |
473 EXPECT_TRUE(client.needs_begin_impl_frame()); | 478 EXPECT_TRUE(client.needs_begin_frame()); |
474 | 479 |
475 // Fail the draw again. | 480 // Fail the draw again. |
476 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 481 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
477 client.task_runner().RunPendingTasks(); // Run posted deadline. | 482 client.task_runner().RunPendingTasks(); // Run posted deadline. |
478 EXPECT_EQ(2, client.num_draws()); | 483 EXPECT_EQ(2, client.num_draws()); |
479 EXPECT_TRUE(scheduler->CommitPending()); | 484 EXPECT_TRUE(scheduler->CommitPending()); |
480 EXPECT_TRUE(scheduler->RedrawPending()); | 485 EXPECT_TRUE(scheduler->RedrawPending()); |
481 EXPECT_TRUE(client.needs_begin_impl_frame()); | 486 EXPECT_TRUE(client.needs_begin_frame()); |
482 | 487 |
483 // Draw successfully. | 488 // Draw successfully. |
484 client.SetDrawWillHappen(true); | 489 client.SetDrawWillHappen(true); |
485 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 490 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
486 client.task_runner().RunPendingTasks(); // Run posted deadline. | 491 client.task_runner().RunPendingTasks(); // Run posted deadline. |
487 EXPECT_EQ(3, client.num_draws()); | 492 EXPECT_EQ(3, client.num_draws()); |
488 EXPECT_TRUE(scheduler->CommitPending()); | 493 EXPECT_TRUE(scheduler->CommitPending()); |
489 EXPECT_FALSE(scheduler->RedrawPending()); | 494 EXPECT_FALSE(scheduler->RedrawPending()); |
490 EXPECT_TRUE(client.needs_begin_impl_frame()); | 495 EXPECT_TRUE(client.needs_begin_frame()); |
491 } | 496 } |
492 | 497 |
493 class SchedulerClientThatSetNeedsCommitInsideDraw : public FakeSchedulerClient { | 498 class SchedulerClientThatSetNeedsCommitInsideDraw : public FakeSchedulerClient { |
494 public: | 499 public: |
495 SchedulerClientThatSetNeedsCommitInsideDraw() | 500 SchedulerClientThatSetNeedsCommitInsideDraw() |
496 : set_needs_commit_on_next_draw_(false) {} | 501 : set_needs_commit_on_next_draw_(false) {} |
497 | 502 |
498 virtual void ScheduledActionSendBeginMainFrame() OVERRIDE {} | 503 virtual void ScheduledActionSendBeginMainFrame() OVERRIDE {} |
499 virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible() | 504 virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible() |
500 OVERRIDE { | 505 OVERRIDE { |
(...skipping 28 matching lines...) Expand all Loading... |
529 TEST(SchedulerTest, RequestCommitInsideDraw) { | 534 TEST(SchedulerTest, RequestCommitInsideDraw) { |
530 SchedulerClientThatSetNeedsCommitInsideDraw client; | 535 SchedulerClientThatSetNeedsCommitInsideDraw client; |
531 SchedulerSettings default_scheduler_settings; | 536 SchedulerSettings default_scheduler_settings; |
532 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 537 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
533 scheduler->SetCanStart(); | 538 scheduler->SetCanStart(); |
534 scheduler->SetVisible(true); | 539 scheduler->SetVisible(true); |
535 scheduler->SetCanDraw(true); | 540 scheduler->SetCanDraw(true); |
536 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 541 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
537 client.Reset(); | 542 client.Reset(); |
538 | 543 |
539 EXPECT_FALSE(client.needs_begin_impl_frame()); | 544 EXPECT_FALSE(client.needs_begin_frame()); |
540 scheduler->SetNeedsRedraw(); | 545 scheduler->SetNeedsRedraw(); |
541 EXPECT_TRUE(scheduler->RedrawPending()); | 546 EXPECT_TRUE(scheduler->RedrawPending()); |
542 EXPECT_EQ(0, client.num_draws()); | 547 EXPECT_EQ(0, client.num_draws()); |
543 EXPECT_TRUE(client.needs_begin_impl_frame()); | 548 EXPECT_TRUE(client.needs_begin_frame()); |
544 | 549 |
545 client.SetNeedsCommitOnNextDraw(); | 550 client.SetNeedsCommitOnNextDraw(); |
546 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 551 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
547 client.SetNeedsCommitOnNextDraw(); | 552 client.SetNeedsCommitOnNextDraw(); |
548 client.task_runner().RunPendingTasks(); // Run posted deadline. | 553 client.task_runner().RunPendingTasks(); // Run posted deadline. |
549 EXPECT_EQ(1, client.num_draws()); | 554 EXPECT_EQ(1, client.num_draws()); |
550 EXPECT_TRUE(scheduler->CommitPending()); | 555 EXPECT_TRUE(scheduler->CommitPending()); |
551 EXPECT_TRUE(client.needs_begin_impl_frame()); | 556 EXPECT_TRUE(client.needs_begin_frame()); |
552 scheduler->NotifyBeginMainFrameStarted(); | 557 scheduler->NotifyBeginMainFrameStarted(); |
553 scheduler->NotifyReadyToCommit(); | 558 scheduler->NotifyReadyToCommit(); |
554 | 559 |
555 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 560 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
556 client.task_runner().RunPendingTasks(); // Run posted deadline. | 561 client.task_runner().RunPendingTasks(); // Run posted deadline. |
557 EXPECT_EQ(2, client.num_draws()); | 562 EXPECT_EQ(2, client.num_draws()); |
558 | 563 |
559 EXPECT_FALSE(scheduler->RedrawPending()); | 564 EXPECT_FALSE(scheduler->RedrawPending()); |
560 EXPECT_FALSE(scheduler->CommitPending()); | 565 EXPECT_FALSE(scheduler->CommitPending()); |
561 EXPECT_TRUE(client.needs_begin_impl_frame()); | 566 EXPECT_TRUE(client.needs_begin_frame()); |
562 | 567 |
563 // We stop requesting BeginImplFrames after a BeginImplFrame where we don't | 568 // We stop requesting BeginImplFrames after a BeginImplFrame where we don't |
564 // swap. | 569 // swap. |
565 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 570 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
566 client.task_runner().RunPendingTasks(); // Run posted deadline. | 571 client.task_runner().RunPendingTasks(); // Run posted deadline. |
567 EXPECT_EQ(2, client.num_draws()); | 572 EXPECT_EQ(2, client.num_draws()); |
568 EXPECT_FALSE(scheduler->RedrawPending()); | 573 EXPECT_FALSE(scheduler->RedrawPending()); |
569 EXPECT_FALSE(scheduler->CommitPending()); | 574 EXPECT_FALSE(scheduler->CommitPending()); |
570 EXPECT_FALSE(client.needs_begin_impl_frame()); | 575 EXPECT_FALSE(client.needs_begin_frame()); |
571 } | 576 } |
572 | 577 |
573 // Tests that when a draw fails then the pending commit should not be dropped. | 578 // Tests that when a draw fails then the pending commit should not be dropped. |
574 TEST(SchedulerTest, RequestCommitInsideFailedDraw) { | 579 TEST(SchedulerTest, RequestCommitInsideFailedDraw) { |
575 SchedulerClientThatsetNeedsDrawInsideDraw client; | 580 SchedulerClientThatsetNeedsDrawInsideDraw client; |
576 SchedulerSettings default_scheduler_settings; | 581 SchedulerSettings default_scheduler_settings; |
577 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 582 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
578 scheduler->SetCanStart(); | 583 scheduler->SetCanStart(); |
579 scheduler->SetVisible(true); | 584 scheduler->SetVisible(true); |
580 scheduler->SetCanDraw(true); | 585 scheduler->SetCanDraw(true); |
581 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 586 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
582 client.Reset(); | 587 client.Reset(); |
583 | 588 |
584 client.SetDrawWillHappen(false); | 589 client.SetDrawWillHappen(false); |
585 | 590 |
586 scheduler->SetNeedsRedraw(); | 591 scheduler->SetNeedsRedraw(); |
587 EXPECT_TRUE(scheduler->RedrawPending()); | 592 EXPECT_TRUE(scheduler->RedrawPending()); |
588 EXPECT_TRUE(client.needs_begin_impl_frame()); | 593 EXPECT_TRUE(client.needs_begin_frame()); |
589 EXPECT_EQ(0, client.num_draws()); | 594 EXPECT_EQ(0, client.num_draws()); |
590 | 595 |
591 // Fail the draw. | 596 // Fail the draw. |
592 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 597 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
593 client.task_runner().RunPendingTasks(); // Run posted deadline. | 598 client.task_runner().RunPendingTasks(); // Run posted deadline. |
594 EXPECT_EQ(1, client.num_draws()); | 599 EXPECT_EQ(1, client.num_draws()); |
595 | 600 |
596 // We have a commit pending and the draw failed, and we didn't lose the commit | 601 // We have a commit pending and the draw failed, and we didn't lose the commit |
597 // request. | 602 // request. |
598 EXPECT_TRUE(scheduler->CommitPending()); | 603 EXPECT_TRUE(scheduler->CommitPending()); |
599 EXPECT_TRUE(scheduler->RedrawPending()); | 604 EXPECT_TRUE(scheduler->RedrawPending()); |
600 EXPECT_TRUE(client.needs_begin_impl_frame()); | 605 EXPECT_TRUE(client.needs_begin_frame()); |
601 | 606 |
602 // Fail the draw again. | 607 // Fail the draw again. |
603 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 608 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
604 | 609 |
605 client.task_runner().RunPendingTasks(); // Run posted deadline. | 610 client.task_runner().RunPendingTasks(); // Run posted deadline. |
606 EXPECT_EQ(2, client.num_draws()); | 611 EXPECT_EQ(2, client.num_draws()); |
607 EXPECT_TRUE(scheduler->CommitPending()); | 612 EXPECT_TRUE(scheduler->CommitPending()); |
608 EXPECT_TRUE(scheduler->RedrawPending()); | 613 EXPECT_TRUE(scheduler->RedrawPending()); |
609 EXPECT_TRUE(client.needs_begin_impl_frame()); | 614 EXPECT_TRUE(client.needs_begin_frame()); |
610 | 615 |
611 // Draw successfully. | 616 // Draw successfully. |
612 client.SetDrawWillHappen(true); | 617 client.SetDrawWillHappen(true); |
613 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 618 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
614 client.task_runner().RunPendingTasks(); // Run posted deadline. | 619 client.task_runner().RunPendingTasks(); // Run posted deadline. |
615 EXPECT_EQ(3, client.num_draws()); | 620 EXPECT_EQ(3, client.num_draws()); |
616 EXPECT_TRUE(scheduler->CommitPending()); | 621 EXPECT_TRUE(scheduler->CommitPending()); |
617 EXPECT_FALSE(scheduler->RedrawPending()); | 622 EXPECT_FALSE(scheduler->RedrawPending()); |
618 EXPECT_TRUE(client.needs_begin_impl_frame()); | 623 EXPECT_TRUE(client.needs_begin_frame()); |
619 } | 624 } |
620 | 625 |
621 TEST(SchedulerTest, NoSwapWhenDrawFails) { | 626 TEST(SchedulerTest, NoSwapWhenDrawFails) { |
622 SchedulerClientThatSetNeedsCommitInsideDraw client; | 627 SchedulerClientThatSetNeedsCommitInsideDraw client; |
623 SchedulerSettings default_scheduler_settings; | 628 SchedulerSettings default_scheduler_settings; |
624 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 629 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
625 scheduler->SetCanStart(); | 630 scheduler->SetCanStart(); |
626 scheduler->SetVisible(true); | 631 scheduler->SetVisible(true); |
627 scheduler->SetCanDraw(true); | 632 scheduler->SetCanDraw(true); |
628 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 633 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
629 client.Reset(); | 634 client.Reset(); |
630 | 635 |
631 scheduler->SetNeedsRedraw(); | 636 scheduler->SetNeedsRedraw(); |
632 EXPECT_TRUE(scheduler->RedrawPending()); | 637 EXPECT_TRUE(scheduler->RedrawPending()); |
633 EXPECT_TRUE(client.needs_begin_impl_frame()); | 638 EXPECT_TRUE(client.needs_begin_frame()); |
634 EXPECT_EQ(0, client.num_draws()); | 639 EXPECT_EQ(0, client.num_draws()); |
635 | 640 |
636 // Draw successfully, this starts a new frame. | 641 // Draw successfully, this starts a new frame. |
637 client.SetNeedsCommitOnNextDraw(); | 642 client.SetNeedsCommitOnNextDraw(); |
638 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 643 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
639 client.task_runner().RunPendingTasks(); // Run posted deadline. | 644 client.task_runner().RunPendingTasks(); // Run posted deadline. |
640 EXPECT_EQ(1, client.num_draws()); | 645 EXPECT_EQ(1, client.num_draws()); |
641 | 646 |
642 scheduler->SetNeedsRedraw(); | 647 scheduler->SetNeedsRedraw(); |
643 EXPECT_TRUE(scheduler->RedrawPending()); | 648 EXPECT_TRUE(scheduler->RedrawPending()); |
644 EXPECT_TRUE(client.needs_begin_impl_frame()); | 649 EXPECT_TRUE(client.needs_begin_frame()); |
645 | 650 |
646 // Fail to draw, this should not start a frame. | 651 // Fail to draw, this should not start a frame. |
647 client.SetDrawWillHappen(false); | 652 client.SetDrawWillHappen(false); |
648 client.SetNeedsCommitOnNextDraw(); | 653 client.SetNeedsCommitOnNextDraw(); |
649 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 654 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
650 client.task_runner().RunPendingTasks(); // Run posted deadline. | 655 client.task_runner().RunPendingTasks(); // Run posted deadline. |
651 EXPECT_EQ(2, client.num_draws()); | 656 EXPECT_EQ(2, client.num_draws()); |
652 } | 657 } |
653 | 658 |
654 TEST(SchedulerTest, NoSwapWhenSwapFailsDuringForcedCommit) { | 659 TEST(SchedulerTest, NoSwapWhenSwapFailsDuringForcedCommit) { |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
717 scheduler->SetCanDraw(true); | 722 scheduler->SetCanDraw(true); |
718 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 723 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
719 | 724 |
720 // Request both draw and manage tiles. ManageTiles shouldn't | 725 // Request both draw and manage tiles. ManageTiles shouldn't |
721 // be trigged until BeginImplFrame. | 726 // be trigged until BeginImplFrame. |
722 client.Reset(); | 727 client.Reset(); |
723 scheduler->SetNeedsManageTiles(); | 728 scheduler->SetNeedsManageTiles(); |
724 scheduler->SetNeedsRedraw(); | 729 scheduler->SetNeedsRedraw(); |
725 EXPECT_TRUE(scheduler->RedrawPending()); | 730 EXPECT_TRUE(scheduler->RedrawPending()); |
726 EXPECT_TRUE(scheduler->ManageTilesPending()); | 731 EXPECT_TRUE(scheduler->ManageTilesPending()); |
727 EXPECT_TRUE(client.needs_begin_impl_frame()); | 732 EXPECT_TRUE(client.needs_begin_frame()); |
728 EXPECT_EQ(0, client.num_draws()); | 733 EXPECT_EQ(0, client.num_draws()); |
729 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles")); | 734 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles")); |
730 EXPECT_FALSE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); | 735 EXPECT_FALSE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
731 | 736 |
732 // We have no immediate actions to perform, so the BeginImplFrame should post | 737 // We have no immediate actions to perform, so the BeginImplFrame should post |
733 // the deadline task. | 738 // the deadline task. |
734 client.Reset(); | 739 client.Reset(); |
735 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 740 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
736 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | 741 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
737 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 742 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
738 | 743 |
739 // On the deadline, he actions should have occured in the right order. | 744 // On the deadline, he actions should have occured in the right order. |
740 client.Reset(); | 745 client.Reset(); |
741 client.task_runner().RunPendingTasks(); // Run posted deadline. | 746 client.task_runner().RunPendingTasks(); // Run posted deadline. |
742 EXPECT_EQ(1, client.num_draws()); | 747 EXPECT_EQ(1, client.num_draws()); |
743 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); | 748 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
744 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); | 749 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); |
745 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), | 750 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), |
746 client.ActionIndex("ScheduledActionManageTiles")); | 751 client.ActionIndex("ScheduledActionManageTiles")); |
747 EXPECT_FALSE(scheduler->RedrawPending()); | 752 EXPECT_FALSE(scheduler->RedrawPending()); |
748 EXPECT_FALSE(scheduler->ManageTilesPending()); | 753 EXPECT_FALSE(scheduler->ManageTilesPending()); |
749 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 754 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
750 | 755 |
751 // Request a draw. We don't need a ManageTiles yet. | 756 // Request a draw. We don't need a ManageTiles yet. |
752 client.Reset(); | 757 client.Reset(); |
753 scheduler->SetNeedsRedraw(); | 758 scheduler->SetNeedsRedraw(); |
754 EXPECT_TRUE(scheduler->RedrawPending()); | 759 EXPECT_TRUE(scheduler->RedrawPending()); |
755 EXPECT_FALSE(scheduler->ManageTilesPending()); | 760 EXPECT_FALSE(scheduler->ManageTilesPending()); |
756 EXPECT_TRUE(client.needs_begin_impl_frame()); | 761 EXPECT_TRUE(client.needs_begin_frame()); |
757 EXPECT_EQ(0, client.num_draws()); | 762 EXPECT_EQ(0, client.num_draws()); |
758 | 763 |
759 // We have no immediate actions to perform, so the BeginImplFrame should post | 764 // We have no immediate actions to perform, so the BeginImplFrame should post |
760 // the deadline task. | 765 // the deadline task. |
761 client.Reset(); | 766 client.Reset(); |
762 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 767 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
763 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | 768 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
764 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 769 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
765 | 770 |
766 // Draw. The draw will trigger SetNeedsManageTiles, and | 771 // Draw. The draw will trigger SetNeedsManageTiles, and |
(...skipping 11 matching lines...) Expand all Loading... |
778 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 783 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
779 | 784 |
780 // We need a BeginImplFrame where we don't swap to go idle. | 785 // We need a BeginImplFrame where we don't swap to go idle. |
781 client.Reset(); | 786 client.Reset(); |
782 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 787 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
783 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | 788 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
784 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 789 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
785 client.Reset(); | 790 client.Reset(); |
786 client.task_runner().RunPendingTasks(); // Run posted deadline. | 791 client.task_runner().RunPendingTasks(); // Run posted deadline. |
787 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); | 792 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); |
| 793 EXPECT_FALSE(client.needs_begin_frame()); |
788 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 794 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
789 EXPECT_EQ(0, client.num_draws()); | 795 EXPECT_EQ(0, client.num_draws()); |
790 | 796 |
791 // Now trigger a ManageTiles outside of a draw. We will then need | 797 // Now trigger a ManageTiles outside of a draw. We will then need |
792 // a begin-frame for the ManageTiles, but we don't need a draw. | 798 // a begin-frame for the ManageTiles, but we don't need a draw. |
793 client.Reset(); | 799 client.Reset(); |
794 EXPECT_FALSE(client.needs_begin_impl_frame()); | 800 EXPECT_FALSE(client.needs_begin_frame()); |
795 scheduler->SetNeedsManageTiles(); | 801 scheduler->SetNeedsManageTiles(); |
796 EXPECT_TRUE(client.needs_begin_impl_frame()); | 802 EXPECT_TRUE(client.needs_begin_frame()); |
797 EXPECT_TRUE(scheduler->ManageTilesPending()); | 803 EXPECT_TRUE(scheduler->ManageTilesPending()); |
798 EXPECT_FALSE(scheduler->RedrawPending()); | 804 EXPECT_FALSE(scheduler->RedrawPending()); |
799 | 805 |
800 // BeginImplFrame. There will be no draw, only ManageTiles. | 806 // BeginImplFrame. There will be no draw, only ManageTiles. |
801 client.Reset(); | 807 client.Reset(); |
802 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 808 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
803 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | 809 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
804 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 810 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
805 client.Reset(); | 811 client.Reset(); |
806 client.task_runner().RunPendingTasks(); // Run posted deadline. | 812 client.task_runner().RunPendingTasks(); // Run posted deadline. |
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1109 client.task_runner().NextPendingTaskDelay().InMicroseconds()) | 1115 client.task_runner().NextPendingTaskDelay().InMicroseconds()) |
1110 << *scheduler->StateAsValue(); | 1116 << *scheduler->StateAsValue(); |
1111 client.task_runner().RunPendingTasks(); | 1117 client.task_runner().RunPendingTasks(); |
1112 EXPECT_GT(client.num_actions_(), actions_so_far); | 1118 EXPECT_GT(client.num_actions_(), actions_so_far); |
1113 EXPECT_STREQ(client.Action(client.num_actions_() - 1), | 1119 EXPECT_STREQ(client.Action(client.num_actions_() - 1), |
1114 "DidAnticipatedDrawTimeChange"); | 1120 "DidAnticipatedDrawTimeChange"); |
1115 actions_so_far = client.num_actions_(); | 1121 actions_so_far = client.num_actions_(); |
1116 } | 1122 } |
1117 } | 1123 } |
1118 | 1124 |
1119 TEST(SchedulerTest, BeginRetroFrameBasic) { | 1125 TEST(SchedulerTest, BeginRetroFrame) { |
1120 FakeSchedulerClient client; | 1126 FakeSchedulerClient client; |
1121 SchedulerSettings scheduler_settings; | 1127 SchedulerSettings scheduler_settings; |
1122 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); | 1128 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); |
1123 scheduler->SetCanStart(); | 1129 scheduler->SetCanStart(); |
1124 scheduler->SetVisible(true); | 1130 scheduler->SetVisible(true); |
1125 scheduler->SetCanDraw(true); | 1131 scheduler->SetCanDraw(true); |
1126 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 1132 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
1127 | 1133 |
1128 // SetNeedsCommit should begin the frame on the next BeginImplFrame. | 1134 // SetNeedsCommit should begin the frame on the next BeginImplFrame. |
1129 client.Reset(); | 1135 client.Reset(); |
1130 scheduler->SetNeedsCommit(); | 1136 scheduler->SetNeedsCommit(); |
1131 EXPECT_TRUE(client.needs_begin_impl_frame()); | 1137 EXPECT_TRUE(client.needs_begin_frame()); |
1132 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); | 1138 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); |
1133 client.Reset(); | 1139 client.Reset(); |
1134 | 1140 |
1135 // Create a BeginFrame with a long deadline to avoid race conditions. | 1141 // Create a BeginFrame with a long deadline to avoid race conditions. |
1136 // This is the first BeginFrame, which will be handled immediately. | 1142 // This is the first BeginFrame, which will be handled immediately. |
1137 BeginFrameArgs args = BeginFrameArgs::CreateForTesting(); | 1143 BeginFrameArgs args = BeginFrameArgs::CreateForTesting(); |
1138 args.deadline += base::TimeDelta::FromHours(1); | 1144 args.deadline += base::TimeDelta::FromHours(1); |
1139 scheduler->BeginFrame(args); | 1145 scheduler->BeginFrame(args); |
1140 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 1146 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
1141 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); | 1147 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
1142 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1148 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
1143 EXPECT_TRUE(client.needs_begin_impl_frame()); | 1149 EXPECT_TRUE(client.needs_begin_frame()); |
1144 client.Reset(); | 1150 client.Reset(); |
1145 | 1151 |
1146 // Queue BeginFrames while we are still handling the previous BeginFrame. | 1152 // Queue BeginFrames while we are still handling the previous BeginFrame. |
1147 args.frame_time += base::TimeDelta::FromSeconds(1); | 1153 args.frame_time += base::TimeDelta::FromSeconds(1); |
1148 scheduler->BeginFrame(args); | 1154 scheduler->BeginFrame(args); |
1149 args.frame_time += base::TimeDelta::FromSeconds(1); | 1155 args.frame_time += base::TimeDelta::FromSeconds(1); |
1150 scheduler->BeginFrame(args); | 1156 scheduler->BeginFrame(args); |
1151 | 1157 |
1152 // If we don't swap on the deadline, we need to request another | 1158 // If we don't swap on the deadline, we wait for the next BeginImplFrame. |
1153 // BeginImplFrame. | |
1154 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1159 client.task_runner().RunPendingTasks(); // Run posted deadline. |
1155 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); | 1160 EXPECT_EQ(0, client.num_actions_()); |
1156 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1161 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
1157 EXPECT_TRUE(client.needs_begin_impl_frame()); | 1162 EXPECT_TRUE(client.needs_begin_frame()); |
1158 client.Reset(); | 1163 client.Reset(); |
1159 | 1164 |
1160 // NotifyReadyToCommit should trigger the commit. | 1165 // NotifyReadyToCommit should trigger the commit. |
1161 scheduler->NotifyBeginMainFrameStarted(); | 1166 scheduler->NotifyBeginMainFrameStarted(); |
1162 scheduler->NotifyReadyToCommit(); | 1167 scheduler->NotifyReadyToCommit(); |
1163 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 1168 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
1164 EXPECT_TRUE(client.needs_begin_impl_frame()); | 1169 EXPECT_TRUE(client.needs_begin_frame()); |
1165 client.Reset(); | 1170 client.Reset(); |
1166 | 1171 |
1167 // BeginImplFrame should prepare the draw. | 1172 // BeginImplFrame should prepare the draw. |
1168 client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. | 1173 client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. |
1169 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | 1174 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
1170 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1175 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
1171 EXPECT_TRUE(client.needs_begin_impl_frame()); | 1176 EXPECT_TRUE(client.needs_begin_frame()); |
1172 client.Reset(); | 1177 client.Reset(); |
1173 | 1178 |
1174 // BeginImplFrame deadline should draw. | 1179 // BeginImplFrame deadline should draw. |
1175 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1180 client.task_runner().RunPendingTasks(); // Run posted deadline. |
1176 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); | 1181 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
1177 EXPECT_ACTION("SetNeedsBeginFrame", client, 1, 2); | |
1178 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1182 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
1179 EXPECT_TRUE(client.needs_begin_impl_frame()); | 1183 EXPECT_TRUE(client.needs_begin_frame()); |
1180 client.Reset(); | 1184 client.Reset(); |
1181 | 1185 |
1182 // The following BeginImplFrame deadline should SetNeedsBeginFrame(false) | 1186 // The following BeginImplFrame deadline should SetNeedsBeginFrame(false) |
1183 // to avoid excessive toggles. | 1187 // to avoid excessive toggles. |
1184 client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. | 1188 client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. |
1185 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | 1189 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
1186 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1190 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
1187 client.Reset(); | 1191 client.Reset(); |
1188 | 1192 |
1189 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1193 client.task_runner().RunPendingTasks(); // Run posted deadline. |
1190 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); | 1194 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); |
1191 EXPECT_FALSE(client.needs_begin_impl_frame()); | 1195 EXPECT_FALSE(client.needs_begin_frame()); |
1192 client.Reset(); | 1196 client.Reset(); |
1193 } | 1197 } |
1194 | 1198 |
1195 TEST(SchedulerTest, BeginRetroFrame_SwapThrottled) { | 1199 TEST(SchedulerTest, BeginRetroFrame_SwapThrottled) { |
1196 FakeSchedulerClient client; | 1200 FakeSchedulerClient client; |
1197 SchedulerSettings scheduler_settings; | 1201 SchedulerSettings scheduler_settings; |
1198 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); | 1202 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); |
1199 scheduler->SetCanStart(); | 1203 scheduler->SetCanStart(); |
1200 scheduler->SetVisible(true); | 1204 scheduler->SetVisible(true); |
1201 scheduler->SetCanDraw(true); | 1205 scheduler->SetCanDraw(true); |
1202 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 1206 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
1203 | 1207 |
1204 // To test swap ack throttling, this test disables automatic swap acks. | 1208 // To test swap ack throttling, this test disables automatic swap acks. |
1205 scheduler->SetMaxSwapsPending(1); | 1209 scheduler->SetMaxSwapsPending(1); |
1206 client.SetAutomaticSwapAck(false); | 1210 client.SetAutomaticSwapAck(false); |
1207 | 1211 |
1208 // SetNeedsCommit should begin the frame on the next BeginImplFrame. | 1212 // SetNeedsCommit should begin the frame on the next BeginImplFrame. |
1209 client.Reset(); | 1213 client.Reset(); |
1210 scheduler->SetNeedsCommit(); | 1214 scheduler->SetNeedsCommit(); |
1211 EXPECT_TRUE(client.needs_begin_impl_frame()); | 1215 EXPECT_TRUE(client.needs_begin_frame()); |
1212 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); | 1216 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); |
1213 client.Reset(); | 1217 client.Reset(); |
1214 | 1218 |
1215 // Create a BeginFrame with a long deadline to avoid race conditions. | 1219 // Create a BeginFrame with a long deadline to avoid race conditions. |
1216 // This is the first BeginFrame, which will be handled immediately. | 1220 // This is the first BeginFrame, which will be handled immediately. |
1217 BeginFrameArgs args = BeginFrameArgs::CreateForTesting(); | 1221 BeginFrameArgs args = BeginFrameArgs::CreateForTesting(); |
1218 args.deadline += base::TimeDelta::FromHours(1); | 1222 args.deadline += base::TimeDelta::FromHours(1); |
1219 scheduler->BeginFrame(args); | 1223 scheduler->BeginFrame(args); |
1220 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 1224 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
1221 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); | 1225 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
1222 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1226 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
1223 EXPECT_TRUE(client.needs_begin_impl_frame()); | 1227 EXPECT_TRUE(client.needs_begin_frame()); |
1224 client.Reset(); | 1228 client.Reset(); |
1225 | 1229 |
1226 // Queue BeginFrame while we are still handling the previous BeginFrame. | 1230 // Queue BeginFrame while we are still handling the previous BeginFrame. |
1227 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1231 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
1228 args.frame_time += base::TimeDelta::FromSeconds(1); | 1232 args.frame_time += base::TimeDelta::FromSeconds(1); |
1229 scheduler->BeginFrame(args); | 1233 scheduler->BeginFrame(args); |
1230 EXPECT_EQ(0, client.num_actions_()); | 1234 EXPECT_EQ(0, client.num_actions_()); |
1231 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1235 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
1232 client.Reset(); | 1236 client.Reset(); |
1233 | 1237 |
1234 // NotifyReadyToCommit should trigger the pending commit and draw. | 1238 // NotifyReadyToCommit should trigger the pending commit and draw. |
1235 scheduler->NotifyBeginMainFrameStarted(); | 1239 scheduler->NotifyBeginMainFrameStarted(); |
1236 scheduler->NotifyReadyToCommit(); | 1240 scheduler->NotifyReadyToCommit(); |
1237 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 1241 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
1238 EXPECT_TRUE(client.needs_begin_impl_frame()); | 1242 EXPECT_TRUE(client.needs_begin_frame()); |
1239 client.Reset(); | 1243 client.Reset(); |
1240 | 1244 |
1241 // Swapping will put us into a swap throttled state. | 1245 // Swapping will put us into a swap throttled state. |
1242 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1246 client.task_runner().RunPendingTasks(); // Run posted deadline. |
1243 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); | 1247 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
1244 EXPECT_ACTION("SetNeedsBeginFrame", client, 1, 2); | |
1245 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1248 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
1246 EXPECT_TRUE(client.needs_begin_impl_frame()); | 1249 EXPECT_TRUE(client.needs_begin_frame()); |
1247 client.Reset(); | 1250 client.Reset(); |
1248 | 1251 |
1249 // While swap throttled, BeginRetroFrames should trigger BeginImplFrames | 1252 // While swap throttled, BeginRetroFrames should trigger BeginImplFrames |
1250 // but not a BeginMainFrame or draw. | 1253 // but not a BeginMainFrame or draw. |
1251 scheduler->SetNeedsCommit(); | 1254 scheduler->SetNeedsCommit(); |
1252 client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. | 1255 client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. |
1253 EXPECT_ACTION("WillBeginImplFrame", client, 0, 1); | 1256 EXPECT_ACTION("WillBeginImplFrame", client, 0, 1); |
1254 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1257 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
1255 EXPECT_TRUE(client.needs_begin_impl_frame()); | 1258 EXPECT_TRUE(client.needs_begin_frame()); |
1256 client.Reset(); | 1259 client.Reset(); |
1257 | 1260 |
1258 // Queue BeginFrame while we are still handling the previous BeginFrame. | 1261 // Queue BeginFrame while we are still handling the previous BeginFrame. |
1259 args.frame_time += base::TimeDelta::FromSeconds(1); | 1262 args.frame_time += base::TimeDelta::FromSeconds(1); |
1260 scheduler->BeginFrame(args); | 1263 scheduler->BeginFrame(args); |
1261 EXPECT_EQ(0, client.num_actions_()); | 1264 EXPECT_EQ(0, client.num_actions_()); |
1262 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1265 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
1263 EXPECT_TRUE(client.needs_begin_impl_frame()); | 1266 EXPECT_TRUE(client.needs_begin_frame()); |
1264 client.Reset(); | 1267 client.Reset(); |
1265 | 1268 |
1266 // Take us out of a swap throttled state. | 1269 // Take us out of a swap throttled state. |
1267 scheduler->DidSwapBuffersComplete(); | 1270 scheduler->DidSwapBuffersComplete(); |
1268 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 1); | 1271 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 1); |
1269 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1272 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
1270 EXPECT_TRUE(client.needs_begin_impl_frame()); | 1273 EXPECT_TRUE(client.needs_begin_frame()); |
1271 client.Reset(); | 1274 client.Reset(); |
1272 | 1275 |
1273 // BeginImplFrame deadline should draw. | 1276 // BeginImplFrame deadline should draw. |
1274 scheduler->SetNeedsRedraw(); | 1277 scheduler->SetNeedsRedraw(); |
1275 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1278 client.task_runner().RunPendingTasks(); // Run posted deadline. |
1276 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); | 1279 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
1277 EXPECT_ACTION("SetNeedsBeginFrame", client, 1, 2); | 1280 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
1278 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1281 EXPECT_TRUE(client.needs_begin_frame()); |
1279 EXPECT_TRUE(client.needs_begin_impl_frame()); | 1282 client.Reset(); |
1280 client.Reset(); | 1283 } |
| 1284 |
| 1285 void BeginFramesNotFromClient(bool begin_frame_scheduling_enabled, |
| 1286 bool throttle_frame_production) { |
| 1287 FakeSchedulerClient client; |
| 1288 SchedulerSettings scheduler_settings; |
| 1289 scheduler_settings.begin_frame_scheduling_enabled = |
| 1290 begin_frame_scheduling_enabled; |
| 1291 scheduler_settings.throttle_frame_production = throttle_frame_production; |
| 1292 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); |
| 1293 scheduler->SetCanStart(); |
| 1294 scheduler->SetVisible(true); |
| 1295 scheduler->SetCanDraw(true); |
| 1296 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
| 1297 |
| 1298 // SetNeedsCommit should begin the frame on the next BeginImplFrame |
| 1299 // without calling SetNeedsBeginFrame. |
| 1300 client.Reset(); |
| 1301 scheduler->SetNeedsCommit(); |
| 1302 EXPECT_FALSE(client.needs_begin_frame()); |
| 1303 EXPECT_EQ(0, client.num_actions_()); |
| 1304 client.Reset(); |
| 1305 |
| 1306 // When the client-driven BeginFrame are disabled, the scheduler posts it's |
| 1307 // own BeginFrame tasks. |
| 1308 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| 1309 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 1310 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| 1311 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1312 EXPECT_FALSE(client.needs_begin_frame()); |
| 1313 client.Reset(); |
| 1314 |
| 1315 // If we don't swap on the deadline, we wait for the next BeginFrame. |
| 1316 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1317 EXPECT_EQ(0, client.num_actions_()); |
| 1318 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 1319 EXPECT_FALSE(client.needs_begin_frame()); |
| 1320 client.Reset(); |
| 1321 |
| 1322 // NotifyReadyToCommit should trigger the commit. |
| 1323 scheduler->NotifyBeginMainFrameStarted(); |
| 1324 scheduler->NotifyReadyToCommit(); |
| 1325 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| 1326 EXPECT_FALSE(client.needs_begin_frame()); |
| 1327 client.Reset(); |
| 1328 |
| 1329 // BeginImplFrame should prepare the draw. |
| 1330 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| 1331 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
| 1332 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1333 EXPECT_FALSE(client.needs_begin_frame()); |
| 1334 client.Reset(); |
| 1335 |
| 1336 // BeginImplFrame deadline should draw. |
| 1337 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1338 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
| 1339 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 1340 EXPECT_FALSE(client.needs_begin_frame()); |
| 1341 client.Reset(); |
| 1342 |
| 1343 // The following BeginImplFrame deadline should SetNeedsBeginFrame(false) |
| 1344 // to avoid excessive toggles. |
| 1345 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| 1346 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
| 1347 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1348 client.Reset(); |
| 1349 |
| 1350 // Make sure SetNeedsBeginFrame isn't called on the client |
| 1351 // when the BeginFrame is no longer needed. |
| 1352 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1353 EXPECT_EQ(0, client.num_actions_()); |
| 1354 EXPECT_FALSE(client.needs_begin_frame()); |
| 1355 client.Reset(); |
| 1356 } |
| 1357 |
| 1358 TEST(SchedulerTest, SyntheticBeginFrames) { |
| 1359 bool begin_frame_scheduling_enabled = false; |
| 1360 bool throttle_frame_production = true; |
| 1361 BeginFramesNotFromClient(begin_frame_scheduling_enabled, |
| 1362 throttle_frame_production); |
| 1363 } |
| 1364 |
| 1365 TEST(SchedulerTest, VSyncThrottlingDisabled) { |
| 1366 bool begin_frame_scheduling_enabled = true; |
| 1367 bool throttle_frame_production = false; |
| 1368 BeginFramesNotFromClient(begin_frame_scheduling_enabled, |
| 1369 throttle_frame_production); |
| 1370 } |
| 1371 |
| 1372 TEST(SchedulerTest, SyntheticBeginFrames_And_VSyncThrottlingDisabled) { |
| 1373 bool begin_frame_scheduling_enabled = false; |
| 1374 bool throttle_frame_production = false; |
| 1375 BeginFramesNotFromClient(begin_frame_scheduling_enabled, |
| 1376 throttle_frame_production); |
| 1377 } |
| 1378 |
| 1379 void BeginFramesNotFromClient_SwapThrottled(bool begin_frame_scheduling_enabled, |
| 1380 bool throttle_frame_production) { |
| 1381 FakeSchedulerClient client; |
| 1382 SchedulerSettings scheduler_settings; |
| 1383 scheduler_settings.begin_frame_scheduling_enabled = |
| 1384 begin_frame_scheduling_enabled; |
| 1385 scheduler_settings.throttle_frame_production = throttle_frame_production; |
| 1386 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); |
| 1387 scheduler->SetCanStart(); |
| 1388 scheduler->SetVisible(true); |
| 1389 scheduler->SetCanDraw(true); |
| 1390 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
| 1391 |
| 1392 // To test swap ack throttling, this test disables automatic swap acks. |
| 1393 scheduler->SetMaxSwapsPending(1); |
| 1394 client.SetAutomaticSwapAck(false); |
| 1395 |
| 1396 // SetNeedsCommit should begin the frame on the next BeginImplFrame. |
| 1397 client.Reset(); |
| 1398 scheduler->SetNeedsCommit(); |
| 1399 EXPECT_FALSE(client.needs_begin_frame()); |
| 1400 EXPECT_EQ(0, client.num_actions_()); |
| 1401 client.Reset(); |
| 1402 |
| 1403 // Trigger the first BeginImplFrame and BeginMainFrame |
| 1404 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| 1405 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 1406 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| 1407 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1408 EXPECT_FALSE(client.needs_begin_frame()); |
| 1409 client.Reset(); |
| 1410 |
| 1411 // NotifyReadyToCommit should trigger the pending commit and draw. |
| 1412 scheduler->NotifyBeginMainFrameStarted(); |
| 1413 scheduler->NotifyReadyToCommit(); |
| 1414 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| 1415 EXPECT_FALSE(client.needs_begin_frame()); |
| 1416 client.Reset(); |
| 1417 |
| 1418 // Swapping will put us into a swap throttled state. |
| 1419 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1420 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
| 1421 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 1422 EXPECT_FALSE(client.needs_begin_frame()); |
| 1423 client.Reset(); |
| 1424 |
| 1425 // While swap throttled, BeginFrames should trigger BeginImplFrames, |
| 1426 // but not a BeginMainFrame or draw. |
| 1427 scheduler->SetNeedsCommit(); |
| 1428 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| 1429 EXPECT_ACTION("WillBeginImplFrame", client, 0, 1); |
| 1430 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1431 EXPECT_FALSE(client.needs_begin_frame()); |
| 1432 client.Reset(); |
| 1433 |
| 1434 // Take us out of a swap throttled state. |
| 1435 scheduler->DidSwapBuffersComplete(); |
| 1436 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 1); |
| 1437 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1438 EXPECT_FALSE(client.needs_begin_frame()); |
| 1439 client.Reset(); |
| 1440 |
| 1441 // BeginImplFrame deadline should draw. |
| 1442 scheduler->SetNeedsRedraw(); |
| 1443 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1444 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
| 1445 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 1446 EXPECT_FALSE(client.needs_begin_frame()); |
| 1447 client.Reset(); |
| 1448 } |
| 1449 |
| 1450 TEST(SchedulerTest, SyntheticBeginFrames_SwapThrottled) { |
| 1451 bool begin_frame_scheduling_enabled = false; |
| 1452 bool throttle_frame_production = true; |
| 1453 BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, |
| 1454 throttle_frame_production); |
| 1455 } |
| 1456 |
| 1457 TEST(SchedulerTest, VSyncThrottlingDisabled_SwapThrottled) { |
| 1458 bool begin_frame_scheduling_enabled = true; |
| 1459 bool throttle_frame_production = false; |
| 1460 BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, |
| 1461 throttle_frame_production); |
| 1462 } |
| 1463 |
| 1464 TEST(SchedulerTest, |
| 1465 SyntheticBeginFrames_And_VSyncThrottlingDisabled_SwapThrottled) { |
| 1466 bool begin_frame_scheduling_enabled = false; |
| 1467 bool throttle_frame_production = false; |
| 1468 BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, |
| 1469 throttle_frame_production); |
1281 } | 1470 } |
1282 | 1471 |
1283 } // namespace | 1472 } // namespace |
1284 } // namespace cc | 1473 } // namespace cc |
OLD | NEW |