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

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

Issue 218633010: cc: Handle retroactive BeginFrames in the Scheduler. (Closed) Base URL: http://git.chromium.org/chromium/src.git@compositorVsyncDisable
Patch Set: fix comment typo Created 6 years, 8 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 #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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 } 87 }
88 88
89 void SetDrawWillHappen(bool draw_will_happen) { 89 void SetDrawWillHappen(bool draw_will_happen) {
90 draw_will_happen_ = draw_will_happen; 90 draw_will_happen_ = draw_will_happen;
91 } 91 }
92 void SetSwapWillHappenIfDrawHappens(bool swap_will_happen_if_draw_happens) { 92 void SetSwapWillHappenIfDrawHappens(bool swap_will_happen_if_draw_happens) {
93 swap_will_happen_if_draw_happens_ = swap_will_happen_if_draw_happens; 93 swap_will_happen_if_draw_happens_ = swap_will_happen_if_draw_happens;
94 } 94 }
95 95
96 // SchedulerClient implementation. 96 // SchedulerClient implementation.
97 virtual void SetNeedsBeginImplFrame(bool enable) OVERRIDE { 97 virtual void SetNeedsBeginFrame(bool enable) OVERRIDE {
98 actions_.push_back("SetNeedsBeginImplFrame"); 98 actions_.push_back("SetNeedsBeginFrame");
99 states_.push_back(scheduler_->StateAsValue().release()); 99 states_.push_back(scheduler_->StateAsValue().release());
100 needs_begin_impl_frame_ = enable; 100 needs_begin_impl_frame_ = enable;
101 } 101 }
102 virtual void WillBeginImplFrame(const BeginFrameArgs& args) OVERRIDE {
103 actions_.push_back("WillBeginImplFrame");
104 states_.push_back(scheduler_->StateAsValue().release());
105 }
102 virtual void ScheduledActionSendBeginMainFrame() OVERRIDE { 106 virtual void ScheduledActionSendBeginMainFrame() OVERRIDE {
103 actions_.push_back("ScheduledActionSendBeginMainFrame"); 107 actions_.push_back("ScheduledActionSendBeginMainFrame");
104 states_.push_back(scheduler_->StateAsValue().release()); 108 states_.push_back(scheduler_->StateAsValue().release());
105 } 109 }
106 virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible() 110 virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible()
107 OVERRIDE { 111 OVERRIDE {
108 actions_.push_back("ScheduledActionDrawAndSwapIfPossible"); 112 actions_.push_back("ScheduledActionDrawAndSwapIfPossible");
109 states_.push_back(scheduler_->StateAsValue().release()); 113 states_.push_back(scheduler_->StateAsValue().release());
110 num_draws_++; 114 num_draws_++;
111 bool did_readback = false; 115 bool did_readback = false;
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; 187 scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
184 }; 188 };
185 189
186 void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler, 190 void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler,
187 FakeSchedulerClient* client) { 191 FakeSchedulerClient* client) {
188 scheduler->DidCreateAndInitializeOutputSurface(); 192 scheduler->DidCreateAndInitializeOutputSurface();
189 scheduler->SetNeedsCommit(); 193 scheduler->SetNeedsCommit();
190 scheduler->NotifyBeginMainFrameStarted(); 194 scheduler->NotifyBeginMainFrameStarted();
191 scheduler->NotifyReadyToCommit(); 195 scheduler->NotifyReadyToCommit();
192 // Go through the motions to draw the commit. 196 // Go through the motions to draw the commit.
193 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 197 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
194 198
195 // Run the posted deadline task. 199 // Run the posted deadline task.
196 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); 200 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
197 client->task_runner().RunPendingTasks(); 201 client->task_runner().RunPendingTasks();
198 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); 202 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
199 203
200 // We need another BeginImplFrame so Scheduler calls 204 // We need another BeginImplFrame so Scheduler calls
201 // SetNeedsBeginImplFrame(false). 205 // SetNeedsBeginFrame(false).
202 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 206 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
203 207
204 // Run the posted deadline task. 208 // Run the posted deadline task.
205 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); 209 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
206 client->task_runner().RunPendingTasks(); 210 client->task_runner().RunPendingTasks();
207 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); 211 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
208 } 212 }
209 213
210 TEST(SchedulerTest, InitializeOutputSurfaceDoesNotBeginImplFrame) { 214 TEST(SchedulerTest, InitializeOutputSurfaceDoesNotBeginImplFrame) {
211 FakeSchedulerClient client; 215 FakeSchedulerClient client;
212 SchedulerSettings default_scheduler_settings; 216 SchedulerSettings default_scheduler_settings;
(...skipping 16 matching lines...) Expand all
229 scheduler->SetVisible(true); 233 scheduler->SetVisible(true);
230 scheduler->SetCanDraw(true); 234 scheduler->SetCanDraw(true);
231 235
232 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); 236 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client);
233 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); 237 InitializeOutputSurfaceAndFirstCommit(scheduler, &client);
234 238
235 // SetNeedsCommit should begin the frame on the next BeginImplFrame. 239 // SetNeedsCommit should begin the frame on the next BeginImplFrame.
236 client.Reset(); 240 client.Reset();
237 scheduler->SetNeedsCommit(); 241 scheduler->SetNeedsCommit();
238 EXPECT_TRUE(client.needs_begin_impl_frame()); 242 EXPECT_TRUE(client.needs_begin_impl_frame());
239 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); 243 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client);
240 client.Reset(); 244 client.Reset();
241 245
242 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 246 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
243 EXPECT_SINGLE_ACTION("ScheduledActionSendBeginMainFrame", client); 247 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2);
248 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2);
244 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); 249 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
245 EXPECT_TRUE(client.needs_begin_impl_frame()); 250 EXPECT_TRUE(client.needs_begin_impl_frame());
246 client.Reset(); 251 client.Reset();
247 252
248 // If we don't swap on the deadline, we need to request another 253 // If we don't swap on the deadline, we need to request another
249 // BeginImplFrame. 254 // BeginImplFrame.
250 scheduler->OnBeginImplFrameDeadline(); 255 client.task_runner().RunPendingTasks(); // Run posted deadline.
251 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); 256 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client);
252 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); 257 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
253 EXPECT_TRUE(client.needs_begin_impl_frame()); 258 EXPECT_TRUE(client.needs_begin_impl_frame());
254 client.Reset(); 259 client.Reset();
255 260
256 // NotifyReadyToCommit should trigger the commit. 261 // NotifyReadyToCommit should trigger the commit.
257 scheduler->NotifyBeginMainFrameStarted(); 262 scheduler->NotifyBeginMainFrameStarted();
258 scheduler->NotifyReadyToCommit(); 263 scheduler->NotifyReadyToCommit();
259 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); 264 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client);
260 EXPECT_TRUE(client.needs_begin_impl_frame()); 265 EXPECT_TRUE(client.needs_begin_impl_frame());
261 client.Reset(); 266 client.Reset();
262 267
263 // BeginImplFrame should prepare the draw. 268 // BeginImplFrame should prepare the draw.
264 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 269 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
265 EXPECT_EQ(client.num_actions_(), 0); 270 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
266 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); 271 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
267 EXPECT_TRUE(client.needs_begin_impl_frame()); 272 EXPECT_TRUE(client.needs_begin_impl_frame());
268 client.Reset(); 273 client.Reset();
269 274
270 // BeginImplFrame deadline should draw. 275 // BeginImplFrame deadline should draw.
271 scheduler->OnBeginImplFrameDeadline(); 276 client.task_runner().RunPendingTasks(); // Run posted deadline.
272 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); 277 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2);
273 EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2); 278 EXPECT_ACTION("SetNeedsBeginFrame", client, 1, 2);
274 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); 279 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
275 EXPECT_TRUE(client.needs_begin_impl_frame()); 280 EXPECT_TRUE(client.needs_begin_impl_frame());
276 client.Reset(); 281 client.Reset();
277 282
278 // The following BeginImplFrame deadline should SetNeedsBeginImplFrame(false) 283 // The following BeginImplFrame deadline should SetNeedsBeginFrame(false)
279 // to avoid excessive toggles. 284 // to avoid excessive toggles.
280 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 285 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
281 EXPECT_EQ(client.num_actions_(), 0); 286 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
282 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); 287 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
283 client.Reset(); 288 client.Reset();
284 289
285 scheduler->OnBeginImplFrameDeadline(); 290 client.task_runner().RunPendingTasks(); // Run posted deadline.
286 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); 291 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client);
287 EXPECT_FALSE(client.needs_begin_impl_frame()); 292 EXPECT_FALSE(client.needs_begin_impl_frame());
288 client.Reset(); 293 client.Reset();
289 } 294 }
290 295
291 TEST(SchedulerTest, RequestCommitAfterBeginMainFrameSent) { 296 TEST(SchedulerTest, RequestCommitAfterBeginMainFrameSent) {
292 FakeSchedulerClient client; 297 FakeSchedulerClient client;
293 SchedulerSettings scheduler_settings; 298 SchedulerSettings scheduler_settings;
294 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); 299 Scheduler* scheduler = client.CreateScheduler(scheduler_settings);
295 scheduler->SetCanStart(); 300 scheduler->SetCanStart();
296 scheduler->SetVisible(true); 301 scheduler->SetVisible(true);
297 scheduler->SetCanDraw(true); 302 scheduler->SetCanDraw(true);
298 303
299 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); 304 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client);
300 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); 305 InitializeOutputSurfaceAndFirstCommit(scheduler, &client);
301 client.Reset(); 306 client.Reset();
302 307
303 // SetNeedsCommit should begin the frame. 308 // SetNeedsCommit should begin the frame.
304 scheduler->SetNeedsCommit(); 309 scheduler->SetNeedsCommit();
305 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); 310 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client);
306 311
307 client.Reset(); 312 client.Reset();
308 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 313 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
309 EXPECT_SINGLE_ACTION("ScheduledActionSendBeginMainFrame", client); 314 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2);
315 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2);
310 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); 316 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
311 317
312 EXPECT_TRUE(client.needs_begin_impl_frame()); 318 EXPECT_TRUE(client.needs_begin_impl_frame());
313 client.Reset(); 319 client.Reset();
314 320
315 // Now SetNeedsCommit again. Calling here means we need a second commit. 321 // Now SetNeedsCommit again. Calling here means we need a second commit.
316 scheduler->SetNeedsCommit(); 322 scheduler->SetNeedsCommit();
317 EXPECT_EQ(client.num_actions_(), 0); 323 EXPECT_EQ(client.num_actions_(), 0);
318 client.Reset(); 324 client.Reset();
319 325
320 // Finish the first commit. 326 // Finish the first commit.
321 scheduler->NotifyBeginMainFrameStarted(); 327 scheduler->NotifyBeginMainFrameStarted();
322 scheduler->NotifyReadyToCommit(); 328 scheduler->NotifyReadyToCommit();
323 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); 329 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client);
324 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); 330 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
325 client.Reset(); 331 client.Reset();
326 scheduler->OnBeginImplFrameDeadline(); 332 client.task_runner().RunPendingTasks(); // Run posted deadline.
327 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); 333 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2);
328 EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2); 334 EXPECT_ACTION("SetNeedsBeginFrame", client, 1, 2);
329 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); 335 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
330 336
331 // Because we just swapped, the Scheduler should also request the next 337 // Because we just swapped, the Scheduler should also request the next
332 // BeginImplFrame from the OutputSurface. 338 // BeginImplFrame from the OutputSurface.
333 EXPECT_TRUE(client.needs_begin_impl_frame()); 339 EXPECT_TRUE(client.needs_begin_impl_frame());
334 client.Reset(); 340 client.Reset();
335
336 // Since another commit is needed, the next BeginImplFrame should initiate 341 // Since another commit is needed, the next BeginImplFrame should initiate
337 // the second commit. 342 // the second commit.
338 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 343 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
339 EXPECT_SINGLE_ACTION("ScheduledActionSendBeginMainFrame", client); 344 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2);
345 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2);
340 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); 346 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
341 client.Reset(); 347 client.Reset();
342 348
343 // Finishing the commit before the deadline should post a new deadline task 349 // Finishing the commit before the deadline should post a new deadline task
344 // to trigger the deadline early. 350 // to trigger the deadline early.
345 scheduler->NotifyBeginMainFrameStarted(); 351 scheduler->NotifyBeginMainFrameStarted();
346 scheduler->NotifyReadyToCommit(); 352 scheduler->NotifyReadyToCommit();
347 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); 353 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client);
348 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); 354 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
349 client.Reset(); 355 client.Reset();
350 scheduler->OnBeginImplFrameDeadline(); 356 client.task_runner().RunPendingTasks(); // Run posted deadline.
351 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); 357 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2);
352 EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2); 358 EXPECT_ACTION("SetNeedsBeginFrame", client, 1, 2);
353 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); 359 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
354 EXPECT_TRUE(client.needs_begin_impl_frame()); 360 EXPECT_TRUE(client.needs_begin_impl_frame());
355 client.Reset(); 361 client.Reset();
356 362
357 // On the next BeginImplFrame, verify we go back to a quiescent state and 363 // On the next BeginImplFrame, verify we go back to a quiescent state and
358 // no longer request BeginImplFrames. 364 // no longer request BeginImplFrames.
359 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 365 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
360 scheduler->OnBeginImplFrameDeadline(); 366 client.task_runner().RunPendingTasks(); // Run posted deadline.
361 EXPECT_FALSE(client.needs_begin_impl_frame()); 367 EXPECT_FALSE(client.needs_begin_impl_frame());
362 client.Reset(); 368 client.Reset();
363 } 369 }
364 370
365 class SchedulerClientThatsetNeedsDrawInsideDraw : public FakeSchedulerClient { 371 class SchedulerClientThatsetNeedsDrawInsideDraw : public FakeSchedulerClient {
366 public: 372 public:
367 virtual void ScheduledActionSendBeginMainFrame() OVERRIDE {} 373 virtual void ScheduledActionSendBeginMainFrame() OVERRIDE {}
368 virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible() 374 virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible()
369 OVERRIDE { 375 OVERRIDE {
370 // Only SetNeedsRedraw the first time this is called 376 // Only SetNeedsRedraw the first time this is called
(...skipping 27 matching lines...) Expand all
398 scheduler->SetVisible(true); 404 scheduler->SetVisible(true);
399 scheduler->SetCanDraw(true); 405 scheduler->SetCanDraw(true);
400 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); 406 InitializeOutputSurfaceAndFirstCommit(scheduler, &client);
401 client.Reset(); 407 client.Reset();
402 408
403 scheduler->SetNeedsRedraw(); 409 scheduler->SetNeedsRedraw();
404 EXPECT_TRUE(scheduler->RedrawPending()); 410 EXPECT_TRUE(scheduler->RedrawPending());
405 EXPECT_TRUE(client.needs_begin_impl_frame()); 411 EXPECT_TRUE(client.needs_begin_impl_frame());
406 EXPECT_EQ(0, client.num_draws()); 412 EXPECT_EQ(0, client.num_draws());
407 413
408 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 414 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
409 scheduler->OnBeginImplFrameDeadline(); 415 client.task_runner().RunPendingTasks(); // Run posted deadline.
410 EXPECT_EQ(1, client.num_draws()); 416 EXPECT_EQ(1, client.num_draws());
411 EXPECT_TRUE(scheduler->RedrawPending()); 417 EXPECT_TRUE(scheduler->RedrawPending());
412 EXPECT_TRUE(client.needs_begin_impl_frame()); 418 EXPECT_TRUE(client.needs_begin_impl_frame());
413 419
414 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 420 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
415 scheduler->OnBeginImplFrameDeadline(); 421 client.task_runner().RunPendingTasks(); // Run posted deadline.
416 EXPECT_EQ(2, client.num_draws()); 422 EXPECT_EQ(2, client.num_draws());
417 EXPECT_FALSE(scheduler->RedrawPending()); 423 EXPECT_FALSE(scheduler->RedrawPending());
418 EXPECT_TRUE(client.needs_begin_impl_frame()); 424 EXPECT_TRUE(client.needs_begin_impl_frame());
419 425
420 // We stop requesting BeginImplFrames after a BeginImplFrame where we don't 426 // We stop requesting BeginImplFrames after a BeginImplFrame where we don't
421 // swap. 427 // swap.
422 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 428 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
423 scheduler->OnBeginImplFrameDeadline(); 429 client.task_runner().RunPendingTasks(); // Run posted deadline.
424 EXPECT_EQ(2, client.num_draws()); 430 EXPECT_EQ(2, client.num_draws());
425 EXPECT_FALSE(scheduler->RedrawPending()); 431 EXPECT_FALSE(scheduler->RedrawPending());
426 EXPECT_FALSE(client.needs_begin_impl_frame()); 432 EXPECT_FALSE(client.needs_begin_impl_frame());
427 } 433 }
428 434
429 // Test that requesting redraw inside a failed draw doesn't lose the request. 435 // Test that requesting redraw inside a failed draw doesn't lose the request.
430 TEST(SchedulerTest, RequestRedrawInsideFailedDraw) { 436 TEST(SchedulerTest, RequestRedrawInsideFailedDraw) {
431 SchedulerClientThatsetNeedsDrawInsideDraw client; 437 SchedulerClientThatsetNeedsDrawInsideDraw client;
432 SchedulerSettings default_scheduler_settings; 438 SchedulerSettings default_scheduler_settings;
433 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); 439 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings);
434 scheduler->SetCanStart(); 440 scheduler->SetCanStart();
435 scheduler->SetVisible(true); 441 scheduler->SetVisible(true);
436 scheduler->SetCanDraw(true); 442 scheduler->SetCanDraw(true);
437 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); 443 InitializeOutputSurfaceAndFirstCommit(scheduler, &client);
438 client.Reset(); 444 client.Reset();
439 445
440 client.SetDrawWillHappen(false); 446 client.SetDrawWillHappen(false);
441 447
442 scheduler->SetNeedsRedraw(); 448 scheduler->SetNeedsRedraw();
443 EXPECT_TRUE(scheduler->RedrawPending()); 449 EXPECT_TRUE(scheduler->RedrawPending());
444 EXPECT_TRUE(client.needs_begin_impl_frame()); 450 EXPECT_TRUE(client.needs_begin_impl_frame());
445 EXPECT_EQ(0, client.num_draws()); 451 EXPECT_EQ(0, client.num_draws());
446 452
447 // Fail the draw. 453 // Fail the draw.
448 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 454 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
449 scheduler->OnBeginImplFrameDeadline(); 455 client.task_runner().RunPendingTasks(); // Run posted deadline.
450 EXPECT_EQ(1, client.num_draws()); 456 EXPECT_EQ(1, client.num_draws());
451 457
452 // We have a commit pending and the draw failed, and we didn't lose the redraw 458 // We have a commit pending and the draw failed, and we didn't lose the redraw
453 // request. 459 // request.
454 EXPECT_TRUE(scheduler->CommitPending()); 460 EXPECT_TRUE(scheduler->CommitPending());
455 EXPECT_TRUE(scheduler->RedrawPending()); 461 EXPECT_TRUE(scheduler->RedrawPending());
456 EXPECT_TRUE(client.needs_begin_impl_frame()); 462 EXPECT_TRUE(client.needs_begin_impl_frame());
457 463
458 // Fail the draw again. 464 // Fail the draw again.
459 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 465 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
460 scheduler->OnBeginImplFrameDeadline(); 466 client.task_runner().RunPendingTasks(); // Run posted deadline.
461 EXPECT_EQ(2, client.num_draws()); 467 EXPECT_EQ(2, client.num_draws());
462 EXPECT_TRUE(scheduler->CommitPending()); 468 EXPECT_TRUE(scheduler->CommitPending());
463 EXPECT_TRUE(scheduler->RedrawPending()); 469 EXPECT_TRUE(scheduler->RedrawPending());
464 EXPECT_TRUE(client.needs_begin_impl_frame()); 470 EXPECT_TRUE(client.needs_begin_impl_frame());
465 471
466 // Draw successfully. 472 // Draw successfully.
467 client.SetDrawWillHappen(true); 473 client.SetDrawWillHappen(true);
468 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 474 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
469 scheduler->OnBeginImplFrameDeadline(); 475 client.task_runner().RunPendingTasks(); // Run posted deadline.
470 EXPECT_EQ(3, client.num_draws()); 476 EXPECT_EQ(3, client.num_draws());
471 EXPECT_TRUE(scheduler->CommitPending()); 477 EXPECT_TRUE(scheduler->CommitPending());
472 EXPECT_FALSE(scheduler->RedrawPending()); 478 EXPECT_FALSE(scheduler->RedrawPending());
473 EXPECT_TRUE(client.needs_begin_impl_frame()); 479 EXPECT_TRUE(client.needs_begin_impl_frame());
474 } 480 }
475 481
476 class SchedulerClientThatSetNeedsCommitInsideDraw : public FakeSchedulerClient { 482 class SchedulerClientThatSetNeedsCommitInsideDraw : public FakeSchedulerClient {
477 public: 483 public:
478 SchedulerClientThatSetNeedsCommitInsideDraw() 484 SchedulerClientThatSetNeedsCommitInsideDraw()
479 : set_needs_commit_on_next_draw_(false) {} 485 : set_needs_commit_on_next_draw_(false) {}
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
519 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); 525 InitializeOutputSurfaceAndFirstCommit(scheduler, &client);
520 client.Reset(); 526 client.Reset();
521 527
522 EXPECT_FALSE(client.needs_begin_impl_frame()); 528 EXPECT_FALSE(client.needs_begin_impl_frame());
523 scheduler->SetNeedsRedraw(); 529 scheduler->SetNeedsRedraw();
524 EXPECT_TRUE(scheduler->RedrawPending()); 530 EXPECT_TRUE(scheduler->RedrawPending());
525 EXPECT_EQ(0, client.num_draws()); 531 EXPECT_EQ(0, client.num_draws());
526 EXPECT_TRUE(client.needs_begin_impl_frame()); 532 EXPECT_TRUE(client.needs_begin_impl_frame());
527 533
528 client.SetNeedsCommitOnNextDraw(); 534 client.SetNeedsCommitOnNextDraw();
529 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 535 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
530 client.SetNeedsCommitOnNextDraw(); 536 client.SetNeedsCommitOnNextDraw();
531 scheduler->OnBeginImplFrameDeadline(); 537 client.task_runner().RunPendingTasks(); // Run posted deadline.
532 EXPECT_EQ(1, client.num_draws()); 538 EXPECT_EQ(1, client.num_draws());
533 EXPECT_TRUE(scheduler->CommitPending()); 539 EXPECT_TRUE(scheduler->CommitPending());
534 EXPECT_TRUE(client.needs_begin_impl_frame()); 540 EXPECT_TRUE(client.needs_begin_impl_frame());
535 scheduler->NotifyBeginMainFrameStarted(); 541 scheduler->NotifyBeginMainFrameStarted();
536 scheduler->NotifyReadyToCommit(); 542 scheduler->NotifyReadyToCommit();
537 543
538 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 544 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
539 scheduler->OnBeginImplFrameDeadline(); 545 client.task_runner().RunPendingTasks(); // Run posted deadline.
540 EXPECT_EQ(2, client.num_draws()); 546 EXPECT_EQ(2, client.num_draws());
541 547
542 EXPECT_FALSE(scheduler->RedrawPending()); 548 EXPECT_FALSE(scheduler->RedrawPending());
543 EXPECT_FALSE(scheduler->CommitPending()); 549 EXPECT_FALSE(scheduler->CommitPending());
544 EXPECT_TRUE(client.needs_begin_impl_frame()); 550 EXPECT_TRUE(client.needs_begin_impl_frame());
545 551
546 // We stop requesting BeginImplFrames after a BeginImplFrame where we don't 552 // We stop requesting BeginImplFrames after a BeginImplFrame where we don't
547 // swap. 553 // swap.
548 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 554 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
549 scheduler->OnBeginImplFrameDeadline(); 555 client.task_runner().RunPendingTasks(); // Run posted deadline.
550 EXPECT_EQ(2, client.num_draws()); 556 EXPECT_EQ(2, client.num_draws());
551 EXPECT_FALSE(scheduler->RedrawPending()); 557 EXPECT_FALSE(scheduler->RedrawPending());
552 EXPECT_FALSE(scheduler->CommitPending()); 558 EXPECT_FALSE(scheduler->CommitPending());
553 EXPECT_FALSE(client.needs_begin_impl_frame()); 559 EXPECT_FALSE(client.needs_begin_impl_frame());
554 } 560 }
555 561
556 // Tests that when a draw fails then the pending commit should not be dropped. 562 // Tests that when a draw fails then the pending commit should not be dropped.
557 TEST(SchedulerTest, RequestCommitInsideFailedDraw) { 563 TEST(SchedulerTest, RequestCommitInsideFailedDraw) {
558 SchedulerClientThatsetNeedsDrawInsideDraw client; 564 SchedulerClientThatsetNeedsDrawInsideDraw client;
559 SchedulerSettings default_scheduler_settings; 565 SchedulerSettings default_scheduler_settings;
560 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); 566 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings);
561 scheduler->SetCanStart(); 567 scheduler->SetCanStart();
562 scheduler->SetVisible(true); 568 scheduler->SetVisible(true);
563 scheduler->SetCanDraw(true); 569 scheduler->SetCanDraw(true);
564 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); 570 InitializeOutputSurfaceAndFirstCommit(scheduler, &client);
565 client.Reset(); 571 client.Reset();
566 572
567 client.SetDrawWillHappen(false); 573 client.SetDrawWillHappen(false);
568 574
569 scheduler->SetNeedsRedraw(); 575 scheduler->SetNeedsRedraw();
570 EXPECT_TRUE(scheduler->RedrawPending()); 576 EXPECT_TRUE(scheduler->RedrawPending());
571 EXPECT_TRUE(client.needs_begin_impl_frame()); 577 EXPECT_TRUE(client.needs_begin_impl_frame());
572 EXPECT_EQ(0, client.num_draws()); 578 EXPECT_EQ(0, client.num_draws());
573 579
574 // Fail the draw. 580 // Fail the draw.
575 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 581 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
576 scheduler->OnBeginImplFrameDeadline(); 582 client.task_runner().RunPendingTasks(); // Run posted deadline.
577 EXPECT_EQ(1, client.num_draws()); 583 EXPECT_EQ(1, client.num_draws());
578 584
579 // We have a commit pending and the draw failed, and we didn't lose the commit 585 // We have a commit pending and the draw failed, and we didn't lose the commit
580 // request. 586 // request.
581 EXPECT_TRUE(scheduler->CommitPending()); 587 EXPECT_TRUE(scheduler->CommitPending());
582 EXPECT_TRUE(scheduler->RedrawPending()); 588 EXPECT_TRUE(scheduler->RedrawPending());
583 EXPECT_TRUE(client.needs_begin_impl_frame()); 589 EXPECT_TRUE(client.needs_begin_impl_frame());
584 590
585 // Fail the draw again. 591 // Fail the draw again.
586 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 592 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
587 scheduler->OnBeginImplFrameDeadline(); 593
594 client.task_runner().RunPendingTasks(); // Run posted deadline.
588 EXPECT_EQ(2, client.num_draws()); 595 EXPECT_EQ(2, client.num_draws());
589 EXPECT_TRUE(scheduler->CommitPending()); 596 EXPECT_TRUE(scheduler->CommitPending());
590 EXPECT_TRUE(scheduler->RedrawPending()); 597 EXPECT_TRUE(scheduler->RedrawPending());
591 EXPECT_TRUE(client.needs_begin_impl_frame()); 598 EXPECT_TRUE(client.needs_begin_impl_frame());
592 599
593 // Draw successfully. 600 // Draw successfully.
594 client.SetDrawWillHappen(true); 601 client.SetDrawWillHappen(true);
595 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 602 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
596 scheduler->OnBeginImplFrameDeadline(); 603 client.task_runner().RunPendingTasks(); // Run posted deadline.
597 EXPECT_EQ(3, client.num_draws()); 604 EXPECT_EQ(3, client.num_draws());
598 EXPECT_TRUE(scheduler->CommitPending()); 605 EXPECT_TRUE(scheduler->CommitPending());
599 EXPECT_FALSE(scheduler->RedrawPending()); 606 EXPECT_FALSE(scheduler->RedrawPending());
600 EXPECT_TRUE(client.needs_begin_impl_frame()); 607 EXPECT_TRUE(client.needs_begin_impl_frame());
601 } 608 }
602 609
603 TEST(SchedulerTest, NoSwapWhenDrawFails) { 610 TEST(SchedulerTest, NoSwapWhenDrawFails) {
604 SchedulerClientThatSetNeedsCommitInsideDraw client; 611 SchedulerClientThatSetNeedsCommitInsideDraw client;
605 SchedulerSettings default_scheduler_settings; 612 SchedulerSettings default_scheduler_settings;
606 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); 613 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings);
607 scheduler->SetCanStart(); 614 scheduler->SetCanStart();
608 scheduler->SetVisible(true); 615 scheduler->SetVisible(true);
609 scheduler->SetCanDraw(true); 616 scheduler->SetCanDraw(true);
610 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); 617 InitializeOutputSurfaceAndFirstCommit(scheduler, &client);
611 client.Reset(); 618 client.Reset();
612 619
613 scheduler->SetNeedsRedraw(); 620 scheduler->SetNeedsRedraw();
614 EXPECT_TRUE(scheduler->RedrawPending()); 621 EXPECT_TRUE(scheduler->RedrawPending());
615 EXPECT_TRUE(client.needs_begin_impl_frame()); 622 EXPECT_TRUE(client.needs_begin_impl_frame());
616 EXPECT_EQ(0, client.num_draws()); 623 EXPECT_EQ(0, client.num_draws());
617 624
618 // Draw successfully, this starts a new frame. 625 // Draw successfully, this starts a new frame.
619 client.SetNeedsCommitOnNextDraw(); 626 client.SetNeedsCommitOnNextDraw();
620 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 627 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
621 scheduler->OnBeginImplFrameDeadline(); 628 client.task_runner().RunPendingTasks(); // Run posted deadline.
622 EXPECT_EQ(1, client.num_draws()); 629 EXPECT_EQ(1, client.num_draws());
623 630
624 scheduler->SetNeedsRedraw(); 631 scheduler->SetNeedsRedraw();
625 EXPECT_TRUE(scheduler->RedrawPending()); 632 EXPECT_TRUE(scheduler->RedrawPending());
626 EXPECT_TRUE(client.needs_begin_impl_frame()); 633 EXPECT_TRUE(client.needs_begin_impl_frame());
627 634
628 // Fail to draw, this should not start a frame. 635 // Fail to draw, this should not start a frame.
629 client.SetDrawWillHappen(false); 636 client.SetDrawWillHappen(false);
630 client.SetNeedsCommitOnNextDraw(); 637 client.SetNeedsCommitOnNextDraw();
631 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 638 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
632 scheduler->OnBeginImplFrameDeadline(); 639 client.task_runner().RunPendingTasks(); // Run posted deadline.
633 EXPECT_EQ(2, client.num_draws()); 640 EXPECT_EQ(2, client.num_draws());
634 } 641 }
635 642
636 TEST(SchedulerTest, NoSwapWhenSwapFailsDuringForcedCommit) { 643 TEST(SchedulerTest, NoSwapWhenSwapFailsDuringForcedCommit) {
637 FakeSchedulerClient client; 644 FakeSchedulerClient client;
638 SchedulerSettings default_scheduler_settings; 645 SchedulerSettings default_scheduler_settings;
639 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); 646 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings);
640 647
641 // Tell the client that it will fail to swap. 648 // Tell the client that it will fail to swap.
642 client.SetDrawWillHappen(true); 649 client.SetDrawWillHappen(true);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
707 EXPECT_TRUE(scheduler->RedrawPending()); 714 EXPECT_TRUE(scheduler->RedrawPending());
708 EXPECT_TRUE(scheduler->ManageTilesPending()); 715 EXPECT_TRUE(scheduler->ManageTilesPending());
709 EXPECT_TRUE(client.needs_begin_impl_frame()); 716 EXPECT_TRUE(client.needs_begin_impl_frame());
710 EXPECT_EQ(0, client.num_draws()); 717 EXPECT_EQ(0, client.num_draws());
711 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles")); 718 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles"));
712 EXPECT_FALSE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); 719 EXPECT_FALSE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
713 720
714 // We have no immediate actions to perform, so the BeginImplFrame should post 721 // We have no immediate actions to perform, so the BeginImplFrame should post
715 // the deadline task. 722 // the deadline task.
716 client.Reset(); 723 client.Reset();
717 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 724 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
718 EXPECT_EQ(client.num_actions_(), 0); 725 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
719 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); 726 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
720 727
721 // On the deadline, he actions should have occured in the right order. 728 // On the deadline, he actions should have occured in the right order.
722 client.Reset(); 729 client.Reset();
723 scheduler->OnBeginImplFrameDeadline(); 730 client.task_runner().RunPendingTasks(); // Run posted deadline.
724 EXPECT_EQ(1, client.num_draws()); 731 EXPECT_EQ(1, client.num_draws());
725 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); 732 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
726 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); 733 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles"));
727 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), 734 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"),
728 client.ActionIndex("ScheduledActionManageTiles")); 735 client.ActionIndex("ScheduledActionManageTiles"));
729 EXPECT_FALSE(scheduler->RedrawPending()); 736 EXPECT_FALSE(scheduler->RedrawPending());
730 EXPECT_FALSE(scheduler->ManageTilesPending()); 737 EXPECT_FALSE(scheduler->ManageTilesPending());
731 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); 738 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
732 739
733 // Request a draw. We don't need a ManageTiles yet. 740 // Request a draw. We don't need a ManageTiles yet.
734 client.Reset(); 741 client.Reset();
735 scheduler->SetNeedsRedraw(); 742 scheduler->SetNeedsRedraw();
736 EXPECT_TRUE(scheduler->RedrawPending()); 743 EXPECT_TRUE(scheduler->RedrawPending());
737 EXPECT_FALSE(scheduler->ManageTilesPending()); 744 EXPECT_FALSE(scheduler->ManageTilesPending());
738 EXPECT_TRUE(client.needs_begin_impl_frame()); 745 EXPECT_TRUE(client.needs_begin_impl_frame());
739 EXPECT_EQ(0, client.num_draws()); 746 EXPECT_EQ(0, client.num_draws());
740 747
741 // We have no immediate actions to perform, so the BeginImplFrame should post 748 // We have no immediate actions to perform, so the BeginImplFrame should post
742 // the deadline task. 749 // the deadline task.
743 client.Reset(); 750 client.Reset();
744 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 751 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
745 EXPECT_EQ(client.num_actions_(), 0); 752 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
746 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); 753 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
747 754
748 // Draw. The draw will trigger SetNeedsManageTiles, and 755 // Draw. The draw will trigger SetNeedsManageTiles, and
749 // then the ManageTiles action will be triggered after the Draw. 756 // then the ManageTiles action will be triggered after the Draw.
750 // Afterwards, neither a draw nor ManageTiles are pending. 757 // Afterwards, neither a draw nor ManageTiles are pending.
751 client.Reset(); 758 client.Reset();
752 scheduler->OnBeginImplFrameDeadline(); 759 client.task_runner().RunPendingTasks(); // Run posted deadline.
753 EXPECT_EQ(1, client.num_draws()); 760 EXPECT_EQ(1, client.num_draws());
754 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); 761 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
755 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); 762 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles"));
756 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), 763 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"),
757 client.ActionIndex("ScheduledActionManageTiles")); 764 client.ActionIndex("ScheduledActionManageTiles"));
758 EXPECT_FALSE(scheduler->RedrawPending()); 765 EXPECT_FALSE(scheduler->RedrawPending());
759 EXPECT_FALSE(scheduler->ManageTilesPending()); 766 EXPECT_FALSE(scheduler->ManageTilesPending());
760 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); 767 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
761 768
762 // We need a BeginImplFrame where we don't swap to go idle. 769 // We need a BeginImplFrame where we don't swap to go idle.
763 client.Reset(); 770 client.Reset();
764 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 771 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
765 EXPECT_EQ(client.num_actions_(), 0); 772 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
766 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); 773 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
767 client.Reset(); 774 client.Reset();
768 scheduler->OnBeginImplFrameDeadline(); 775 client.task_runner().RunPendingTasks(); // Run posted deadline.
769 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); 776 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client);
770 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); 777 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
771 EXPECT_EQ(0, client.num_draws()); 778 EXPECT_EQ(0, client.num_draws());
772 779
773 // Now trigger a ManageTiles outside of a draw. We will then need 780 // Now trigger a ManageTiles outside of a draw. We will then need
774 // a begin-frame for the ManageTiles, but we don't need a draw. 781 // a begin-frame for the ManageTiles, but we don't need a draw.
775 client.Reset(); 782 client.Reset();
776 EXPECT_FALSE(client.needs_begin_impl_frame()); 783 EXPECT_FALSE(client.needs_begin_impl_frame());
777 scheduler->SetNeedsManageTiles(); 784 scheduler->SetNeedsManageTiles();
778 EXPECT_TRUE(client.needs_begin_impl_frame()); 785 EXPECT_TRUE(client.needs_begin_impl_frame());
779 EXPECT_TRUE(scheduler->ManageTilesPending()); 786 EXPECT_TRUE(scheduler->ManageTilesPending());
780 EXPECT_FALSE(scheduler->RedrawPending()); 787 EXPECT_FALSE(scheduler->RedrawPending());
781 788
782 // BeginImplFrame. There will be no draw, only ManageTiles. 789 // BeginImplFrame. There will be no draw, only ManageTiles.
783 client.Reset(); 790 client.Reset();
784 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 791 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
785 EXPECT_EQ(client.num_actions_(), 0); 792 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
786 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); 793 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
787 client.Reset(); 794 client.Reset();
788 scheduler->OnBeginImplFrameDeadline(); 795 client.task_runner().RunPendingTasks(); // Run posted deadline.
789 EXPECT_EQ(0, client.num_draws()); 796 EXPECT_EQ(0, client.num_draws());
790 EXPECT_FALSE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); 797 EXPECT_FALSE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
791 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); 798 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles"));
792 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); 799 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
793 } 800 }
794 801
795 // Test that ManageTiles only happens once per frame. If an external caller 802 // Test that ManageTiles only happens once per frame. If an external caller
796 // initiates it, then the state machine should not ManageTiles on that frame. 803 // initiates it, then the state machine should not ManageTiles on that frame.
797 TEST(SchedulerTest, ManageTilesOncePerFrame) { 804 TEST(SchedulerTest, ManageTilesOncePerFrame) {
798 FakeSchedulerClient client; 805 FakeSchedulerClient client;
799 SchedulerSettings default_scheduler_settings; 806 SchedulerSettings default_scheduler_settings;
800 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); 807 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings);
801 scheduler->SetCanStart(); 808 scheduler->SetCanStart();
802 scheduler->SetVisible(true); 809 scheduler->SetVisible(true);
803 scheduler->SetCanDraw(true); 810 scheduler->SetCanDraw(true);
804 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); 811 InitializeOutputSurfaceAndFirstCommit(scheduler, &client);
805 812
806 // If DidManageTiles during a frame, then ManageTiles should not occur again. 813 // If DidManageTiles during a frame, then ManageTiles should not occur again.
807 scheduler->SetNeedsManageTiles(); 814 scheduler->SetNeedsManageTiles();
808 scheduler->SetNeedsRedraw(); 815 scheduler->SetNeedsRedraw();
809 client.Reset(); 816 client.Reset();
810 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 817 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
811 EXPECT_EQ(client.num_actions_(), 0); 818 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
812 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); 819 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
813 820
814 EXPECT_TRUE(scheduler->ManageTilesPending()); 821 EXPECT_TRUE(scheduler->ManageTilesPending());
815 scheduler->DidManageTiles(); // An explicit ManageTiles. 822 scheduler->DidManageTiles(); // An explicit ManageTiles.
816 EXPECT_FALSE(scheduler->ManageTilesPending()); 823 EXPECT_FALSE(scheduler->ManageTilesPending());
817 824
818 client.Reset(); 825 client.Reset();
819 scheduler->OnBeginImplFrameDeadline(); 826 client.task_runner().RunPendingTasks(); // Run posted deadline.
820 EXPECT_EQ(1, client.num_draws()); 827 EXPECT_EQ(1, client.num_draws());
821 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); 828 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
822 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles")); 829 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles"));
823 EXPECT_FALSE(scheduler->RedrawPending()); 830 EXPECT_FALSE(scheduler->RedrawPending());
824 EXPECT_FALSE(scheduler->ManageTilesPending()); 831 EXPECT_FALSE(scheduler->ManageTilesPending());
825 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); 832 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
826 833
827 // Next frame without DidManageTiles should ManageTiles with draw. 834 // Next frame without DidManageTiles should ManageTiles with draw.
828 scheduler->SetNeedsManageTiles(); 835 scheduler->SetNeedsManageTiles();
829 scheduler->SetNeedsRedraw(); 836 scheduler->SetNeedsRedraw();
830 client.Reset(); 837 client.Reset();
831 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 838 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
832 EXPECT_EQ(client.num_actions_(), 0); 839 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
833 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); 840 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
834 841
835 client.Reset(); 842 client.Reset();
836 scheduler->OnBeginImplFrameDeadline(); 843 client.task_runner().RunPendingTasks(); // Run posted deadline.
837 EXPECT_EQ(1, client.num_draws()); 844 EXPECT_EQ(1, client.num_draws());
838 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); 845 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
839 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); 846 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles"));
840 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), 847 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"),
841 client.ActionIndex("ScheduledActionManageTiles")); 848 client.ActionIndex("ScheduledActionManageTiles"));
842 EXPECT_FALSE(scheduler->RedrawPending()); 849 EXPECT_FALSE(scheduler->RedrawPending());
843 EXPECT_FALSE(scheduler->ManageTilesPending()); 850 EXPECT_FALSE(scheduler->ManageTilesPending());
844 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); 851 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
845 scheduler->DidManageTiles(); // Corresponds to ScheduledActionManageTiles 852 scheduler->DidManageTiles(); // Corresponds to ScheduledActionManageTiles
846 853
847 // If we get another DidManageTiles within the same frame, we should 854 // If we get another DidManageTiles within the same frame, we should
848 // not ManageTiles on the next frame. 855 // not ManageTiles on the next frame.
849 scheduler->DidManageTiles(); // An explicit ManageTiles. 856 scheduler->DidManageTiles(); // An explicit ManageTiles.
850 scheduler->SetNeedsManageTiles(); 857 scheduler->SetNeedsManageTiles();
851 scheduler->SetNeedsRedraw(); 858 scheduler->SetNeedsRedraw();
852 client.Reset(); 859 client.Reset();
853 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 860 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
854 EXPECT_EQ(client.num_actions_(), 0); 861 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
855 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); 862 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
856 863
857 EXPECT_TRUE(scheduler->ManageTilesPending()); 864 EXPECT_TRUE(scheduler->ManageTilesPending());
858 865
859 client.Reset(); 866 client.Reset();
860 scheduler->OnBeginImplFrameDeadline(); 867 client.task_runner().RunPendingTasks(); // Run posted deadline.
861 EXPECT_EQ(1, client.num_draws()); 868 EXPECT_EQ(1, client.num_draws());
862 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); 869 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
863 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles")); 870 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles"));
864 EXPECT_FALSE(scheduler->RedrawPending()); 871 EXPECT_FALSE(scheduler->RedrawPending());
865 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); 872 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
866 873
867 // If we get another DidManageTiles, we should not ManageTiles on the next 874 // If we get another DidManageTiles, we should not ManageTiles on the next
868 // frame. This verifies we don't alternate calling ManageTiles once and twice. 875 // frame. This verifies we don't alternate calling ManageTiles once and twice.
869 EXPECT_TRUE(scheduler->ManageTilesPending()); 876 EXPECT_TRUE(scheduler->ManageTilesPending());
870 scheduler->DidManageTiles(); // An explicit ManageTiles. 877 scheduler->DidManageTiles(); // An explicit ManageTiles.
871 EXPECT_FALSE(scheduler->ManageTilesPending()); 878 EXPECT_FALSE(scheduler->ManageTilesPending());
872 scheduler->SetNeedsManageTiles(); 879 scheduler->SetNeedsManageTiles();
873 scheduler->SetNeedsRedraw(); 880 scheduler->SetNeedsRedraw();
874 client.Reset(); 881 client.Reset();
875 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 882 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
876 EXPECT_EQ(client.num_actions_(), 0); 883 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
877 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); 884 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
878 885
879 EXPECT_TRUE(scheduler->ManageTilesPending()); 886 EXPECT_TRUE(scheduler->ManageTilesPending());
880 887
881 client.Reset(); 888 client.Reset();
882 scheduler->OnBeginImplFrameDeadline(); 889 client.task_runner().RunPendingTasks(); // Run posted deadline.
883 EXPECT_EQ(1, client.num_draws()); 890 EXPECT_EQ(1, client.num_draws());
884 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); 891 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
885 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles")); 892 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles"));
886 EXPECT_FALSE(scheduler->RedrawPending()); 893 EXPECT_FALSE(scheduler->RedrawPending());
887 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); 894 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
888 895
889 // Next frame without DidManageTiles should ManageTiles with draw. 896 // Next frame without DidManageTiles should ManageTiles with draw.
890 scheduler->SetNeedsManageTiles(); 897 scheduler->SetNeedsManageTiles();
891 scheduler->SetNeedsRedraw(); 898 scheduler->SetNeedsRedraw();
892 client.Reset(); 899 client.Reset();
893 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 900 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
894 EXPECT_EQ(client.num_actions_(), 0); 901 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
895 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); 902 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
896 903
897 client.Reset(); 904 client.Reset();
898 scheduler->OnBeginImplFrameDeadline(); 905 client.task_runner().RunPendingTasks(); // Run posted deadline.
899 EXPECT_EQ(1, client.num_draws()); 906 EXPECT_EQ(1, client.num_draws());
900 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); 907 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
901 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); 908 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles"));
902 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), 909 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"),
903 client.ActionIndex("ScheduledActionManageTiles")); 910 client.ActionIndex("ScheduledActionManageTiles"));
904 EXPECT_FALSE(scheduler->RedrawPending()); 911 EXPECT_FALSE(scheduler->RedrawPending());
905 EXPECT_FALSE(scheduler->ManageTilesPending()); 912 EXPECT_FALSE(scheduler->ManageTilesPending());
906 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); 913 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
907 scheduler->DidManageTiles(); // Corresponds to ScheduledActionManageTiles 914 scheduler->DidManageTiles(); // Corresponds to ScheduledActionManageTiles
908 } 915 }
909 916
910 TEST(SchedulerTest, TriggerBeginFrameDeadlineEarly) { 917 TEST(SchedulerTest, TriggerBeginFrameDeadlineEarly) {
911 SchedulerClientNeedsManageTilesInDraw client; 918 SchedulerClientNeedsManageTilesInDraw client;
912 SchedulerSettings default_scheduler_settings; 919 SchedulerSettings default_scheduler_settings;
913 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); 920 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings);
914 scheduler->SetCanStart(); 921 scheduler->SetCanStart();
915 scheduler->SetVisible(true); 922 scheduler->SetVisible(true);
916 scheduler->SetCanDraw(true); 923 scheduler->SetCanDraw(true);
917 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); 924 InitializeOutputSurfaceAndFirstCommit(scheduler, &client);
918 925
919 client.Reset(); 926 client.Reset();
920 BeginFrameArgs impl_frame_args = BeginFrameArgs::CreateForTesting();
921 scheduler->SetNeedsRedraw(); 927 scheduler->SetNeedsRedraw();
922 scheduler->BeginImplFrame(impl_frame_args); 928 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
923 929
924 // The deadline should be zero since there is no work other than drawing 930 // The deadline should be zero since there is no work other than drawing
925 // pending. 931 // pending.
926 EXPECT_EQ(base::TimeTicks(), client.posted_begin_impl_frame_deadline()); 932 EXPECT_EQ(base::TimeTicks(), client.posted_begin_impl_frame_deadline());
927 } 933 }
928 934
929 class SchedulerClientWithFixedEstimates : public FakeSchedulerClient { 935 class SchedulerClientWithFixedEstimates : public FakeSchedulerClient {
930 public: 936 public:
931 SchedulerClientWithFixedEstimates( 937 SchedulerClientWithFixedEstimates(
932 base::TimeDelta draw_duration, 938 base::TimeDelta draw_duration,
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
968 scheduler->SetCanStart(); 974 scheduler->SetCanStart();
969 scheduler->SetVisible(true); 975 scheduler->SetVisible(true);
970 scheduler->SetCanDraw(true); 976 scheduler->SetCanDraw(true);
971 scheduler->SetSmoothnessTakesPriority(smoothness_takes_priority); 977 scheduler->SetSmoothnessTakesPriority(smoothness_takes_priority);
972 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); 978 InitializeOutputSurfaceAndFirstCommit(scheduler, &client);
973 979
974 // Impl thread hits deadline before commit finishes. 980 // Impl thread hits deadline before commit finishes.
975 client.Reset(); 981 client.Reset();
976 scheduler->SetNeedsCommit(); 982 scheduler->SetNeedsCommit();
977 EXPECT_FALSE(scheduler->MainThreadIsInHighLatencyMode()); 983 EXPECT_FALSE(scheduler->MainThreadIsInHighLatencyMode());
978 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 984 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
979 EXPECT_FALSE(scheduler->MainThreadIsInHighLatencyMode()); 985 EXPECT_FALSE(scheduler->MainThreadIsInHighLatencyMode());
980 scheduler->OnBeginImplFrameDeadline(); 986 client.task_runner().RunPendingTasks(); // Run posted deadline.
981 EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); 987 EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode());
982 scheduler->NotifyBeginMainFrameStarted(); 988 scheduler->NotifyBeginMainFrameStarted();
983 scheduler->NotifyReadyToCommit(); 989 scheduler->NotifyReadyToCommit();
984 EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); 990 EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode());
985 EXPECT_TRUE(client.HasAction("ScheduledActionSendBeginMainFrame")); 991 EXPECT_TRUE(client.HasAction("ScheduledActionSendBeginMainFrame"));
986 992
987 client.Reset(); 993 client.Reset();
988 scheduler->SetNeedsCommit(); 994 scheduler->SetNeedsCommit();
989 EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); 995 EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode());
990 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 996 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
991 EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); 997 EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode());
992 scheduler->OnBeginImplFrameDeadline(); 998 client.task_runner().RunPendingTasks(); // Run posted deadline.
993 EXPECT_EQ(scheduler->MainThreadIsInHighLatencyMode(), 999 EXPECT_EQ(scheduler->MainThreadIsInHighLatencyMode(),
994 should_send_begin_main_frame); 1000 should_send_begin_main_frame);
995 EXPECT_EQ(client.HasAction("ScheduledActionSendBeginMainFrame"), 1001 EXPECT_EQ(client.HasAction("ScheduledActionSendBeginMainFrame"),
996 should_send_begin_main_frame); 1002 should_send_begin_main_frame);
997 } 1003 }
998 1004
999 TEST(SchedulerTest, 1005 TEST(SchedulerTest,
1000 SkipMainFrameIfHighLatencyAndCanCommitAndActivateBeforeDeadline) { 1006 SkipMainFrameIfHighLatencyAndCanCommitAndActivateBeforeDeadline) {
1001 // Set up client so that estimates indicate that we can commit and activate 1007 // Set up client so that estimates indicate that we can commit and activate
1002 // before the deadline (~8ms by default). 1008 // before the deadline (~8ms by default).
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1037 scheduler->SetCanStart(); 1043 scheduler->SetCanStart();
1038 scheduler->SetVisible(true); 1044 scheduler->SetVisible(true);
1039 scheduler->DidCreateAndInitializeOutputSurface(); 1045 scheduler->DidCreateAndInitializeOutputSurface();
1040 1046
1041 scheduler->SetNeedsCommit(); 1047 scheduler->SetNeedsCommit();
1042 EXPECT_TRUE(scheduler->CommitPending()); 1048 EXPECT_TRUE(scheduler->CommitPending());
1043 scheduler->NotifyBeginMainFrameStarted(); 1049 scheduler->NotifyBeginMainFrameStarted();
1044 scheduler->NotifyReadyToCommit(); 1050 scheduler->NotifyReadyToCommit();
1045 scheduler->SetNeedsRedraw(); 1051 scheduler->SetNeedsRedraw();
1046 1052
1047 BeginFrameArgs impl_frame_args = BeginFrameArgs::CreateForTesting(); 1053 BeginFrameArgs frame_args = BeginFrameArgs::CreateForTesting();
1048 impl_frame_args.interval = base::TimeDelta::FromMilliseconds(1000); 1054 frame_args.interval = base::TimeDelta::FromMilliseconds(1000);
1049 scheduler->BeginImplFrame(impl_frame_args); 1055 scheduler->BeginFrame(frame_args);
1050 1056
1051 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); 1057 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
1052 client.task_runner().RunPendingTasks(); // Run posted deadline. 1058 client.task_runner().RunPendingTasks(); // Run posted deadline.
1053 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); 1059 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
1054 1060
1055 // At this point, we've drawn a frame. Start another commit, but hold off on 1061 // At this point, we've drawn a frame. Start another commit, but hold off on
1056 // the NotifyReadyToCommit for now. 1062 // the NotifyReadyToCommit for now.
1057 EXPECT_FALSE(scheduler->CommitPending()); 1063 EXPECT_FALSE(scheduler->CommitPending());
1058 scheduler->SetNeedsCommit(); 1064 scheduler->SetNeedsCommit();
1059 scheduler->BeginImplFrame(impl_frame_args); 1065 scheduler->BeginFrame(frame_args);
1060 EXPECT_TRUE(scheduler->CommitPending()); 1066 EXPECT_TRUE(scheduler->CommitPending());
1061 1067
1062 // Spin the event loop a few times and make sure we get more 1068 // Spin the event loop a few times and make sure we get more
1063 // DidAnticipateDrawTimeChange calls every time. 1069 // DidAnticipateDrawTimeChange calls every time.
1064 int actions_so_far = client.num_actions_(); 1070 int actions_so_far = client.num_actions_();
1065 1071
1066 // Does three iterations to make sure that the timer is properly repeating. 1072 // Does three iterations to make sure that the timer is properly repeating.
1067 for (int i = 0; i < 3; ++i) { 1073 for (int i = 0; i < 3; ++i) {
1068 EXPECT_EQ((impl_frame_args.interval * 2).InMicroseconds(), 1074 EXPECT_EQ((frame_args.interval * 2).InMicroseconds(),
1069 client.task_runner().NextPendingTaskDelay().InMicroseconds()) 1075 client.task_runner().NextPendingTaskDelay().InMicroseconds())
1070 << *scheduler->StateAsValue(); 1076 << *scheduler->StateAsValue();
1071 client.task_runner().RunPendingTasks(); 1077 client.task_runner().RunPendingTasks();
1072 EXPECT_GT(client.num_actions_(), actions_so_far); 1078 EXPECT_GT(client.num_actions_(), actions_so_far);
1073 EXPECT_STREQ(client.Action(client.num_actions_() - 1), 1079 EXPECT_STREQ(client.Action(client.num_actions_() - 1),
1074 "DidAnticipatedDrawTimeChange"); 1080 "DidAnticipatedDrawTimeChange");
1075 actions_so_far = client.num_actions_(); 1081 actions_so_far = client.num_actions_();
1076 } 1082 }
1077 1083
1078 // Do the same thing after BeginMainFrame starts but still before activation. 1084 // Do the same thing after BeginMainFrame starts but still before activation.
1079 scheduler->NotifyBeginMainFrameStarted(); 1085 scheduler->NotifyBeginMainFrameStarted();
1080 for (int i = 0; i < 3; ++i) { 1086 for (int i = 0; i < 3; ++i) {
1081 EXPECT_EQ((impl_frame_args.interval * 2).InMicroseconds(), 1087 EXPECT_EQ((frame_args.interval * 2).InMicroseconds(),
1082 client.task_runner().NextPendingTaskDelay().InMicroseconds()) 1088 client.task_runner().NextPendingTaskDelay().InMicroseconds())
1083 << *scheduler->StateAsValue(); 1089 << *scheduler->StateAsValue();
1084 client.task_runner().RunPendingTasks(); 1090 client.task_runner().RunPendingTasks();
1085 EXPECT_GT(client.num_actions_(), actions_so_far); 1091 EXPECT_GT(client.num_actions_(), actions_so_far);
1086 EXPECT_STREQ(client.Action(client.num_actions_() - 1), 1092 EXPECT_STREQ(client.Action(client.num_actions_() - 1),
1087 "DidAnticipatedDrawTimeChange"); 1093 "DidAnticipatedDrawTimeChange");
1088 actions_so_far = client.num_actions_(); 1094 actions_so_far = client.num_actions_();
1089 } 1095 }
1090 } 1096 }
1091 1097
1098 TEST(SchedulerTest, BeginRetroFrame) {
1099 FakeSchedulerClient client;
1100 SchedulerSettings scheduler_settings;
1101 Scheduler* scheduler = client.CreateScheduler(scheduler_settings);
1102 scheduler->SetCanStart();
1103 scheduler->SetVisible(true);
1104 scheduler->SetCanDraw(true);
1105 InitializeOutputSurfaceAndFirstCommit(scheduler, &client);
1106
1107 // SetNeedsCommit should begin the frame on the next BeginImplFrame.
1108 client.Reset();
1109 scheduler->SetNeedsCommit();
1110 EXPECT_TRUE(client.needs_begin_impl_frame());
1111 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client);
1112 client.Reset();
1113
1114 // Create a BeginFrame with a long deadline to avoid race conditions.
1115 // This is the first BeginFrame, which will be handled immediately.
1116 BeginFrameArgs args = BeginFrameArgs::CreateForTesting();
1117 args.deadline += base::TimeDelta::FromHours(1);
1118 scheduler->BeginFrame(args);
1119
1120 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2);
1121 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2);
1122 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
1123 EXPECT_TRUE(client.needs_begin_impl_frame());
1124 client.Reset();
1125
1126 // Queue BeginFrames while we are still handling the previous BeginFrame.
1127 args.frame_time += base::TimeDelta::FromSeconds(1);
1128 scheduler->BeginFrame(args);
1129 args.frame_time += base::TimeDelta::FromSeconds(1);
1130 scheduler->BeginFrame(args);
1131
1132 // If we don't swap on the deadline, we need to request another
1133 // BeginImplFrame.
1134 client.task_runner().RunPendingTasks(); // Run posted deadline.
1135 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client);
1136 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
1137 EXPECT_TRUE(client.needs_begin_impl_frame());
1138 client.Reset();
1139
1140 // NotifyReadyToCommit should trigger the commit.
1141 scheduler->NotifyBeginMainFrameStarted();
1142 scheduler->NotifyReadyToCommit();
1143 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client);
1144 EXPECT_TRUE(client.needs_begin_impl_frame());
1145 client.Reset();
1146
1147 // BeginImplFrame should prepare the draw.
1148 client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame.
1149 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
1150 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
1151 EXPECT_TRUE(client.needs_begin_impl_frame());
1152 client.Reset();
1153
1154 // BeginImplFrame deadline should draw.
1155 client.task_runner().RunPendingTasks(); // Run posted deadline.
1156 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2);
1157 EXPECT_ACTION("SetNeedsBeginFrame", client, 1, 2);
1158 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
1159 EXPECT_TRUE(client.needs_begin_impl_frame());
1160 client.Reset();
1161
1162 // The following BeginImplFrame deadline should SetNeedsBeginFrame(false)
1163 // to avoid excessive toggles.
1164 client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame.
1165 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
1166 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
1167 client.Reset();
1168
1169 client.task_runner().RunPendingTasks(); // Run posted deadline.
1170 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client);
1171 EXPECT_FALSE(client.needs_begin_impl_frame());
1172 client.Reset();
1173 }
1174
1092 } // namespace 1175 } // namespace
1093 } // namespace cc 1176 } // namespace cc
OLDNEW
« no previous file with comments | « cc/scheduler/scheduler_state_machine_unittest.cc ('k') | cc/test/fake_layer_tree_host_impl_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698