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 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 needs_begin_frame_ = enable; | 102 needs_begin_frame_ = enable; |
103 } | 103 } |
104 virtual void WillBeginImplFrame(const BeginFrameArgs& args) OVERRIDE { | 104 virtual void WillBeginImplFrame(const BeginFrameArgs& args) OVERRIDE { |
105 actions_.push_back("WillBeginImplFrame"); | 105 actions_.push_back("WillBeginImplFrame"); |
106 states_.push_back(scheduler_->StateAsValue().release()); | 106 states_.push_back(scheduler_->StateAsValue().release()); |
107 } | 107 } |
108 virtual void ScheduledActionSendBeginMainFrame() OVERRIDE { | 108 virtual void ScheduledActionSendBeginMainFrame() OVERRIDE { |
109 actions_.push_back("ScheduledActionSendBeginMainFrame"); | 109 actions_.push_back("ScheduledActionSendBeginMainFrame"); |
110 states_.push_back(scheduler_->StateAsValue().release()); | 110 states_.push_back(scheduler_->StateAsValue().release()); |
111 } | 111 } |
| 112 virtual void ScheduledActionAnimate() OVERRIDE { |
| 113 actions_.push_back("ScheduledActionAnimate"); |
| 114 states_.push_back(scheduler_->StateAsValue().release()); |
| 115 } |
112 virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible() | 116 virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible() |
113 OVERRIDE { | 117 OVERRIDE { |
114 actions_.push_back("ScheduledActionDrawAndSwapIfPossible"); | 118 actions_.push_back("ScheduledActionDrawAndSwapIfPossible"); |
115 states_.push_back(scheduler_->StateAsValue().release()); | 119 states_.push_back(scheduler_->StateAsValue().release()); |
116 num_draws_++; | 120 num_draws_++; |
117 bool did_readback = false; | 121 bool did_readback = false; |
118 DrawSwapReadbackResult::DrawResult result = | 122 DrawSwapReadbackResult::DrawResult result = |
119 draw_will_happen_ | 123 draw_will_happen_ |
120 ? DrawSwapReadbackResult::DRAW_SUCCESS | 124 ? DrawSwapReadbackResult::DRAW_SUCCESS |
121 : DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; | 125 : DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 | 283 |
280 // NotifyReadyToCommit should trigger the commit. | 284 // NotifyReadyToCommit should trigger the commit. |
281 scheduler->NotifyBeginMainFrameStarted(); | 285 scheduler->NotifyBeginMainFrameStarted(); |
282 scheduler->NotifyReadyToCommit(); | 286 scheduler->NotifyReadyToCommit(); |
283 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 287 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
284 EXPECT_TRUE(client.needs_begin_frame()); | 288 EXPECT_TRUE(client.needs_begin_frame()); |
285 client.Reset(); | 289 client.Reset(); |
286 | 290 |
287 // BeginImplFrame should prepare the draw. | 291 // BeginImplFrame should prepare the draw. |
288 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 292 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
289 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | 293 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 294 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
290 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 295 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
291 EXPECT_TRUE(client.needs_begin_frame()); | 296 EXPECT_TRUE(client.needs_begin_frame()); |
292 client.Reset(); | 297 client.Reset(); |
293 | 298 |
294 // BeginImplFrame deadline should draw. | 299 // BeginImplFrame deadline should draw. |
295 client.task_runner().RunPendingTasks(); // Run posted deadline. | 300 client.task_runner().RunPendingTasks(); // Run posted deadline. |
296 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); | 301 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
297 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 302 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
298 EXPECT_TRUE(client.needs_begin_frame()); | 303 EXPECT_TRUE(client.needs_begin_frame()); |
299 client.Reset(); | 304 client.Reset(); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 EXPECT_EQ(client.num_actions_(), 0); | 346 EXPECT_EQ(client.num_actions_(), 0); |
342 client.Reset(); | 347 client.Reset(); |
343 | 348 |
344 // Finish the first commit. | 349 // Finish the first commit. |
345 scheduler->NotifyBeginMainFrameStarted(); | 350 scheduler->NotifyBeginMainFrameStarted(); |
346 scheduler->NotifyReadyToCommit(); | 351 scheduler->NotifyReadyToCommit(); |
347 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 352 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
348 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 353 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
349 client.Reset(); | 354 client.Reset(); |
350 client.task_runner().RunPendingTasks(); // Run posted deadline. | 355 client.task_runner().RunPendingTasks(); // Run posted deadline. |
351 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); | 356 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); |
| 357 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
352 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 358 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
353 | 359 |
354 // Because we just swapped, the Scheduler should also request the next | 360 // Because we just swapped, the Scheduler should also request the next |
355 // BeginImplFrame from the OutputSurface. | 361 // BeginImplFrame from the OutputSurface. |
356 EXPECT_TRUE(client.needs_begin_frame()); | 362 EXPECT_TRUE(client.needs_begin_frame()); |
357 client.Reset(); | 363 client.Reset(); |
358 // Since another commit is needed, the next BeginImplFrame should initiate | 364 // Since another commit is needed, the next BeginImplFrame should initiate |
359 // the second commit. | 365 // the second commit. |
360 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 366 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
361 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 367 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
362 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); | 368 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
363 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 369 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
364 client.Reset(); | 370 client.Reset(); |
365 | 371 |
366 // Finishing the commit before the deadline should post a new deadline task | 372 // Finishing the commit before the deadline should post a new deadline task |
367 // to trigger the deadline early. | 373 // to trigger the deadline early. |
368 scheduler->NotifyBeginMainFrameStarted(); | 374 scheduler->NotifyBeginMainFrameStarted(); |
369 scheduler->NotifyReadyToCommit(); | 375 scheduler->NotifyReadyToCommit(); |
370 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 376 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
371 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 377 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
372 client.Reset(); | 378 client.Reset(); |
373 client.task_runner().RunPendingTasks(); // Run posted deadline. | 379 client.task_runner().RunPendingTasks(); // Run posted deadline. |
374 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); | 380 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); |
| 381 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
375 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 382 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
376 EXPECT_TRUE(client.needs_begin_frame()); | 383 EXPECT_TRUE(client.needs_begin_frame()); |
377 client.Reset(); | 384 client.Reset(); |
378 | 385 |
379 // On the next BeginImplFrame, verify we go back to a quiescent state and | 386 // On the next BeginImplFrame, verify we go back to a quiescent state and |
380 // no longer request BeginImplFrames. | 387 // no longer request BeginImplFrames. |
381 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 388 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
382 client.task_runner().RunPendingTasks(); // Run posted deadline. | 389 client.task_runner().RunPendingTasks(); // Run posted deadline. |
383 EXPECT_FALSE(client.needs_begin_frame()); | 390 EXPECT_FALSE(client.needs_begin_frame()); |
384 client.Reset(); | 391 client.Reset(); |
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
731 EXPECT_TRUE(scheduler->ManageTilesPending()); | 738 EXPECT_TRUE(scheduler->ManageTilesPending()); |
732 EXPECT_TRUE(client.needs_begin_frame()); | 739 EXPECT_TRUE(client.needs_begin_frame()); |
733 EXPECT_EQ(0, client.num_draws()); | 740 EXPECT_EQ(0, client.num_draws()); |
734 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles")); | 741 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles")); |
735 EXPECT_FALSE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); | 742 EXPECT_FALSE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
736 | 743 |
737 // We have no immediate actions to perform, so the BeginImplFrame should post | 744 // We have no immediate actions to perform, so the BeginImplFrame should post |
738 // the deadline task. | 745 // the deadline task. |
739 client.Reset(); | 746 client.Reset(); |
740 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 747 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
741 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | 748 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 749 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
742 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 750 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
743 | 751 |
744 // On the deadline, he actions should have occured in the right order. | 752 // On the deadline, he actions should have occured in the right order. |
745 client.Reset(); | 753 client.Reset(); |
746 client.task_runner().RunPendingTasks(); // Run posted deadline. | 754 client.task_runner().RunPendingTasks(); // Run posted deadline. |
747 EXPECT_EQ(1, client.num_draws()); | 755 EXPECT_EQ(1, client.num_draws()); |
748 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); | 756 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
749 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); | 757 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); |
750 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), | 758 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), |
751 client.ActionIndex("ScheduledActionManageTiles")); | 759 client.ActionIndex("ScheduledActionManageTiles")); |
752 EXPECT_FALSE(scheduler->RedrawPending()); | 760 EXPECT_FALSE(scheduler->RedrawPending()); |
753 EXPECT_FALSE(scheduler->ManageTilesPending()); | 761 EXPECT_FALSE(scheduler->ManageTilesPending()); |
754 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 762 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
755 | 763 |
756 // Request a draw. We don't need a ManageTiles yet. | 764 // Request a draw. We don't need a ManageTiles yet. |
757 client.Reset(); | 765 client.Reset(); |
758 scheduler->SetNeedsRedraw(); | 766 scheduler->SetNeedsRedraw(); |
759 EXPECT_TRUE(scheduler->RedrawPending()); | 767 EXPECT_TRUE(scheduler->RedrawPending()); |
760 EXPECT_FALSE(scheduler->ManageTilesPending()); | 768 EXPECT_FALSE(scheduler->ManageTilesPending()); |
761 EXPECT_TRUE(client.needs_begin_frame()); | 769 EXPECT_TRUE(client.needs_begin_frame()); |
762 EXPECT_EQ(0, client.num_draws()); | 770 EXPECT_EQ(0, client.num_draws()); |
763 | 771 |
764 // We have no immediate actions to perform, so the BeginImplFrame should post | 772 // We have no immediate actions to perform, so the BeginImplFrame should post |
765 // the deadline task. | 773 // the deadline task. |
766 client.Reset(); | 774 client.Reset(); |
767 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 775 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
768 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | 776 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 777 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
769 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 778 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
770 | 779 |
771 // Draw. The draw will trigger SetNeedsManageTiles, and | 780 // Draw. The draw will trigger SetNeedsManageTiles, and |
772 // then the ManageTiles action will be triggered after the Draw. | 781 // then the ManageTiles action will be triggered after the Draw. |
773 // Afterwards, neither a draw nor ManageTiles are pending. | 782 // Afterwards, neither a draw nor ManageTiles are pending. |
774 client.Reset(); | 783 client.Reset(); |
775 client.task_runner().RunPendingTasks(); // Run posted deadline. | 784 client.task_runner().RunPendingTasks(); // Run posted deadline. |
776 EXPECT_EQ(1, client.num_draws()); | 785 EXPECT_EQ(1, client.num_draws()); |
777 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); | 786 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
778 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); | 787 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
825 scheduler->SetCanStart(); | 834 scheduler->SetCanStart(); |
826 scheduler->SetVisible(true); | 835 scheduler->SetVisible(true); |
827 scheduler->SetCanDraw(true); | 836 scheduler->SetCanDraw(true); |
828 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 837 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
829 | 838 |
830 // If DidManageTiles during a frame, then ManageTiles should not occur again. | 839 // If DidManageTiles during a frame, then ManageTiles should not occur again. |
831 scheduler->SetNeedsManageTiles(); | 840 scheduler->SetNeedsManageTiles(); |
832 scheduler->SetNeedsRedraw(); | 841 scheduler->SetNeedsRedraw(); |
833 client.Reset(); | 842 client.Reset(); |
834 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 843 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
835 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | 844 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 845 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
836 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 846 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
837 | 847 |
838 EXPECT_TRUE(scheduler->ManageTilesPending()); | 848 EXPECT_TRUE(scheduler->ManageTilesPending()); |
839 scheduler->DidManageTiles(); // An explicit ManageTiles. | 849 scheduler->DidManageTiles(); // An explicit ManageTiles. |
840 EXPECT_FALSE(scheduler->ManageTilesPending()); | 850 EXPECT_FALSE(scheduler->ManageTilesPending()); |
841 | 851 |
842 client.Reset(); | 852 client.Reset(); |
843 client.task_runner().RunPendingTasks(); // Run posted deadline. | 853 client.task_runner().RunPendingTasks(); // Run posted deadline. |
844 EXPECT_EQ(1, client.num_draws()); | 854 EXPECT_EQ(1, client.num_draws()); |
845 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); | 855 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
846 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles")); | 856 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles")); |
847 EXPECT_FALSE(scheduler->RedrawPending()); | 857 EXPECT_FALSE(scheduler->RedrawPending()); |
848 EXPECT_FALSE(scheduler->ManageTilesPending()); | 858 EXPECT_FALSE(scheduler->ManageTilesPending()); |
849 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 859 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
850 | 860 |
851 // Next frame without DidManageTiles should ManageTiles with draw. | 861 // Next frame without DidManageTiles should ManageTiles with draw. |
852 scheduler->SetNeedsManageTiles(); | 862 scheduler->SetNeedsManageTiles(); |
853 scheduler->SetNeedsRedraw(); | 863 scheduler->SetNeedsRedraw(); |
854 client.Reset(); | 864 client.Reset(); |
855 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 865 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
856 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | 866 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 867 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
857 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 868 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
858 | 869 |
859 client.Reset(); | 870 client.Reset(); |
860 client.task_runner().RunPendingTasks(); // Run posted deadline. | 871 client.task_runner().RunPendingTasks(); // Run posted deadline. |
861 EXPECT_EQ(1, client.num_draws()); | 872 EXPECT_EQ(1, client.num_draws()); |
862 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); | 873 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
863 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); | 874 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); |
864 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), | 875 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), |
865 client.ActionIndex("ScheduledActionManageTiles")); | 876 client.ActionIndex("ScheduledActionManageTiles")); |
866 EXPECT_FALSE(scheduler->RedrawPending()); | 877 EXPECT_FALSE(scheduler->RedrawPending()); |
867 EXPECT_FALSE(scheduler->ManageTilesPending()); | 878 EXPECT_FALSE(scheduler->ManageTilesPending()); |
868 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 879 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
869 scheduler->DidManageTiles(); // Corresponds to ScheduledActionManageTiles | 880 scheduler->DidManageTiles(); // Corresponds to ScheduledActionManageTiles |
870 | 881 |
871 // If we get another DidManageTiles within the same frame, we should | 882 // If we get another DidManageTiles within the same frame, we should |
872 // not ManageTiles on the next frame. | 883 // not ManageTiles on the next frame. |
873 scheduler->DidManageTiles(); // An explicit ManageTiles. | 884 scheduler->DidManageTiles(); // An explicit ManageTiles. |
874 scheduler->SetNeedsManageTiles(); | 885 scheduler->SetNeedsManageTiles(); |
875 scheduler->SetNeedsRedraw(); | 886 scheduler->SetNeedsRedraw(); |
876 client.Reset(); | 887 client.Reset(); |
877 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 888 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
878 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | 889 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 890 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
879 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 891 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
880 | 892 |
881 EXPECT_TRUE(scheduler->ManageTilesPending()); | 893 EXPECT_TRUE(scheduler->ManageTilesPending()); |
882 | 894 |
883 client.Reset(); | 895 client.Reset(); |
884 client.task_runner().RunPendingTasks(); // Run posted deadline. | 896 client.task_runner().RunPendingTasks(); // Run posted deadline. |
885 EXPECT_EQ(1, client.num_draws()); | 897 EXPECT_EQ(1, client.num_draws()); |
886 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); | 898 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
887 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles")); | 899 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles")); |
888 EXPECT_FALSE(scheduler->RedrawPending()); | 900 EXPECT_FALSE(scheduler->RedrawPending()); |
889 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 901 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
890 | 902 |
891 // If we get another DidManageTiles, we should not ManageTiles on the next | 903 // If we get another DidManageTiles, we should not ManageTiles on the next |
892 // frame. This verifies we don't alternate calling ManageTiles once and twice. | 904 // frame. This verifies we don't alternate calling ManageTiles once and twice. |
893 EXPECT_TRUE(scheduler->ManageTilesPending()); | 905 EXPECT_TRUE(scheduler->ManageTilesPending()); |
894 scheduler->DidManageTiles(); // An explicit ManageTiles. | 906 scheduler->DidManageTiles(); // An explicit ManageTiles. |
895 EXPECT_FALSE(scheduler->ManageTilesPending()); | 907 EXPECT_FALSE(scheduler->ManageTilesPending()); |
896 scheduler->SetNeedsManageTiles(); | 908 scheduler->SetNeedsManageTiles(); |
897 scheduler->SetNeedsRedraw(); | 909 scheduler->SetNeedsRedraw(); |
898 client.Reset(); | 910 client.Reset(); |
899 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 911 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
900 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | 912 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 913 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
901 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 914 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
902 | 915 |
903 EXPECT_TRUE(scheduler->ManageTilesPending()); | 916 EXPECT_TRUE(scheduler->ManageTilesPending()); |
904 | 917 |
905 client.Reset(); | 918 client.Reset(); |
906 client.task_runner().RunPendingTasks(); // Run posted deadline. | 919 client.task_runner().RunPendingTasks(); // Run posted deadline. |
907 EXPECT_EQ(1, client.num_draws()); | 920 EXPECT_EQ(1, client.num_draws()); |
908 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); | 921 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
909 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles")); | 922 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles")); |
910 EXPECT_FALSE(scheduler->RedrawPending()); | 923 EXPECT_FALSE(scheduler->RedrawPending()); |
911 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 924 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
912 | 925 |
913 // Next frame without DidManageTiles should ManageTiles with draw. | 926 // Next frame without DidManageTiles should ManageTiles with draw. |
914 scheduler->SetNeedsManageTiles(); | 927 scheduler->SetNeedsManageTiles(); |
915 scheduler->SetNeedsRedraw(); | 928 scheduler->SetNeedsRedraw(); |
916 client.Reset(); | 929 client.Reset(); |
917 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 930 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
918 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | 931 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 932 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
919 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 933 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
920 | 934 |
921 client.Reset(); | 935 client.Reset(); |
922 client.task_runner().RunPendingTasks(); // Run posted deadline. | 936 client.task_runner().RunPendingTasks(); // Run posted deadline. |
923 EXPECT_EQ(1, client.num_draws()); | 937 EXPECT_EQ(1, client.num_draws()); |
924 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); | 938 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
925 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); | 939 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); |
926 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), | 940 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), |
927 client.ActionIndex("ScheduledActionManageTiles")); | 941 client.ActionIndex("ScheduledActionManageTiles")); |
928 EXPECT_FALSE(scheduler->RedrawPending()); | 942 EXPECT_FALSE(scheduler->RedrawPending()); |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1164 | 1178 |
1165 // NotifyReadyToCommit should trigger the commit. | 1179 // NotifyReadyToCommit should trigger the commit. |
1166 scheduler->NotifyBeginMainFrameStarted(); | 1180 scheduler->NotifyBeginMainFrameStarted(); |
1167 scheduler->NotifyReadyToCommit(); | 1181 scheduler->NotifyReadyToCommit(); |
1168 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 1182 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
1169 EXPECT_TRUE(client.needs_begin_frame()); | 1183 EXPECT_TRUE(client.needs_begin_frame()); |
1170 client.Reset(); | 1184 client.Reset(); |
1171 | 1185 |
1172 // BeginImplFrame should prepare the draw. | 1186 // BeginImplFrame should prepare the draw. |
1173 client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. | 1187 client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. |
1174 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | 1188 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 1189 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
1175 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1190 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
1176 EXPECT_TRUE(client.needs_begin_frame()); | 1191 EXPECT_TRUE(client.needs_begin_frame()); |
1177 client.Reset(); | 1192 client.Reset(); |
1178 | 1193 |
1179 // BeginImplFrame deadline should draw. | 1194 // BeginImplFrame deadline should draw. |
1180 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1195 client.task_runner().RunPendingTasks(); // Run posted deadline. |
1181 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); | 1196 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
1182 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1197 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
1183 EXPECT_TRUE(client.needs_begin_frame()); | 1198 EXPECT_TRUE(client.needs_begin_frame()); |
1184 client.Reset(); | 1199 client.Reset(); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1237 | 1252 |
1238 // NotifyReadyToCommit should trigger the pending commit and draw. | 1253 // NotifyReadyToCommit should trigger the pending commit and draw. |
1239 scheduler->NotifyBeginMainFrameStarted(); | 1254 scheduler->NotifyBeginMainFrameStarted(); |
1240 scheduler->NotifyReadyToCommit(); | 1255 scheduler->NotifyReadyToCommit(); |
1241 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 1256 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
1242 EXPECT_TRUE(client.needs_begin_frame()); | 1257 EXPECT_TRUE(client.needs_begin_frame()); |
1243 client.Reset(); | 1258 client.Reset(); |
1244 | 1259 |
1245 // Swapping will put us into a swap throttled state. | 1260 // Swapping will put us into a swap throttled state. |
1246 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1261 client.task_runner().RunPendingTasks(); // Run posted deadline. |
1247 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); | 1262 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); |
| 1263 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
1248 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1264 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
1249 EXPECT_TRUE(client.needs_begin_frame()); | 1265 EXPECT_TRUE(client.needs_begin_frame()); |
1250 client.Reset(); | 1266 client.Reset(); |
1251 | 1267 |
1252 // While swap throttled, BeginRetroFrames should trigger BeginImplFrames | 1268 // While swap throttled, BeginRetroFrames should trigger BeginImplFrames |
1253 // but not a BeginMainFrame or draw. | 1269 // but not a BeginMainFrame or draw. |
1254 scheduler->SetNeedsCommit(); | 1270 scheduler->SetNeedsCommit(); |
1255 client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. | 1271 client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. |
1256 EXPECT_ACTION("WillBeginImplFrame", client, 0, 1); | 1272 EXPECT_ACTION("WillBeginImplFrame", client, 0, 1); |
1257 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1273 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
(...skipping 11 matching lines...) Expand all Loading... |
1269 // Take us out of a swap throttled state. | 1285 // Take us out of a swap throttled state. |
1270 scheduler->DidSwapBuffersComplete(); | 1286 scheduler->DidSwapBuffersComplete(); |
1271 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 1); | 1287 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 1); |
1272 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1288 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
1273 EXPECT_TRUE(client.needs_begin_frame()); | 1289 EXPECT_TRUE(client.needs_begin_frame()); |
1274 client.Reset(); | 1290 client.Reset(); |
1275 | 1291 |
1276 // BeginImplFrame deadline should draw. | 1292 // BeginImplFrame deadline should draw. |
1277 scheduler->SetNeedsRedraw(); | 1293 scheduler->SetNeedsRedraw(); |
1278 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1294 client.task_runner().RunPendingTasks(); // Run posted deadline. |
1279 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); | 1295 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); |
| 1296 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
1280 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1297 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
1281 EXPECT_TRUE(client.needs_begin_frame()); | 1298 EXPECT_TRUE(client.needs_begin_frame()); |
1282 client.Reset(); | 1299 client.Reset(); |
1283 } | 1300 } |
1284 | 1301 |
1285 void BeginFramesNotFromClient(bool begin_frame_scheduling_enabled, | 1302 void BeginFramesNotFromClient(bool begin_frame_scheduling_enabled, |
1286 bool throttle_frame_production) { | 1303 bool throttle_frame_production) { |
1287 FakeSchedulerClient client; | 1304 FakeSchedulerClient client; |
1288 SchedulerSettings scheduler_settings; | 1305 SchedulerSettings scheduler_settings; |
1289 scheduler_settings.begin_frame_scheduling_enabled = | 1306 scheduler_settings.begin_frame_scheduling_enabled = |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1321 | 1338 |
1322 // NotifyReadyToCommit should trigger the commit. | 1339 // NotifyReadyToCommit should trigger the commit. |
1323 scheduler->NotifyBeginMainFrameStarted(); | 1340 scheduler->NotifyBeginMainFrameStarted(); |
1324 scheduler->NotifyReadyToCommit(); | 1341 scheduler->NotifyReadyToCommit(); |
1325 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 1342 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
1326 EXPECT_FALSE(client.needs_begin_frame()); | 1343 EXPECT_FALSE(client.needs_begin_frame()); |
1327 client.Reset(); | 1344 client.Reset(); |
1328 | 1345 |
1329 // BeginImplFrame should prepare the draw. | 1346 // BeginImplFrame should prepare the draw. |
1330 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. | 1347 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
1331 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | 1348 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 1349 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
1332 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1350 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
1333 EXPECT_FALSE(client.needs_begin_frame()); | 1351 EXPECT_FALSE(client.needs_begin_frame()); |
1334 client.Reset(); | 1352 client.Reset(); |
1335 | 1353 |
1336 // BeginImplFrame deadline should draw. | 1354 // BeginImplFrame deadline should draw. |
1337 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1355 client.task_runner().RunPendingTasks(); // Run posted deadline. |
1338 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); | 1356 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
1339 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1357 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
1340 EXPECT_FALSE(client.needs_begin_frame()); | 1358 EXPECT_FALSE(client.needs_begin_frame()); |
1341 client.Reset(); | 1359 client.Reset(); |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1410 | 1428 |
1411 // NotifyReadyToCommit should trigger the pending commit and draw. | 1429 // NotifyReadyToCommit should trigger the pending commit and draw. |
1412 scheduler->NotifyBeginMainFrameStarted(); | 1430 scheduler->NotifyBeginMainFrameStarted(); |
1413 scheduler->NotifyReadyToCommit(); | 1431 scheduler->NotifyReadyToCommit(); |
1414 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 1432 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
1415 EXPECT_FALSE(client.needs_begin_frame()); | 1433 EXPECT_FALSE(client.needs_begin_frame()); |
1416 client.Reset(); | 1434 client.Reset(); |
1417 | 1435 |
1418 // Swapping will put us into a swap throttled state. | 1436 // Swapping will put us into a swap throttled state. |
1419 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1437 client.task_runner().RunPendingTasks(); // Run posted deadline. |
1420 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); | 1438 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); |
| 1439 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
1421 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1440 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
1422 EXPECT_FALSE(client.needs_begin_frame()); | 1441 EXPECT_FALSE(client.needs_begin_frame()); |
1423 client.Reset(); | 1442 client.Reset(); |
1424 | 1443 |
1425 // While swap throttled, BeginFrames should trigger BeginImplFrames, | 1444 // While swap throttled, BeginFrames should trigger BeginImplFrames, |
1426 // but not a BeginMainFrame or draw. | 1445 // but not a BeginMainFrame or draw. |
1427 scheduler->SetNeedsCommit(); | 1446 scheduler->SetNeedsCommit(); |
1428 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. | 1447 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
1429 EXPECT_ACTION("WillBeginImplFrame", client, 0, 1); | 1448 EXPECT_ACTION("WillBeginImplFrame", client, 0, 1); |
1430 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1449 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
1431 EXPECT_FALSE(client.needs_begin_frame()); | 1450 EXPECT_FALSE(client.needs_begin_frame()); |
1432 client.Reset(); | 1451 client.Reset(); |
1433 | 1452 |
1434 // Take us out of a swap throttled state. | 1453 // Take us out of a swap throttled state. |
1435 scheduler->DidSwapBuffersComplete(); | 1454 scheduler->DidSwapBuffersComplete(); |
1436 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 1); | 1455 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 1); |
1437 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1456 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
1438 EXPECT_FALSE(client.needs_begin_frame()); | 1457 EXPECT_FALSE(client.needs_begin_frame()); |
1439 client.Reset(); | 1458 client.Reset(); |
1440 | 1459 |
1441 // BeginImplFrame deadline should draw. | 1460 // BeginImplFrame deadline should draw. |
1442 scheduler->SetNeedsRedraw(); | 1461 scheduler->SetNeedsRedraw(); |
1443 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1462 client.task_runner().RunPendingTasks(); // Run posted deadline. |
1444 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); | 1463 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); |
| 1464 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
1445 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1465 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
1446 EXPECT_FALSE(client.needs_begin_frame()); | 1466 EXPECT_FALSE(client.needs_begin_frame()); |
1447 client.Reset(); | 1467 client.Reset(); |
1448 } | 1468 } |
1449 | 1469 |
1450 TEST(SchedulerTest, SyntheticBeginFrames_SwapThrottled) { | 1470 TEST(SchedulerTest, SyntheticBeginFrames_SwapThrottled) { |
1451 bool begin_frame_scheduling_enabled = false; | 1471 bool begin_frame_scheduling_enabled = false; |
1452 bool throttle_frame_production = true; | 1472 bool throttle_frame_production = true; |
1453 BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, | 1473 BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, |
1454 throttle_frame_production); | 1474 throttle_frame_production); |
1455 } | 1475 } |
1456 | 1476 |
1457 TEST(SchedulerTest, VSyncThrottlingDisabled_SwapThrottled) { | 1477 TEST(SchedulerTest, VSyncThrottlingDisabled_SwapThrottled) { |
1458 bool begin_frame_scheduling_enabled = true; | 1478 bool begin_frame_scheduling_enabled = true; |
1459 bool throttle_frame_production = false; | 1479 bool throttle_frame_production = false; |
1460 BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, | 1480 BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, |
1461 throttle_frame_production); | 1481 throttle_frame_production); |
1462 } | 1482 } |
1463 | 1483 |
1464 TEST(SchedulerTest, | 1484 TEST(SchedulerTest, |
1465 SyntheticBeginFrames_And_VSyncThrottlingDisabled_SwapThrottled) { | 1485 SyntheticBeginFrames_And_VSyncThrottlingDisabled_SwapThrottled) { |
1466 bool begin_frame_scheduling_enabled = false; | 1486 bool begin_frame_scheduling_enabled = false; |
1467 bool throttle_frame_production = false; | 1487 bool throttle_frame_production = false; |
1468 BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, | 1488 BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, |
1469 throttle_frame_production); | 1489 throttle_frame_production); |
1470 } | 1490 } |
1471 | 1491 |
1472 } // namespace | 1492 } // namespace |
1473 } // namespace cc | 1493 } // namespace cc |
OLD | NEW |