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 17 matching lines...) Expand all Loading... |
28 #define EXPECT_SINGLE_ACTION(action, client) \ | 28 #define EXPECT_SINGLE_ACTION(action, client) \ |
29 EXPECT_ACTION(action, client, 0, 1) | 29 EXPECT_ACTION(action, client, 0, 1) |
30 | 30 |
31 namespace cc { | 31 namespace cc { |
32 namespace { | 32 namespace { |
33 | 33 |
34 void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler) { | 34 void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler) { |
35 scheduler->DidCreateAndInitializeOutputSurface(); | 35 scheduler->DidCreateAndInitializeOutputSurface(); |
36 scheduler->SetNeedsCommit(); | 36 scheduler->SetNeedsCommit(); |
37 scheduler->NotifyBeginMainFrameStarted(); | 37 scheduler->NotifyBeginMainFrameStarted(); |
38 scheduler->FinishCommit(); | 38 scheduler->NotifyReadyToCommit(); |
39 // Go through the motions to draw the commit. | 39 // Go through the motions to draw the commit. |
40 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); | 40 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
41 scheduler->OnBeginImplFrameDeadline(); | 41 scheduler->OnBeginImplFrameDeadline(); |
42 // We need another BeginImplFrame so Scheduler calls | 42 // We need another BeginImplFrame so Scheduler calls |
43 // SetNeedsBeginImplFrame(false). | 43 // SetNeedsBeginImplFrame(false). |
44 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); | 44 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
45 scheduler->OnBeginImplFrameDeadline(); | 45 scheduler->OnBeginImplFrameDeadline(); |
46 } | 46 } |
47 | 47 |
48 class FakeSchedulerClient : public SchedulerClient { | 48 class FakeSchedulerClient : public SchedulerClient { |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
231 EXPECT_TRUE(client.needs_begin_impl_frame()); | 231 EXPECT_TRUE(client.needs_begin_impl_frame()); |
232 client.Reset(); | 232 client.Reset(); |
233 | 233 |
234 // If we don't swap on the deadline, we need to request another | 234 // If we don't swap on the deadline, we need to request another |
235 // BeginImplFrame. | 235 // BeginImplFrame. |
236 scheduler->OnBeginImplFrameDeadline(); | 236 scheduler->OnBeginImplFrameDeadline(); |
237 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); | 237 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); |
238 EXPECT_TRUE(client.needs_begin_impl_frame()); | 238 EXPECT_TRUE(client.needs_begin_impl_frame()); |
239 client.Reset(); | 239 client.Reset(); |
240 | 240 |
241 // FinishCommit should commit | 241 // NotifyReadyToCommit should trigger the commit. |
242 scheduler->NotifyBeginMainFrameStarted(); | 242 scheduler->NotifyBeginMainFrameStarted(); |
243 scheduler->FinishCommit(); | 243 scheduler->NotifyReadyToCommit(); |
244 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 244 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
245 EXPECT_TRUE(client.needs_begin_impl_frame()); | 245 EXPECT_TRUE(client.needs_begin_impl_frame()); |
246 client.Reset(); | 246 client.Reset(); |
247 | 247 |
248 // BeginImplFrame should prepare the draw. | 248 // BeginImplFrame should prepare the draw. |
249 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); | 249 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
250 EXPECT_SINGLE_ACTION("PostBeginImplFrameDeadlineTask", client); | 250 EXPECT_SINGLE_ACTION("PostBeginImplFrameDeadlineTask", client); |
251 EXPECT_TRUE(client.needs_begin_impl_frame()); | 251 EXPECT_TRUE(client.needs_begin_impl_frame()); |
252 client.Reset(); | 252 client.Reset(); |
253 | 253 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
295 EXPECT_TRUE(client.needs_begin_impl_frame()); | 295 EXPECT_TRUE(client.needs_begin_impl_frame()); |
296 client.Reset(); | 296 client.Reset(); |
297 | 297 |
298 // Now SetNeedsCommit again. Calling here means we need a second commit. | 298 // Now SetNeedsCommit again. Calling here means we need a second commit. |
299 scheduler->SetNeedsCommit(); | 299 scheduler->SetNeedsCommit(); |
300 EXPECT_EQ(client.num_actions_(), 0); | 300 EXPECT_EQ(client.num_actions_(), 0); |
301 client.Reset(); | 301 client.Reset(); |
302 | 302 |
303 // Finish the first commit. | 303 // Finish the first commit. |
304 scheduler->NotifyBeginMainFrameStarted(); | 304 scheduler->NotifyBeginMainFrameStarted(); |
305 scheduler->FinishCommit(); | 305 scheduler->NotifyReadyToCommit(); |
306 EXPECT_ACTION("ScheduledActionCommit", client, 0, 2); | 306 EXPECT_ACTION("ScheduledActionCommit", client, 0, 2); |
307 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); | 307 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); |
308 client.Reset(); | 308 client.Reset(); |
309 scheduler->OnBeginImplFrameDeadline(); | 309 scheduler->OnBeginImplFrameDeadline(); |
310 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); | 310 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
311 EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2); | 311 EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2); |
312 | 312 |
313 // Because we just swapped, the Scheduler should also request the next | 313 // Because we just swapped, the Scheduler should also request the next |
314 // BeginImplFrame from the OutputSurface. | 314 // BeginImplFrame from the OutputSurface. |
315 EXPECT_TRUE(client.needs_begin_impl_frame()); | 315 EXPECT_TRUE(client.needs_begin_impl_frame()); |
316 client.Reset(); | 316 client.Reset(); |
317 | 317 |
318 // Since another commit is needed, the next BeginImplFrame should initiate | 318 // Since another commit is needed, the next BeginImplFrame should initiate |
319 // the second commit. | 319 // the second commit. |
320 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); | 320 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
321 EXPECT_EQ(client.num_actions_(), 2); | 321 EXPECT_EQ(client.num_actions_(), 2); |
322 EXPECT_TRUE(client.HasAction("ScheduledActionSendBeginMainFrame")); | 322 EXPECT_TRUE(client.HasAction("ScheduledActionSendBeginMainFrame")); |
323 EXPECT_TRUE(client.HasAction("PostBeginImplFrameDeadlineTask")); | 323 EXPECT_TRUE(client.HasAction("PostBeginImplFrameDeadlineTask")); |
324 client.Reset(); | 324 client.Reset(); |
325 | 325 |
326 // Finishing the commit before the deadline should post a new deadline task | 326 // Finishing the commit before the deadline should post a new deadline task |
327 // to trigger the deadline early. | 327 // to trigger the deadline early. |
328 scheduler->NotifyBeginMainFrameStarted(); | 328 scheduler->NotifyBeginMainFrameStarted(); |
329 scheduler->FinishCommit(); | 329 scheduler->NotifyReadyToCommit(); |
330 EXPECT_ACTION("ScheduledActionCommit", client, 0, 2); | 330 EXPECT_ACTION("ScheduledActionCommit", client, 0, 2); |
331 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); | 331 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); |
332 client.Reset(); | 332 client.Reset(); |
333 scheduler->OnBeginImplFrameDeadline(); | 333 scheduler->OnBeginImplFrameDeadline(); |
334 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); | 334 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
335 EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2); | 335 EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2); |
336 EXPECT_TRUE(client.needs_begin_impl_frame()); | 336 EXPECT_TRUE(client.needs_begin_impl_frame()); |
337 client.Reset(); | 337 client.Reset(); |
338 | 338 |
339 // On the next BeginImplFrame, verify we go back to a quiescent state and | 339 // On the next BeginImplFrame, verify we go back to a quiescent state and |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
406 EXPECT_EQ(0, client.num_actions_()); | 406 EXPECT_EQ(0, client.num_actions_()); |
407 | 407 |
408 client.Reset(); | 408 client.Reset(); |
409 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); | 409 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
410 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 2); | 410 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 2); |
411 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); | 411 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); |
412 | 412 |
413 // Commit will release the texture. | 413 // Commit will release the texture. |
414 client.Reset(); | 414 client.Reset(); |
415 scheduler->NotifyBeginMainFrameStarted(); | 415 scheduler->NotifyBeginMainFrameStarted(); |
416 scheduler->FinishCommit(); | 416 scheduler->NotifyReadyToCommit(); |
417 EXPECT_ACTION("ScheduledActionCommit", client, 0, 2); | 417 EXPECT_ACTION("ScheduledActionCommit", client, 0, 2); |
418 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); | 418 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); |
419 EXPECT_TRUE(scheduler->RedrawPending()); | 419 EXPECT_TRUE(scheduler->RedrawPending()); |
420 | 420 |
421 // Now we can draw again after the commit happens. | 421 // Now we can draw again after the commit happens. |
422 client.Reset(); | 422 client.Reset(); |
423 scheduler->OnBeginImplFrameDeadline(); | 423 scheduler->OnBeginImplFrameDeadline(); |
424 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); | 424 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
425 EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2); | 425 EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2); |
426 EXPECT_FALSE(scheduler->RedrawPending()); | 426 EXPECT_FALSE(scheduler->RedrawPending()); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
463 | 463 |
464 client.Reset(); | 464 client.Reset(); |
465 scheduler->OnBeginImplFrameDeadline(); | 465 scheduler->OnBeginImplFrameDeadline(); |
466 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); | 466 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); |
467 | 467 |
468 // Although the compositor cannot draw because textures are locked by main | 468 // Although the compositor cannot draw because textures are locked by main |
469 // thread, we continue requesting SetNeedsBeginImplFrame in anticipation of | 469 // thread, we continue requesting SetNeedsBeginImplFrame in anticipation of |
470 // the unlock. | 470 // the unlock. |
471 EXPECT_TRUE(client.needs_begin_impl_frame()); | 471 EXPECT_TRUE(client.needs_begin_impl_frame()); |
472 | 472 |
473 // Trigger the commit | 473 // Trigger the commit. |
474 scheduler->NotifyBeginMainFrameStarted(); | 474 scheduler->NotifyBeginMainFrameStarted(); |
475 scheduler->FinishCommit(); | 475 scheduler->NotifyReadyToCommit(); |
476 EXPECT_TRUE(client.needs_begin_impl_frame()); | 476 EXPECT_TRUE(client.needs_begin_impl_frame()); |
477 | 477 |
478 // Between commit and draw, texture acquisition for main thread delayed, | 478 // Between commit and draw, texture acquisition for main thread delayed, |
479 // and main thread blocks. | 479 // and main thread blocks. |
480 client.Reset(); | 480 client.Reset(); |
481 scheduler->SetMainThreadNeedsLayerTextures(); | 481 scheduler->SetMainThreadNeedsLayerTextures(); |
482 EXPECT_EQ(0, client.num_actions_()); | 482 EXPECT_EQ(0, client.num_actions_()); |
483 | 483 |
484 // No implicit commit is expected. | 484 // No implicit commit is expected. |
485 client.Reset(); | 485 client.Reset(); |
(...skipping 26 matching lines...) Expand all Loading... |
512 EXPECT_TRUE(client.needs_begin_impl_frame()); | 512 EXPECT_TRUE(client.needs_begin_impl_frame()); |
513 | 513 |
514 client.Reset(); | 514 client.Reset(); |
515 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); | 515 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
516 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 2); | 516 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 2); |
517 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); | 517 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); |
518 client.Reset(); | 518 client.Reset(); |
519 | 519 |
520 // Trigger the commit, which will trigger the deadline task early. | 520 // Trigger the commit, which will trigger the deadline task early. |
521 scheduler->NotifyBeginMainFrameStarted(); | 521 scheduler->NotifyBeginMainFrameStarted(); |
522 scheduler->FinishCommit(); | 522 scheduler->NotifyReadyToCommit(); |
523 EXPECT_ACTION("ScheduledActionCommit", client, 0, 2); | 523 EXPECT_ACTION("ScheduledActionCommit", client, 0, 2); |
524 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); | 524 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); |
525 EXPECT_TRUE(client.needs_begin_impl_frame()); | 525 EXPECT_TRUE(client.needs_begin_impl_frame()); |
526 client.Reset(); | 526 client.Reset(); |
527 | 527 |
528 // Verify we draw on the next BeginImplFrame deadline | 528 // Verify we draw on the next BeginImplFrame deadline |
529 scheduler->OnBeginImplFrameDeadline(); | 529 scheduler->OnBeginImplFrameDeadline(); |
530 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); | 530 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
531 EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2); | 531 EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2); |
532 EXPECT_TRUE(client.needs_begin_impl_frame()); | 532 EXPECT_TRUE(client.needs_begin_impl_frame()); |
533 client.Reset(); | 533 client.Reset(); |
534 } | 534 } |
535 | 535 |
536 TEST(SchedulerTest, VisibilitySwitchWithTextureAcquisition) { | 536 TEST(SchedulerTest, VisibilitySwitchWithTextureAcquisition) { |
537 FakeSchedulerClient client; | 537 FakeSchedulerClient client; |
538 SchedulerSettings scheduler_settings; | 538 SchedulerSettings scheduler_settings; |
539 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); | 539 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); |
540 scheduler->SetCanStart(); | 540 scheduler->SetCanStart(); |
541 scheduler->SetVisible(true); | 541 scheduler->SetVisible(true); |
542 scheduler->SetCanDraw(true); | 542 scheduler->SetCanDraw(true); |
543 | 543 |
544 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); | 544 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
545 client.Reset(); | 545 client.Reset(); |
546 scheduler->DidCreateAndInitializeOutputSurface(); | 546 scheduler->DidCreateAndInitializeOutputSurface(); |
547 | 547 |
548 scheduler->SetNeedsCommit(); | 548 scheduler->SetNeedsCommit(); |
549 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); | 549 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
550 scheduler->OnBeginImplFrameDeadline(); | 550 scheduler->OnBeginImplFrameDeadline(); |
551 scheduler->NotifyBeginMainFrameStarted(); | 551 scheduler->NotifyBeginMainFrameStarted(); |
552 scheduler->FinishCommit(); | 552 scheduler->NotifyReadyToCommit(); |
553 scheduler->SetMainThreadNeedsLayerTextures(); | 553 scheduler->SetMainThreadNeedsLayerTextures(); |
554 scheduler->SetNeedsCommit(); | 554 scheduler->SetNeedsCommit(); |
555 client.Reset(); | 555 client.Reset(); |
556 // Verify that pending texture acquisition fires when visibility | 556 // Verify that pending texture acquisition fires when visibility |
557 // is lost in order to avoid a deadlock. | 557 // is lost in order to avoid a deadlock. |
558 scheduler->SetVisible(false); | 558 scheduler->SetVisible(false); |
559 EXPECT_SINGLE_ACTION("ScheduledActionAcquireLayerTexturesForMainThread", | 559 EXPECT_SINGLE_ACTION("ScheduledActionAcquireLayerTexturesForMainThread", |
560 client); | 560 client); |
561 | 561 |
562 client.Reset(); | 562 client.Reset(); |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
737 EXPECT_TRUE(client.needs_begin_impl_frame()); | 737 EXPECT_TRUE(client.needs_begin_impl_frame()); |
738 | 738 |
739 client.SetNeedsCommitOnNextDraw(); | 739 client.SetNeedsCommitOnNextDraw(); |
740 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); | 740 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
741 client.SetNeedsCommitOnNextDraw(); | 741 client.SetNeedsCommitOnNextDraw(); |
742 scheduler->OnBeginImplFrameDeadline(); | 742 scheduler->OnBeginImplFrameDeadline(); |
743 EXPECT_EQ(1, client.num_draws()); | 743 EXPECT_EQ(1, client.num_draws()); |
744 EXPECT_TRUE(scheduler->CommitPending()); | 744 EXPECT_TRUE(scheduler->CommitPending()); |
745 EXPECT_TRUE(client.needs_begin_impl_frame()); | 745 EXPECT_TRUE(client.needs_begin_impl_frame()); |
746 scheduler->NotifyBeginMainFrameStarted(); | 746 scheduler->NotifyBeginMainFrameStarted(); |
747 scheduler->FinishCommit(); | 747 scheduler->NotifyReadyToCommit(); |
748 | 748 |
749 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); | 749 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
750 scheduler->OnBeginImplFrameDeadline(); | 750 scheduler->OnBeginImplFrameDeadline(); |
751 EXPECT_EQ(2, client.num_draws()); | 751 EXPECT_EQ(2, client.num_draws()); |
752 | 752 |
753 EXPECT_FALSE(scheduler->RedrawPending()); | 753 EXPECT_FALSE(scheduler->RedrawPending()); |
754 EXPECT_FALSE(scheduler->CommitPending()); | 754 EXPECT_FALSE(scheduler->CommitPending()); |
755 EXPECT_TRUE(client.needs_begin_impl_frame()); | 755 EXPECT_TRUE(client.needs_begin_impl_frame()); |
756 | 756 |
757 // We stop requesting BeginImplFrames after a BeginImplFrame where we don't | 757 // We stop requesting BeginImplFrames after a BeginImplFrame where we don't |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
851 | 851 |
852 // Tell the client that it will fail to swap. | 852 // Tell the client that it will fail to swap. |
853 client.SetDrawWillHappen(true); | 853 client.SetDrawWillHappen(true); |
854 client.SetSwapWillHappenIfDrawHappens(false); | 854 client.SetSwapWillHappenIfDrawHappens(false); |
855 | 855 |
856 // Get the compositor to do a ScheduledActionDrawAndReadback. | 856 // Get the compositor to do a ScheduledActionDrawAndReadback. |
857 scheduler->SetCanDraw(true); | 857 scheduler->SetCanDraw(true); |
858 scheduler->SetNeedsRedraw(); | 858 scheduler->SetNeedsRedraw(); |
859 scheduler->SetNeedsForcedCommitForReadback(); | 859 scheduler->SetNeedsForcedCommitForReadback(); |
860 scheduler->NotifyBeginMainFrameStarted(); | 860 scheduler->NotifyBeginMainFrameStarted(); |
861 scheduler->FinishCommit(); | 861 scheduler->NotifyReadyToCommit(); |
862 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndReadback")); | 862 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndReadback")); |
863 } | 863 } |
864 | 864 |
865 TEST(SchedulerTest, BackToBackReadbackAllowed) { | 865 TEST(SchedulerTest, BackToBackReadbackAllowed) { |
866 // Some clients call readbacks twice in a row before the replacement | 866 // Some clients call readbacks twice in a row before the replacement |
867 // commit comes in. Make sure it is allowed. | 867 // commit comes in. Make sure it is allowed. |
868 FakeSchedulerClient client; | 868 FakeSchedulerClient client; |
869 SchedulerSettings default_scheduler_settings; | 869 SchedulerSettings default_scheduler_settings; |
870 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 870 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
871 | 871 |
872 // Get the compositor to do 2 ScheduledActionDrawAndReadbacks before | 872 // Get the compositor to do 2 ScheduledActionDrawAndReadbacks before |
873 // the replacement commit comes in. | 873 // the replacement commit comes in. |
874 scheduler->SetCanDraw(true); | 874 scheduler->SetCanDraw(true); |
875 scheduler->SetNeedsRedraw(); | 875 scheduler->SetNeedsRedraw(); |
876 scheduler->SetNeedsForcedCommitForReadback(); | 876 scheduler->SetNeedsForcedCommitForReadback(); |
877 scheduler->NotifyBeginMainFrameStarted(); | 877 scheduler->NotifyBeginMainFrameStarted(); |
878 scheduler->FinishCommit(); | 878 scheduler->NotifyReadyToCommit(); |
879 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndReadback")); | 879 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndReadback")); |
880 | 880 |
881 client.Reset(); | 881 client.Reset(); |
882 scheduler->SetNeedsForcedCommitForReadback(); | 882 scheduler->SetNeedsForcedCommitForReadback(); |
883 scheduler->NotifyBeginMainFrameStarted(); | 883 scheduler->NotifyBeginMainFrameStarted(); |
884 scheduler->FinishCommit(); | 884 scheduler->NotifyReadyToCommit(); |
885 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndReadback")); | 885 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndReadback")); |
886 | 886 |
887 // The replacement commit comes in after 2 readbacks. | 887 // The replacement commit comes in after 2 readbacks. |
888 client.Reset(); | 888 client.Reset(); |
889 scheduler->NotifyBeginMainFrameStarted(); | 889 scheduler->NotifyBeginMainFrameStarted(); |
890 scheduler->FinishCommit(); | 890 scheduler->NotifyReadyToCommit(); |
891 } | 891 } |
892 | 892 |
893 | 893 |
894 class SchedulerClientNeedsManageTilesInDraw : public FakeSchedulerClient { | 894 class SchedulerClientNeedsManageTilesInDraw : public FakeSchedulerClient { |
895 public: | 895 public: |
896 virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible() | 896 virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible() |
897 OVERRIDE { | 897 OVERRIDE { |
898 scheduler_->SetNeedsManageTiles(); | 898 scheduler_->SetNeedsManageTiles(); |
899 return FakeSchedulerClient::ScheduledActionDrawAndSwapIfPossible(); | 899 return FakeSchedulerClient::ScheduledActionDrawAndSwapIfPossible(); |
900 } | 900 } |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1145 | 1145 |
1146 // Impl thread hits deadline before commit finishes. | 1146 // Impl thread hits deadline before commit finishes. |
1147 client.Reset(); | 1147 client.Reset(); |
1148 scheduler->SetNeedsCommit(); | 1148 scheduler->SetNeedsCommit(); |
1149 EXPECT_FALSE(scheduler->MainThreadIsInHighLatencyMode()); | 1149 EXPECT_FALSE(scheduler->MainThreadIsInHighLatencyMode()); |
1150 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); | 1150 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
1151 EXPECT_FALSE(scheduler->MainThreadIsInHighLatencyMode()); | 1151 EXPECT_FALSE(scheduler->MainThreadIsInHighLatencyMode()); |
1152 scheduler->OnBeginImplFrameDeadline(); | 1152 scheduler->OnBeginImplFrameDeadline(); |
1153 EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); | 1153 EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); |
1154 scheduler->NotifyBeginMainFrameStarted(); | 1154 scheduler->NotifyBeginMainFrameStarted(); |
1155 scheduler->FinishCommit(); | 1155 scheduler->NotifyReadyToCommit(); |
1156 EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); | 1156 EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); |
1157 EXPECT_TRUE(client.HasAction("ScheduledActionSendBeginMainFrame")); | 1157 EXPECT_TRUE(client.HasAction("ScheduledActionSendBeginMainFrame")); |
1158 | 1158 |
1159 client.Reset(); | 1159 client.Reset(); |
1160 scheduler->SetNeedsCommit(); | 1160 scheduler->SetNeedsCommit(); |
1161 EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); | 1161 EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); |
1162 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); | 1162 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
1163 EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); | 1163 EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); |
1164 scheduler->OnBeginImplFrameDeadline(); | 1164 scheduler->OnBeginImplFrameDeadline(); |
1165 EXPECT_EQ(scheduler->MainThreadIsInHighLatencyMode(), | 1165 EXPECT_EQ(scheduler->MainThreadIsInHighLatencyMode(), |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1204 Scheduler* scheduler = client.CreateScheduler(settings); | 1204 Scheduler* scheduler = client.CreateScheduler(settings); |
1205 | 1205 |
1206 scheduler->SetCanDraw(true); | 1206 scheduler->SetCanDraw(true); |
1207 scheduler->SetCanStart(); | 1207 scheduler->SetCanStart(); |
1208 scheduler->SetVisible(true); | 1208 scheduler->SetVisible(true); |
1209 scheduler->DidCreateAndInitializeOutputSurface(); | 1209 scheduler->DidCreateAndInitializeOutputSurface(); |
1210 | 1210 |
1211 scheduler->SetNeedsCommit(); | 1211 scheduler->SetNeedsCommit(); |
1212 EXPECT_TRUE(scheduler->CommitPending()); | 1212 EXPECT_TRUE(scheduler->CommitPending()); |
1213 scheduler->NotifyBeginMainFrameStarted(); | 1213 scheduler->NotifyBeginMainFrameStarted(); |
1214 scheduler->FinishCommit(); | 1214 scheduler->NotifyReadyToCommit(); |
1215 scheduler->SetNeedsRedraw(); | 1215 scheduler->SetNeedsRedraw(); |
1216 BeginFrameArgs impl_frame_args = BeginFrameArgs::CreateForTesting(); | 1216 BeginFrameArgs impl_frame_args = BeginFrameArgs::CreateForTesting(); |
1217 const int interval = 1; | 1217 const int interval = 1; |
1218 impl_frame_args.interval = base::TimeDelta::FromMilliseconds(interval); | 1218 impl_frame_args.interval = base::TimeDelta::FromMilliseconds(interval); |
1219 scheduler->BeginImplFrame(impl_frame_args); | 1219 scheduler->BeginImplFrame(impl_frame_args); |
1220 scheduler->OnBeginImplFrameDeadline(); | 1220 scheduler->OnBeginImplFrameDeadline(); |
1221 | 1221 |
1222 // At this point, we've drawn a frame. Start another commit, but hold off on | 1222 // At this point, we've drawn a frame. Start another commit, but hold off on |
1223 // the FinishCommit for now. | 1223 // the NotifyReadyToCommit for now. |
1224 EXPECT_FALSE(scheduler->CommitPending()); | 1224 EXPECT_FALSE(scheduler->CommitPending()); |
1225 scheduler->SetNeedsCommit(); | 1225 scheduler->SetNeedsCommit(); |
1226 EXPECT_TRUE(scheduler->CommitPending()); | 1226 EXPECT_TRUE(scheduler->CommitPending()); |
1227 | 1227 |
1228 // Spin the event loop a few times and make sure we get more | 1228 // Spin the event loop a few times and make sure we get more |
1229 // DidAnticipateDrawTimeChange calls every time. | 1229 // DidAnticipateDrawTimeChange calls every time. |
1230 int actions_so_far = client.num_actions_(); | 1230 int actions_so_far = client.num_actions_(); |
1231 | 1231 |
1232 // Does three iterations to make sure that the timer is properly repeating. | 1232 // Does three iterations to make sure that the timer is properly repeating. |
1233 for (int i = 0; i < 3; ++i) { | 1233 for (int i = 0; i < 3; ++i) { |
1234 // Wait for 2x the frame interval to match | 1234 // Wait for 2x the frame interval to match |
1235 // Scheduler::advance_commit_state_timer_'s rate. | 1235 // Scheduler::advance_commit_state_timer_'s rate. |
1236 SpinForMillis(interval * 2); | 1236 SpinForMillis(interval * 2); |
1237 EXPECT_GT(client.num_actions_(), actions_so_far); | 1237 EXPECT_GT(client.num_actions_(), actions_so_far); |
1238 EXPECT_STREQ(client.Action(client.num_actions_() - 1), | 1238 EXPECT_STREQ(client.Action(client.num_actions_() - 1), |
1239 "DidAnticipatedDrawTimeChange"); | 1239 "DidAnticipatedDrawTimeChange"); |
1240 actions_so_far = client.num_actions_(); | 1240 actions_so_far = client.num_actions_(); |
1241 } | 1241 } |
1242 } | 1242 } |
1243 | 1243 |
1244 } // namespace | 1244 } // namespace |
1245 } // namespace cc | 1245 } // namespace cc |
OLD | NEW |