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

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

Issue 2409923002: cc: Rename SwapBuffers on CompositorFrameSink to SubmitCompositorFrame (Closed)
Patch Set: swap-to-submit: rebase Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/scheduler/scheduler.h" 5 #include "cc/scheduler/scheduler.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 namespace { 50 namespace {
51 51
52 base::TimeDelta kSlowDuration = base::TimeDelta::FromSeconds(1); 52 base::TimeDelta kSlowDuration = base::TimeDelta::FromSeconds(1);
53 base::TimeDelta kFastDuration = base::TimeDelta::FromMilliseconds(1); 53 base::TimeDelta kFastDuration = base::TimeDelta::FromMilliseconds(1);
54 54
55 class FakeSchedulerClient : public SchedulerClient, 55 class FakeSchedulerClient : public SchedulerClient,
56 public FakeExternalBeginFrameSource::Client { 56 public FakeExternalBeginFrameSource::Client {
57 public: 57 public:
58 FakeSchedulerClient() 58 FakeSchedulerClient()
59 : inside_begin_impl_frame_(false), 59 : inside_begin_impl_frame_(false),
60 automatic_swap_ack_(true), 60 automatic_ack_(true),
61 scheduler_(nullptr) { 61 scheduler_(nullptr) {
62 Reset(); 62 Reset();
63 } 63 }
64 64
65 void Reset() { 65 void Reset() {
66 actions_.clear(); 66 actions_.clear();
67 states_.clear(); 67 states_.clear();
68 will_begin_impl_frame_causes_redraw_ = false; 68 will_begin_impl_frame_causes_redraw_ = false;
69 will_begin_impl_frame_requests_one_begin_impl_frame_ = false; 69 will_begin_impl_frame_requests_one_begin_impl_frame_ = false;
70 draw_will_happen_ = true; 70 draw_will_happen_ = true;
(...skipping 27 matching lines...) Expand all
98 } 98 }
99 void SetWillBeginImplFrameCausesRedraw(bool causes_redraw) { 99 void SetWillBeginImplFrameCausesRedraw(bool causes_redraw) {
100 will_begin_impl_frame_causes_redraw_ = causes_redraw; 100 will_begin_impl_frame_causes_redraw_ = causes_redraw;
101 } 101 }
102 void SetDrawWillHappen(bool draw_will_happen) { 102 void SetDrawWillHappen(bool draw_will_happen) {
103 draw_will_happen_ = draw_will_happen; 103 draw_will_happen_ = draw_will_happen;
104 } 104 }
105 void SetSwapWillHappenIfDrawHappens(bool swap_will_happen_if_draw_happens) { 105 void SetSwapWillHappenIfDrawHappens(bool swap_will_happen_if_draw_happens) {
106 swap_will_happen_if_draw_happens_ = swap_will_happen_if_draw_happens; 106 swap_will_happen_if_draw_happens_ = swap_will_happen_if_draw_happens;
107 } 107 }
108 void SetAutomaticSwapAck(bool automatic_swap_ack) { 108 void SetAutomaticSubmitCompositorFrameAck(bool automatic_ack) {
109 automatic_swap_ack_ = automatic_swap_ack; 109 automatic_ack_ = automatic_ack;
110 } 110 }
111 // SchedulerClient implementation. 111 // SchedulerClient implementation.
112 void WillBeginImplFrame(const BeginFrameArgs& args) override { 112 void WillBeginImplFrame(const BeginFrameArgs& args) override {
113 EXPECT_FALSE(inside_begin_impl_frame_); 113 EXPECT_FALSE(inside_begin_impl_frame_);
114 inside_begin_impl_frame_ = true; 114 inside_begin_impl_frame_ = true;
115 PushAction("WillBeginImplFrame"); 115 PushAction("WillBeginImplFrame");
116 if (will_begin_impl_frame_requests_one_begin_impl_frame_) 116 if (will_begin_impl_frame_requests_one_begin_impl_frame_)
117 scheduler_->SetNeedsOneBeginImplFrame(); 117 scheduler_->SetNeedsOneBeginImplFrame();
118 if (will_begin_impl_frame_causes_redraw_) 118 if (will_begin_impl_frame_causes_redraw_)
119 scheduler_->SetNeedsRedraw(); 119 scheduler_->SetNeedsRedraw();
120 } 120 }
121 void DidFinishImplFrame() override { 121 void DidFinishImplFrame() override {
122 EXPECT_TRUE(inside_begin_impl_frame_); 122 EXPECT_TRUE(inside_begin_impl_frame_);
123 inside_begin_impl_frame_ = false; 123 inside_begin_impl_frame_ = false;
124 } 124 }
125 125
126 void ScheduledActionSendBeginMainFrame(const BeginFrameArgs& args) override { 126 void ScheduledActionSendBeginMainFrame(const BeginFrameArgs& args) override {
127 PushAction("ScheduledActionSendBeginMainFrame"); 127 PushAction("ScheduledActionSendBeginMainFrame");
128 last_begin_main_frame_args_ = args; 128 last_begin_main_frame_args_ = args;
129 } 129 }
130 130
131 const BeginFrameArgs& last_begin_main_frame_args() { 131 const BeginFrameArgs& last_begin_main_frame_args() {
132 return last_begin_main_frame_args_; 132 return last_begin_main_frame_args_;
133 } 133 }
134 134
135 DrawResult ScheduledActionDrawAndSwapIfPossible() override { 135 DrawResult ScheduledActionDrawIfPossible() override {
136 PushAction("ScheduledActionDrawAndSwapIfPossible"); 136 PushAction("ScheduledActionDrawIfPossible");
137 num_draws_++; 137 num_draws_++;
138 DrawResult result = 138 DrawResult result =
139 draw_will_happen_ ? DRAW_SUCCESS : DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; 139 draw_will_happen_ ? DRAW_SUCCESS : DRAW_ABORTED_CHECKERBOARD_ANIMATIONS;
140 bool swap_will_happen = 140 bool swap_will_happen =
141 draw_will_happen_ && swap_will_happen_if_draw_happens_; 141 draw_will_happen_ && swap_will_happen_if_draw_happens_;
142 if (swap_will_happen) { 142 if (swap_will_happen) {
143 scheduler_->DidSwapBuffers(); 143 scheduler_->DidSubmitCompositorFrame();
144 144
145 if (automatic_swap_ack_) 145 if (automatic_ack_)
146 scheduler_->DidSwapBuffersComplete(); 146 scheduler_->DidReceiveCompositorFrameAck();
147 } 147 }
148 return result; 148 return result;
149 } 149 }
150 DrawResult ScheduledActionDrawAndSwapForced() override { 150 DrawResult ScheduledActionDrawForced() override {
151 PushAction("ScheduledActionDrawAndSwapForced"); 151 PushAction("ScheduledActionDrawForced");
152 return DRAW_SUCCESS; 152 return DRAW_SUCCESS;
153 } 153 }
154 void ScheduledActionCommit() override { 154 void ScheduledActionCommit() override {
155 PushAction("ScheduledActionCommit"); 155 PushAction("ScheduledActionCommit");
156 scheduler_->DidCommit(); 156 scheduler_->DidCommit();
157 } 157 }
158 void ScheduledActionActivateSyncTree() override { 158 void ScheduledActionActivateSyncTree() override {
159 PushAction("ScheduledActionActivateSyncTree"); 159 PushAction("ScheduledActionActivateSyncTree");
160 } 160 }
161 void ScheduledActionBeginCompositorFrameSinkCreation() override { 161 void ScheduledActionBeginCompositorFrameSinkCreation() override {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 protected: 208 protected:
209 bool InsideBeginImplFrameCallback(bool state) { 209 bool InsideBeginImplFrameCallback(bool state) {
210 return inside_begin_impl_frame_ == state; 210 return inside_begin_impl_frame_ == state;
211 } 211 }
212 212
213 bool inside_begin_impl_frame_; 213 bool inside_begin_impl_frame_;
214 bool will_begin_impl_frame_causes_redraw_; 214 bool will_begin_impl_frame_causes_redraw_;
215 bool will_begin_impl_frame_requests_one_begin_impl_frame_; 215 bool will_begin_impl_frame_requests_one_begin_impl_frame_;
216 bool draw_will_happen_; 216 bool draw_will_happen_;
217 bool swap_will_happen_if_draw_happens_; 217 bool swap_will_happen_if_draw_happens_;
218 bool automatic_swap_ack_; 218 bool automatic_ack_;
219 int num_draws_; 219 int num_draws_;
220 BeginFrameArgs last_begin_main_frame_args_; 220 BeginFrameArgs last_begin_main_frame_args_;
221 base::TimeTicks posted_begin_impl_frame_deadline_; 221 base::TimeTicks posted_begin_impl_frame_deadline_;
222 std::vector<const char*> actions_; 222 std::vector<const char*> actions_;
223 std::vector<std::unique_ptr<base::trace_event::ConvertableToTraceFormat>> 223 std::vector<std::unique_ptr<base::trace_event::ConvertableToTraceFormat>>
224 states_; 224 states_;
225 TestScheduler* scheduler_; 225 TestScheduler* scheduler_;
226 }; 226 };
227 227
228 enum BeginFrameSourceType { 228 enum BeginFrameSourceType {
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src()); 409 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src());
410 fake_external_begin_frame_source_->TestOnBeginFrame(args); 410 fake_external_begin_frame_source_->TestOnBeginFrame(args);
411 return args; 411 return args;
412 } 412 }
413 413
414 FakeExternalBeginFrameSource* fake_external_begin_frame_source() const { 414 FakeExternalBeginFrameSource* fake_external_begin_frame_source() const {
415 return fake_external_begin_frame_source_.get(); 415 return fake_external_begin_frame_source_.get();
416 } 416 }
417 417
418 void CheckMainFrameSkippedAfterLateCommit(bool expect_send_begin_main_frame); 418 void CheckMainFrameSkippedAfterLateCommit(bool expect_send_begin_main_frame);
419 void ImplFrameSkippedAfterLateSwapAck(bool swap_ack_before_deadline); 419 void ImplFrameSkippedAfterLateAck(bool receive_ack_before_deadline);
420 void ImplFrameNotSkippedAfterLateSwapAck(); 420 void ImplFrameNotSkippedAfterLateAck();
421 void BeginFramesNotFromClient(BeginFrameSourceType bfs_type); 421 void BeginFramesNotFromClient(BeginFrameSourceType bfs_type);
422 void BeginFramesNotFromClient_SwapThrottled(BeginFrameSourceType bfs_type); 422 void BeginFramesNotFromClient_IsDrawThrottled(BeginFrameSourceType bfs_type);
423 bool BeginMainFrameOnCriticalPath(TreePriority tree_priority, 423 bool BeginMainFrameOnCriticalPath(TreePriority tree_priority,
424 ScrollHandlerState scroll_handler_state, 424 ScrollHandlerState scroll_handler_state,
425 base::TimeDelta durations); 425 base::TimeDelta durations);
426 426
427 std::unique_ptr<base::SimpleTestTickClock> now_src_; 427 std::unique_ptr<base::SimpleTestTickClock> now_src_;
428 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; 428 scoped_refptr<OrderedSimpleTaskRunner> task_runner_;
429 std::unique_ptr<FakeExternalBeginFrameSource> 429 std::unique_ptr<FakeExternalBeginFrameSource>
430 fake_external_begin_frame_source_; 430 fake_external_begin_frame_source_;
431 std::unique_ptr<SyntheticBeginFrameSource> synthetic_frame_source_; 431 std::unique_ptr<SyntheticBeginFrameSource> synthetic_frame_source_;
432 std::unique_ptr<SyntheticBeginFrameSource> unthrottled_frame_source_; 432 std::unique_ptr<SyntheticBeginFrameSource> unthrottled_frame_source_;
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
530 530
531 // BeginImplFrame should prepare the draw. 531 // BeginImplFrame should prepare the draw.
532 EXPECT_SCOPED(AdvanceFrame()); 532 EXPECT_SCOPED(AdvanceFrame());
533 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1); 533 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1);
534 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 534 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
535 EXPECT_TRUE(scheduler_->begin_frames_expected()); 535 EXPECT_TRUE(scheduler_->begin_frames_expected());
536 client_->Reset(); 536 client_->Reset();
537 537
538 // BeginImplFrame deadline should draw. 538 // BeginImplFrame deadline should draw.
539 task_runner().RunPendingTasks(); // Run posted deadline. 539 task_runner().RunPendingTasks(); // Run posted deadline.
540 EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client_); 540 EXPECT_SINGLE_ACTION("ScheduledActionDrawIfPossible", client_);
541 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 541 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
542 EXPECT_TRUE(scheduler_->begin_frames_expected()); 542 EXPECT_TRUE(scheduler_->begin_frames_expected());
543 client_->Reset(); 543 client_->Reset();
544 544
545 // The following BeginImplFrame deadline should SetNeedsBeginFrame(false) 545 // The following BeginImplFrame deadline should SetNeedsBeginFrame(false)
546 // to avoid excessive toggles. 546 // to avoid excessive toggles.
547 EXPECT_SCOPED(AdvanceFrame()); 547 EXPECT_SCOPED(AdvanceFrame());
548 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_); 548 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_);
549 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 549 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
550 client_->Reset(); 550 client_->Reset();
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 scheduler_->SetNeedsRedraw(); 595 scheduler_->SetNeedsRedraw();
596 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); 596 EXPECT_SINGLE_ACTION("AddObserver(this)", client_);
597 597
598 client_->Reset(); 598 client_->Reset();
599 AdvanceFrame(); 599 AdvanceFrame();
600 // BeginMainFrame is not sent during the defer commit is on. 600 // BeginMainFrame is not sent during the defer commit is on.
601 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1); 601 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1);
602 602
603 client_->Reset(); 603 client_->Reset();
604 task_runner().RunPendingTasks(); // Run posted deadline. 604 task_runner().RunPendingTasks(); // Run posted deadline.
605 EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client_); 605 EXPECT_SINGLE_ACTION("ScheduledActionDrawIfPossible", client_);
606 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 606 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
607 EXPECT_TRUE(scheduler_->begin_frames_expected()); 607 EXPECT_TRUE(scheduler_->begin_frames_expected());
608 608
609 client_->Reset(); 609 client_->Reset();
610 AdvanceFrame(); 610 AdvanceFrame();
611 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_); 611 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_);
612 } 612 }
613 613
614 TEST_F(SchedulerTest, RequestCommitAfterBeginMainFrameSent) { 614 TEST_F(SchedulerTest, RequestCommitAfterBeginMainFrameSent) {
615 SetUpScheduler(EXTERNAL_BFS); 615 SetUpScheduler(EXTERNAL_BFS);
(...skipping 24 matching lines...) Expand all
640 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 640 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
641 client_->Reset(); 641 client_->Reset();
642 642
643 // Activate it. 643 // Activate it.
644 scheduler_->NotifyReadyToActivate(); 644 scheduler_->NotifyReadyToActivate();
645 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_); 645 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_);
646 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 646 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
647 client_->Reset(); 647 client_->Reset();
648 648
649 task_runner().RunPendingTasks(); // Run posted deadline. 649 task_runner().RunPendingTasks(); // Run posted deadline.
650 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); 650 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 1);
651 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 651 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
652 652
653 // Because we just swapped, the Scheduler should also request the next 653 // Because we just swapped, the Scheduler should also request the next
654 // BeginImplFrame from the CompositorFrameSink. 654 // BeginImplFrame from the CompositorFrameSink.
655 EXPECT_TRUE(scheduler_->begin_frames_expected()); 655 EXPECT_TRUE(scheduler_->begin_frames_expected());
656 client_->Reset(); 656 client_->Reset();
657 // Since another commit is needed, the next BeginImplFrame should initiate 657 // Since another commit is needed, the next BeginImplFrame should initiate
658 // the second commit. 658 // the second commit.
659 EXPECT_SCOPED(AdvanceFrame()); 659 EXPECT_SCOPED(AdvanceFrame());
660 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); 660 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2);
661 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); 661 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2);
662 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 662 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
663 client_->Reset(); 663 client_->Reset();
664 664
665 // Finishing the commit before the deadline should post a new deadline task 665 // Finishing the commit before the deadline should post a new deadline task
666 // to trigger the deadline early. 666 // to trigger the deadline early.
667 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); 667 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks());
668 scheduler_->NotifyReadyToCommit(); 668 scheduler_->NotifyReadyToCommit();
669 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); 669 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_);
670 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 670 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
671 client_->Reset(); 671 client_->Reset();
672 scheduler_->NotifyReadyToActivate(); 672 scheduler_->NotifyReadyToActivate();
673 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_); 673 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_);
674 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 674 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
675 client_->Reset(); 675 client_->Reset();
676 task_runner().RunPendingTasks(); // Run posted deadline. 676 task_runner().RunPendingTasks(); // Run posted deadline.
677 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); 677 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 1);
678 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 678 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
679 EXPECT_TRUE(scheduler_->begin_frames_expected()); 679 EXPECT_TRUE(scheduler_->begin_frames_expected());
680 client_->Reset(); 680 client_->Reset();
681 681
682 // On the next BeginImplFrame, verify we go back to a quiescent state and 682 // On the next BeginImplFrame, verify we go back to a quiescent state and
683 // no longer request BeginImplFrames. 683 // no longer request BeginImplFrames.
684 EXPECT_SCOPED(AdvanceFrame()); 684 EXPECT_SCOPED(AdvanceFrame());
685 task_runner().RunPendingTasks(); // Run posted deadline. 685 task_runner().RunPendingTasks(); // Run posted deadline.
686 EXPECT_FALSE(scheduler_->begin_frames_expected()); 686 EXPECT_FALSE(scheduler_->begin_frames_expected());
687 client_->Reset(); 687 client_->Reset();
688 } 688 }
689 689
690 class SchedulerClientThatsetNeedsDrawInsideDraw : public FakeSchedulerClient { 690 class SchedulerClientThatsetNeedsDrawInsideDraw : public FakeSchedulerClient {
691 public: 691 public:
692 SchedulerClientThatsetNeedsDrawInsideDraw() 692 SchedulerClientThatsetNeedsDrawInsideDraw()
693 : FakeSchedulerClient(), request_redraws_(false) {} 693 : FakeSchedulerClient(), request_redraws_(false) {}
694 694
695 void SetRequestRedrawsInsideDraw(bool enable) { request_redraws_ = enable; } 695 void SetRequestRedrawsInsideDraw(bool enable) { request_redraws_ = enable; }
696 696
697 DrawResult ScheduledActionDrawAndSwapIfPossible() override { 697 DrawResult ScheduledActionDrawIfPossible() override {
698 // Only SetNeedsRedraw the first time this is called 698 // Only SetNeedsRedraw the first time this is called
699 if (request_redraws_) { 699 if (request_redraws_) {
700 scheduler_->SetNeedsRedraw(); 700 scheduler_->SetNeedsRedraw();
701 } 701 }
702 return FakeSchedulerClient::ScheduledActionDrawAndSwapIfPossible(); 702 return FakeSchedulerClient::ScheduledActionDrawIfPossible();
703 } 703 }
704 704
705 DrawResult ScheduledActionDrawAndSwapForced() override { 705 DrawResult ScheduledActionDrawForced() override {
706 NOTREACHED(); 706 NOTREACHED();
707 return DRAW_SUCCESS; 707 return DRAW_SUCCESS;
708 } 708 }
709 709
710 private: 710 private:
711 bool request_redraws_; 711 bool request_redraws_;
712 }; 712 };
713 713
714 // Tests for two different situations: 714 // Tests for two different situations:
715 // 1. the scheduler dropping SetNeedsRedraw requests that happen inside 715 // 1. the scheduler dropping SetNeedsRedraw requests that happen inside
716 // a ScheduledActionDrawAndSwap 716 // a ScheduledActionDraw
717 // 2. the scheduler drawing twice inside a single tick 717 // 2. the scheduler drawing twice inside a single tick
718 TEST_F(SchedulerTest, RequestRedrawInsideDraw) { 718 TEST_F(SchedulerTest, RequestRedrawInsideDraw) {
719 SchedulerClientThatsetNeedsDrawInsideDraw* client = 719 SchedulerClientThatsetNeedsDrawInsideDraw* client =
720 new SchedulerClientThatsetNeedsDrawInsideDraw; 720 new SchedulerClientThatsetNeedsDrawInsideDraw;
721 SetUpScheduler(EXTERNAL_BFS, base::WrapUnique(client)); 721 SetUpScheduler(EXTERNAL_BFS, base::WrapUnique(client));
722 client->SetRequestRedrawsInsideDraw(true); 722 client->SetRequestRedrawsInsideDraw(true);
723 723
724 scheduler_->SetNeedsRedraw(); 724 scheduler_->SetNeedsRedraw();
725 EXPECT_TRUE(scheduler_->RedrawPending()); 725 EXPECT_TRUE(scheduler_->RedrawPending());
726 EXPECT_TRUE(client->needs_begin_frames()); 726 EXPECT_TRUE(client->needs_begin_frames());
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
793 EXPECT_FALSE(scheduler_->RedrawPending()); 793 EXPECT_FALSE(scheduler_->RedrawPending());
794 EXPECT_TRUE(client->needs_begin_frames()); 794 EXPECT_TRUE(client->needs_begin_frames());
795 } 795 }
796 796
797 class SchedulerClientThatSetNeedsBeginMainFrameInsideDraw 797 class SchedulerClientThatSetNeedsBeginMainFrameInsideDraw
798 : public FakeSchedulerClient { 798 : public FakeSchedulerClient {
799 public: 799 public:
800 SchedulerClientThatSetNeedsBeginMainFrameInsideDraw() 800 SchedulerClientThatSetNeedsBeginMainFrameInsideDraw()
801 : set_needs_commit_on_next_draw_(false) {} 801 : set_needs_commit_on_next_draw_(false) {}
802 802
803 DrawResult ScheduledActionDrawAndSwapIfPossible() override { 803 DrawResult ScheduledActionDrawIfPossible() override {
804 // Only SetNeedsBeginMainFrame the first time this is called 804 // Only SetNeedsBeginMainFrame the first time this is called
805 if (set_needs_commit_on_next_draw_) { 805 if (set_needs_commit_on_next_draw_) {
806 scheduler_->SetNeedsBeginMainFrame(); 806 scheduler_->SetNeedsBeginMainFrame();
807 set_needs_commit_on_next_draw_ = false; 807 set_needs_commit_on_next_draw_ = false;
808 } 808 }
809 return FakeSchedulerClient::ScheduledActionDrawAndSwapIfPossible(); 809 return FakeSchedulerClient::ScheduledActionDrawIfPossible();
810 } 810 }
811 811
812 DrawResult ScheduledActionDrawAndSwapForced() override { 812 DrawResult ScheduledActionDrawForced() override {
813 NOTREACHED(); 813 NOTREACHED();
814 return DRAW_SUCCESS; 814 return DRAW_SUCCESS;
815 } 815 }
816 816
817 void SetNeedsBeginMainFrameOnNextDraw() { 817 void SetNeedsBeginMainFrameOnNextDraw() {
818 set_needs_commit_on_next_draw_ = true; 818 set_needs_commit_on_next_draw_ = true;
819 } 819 }
820 820
821 private: 821 private:
822 bool set_needs_commit_on_next_draw_; 822 bool set_needs_commit_on_next_draw_;
823 }; 823 };
824 824
825 // Tests for the scheduler infinite-looping on SetNeedsBeginMainFrame requests 825 // Tests for the scheduler infinite-looping on SetNeedsBeginMainFrame requests
826 // that happen inside a ScheduledActionDrawAndSwap 826 // that happen inside a ScheduledActionDraw
827 TEST_F(SchedulerTest, RequestCommitInsideDraw) { 827 TEST_F(SchedulerTest, RequestCommitInsideDraw) {
828 SchedulerClientThatSetNeedsBeginMainFrameInsideDraw* client = 828 SchedulerClientThatSetNeedsBeginMainFrameInsideDraw* client =
829 new SchedulerClientThatSetNeedsBeginMainFrameInsideDraw; 829 new SchedulerClientThatSetNeedsBeginMainFrameInsideDraw;
830 SetUpScheduler(EXTERNAL_BFS, base::WrapUnique(client)); 830 SetUpScheduler(EXTERNAL_BFS, base::WrapUnique(client));
831 831
832 EXPECT_FALSE(client->needs_begin_frames()); 832 EXPECT_FALSE(client->needs_begin_frames());
833 scheduler_->SetNeedsRedraw(); 833 scheduler_->SetNeedsRedraw();
834 EXPECT_TRUE(scheduler_->RedrawPending()); 834 EXPECT_TRUE(scheduler_->RedrawPending());
835 EXPECT_EQ(0, client->num_draws()); 835 EXPECT_EQ(0, client->num_draws());
836 EXPECT_TRUE(client->needs_begin_frames()); 836 EXPECT_TRUE(client->needs_begin_frames());
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
930 // Fail to draw, this should not start a frame. 930 // Fail to draw, this should not start a frame.
931 client->SetDrawWillHappen(false); 931 client->SetDrawWillHappen(false);
932 client->SetNeedsBeginMainFrameOnNextDraw(); 932 client->SetNeedsBeginMainFrameOnNextDraw();
933 EXPECT_SCOPED(AdvanceFrame()); 933 EXPECT_SCOPED(AdvanceFrame());
934 task_runner().RunPendingTasks(); // Run posted deadline. 934 task_runner().RunPendingTasks(); // Run posted deadline.
935 EXPECT_EQ(2, client->num_draws()); 935 EXPECT_EQ(2, client->num_draws());
936 } 936 }
937 937
938 class SchedulerClientNeedsPrepareTilesInDraw : public FakeSchedulerClient { 938 class SchedulerClientNeedsPrepareTilesInDraw : public FakeSchedulerClient {
939 public: 939 public:
940 DrawResult ScheduledActionDrawAndSwapIfPossible() override { 940 DrawResult ScheduledActionDrawIfPossible() override {
941 scheduler_->SetNeedsPrepareTiles(); 941 scheduler_->SetNeedsPrepareTiles();
942 return FakeSchedulerClient::ScheduledActionDrawAndSwapIfPossible(); 942 return FakeSchedulerClient::ScheduledActionDrawIfPossible();
943 } 943 }
944 }; 944 };
945 945
946 // Test prepare tiles is independant of draws. 946 // Test prepare tiles is independant of draws.
947 TEST_F(SchedulerTest, PrepareTiles) { 947 TEST_F(SchedulerTest, PrepareTiles) {
948 SchedulerClientNeedsPrepareTilesInDraw* client = 948 SchedulerClientNeedsPrepareTilesInDraw* client =
949 new SchedulerClientNeedsPrepareTilesInDraw; 949 new SchedulerClientNeedsPrepareTilesInDraw;
950 SetUpScheduler(EXTERNAL_BFS, base::WrapUnique(client)); 950 SetUpScheduler(EXTERNAL_BFS, base::WrapUnique(client));
951 951
952 // Request both draw and prepare tiles. PrepareTiles shouldn't 952 // Request both draw and prepare tiles. PrepareTiles shouldn't
953 // be trigged until BeginImplFrame. 953 // be trigged until BeginImplFrame.
954 client->Reset(); 954 client->Reset();
955 scheduler_->SetNeedsPrepareTiles(); 955 scheduler_->SetNeedsPrepareTiles();
956 scheduler_->SetNeedsRedraw(); 956 scheduler_->SetNeedsRedraw();
957 EXPECT_TRUE(scheduler_->RedrawPending()); 957 EXPECT_TRUE(scheduler_->RedrawPending());
958 EXPECT_TRUE(scheduler_->PrepareTilesPending()); 958 EXPECT_TRUE(scheduler_->PrepareTilesPending());
959 EXPECT_TRUE(client->needs_begin_frames()); 959 EXPECT_TRUE(client->needs_begin_frames());
960 EXPECT_EQ(0, client->num_draws()); 960 EXPECT_EQ(0, client->num_draws());
961 EXPECT_FALSE(client->HasAction("ScheduledActionPrepareTiles")); 961 EXPECT_FALSE(client->HasAction("ScheduledActionPrepareTiles"));
962 EXPECT_FALSE(client->HasAction("ScheduledActionDrawAndSwapIfPossible")); 962 EXPECT_FALSE(client->HasAction("ScheduledActionDrawIfPossible"));
963 963
964 // We have no immediate actions to perform, so the BeginImplFrame should post 964 // We have no immediate actions to perform, so the BeginImplFrame should post
965 // the deadline task. 965 // the deadline task.
966 client->Reset(); 966 client->Reset();
967 EXPECT_SCOPED(AdvanceFrame()); 967 EXPECT_SCOPED(AdvanceFrame());
968 EXPECT_ACTION("WillBeginImplFrame", client, 0, 1); 968 EXPECT_ACTION("WillBeginImplFrame", client, 0, 1);
969 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 969 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
970 970
971 // On the deadline, the actions should have occured in the right order. 971 // On the deadline, the actions should have occured in the right order.
972 client->Reset(); 972 client->Reset();
973 task_runner().RunPendingTasks(); // Run posted deadline. 973 task_runner().RunPendingTasks(); // Run posted deadline.
974 EXPECT_EQ(1, client->num_draws()); 974 EXPECT_EQ(1, client->num_draws());
975 EXPECT_TRUE(client->HasAction("ScheduledActionDrawAndSwapIfPossible")); 975 EXPECT_TRUE(client->HasAction("ScheduledActionDrawIfPossible"));
976 EXPECT_TRUE(client->HasAction("ScheduledActionPrepareTiles")); 976 EXPECT_TRUE(client->HasAction("ScheduledActionPrepareTiles"));
977 EXPECT_LT(client->ActionIndex("ScheduledActionDrawAndSwapIfPossible"), 977 EXPECT_LT(client->ActionIndex("ScheduledActionDrawIfPossible"),
978 client->ActionIndex("ScheduledActionPrepareTiles")); 978 client->ActionIndex("ScheduledActionPrepareTiles"));
979 EXPECT_FALSE(scheduler_->RedrawPending()); 979 EXPECT_FALSE(scheduler_->RedrawPending());
980 EXPECT_FALSE(scheduler_->PrepareTilesPending()); 980 EXPECT_FALSE(scheduler_->PrepareTilesPending());
981 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 981 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
982 982
983 // Request a draw. We don't need a PrepareTiles yet. 983 // Request a draw. We don't need a PrepareTiles yet.
984 client->Reset(); 984 client->Reset();
985 scheduler_->SetNeedsRedraw(); 985 scheduler_->SetNeedsRedraw();
986 EXPECT_TRUE(scheduler_->RedrawPending()); 986 EXPECT_TRUE(scheduler_->RedrawPending());
987 EXPECT_FALSE(scheduler_->PrepareTilesPending()); 987 EXPECT_FALSE(scheduler_->PrepareTilesPending());
988 EXPECT_TRUE(client->needs_begin_frames()); 988 EXPECT_TRUE(client->needs_begin_frames());
989 EXPECT_EQ(0, client->num_draws()); 989 EXPECT_EQ(0, client->num_draws());
990 990
991 // We have no immediate actions to perform, so the BeginImplFrame should post 991 // We have no immediate actions to perform, so the BeginImplFrame should post
992 // the deadline task. 992 // the deadline task.
993 client->Reset(); 993 client->Reset();
994 EXPECT_SCOPED(AdvanceFrame()); 994 EXPECT_SCOPED(AdvanceFrame());
995 EXPECT_ACTION("WillBeginImplFrame", client, 0, 1); 995 EXPECT_ACTION("WillBeginImplFrame", client, 0, 1);
996 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 996 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
997 997
998 // Draw. The draw will trigger SetNeedsPrepareTiles, and 998 // Draw. The draw will trigger SetNeedsPrepareTiles, and
999 // then the PrepareTiles action will be triggered after the Draw. 999 // then the PrepareTiles action will be triggered after the Draw.
1000 // Afterwards, neither a draw nor PrepareTiles are pending. 1000 // Afterwards, neither a draw nor PrepareTiles are pending.
1001 client->Reset(); 1001 client->Reset();
1002 task_runner().RunPendingTasks(); // Run posted deadline. 1002 task_runner().RunPendingTasks(); // Run posted deadline.
1003 EXPECT_EQ(1, client->num_draws()); 1003 EXPECT_EQ(1, client->num_draws());
1004 EXPECT_TRUE(client->HasAction("ScheduledActionDrawAndSwapIfPossible")); 1004 EXPECT_TRUE(client->HasAction("ScheduledActionDrawIfPossible"));
1005 EXPECT_TRUE(client->HasAction("ScheduledActionPrepareTiles")); 1005 EXPECT_TRUE(client->HasAction("ScheduledActionPrepareTiles"));
1006 EXPECT_LT(client->ActionIndex("ScheduledActionDrawAndSwapIfPossible"), 1006 EXPECT_LT(client->ActionIndex("ScheduledActionDrawIfPossible"),
1007 client->ActionIndex("ScheduledActionPrepareTiles")); 1007 client->ActionIndex("ScheduledActionPrepareTiles"));
1008 EXPECT_FALSE(scheduler_->RedrawPending()); 1008 EXPECT_FALSE(scheduler_->RedrawPending());
1009 EXPECT_FALSE(scheduler_->PrepareTilesPending()); 1009 EXPECT_FALSE(scheduler_->PrepareTilesPending());
1010 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 1010 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
1011 1011
1012 // We need a BeginImplFrame where we don't swap to go idle. 1012 // We need a BeginImplFrame where we don't swap to go idle.
1013 client->Reset(); 1013 client->Reset();
1014 EXPECT_SCOPED(AdvanceFrame()); 1014 EXPECT_SCOPED(AdvanceFrame());
1015 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); 1015 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
1016 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 1016 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
(...skipping 14 matching lines...) Expand all
1031 EXPECT_FALSE(scheduler_->RedrawPending()); 1031 EXPECT_FALSE(scheduler_->RedrawPending());
1032 1032
1033 // BeginImplFrame. There will be no draw, only PrepareTiles. 1033 // BeginImplFrame. There will be no draw, only PrepareTiles.
1034 client->Reset(); 1034 client->Reset();
1035 EXPECT_SCOPED(AdvanceFrame()); 1035 EXPECT_SCOPED(AdvanceFrame());
1036 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); 1036 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
1037 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 1037 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
1038 client->Reset(); 1038 client->Reset();
1039 task_runner().RunPendingTasks(); // Run posted deadline. 1039 task_runner().RunPendingTasks(); // Run posted deadline.
1040 EXPECT_EQ(0, client->num_draws()); 1040 EXPECT_EQ(0, client->num_draws());
1041 EXPECT_FALSE(client->HasAction("ScheduledActionDrawAndSwapIfPossible")); 1041 EXPECT_FALSE(client->HasAction("ScheduledActionDrawIfPossible"));
1042 EXPECT_TRUE(client->HasAction("ScheduledActionPrepareTiles")); 1042 EXPECT_TRUE(client->HasAction("ScheduledActionPrepareTiles"));
1043 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 1043 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
1044 } 1044 }
1045 1045
1046 // Test that PrepareTiles only happens once per frame. If an external caller 1046 // Test that PrepareTiles only happens once per frame. If an external caller
1047 // initiates it, then the state machine should not PrepareTiles on that frame. 1047 // initiates it, then the state machine should not PrepareTiles on that frame.
1048 TEST_F(SchedulerTest, PrepareTilesOncePerFrame) { 1048 TEST_F(SchedulerTest, PrepareTilesOncePerFrame) {
1049 SetUpScheduler(EXTERNAL_BFS); 1049 SetUpScheduler(EXTERNAL_BFS);
1050 1050
1051 // If DidPrepareTiles during a frame, then PrepareTiles should not occur 1051 // If DidPrepareTiles during a frame, then PrepareTiles should not occur
1052 // again. 1052 // again.
1053 scheduler_->SetNeedsPrepareTiles(); 1053 scheduler_->SetNeedsPrepareTiles();
1054 scheduler_->SetNeedsRedraw(); 1054 scheduler_->SetNeedsRedraw();
1055 client_->Reset(); 1055 client_->Reset();
1056 EXPECT_SCOPED(AdvanceFrame()); 1056 EXPECT_SCOPED(AdvanceFrame());
1057 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1); 1057 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1);
1058 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 1058 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
1059 1059
1060 EXPECT_TRUE(scheduler_->PrepareTilesPending()); 1060 EXPECT_TRUE(scheduler_->PrepareTilesPending());
1061 scheduler_->WillPrepareTiles(); 1061 scheduler_->WillPrepareTiles();
1062 scheduler_->DidPrepareTiles(); // An explicit PrepareTiles. 1062 scheduler_->DidPrepareTiles(); // An explicit PrepareTiles.
1063 EXPECT_FALSE(scheduler_->PrepareTilesPending()); 1063 EXPECT_FALSE(scheduler_->PrepareTilesPending());
1064 1064
1065 client_->Reset(); 1065 client_->Reset();
1066 task_runner().RunPendingTasks(); // Run posted deadline. 1066 task_runner().RunPendingTasks(); // Run posted deadline.
1067 EXPECT_EQ(1, client_->num_draws()); 1067 EXPECT_EQ(1, client_->num_draws());
1068 EXPECT_TRUE(client_->HasAction("ScheduledActionDrawAndSwapIfPossible")); 1068 EXPECT_TRUE(client_->HasAction("ScheduledActionDrawIfPossible"));
1069 EXPECT_FALSE(client_->HasAction("ScheduledActionPrepareTiles")); 1069 EXPECT_FALSE(client_->HasAction("ScheduledActionPrepareTiles"));
1070 EXPECT_FALSE(scheduler_->RedrawPending()); 1070 EXPECT_FALSE(scheduler_->RedrawPending());
1071 EXPECT_FALSE(scheduler_->PrepareTilesPending()); 1071 EXPECT_FALSE(scheduler_->PrepareTilesPending());
1072 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 1072 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
1073 1073
1074 // Next frame without DidPrepareTiles should PrepareTiles with draw. 1074 // Next frame without DidPrepareTiles should PrepareTiles with draw.
1075 scheduler_->SetNeedsPrepareTiles(); 1075 scheduler_->SetNeedsPrepareTiles();
1076 scheduler_->SetNeedsRedraw(); 1076 scheduler_->SetNeedsRedraw();
1077 client_->Reset(); 1077 client_->Reset();
1078 EXPECT_SCOPED(AdvanceFrame()); 1078 EXPECT_SCOPED(AdvanceFrame());
1079 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1); 1079 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1);
1080 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 1080 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
1081 1081
1082 client_->Reset(); 1082 client_->Reset();
1083 task_runner().RunPendingTasks(); // Run posted deadline. 1083 task_runner().RunPendingTasks(); // Run posted deadline.
1084 EXPECT_EQ(1, client_->num_draws()); 1084 EXPECT_EQ(1, client_->num_draws());
1085 EXPECT_TRUE(client_->HasAction("ScheduledActionDrawAndSwapIfPossible")); 1085 EXPECT_TRUE(client_->HasAction("ScheduledActionDrawIfPossible"));
1086 EXPECT_TRUE(client_->HasAction("ScheduledActionPrepareTiles")); 1086 EXPECT_TRUE(client_->HasAction("ScheduledActionPrepareTiles"));
1087 EXPECT_LT(client_->ActionIndex("ScheduledActionDrawAndSwapIfPossible"), 1087 EXPECT_LT(client_->ActionIndex("ScheduledActionDrawIfPossible"),
1088 client_->ActionIndex("ScheduledActionPrepareTiles")); 1088 client_->ActionIndex("ScheduledActionPrepareTiles"));
1089 EXPECT_FALSE(scheduler_->RedrawPending()); 1089 EXPECT_FALSE(scheduler_->RedrawPending());
1090 EXPECT_FALSE(scheduler_->PrepareTilesPending()); 1090 EXPECT_FALSE(scheduler_->PrepareTilesPending());
1091 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 1091 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
1092 1092
1093 // If we get another DidPrepareTiles within the same frame, we should 1093 // If we get another DidPrepareTiles within the same frame, we should
1094 // not PrepareTiles on the next frame. 1094 // not PrepareTiles on the next frame.
1095 scheduler_->WillPrepareTiles(); 1095 scheduler_->WillPrepareTiles();
1096 scheduler_->DidPrepareTiles(); // An explicit PrepareTiles. 1096 scheduler_->DidPrepareTiles(); // An explicit PrepareTiles.
1097 scheduler_->SetNeedsPrepareTiles(); 1097 scheduler_->SetNeedsPrepareTiles();
1098 scheduler_->SetNeedsRedraw(); 1098 scheduler_->SetNeedsRedraw();
1099 client_->Reset(); 1099 client_->Reset();
1100 EXPECT_SCOPED(AdvanceFrame()); 1100 EXPECT_SCOPED(AdvanceFrame());
1101 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1); 1101 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1);
1102 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 1102 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
1103 1103
1104 EXPECT_TRUE(scheduler_->PrepareTilesPending()); 1104 EXPECT_TRUE(scheduler_->PrepareTilesPending());
1105 1105
1106 client_->Reset(); 1106 client_->Reset();
1107 task_runner().RunPendingTasks(); // Run posted deadline. 1107 task_runner().RunPendingTasks(); // Run posted deadline.
1108 EXPECT_EQ(1, client_->num_draws()); 1108 EXPECT_EQ(1, client_->num_draws());
1109 EXPECT_TRUE(client_->HasAction("ScheduledActionDrawAndSwapIfPossible")); 1109 EXPECT_TRUE(client_->HasAction("ScheduledActionDrawIfPossible"));
1110 EXPECT_FALSE(client_->HasAction("ScheduledActionPrepareTiles")); 1110 EXPECT_FALSE(client_->HasAction("ScheduledActionPrepareTiles"));
1111 EXPECT_FALSE(scheduler_->RedrawPending()); 1111 EXPECT_FALSE(scheduler_->RedrawPending());
1112 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 1112 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
1113 1113
1114 // If we get another DidPrepareTiles, we should not PrepareTiles on the next 1114 // If we get another DidPrepareTiles, we should not PrepareTiles on the next
1115 // frame. This verifies we don't alternate calling PrepareTiles once and 1115 // frame. This verifies we don't alternate calling PrepareTiles once and
1116 // twice. 1116 // twice.
1117 EXPECT_TRUE(scheduler_->PrepareTilesPending()); 1117 EXPECT_TRUE(scheduler_->PrepareTilesPending());
1118 scheduler_->WillPrepareTiles(); 1118 scheduler_->WillPrepareTiles();
1119 scheduler_->DidPrepareTiles(); // An explicit PrepareTiles. 1119 scheduler_->DidPrepareTiles(); // An explicit PrepareTiles.
1120 EXPECT_FALSE(scheduler_->PrepareTilesPending()); 1120 EXPECT_FALSE(scheduler_->PrepareTilesPending());
1121 scheduler_->SetNeedsPrepareTiles(); 1121 scheduler_->SetNeedsPrepareTiles();
1122 scheduler_->SetNeedsRedraw(); 1122 scheduler_->SetNeedsRedraw();
1123 client_->Reset(); 1123 client_->Reset();
1124 EXPECT_SCOPED(AdvanceFrame()); 1124 EXPECT_SCOPED(AdvanceFrame());
1125 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1); 1125 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1);
1126 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 1126 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
1127 1127
1128 EXPECT_TRUE(scheduler_->PrepareTilesPending()); 1128 EXPECT_TRUE(scheduler_->PrepareTilesPending());
1129 1129
1130 client_->Reset(); 1130 client_->Reset();
1131 task_runner().RunPendingTasks(); // Run posted deadline. 1131 task_runner().RunPendingTasks(); // Run posted deadline.
1132 EXPECT_EQ(1, client_->num_draws()); 1132 EXPECT_EQ(1, client_->num_draws());
1133 EXPECT_TRUE(client_->HasAction("ScheduledActionDrawAndSwapIfPossible")); 1133 EXPECT_TRUE(client_->HasAction("ScheduledActionDrawIfPossible"));
1134 EXPECT_FALSE(client_->HasAction("ScheduledActionPrepareTiles")); 1134 EXPECT_FALSE(client_->HasAction("ScheduledActionPrepareTiles"));
1135 EXPECT_FALSE(scheduler_->RedrawPending()); 1135 EXPECT_FALSE(scheduler_->RedrawPending());
1136 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 1136 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
1137 1137
1138 // Next frame without DidPrepareTiles should PrepareTiles with draw. 1138 // Next frame without DidPrepareTiles should PrepareTiles with draw.
1139 scheduler_->SetNeedsPrepareTiles(); 1139 scheduler_->SetNeedsPrepareTiles();
1140 scheduler_->SetNeedsRedraw(); 1140 scheduler_->SetNeedsRedraw();
1141 client_->Reset(); 1141 client_->Reset();
1142 EXPECT_SCOPED(AdvanceFrame()); 1142 EXPECT_SCOPED(AdvanceFrame());
1143 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1); 1143 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1);
1144 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 1144 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
1145 1145
1146 client_->Reset(); 1146 client_->Reset();
1147 task_runner().RunPendingTasks(); // Run posted deadline. 1147 task_runner().RunPendingTasks(); // Run posted deadline.
1148 EXPECT_EQ(1, client_->num_draws()); 1148 EXPECT_EQ(1, client_->num_draws());
1149 EXPECT_TRUE(client_->HasAction("ScheduledActionDrawAndSwapIfPossible")); 1149 EXPECT_TRUE(client_->HasAction("ScheduledActionDrawIfPossible"));
1150 EXPECT_TRUE(client_->HasAction("ScheduledActionPrepareTiles")); 1150 EXPECT_TRUE(client_->HasAction("ScheduledActionPrepareTiles"));
1151 EXPECT_LT(client_->ActionIndex("ScheduledActionDrawAndSwapIfPossible"), 1151 EXPECT_LT(client_->ActionIndex("ScheduledActionDrawIfPossible"),
1152 client_->ActionIndex("ScheduledActionPrepareTiles")); 1152 client_->ActionIndex("ScheduledActionPrepareTiles"));
1153 EXPECT_FALSE(scheduler_->RedrawPending()); 1153 EXPECT_FALSE(scheduler_->RedrawPending());
1154 EXPECT_FALSE(scheduler_->PrepareTilesPending()); 1154 EXPECT_FALSE(scheduler_->PrepareTilesPending());
1155 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 1155 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
1156 } 1156 }
1157 1157
1158 TEST_F(SchedulerTest, PrepareTilesFunnelResetOnVisibilityChange) { 1158 TEST_F(SchedulerTest, PrepareTilesFunnelResetOnVisibilityChange) {
1159 std::unique_ptr<SchedulerClientNeedsPrepareTilesInDraw> client = 1159 std::unique_ptr<SchedulerClientNeedsPrepareTilesInDraw> client =
1160 base::WrapUnique(new SchedulerClientNeedsPrepareTilesInDraw); 1160 base::WrapUnique(new SchedulerClientNeedsPrepareTilesInDraw);
1161 SetUpScheduler(EXTERNAL_BFS, std::move(client)); 1161 SetUpScheduler(EXTERNAL_BFS, std::move(client));
(...skipping 14 matching lines...) Expand all
1176 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); 1176 EXPECT_SINGLE_ACTION("AddObserver(this)", client_);
1177 1177
1178 client_->Reset(); 1178 client_->Reset();
1179 AdvanceFrame(); 1179 AdvanceFrame();
1180 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1); 1180 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1);
1181 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 1181 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
1182 1182
1183 client_->Reset(); 1183 client_->Reset();
1184 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); 1184 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true));
1185 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 1185 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
1186 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 2); 1186 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 2);
1187 EXPECT_ACTION("ScheduledActionPrepareTiles", client_, 1, 2); 1187 EXPECT_ACTION("ScheduledActionPrepareTiles", client_, 1, 2);
1188 } 1188 }
1189 1189
1190 TEST_F(SchedulerTest, TriggerBeginFrameDeadlineEarly) { 1190 TEST_F(SchedulerTest, TriggerBeginFrameDeadlineEarly) {
1191 SchedulerClientNeedsPrepareTilesInDraw* client = 1191 SchedulerClientNeedsPrepareTilesInDraw* client =
1192 new SchedulerClientNeedsPrepareTilesInDraw; 1192 new SchedulerClientNeedsPrepareTilesInDraw;
1193 SetUpScheduler(EXTERNAL_BFS, base::WrapUnique(client)); 1193 SetUpScheduler(EXTERNAL_BFS, base::WrapUnique(client));
1194 1194
1195 scheduler_->SetNeedsRedraw(); 1195 scheduler_->SetNeedsRedraw();
1196 EXPECT_SCOPED(AdvanceFrame()); 1196 EXPECT_SCOPED(AdvanceFrame());
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1229 client_->Reset(); 1229 client_->Reset();
1230 task_runner().RunPendingTasks(); // Try to run posted deadline. 1230 task_runner().RunPendingTasks(); // Try to run posted deadline.
1231 // There is no posted deadline. 1231 // There is no posted deadline.
1232 EXPECT_NO_ACTION(client_); 1232 EXPECT_NO_ACTION(client_);
1233 1233
1234 // Scheduler received ready to draw signal, and posted deadline. 1234 // Scheduler received ready to draw signal, and posted deadline.
1235 scheduler_->NotifyReadyToDraw(); 1235 scheduler_->NotifyReadyToDraw();
1236 client_->Reset(); 1236 client_->Reset();
1237 task_runner().RunPendingTasks(); // Run posted deadline. 1237 task_runner().RunPendingTasks(); // Run posted deadline.
1238 EXPECT_EQ(1, client_->num_draws()); 1238 EXPECT_EQ(1, client_->num_draws());
1239 EXPECT_TRUE(client_->HasAction("ScheduledActionDrawAndSwapIfPossible")); 1239 EXPECT_TRUE(client_->HasAction("ScheduledActionDrawIfPossible"));
1240 } 1240 }
1241 1241
1242 TEST_F(SchedulerTest, WaitForReadyToDrawCancelledWhenLostCompositorFrameSink) { 1242 TEST_F(SchedulerTest, WaitForReadyToDrawCancelledWhenLostCompositorFrameSink) {
1243 SchedulerClientNeedsPrepareTilesInDraw* client = 1243 SchedulerClientNeedsPrepareTilesInDraw* client =
1244 new SchedulerClientNeedsPrepareTilesInDraw; 1244 new SchedulerClientNeedsPrepareTilesInDraw;
1245 scheduler_settings_.commit_to_active_tree = true; 1245 scheduler_settings_.commit_to_active_tree = true;
1246 SetUpScheduler(EXTERNAL_BFS, base::WrapUnique(client)); 1246 SetUpScheduler(EXTERNAL_BFS, base::WrapUnique(client));
1247 1247
1248 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame. 1248 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame.
1249 scheduler_->SetNeedsBeginMainFrame(); 1249 scheduler_->SetNeedsBeginMainFrame();
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
1489 scheduler_->SetNeedsBeginMainFrame(); 1489 scheduler_->SetNeedsBeginMainFrame();
1490 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1490 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1491 EXPECT_SCOPED(AdvanceFrame()); 1491 EXPECT_SCOPED(AdvanceFrame());
1492 EXPECT_TRUE(client_->HasAction("WillBeginImplFrame")); 1492 EXPECT_TRUE(client_->HasAction("WillBeginImplFrame"));
1493 EXPECT_TRUE(client_->HasAction("ScheduledActionSendBeginMainFrame")); 1493 EXPECT_TRUE(client_->HasAction("ScheduledActionSendBeginMainFrame"));
1494 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1494 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1495 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); 1495 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true));
1496 EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline()); 1496 EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline());
1497 } 1497 }
1498 1498
1499 void SchedulerTest::ImplFrameSkippedAfterLateSwapAck( 1499 void SchedulerTest::ImplFrameSkippedAfterLateAck(
1500 bool swap_ack_before_deadline) { 1500 bool receive_ack_before_deadline) {
1501 // To get into a high latency state, this test disables automatic swap acks. 1501 // To get into a high latency state, this test disables automatic swap acks.
1502 client_->SetAutomaticSwapAck(false); 1502 client_->SetAutomaticSubmitCompositorFrameAck(false);
1503 1503
1504 // Draw and swap for first BeginFrame 1504 // Draw and swap for first BeginFrame
1505 client_->Reset(); 1505 client_->Reset();
1506 scheduler_->SetNeedsBeginMainFrame(); 1506 scheduler_->SetNeedsBeginMainFrame();
1507 scheduler_->SetNeedsRedraw(); 1507 scheduler_->SetNeedsRedraw();
1508 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1508 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1509 SendNextBeginFrame(); 1509 SendNextBeginFrame();
1510 EXPECT_ACTION("AddObserver(this)", client_, 0, 3); 1510 EXPECT_ACTION("AddObserver(this)", client_, 0, 3);
1511 EXPECT_ACTION("WillBeginImplFrame", client_, 1, 3); 1511 EXPECT_ACTION("WillBeginImplFrame", client_, 1, 3);
1512 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 2, 3); 1512 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 2, 3);
1513 1513
1514 client_->Reset(); 1514 client_->Reset();
1515 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); 1515 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks());
1516 scheduler_->NotifyReadyToCommit(); 1516 scheduler_->NotifyReadyToCommit();
1517 scheduler_->NotifyReadyToActivate(); 1517 scheduler_->NotifyReadyToActivate();
1518 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1518 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1519 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); 1519 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true));
1520 EXPECT_ACTION("ScheduledActionCommit", client_, 0, 3); 1520 EXPECT_ACTION("ScheduledActionCommit", client_, 0, 3);
1521 EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 1, 3); 1521 EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 1, 3);
1522 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 2, 3); 1522 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 2, 3);
1523 1523
1524 // Verify we skip every other frame if the swap ack consistently 1524 // Verify we skip every other frame if the swap ack consistently
1525 // comes back late. 1525 // comes back late.
1526 for (int i = 0; i < 10; i++) { 1526 for (int i = 0; i < 10; i++) {
1527 // Not calling scheduler_->DidSwapBuffersComplete() until after next 1527 // Not calling scheduler_->DidReceiveCompositorFrameAck() until after next
1528 // BeginImplFrame puts the impl thread in high latency mode. 1528 // BeginImplFrame puts the impl thread in high latency mode.
1529 client_->Reset(); 1529 client_->Reset();
1530 scheduler_->SetNeedsBeginMainFrame(); 1530 scheduler_->SetNeedsBeginMainFrame();
1531 scheduler_->SetNeedsRedraw(); 1531 scheduler_->SetNeedsRedraw();
1532 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1532 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1533 SendNextBeginFrame(); 1533 SendNextBeginFrame();
1534 // Verify that we skip the BeginImplFrame 1534 // Verify that we skip the BeginImplFrame
1535 EXPECT_NO_ACTION(client_); 1535 EXPECT_NO_ACTION(client_);
1536 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 1536 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
1537 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1537 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1538 1538
1539 // Verify that we do not perform any actions after we are no longer 1539 // Verify that we do not perform any actions after we are no longer
1540 // swap throttled. 1540 // swap throttled.
1541 client_->Reset(); 1541 client_->Reset();
1542 if (swap_ack_before_deadline) { 1542 if (receive_ack_before_deadline) {
1543 // It shouldn't matter if the swap ack comes back before the deadline... 1543 // It shouldn't matter if the swap ack comes back before the deadline...
1544 scheduler_->DidSwapBuffersComplete(); 1544 scheduler_->DidReceiveCompositorFrameAck();
1545 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); 1545 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true));
1546 } else { 1546 } else {
1547 // ... or after the deadline. 1547 // ... or after the deadline.
1548 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); 1548 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true));
1549 scheduler_->DidSwapBuffersComplete(); 1549 scheduler_->DidReceiveCompositorFrameAck();
1550 } 1550 }
1551 EXPECT_NO_ACTION(client_); 1551 EXPECT_NO_ACTION(client_);
1552 1552
1553 // Verify that we start the next BeginImplFrame and continue normally 1553 // Verify that we start the next BeginImplFrame and continue normally
1554 // after having just skipped a BeginImplFrame. 1554 // after having just skipped a BeginImplFrame.
1555 client_->Reset(); 1555 client_->Reset();
1556 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1556 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1557 SendNextBeginFrame(); 1557 SendNextBeginFrame();
1558 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); 1558 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2);
1559 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); 1559 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2);
1560 1560
1561 client_->Reset(); 1561 client_->Reset();
1562 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); 1562 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks());
1563 scheduler_->NotifyReadyToCommit(); 1563 scheduler_->NotifyReadyToCommit();
1564 scheduler_->NotifyReadyToActivate(); 1564 scheduler_->NotifyReadyToActivate();
1565 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); 1565 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true));
1566 EXPECT_ACTION("ScheduledActionCommit", client_, 0, 3); 1566 EXPECT_ACTION("ScheduledActionCommit", client_, 0, 3);
1567 EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 1, 3); 1567 EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 1, 3);
1568 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 2, 3); 1568 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 2, 3);
1569 } 1569 }
1570 } 1570 }
1571 1571
1572 TEST_F(SchedulerTest, 1572 TEST_F(SchedulerTest,
1573 ImplFrameSkippedAfterLateSwapAck_FastEstimates_SwapAckThenDeadline) { 1573 ImplFrameSkippedAfterLateAck_FastEstimates_SubmitAckThenDeadline) {
1574 SetUpScheduler(EXTERNAL_BFS); 1574 SetUpScheduler(EXTERNAL_BFS);
1575 fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); 1575 fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration);
1576 1576
1577 bool swap_ack_before_deadline = true; 1577 bool receive_ack_before_deadline = true;
1578 EXPECT_SCOPED(ImplFrameSkippedAfterLateSwapAck(swap_ack_before_deadline)); 1578 EXPECT_SCOPED(ImplFrameSkippedAfterLateAck(receive_ack_before_deadline));
1579 } 1579 }
1580 1580
1581 TEST_F(SchedulerTest, 1581 TEST_F(SchedulerTest,
1582 ImplFrameSkippedAfterLateSwapAck_FastEstimates_DeadlineThenSwapAck) { 1582 ImplFrameSkippedAfterLateAck_FastEstimates_DeadlineThenSubmitAck) {
1583 SetUpScheduler(EXTERNAL_BFS); 1583 SetUpScheduler(EXTERNAL_BFS);
1584 fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); 1584 fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration);
1585 1585
1586 bool swap_ack_before_deadline = false; 1586 bool receive_ack_before_deadline = false;
1587 EXPECT_SCOPED(ImplFrameSkippedAfterLateSwapAck(swap_ack_before_deadline)); 1587 EXPECT_SCOPED(ImplFrameSkippedAfterLateAck(receive_ack_before_deadline));
1588 } 1588 }
1589 1589
1590 TEST_F(SchedulerTest, 1590 TEST_F(SchedulerTest,
1591 ImplFrameSkippedAfterLateSwapAck_LongMainFrameQueueDurationNotCritical) { 1591 ImplFrameSkippedAfterLateAck_LongMainFrameQueueDurationNotCritical) {
1592 SetUpScheduler(EXTERNAL_BFS); 1592 SetUpScheduler(EXTERNAL_BFS);
1593 fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); 1593 fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration);
1594 fake_compositor_timing_history_ 1594 fake_compositor_timing_history_
1595 ->SetBeginMainFrameQueueDurationNotCriticalEstimate(kSlowDuration); 1595 ->SetBeginMainFrameQueueDurationNotCriticalEstimate(kSlowDuration);
1596 1596
1597 bool swap_ack_before_deadline = false; 1597 bool receive_ack_before_deadline = false;
1598 EXPECT_SCOPED(ImplFrameSkippedAfterLateSwapAck(swap_ack_before_deadline)); 1598 EXPECT_SCOPED(ImplFrameSkippedAfterLateAck(receive_ack_before_deadline));
1599 } 1599 }
1600 1600
1601 TEST_F(SchedulerTest, 1601 TEST_F(SchedulerTest, ImplFrameSkippedAfterLateAck_ImplLatencyTakesPriority) {
1602 ImplFrameSkippedAfterLateSwapAck_ImplLatencyTakesPriority) {
1603 SetUpScheduler(EXTERNAL_BFS); 1602 SetUpScheduler(EXTERNAL_BFS);
1604 1603
1605 // Even if every estimate related to the main thread is slow, we should 1604 // Even if every estimate related to the main thread is slow, we should
1606 // still expect to recover impl thread latency if the draw is fast and we 1605 // still expect to recover impl thread latency if the draw is fast and we
1607 // are in impl latency takes priority. 1606 // are in impl latency takes priority.
1608 scheduler_->SetTreePrioritiesAndScrollState( 1607 scheduler_->SetTreePrioritiesAndScrollState(
1609 SMOOTHNESS_TAKES_PRIORITY, 1608 SMOOTHNESS_TAKES_PRIORITY,
1610 ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER); 1609 ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER);
1611 fake_compositor_timing_history_->SetAllEstimatesTo(kSlowDuration); 1610 fake_compositor_timing_history_->SetAllEstimatesTo(kSlowDuration);
1612 fake_compositor_timing_history_->SetDrawDurationEstimate(kFastDuration); 1611 fake_compositor_timing_history_->SetDrawDurationEstimate(kFastDuration);
1613 1612
1614 bool swap_ack_before_deadline = false; 1613 bool receive_ack_before_deadline = false;
1615 EXPECT_SCOPED(ImplFrameSkippedAfterLateSwapAck(swap_ack_before_deadline)); 1614 EXPECT_SCOPED(ImplFrameSkippedAfterLateAck(receive_ack_before_deadline));
1616 } 1615 }
1617 1616
1618 TEST_F(SchedulerTest, 1617 TEST_F(SchedulerTest,
1619 ImplFrameSkippedAfterLateSwapAck_OnlyImplSideUpdatesExpected) { 1618 ImplFrameSkippedAfterLateAck_OnlyImplSideUpdatesExpected) {
1620 // This tests that we recover impl thread latency when there are no commits. 1619 // This tests that we recover impl thread latency when there are no commits.
1621 SetUpScheduler(EXTERNAL_BFS); 1620 SetUpScheduler(EXTERNAL_BFS);
1622 1621
1623 // To get into a high latency state, this test disables automatic swap acks. 1622 // To get into a high latency state, this test disables automatic swap acks.
1624 client_->SetAutomaticSwapAck(false); 1623 client_->SetAutomaticSubmitCompositorFrameAck(false);
1625 1624
1626 // Even if every estimate related to the main thread is slow, we should 1625 // Even if every estimate related to the main thread is slow, we should
1627 // still expect to recover impl thread latency if there are no commits from 1626 // still expect to recover impl thread latency if there are no commits from
1628 // the main thread. 1627 // the main thread.
1629 fake_compositor_timing_history_->SetAllEstimatesTo(kSlowDuration); 1628 fake_compositor_timing_history_->SetAllEstimatesTo(kSlowDuration);
1630 fake_compositor_timing_history_->SetDrawDurationEstimate(kFastDuration); 1629 fake_compositor_timing_history_->SetDrawDurationEstimate(kFastDuration);
1631 1630
1632 // Draw and swap for first BeginFrame 1631 // Draw and swap for first BeginFrame
1633 client_->Reset(); 1632 client_->Reset();
1634 scheduler_->SetNeedsRedraw(); 1633 scheduler_->SetNeedsRedraw();
1635 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1634 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1636 SendNextBeginFrame(); 1635 SendNextBeginFrame();
1637 EXPECT_ACTION("AddObserver(this)", client_, 0, 2); 1636 EXPECT_ACTION("AddObserver(this)", client_, 0, 2);
1638 EXPECT_ACTION("WillBeginImplFrame", client_, 1, 2); 1637 EXPECT_ACTION("WillBeginImplFrame", client_, 1, 2);
1639 1638
1640 client_->Reset(); 1639 client_->Reset();
1641 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1640 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1642 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); 1641 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true));
1643 EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client_); 1642 EXPECT_SINGLE_ACTION("ScheduledActionDrawIfPossible", client_);
1644 1643
1645 // Verify we skip every other frame if the swap ack consistently 1644 // Verify we skip every other frame if the swap ack consistently
1646 // comes back late. 1645 // comes back late.
1647 for (int i = 0; i < 10; i++) { 1646 for (int i = 0; i < 10; i++) {
1648 // Not calling scheduler_->DidSwapBuffersComplete() until after next 1647 // Not calling scheduler_->DidReceiveCompositorFrameAck() until after next
1649 // BeginImplFrame puts the impl thread in high latency mode. 1648 // BeginImplFrame puts the impl thread in high latency mode.
1650 client_->Reset(); 1649 client_->Reset();
1651 scheduler_->SetNeedsRedraw(); 1650 scheduler_->SetNeedsRedraw();
1652 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1651 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1653 SendNextBeginFrame(); 1652 SendNextBeginFrame();
1654 // Verify that we skip the BeginImplFrame 1653 // Verify that we skip the BeginImplFrame
1655 EXPECT_NO_ACTION(client_); 1654 EXPECT_NO_ACTION(client_);
1656 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 1655 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
1657 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1656 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1658 1657
1659 // Verify that we do not perform any actions after we are no longer 1658 // Verify that we do not perform any actions after we are no longer
1660 // swap throttled. 1659 // swap throttled.
1661 client_->Reset(); 1660 client_->Reset();
1662 scheduler_->DidSwapBuffersComplete(); 1661 scheduler_->DidReceiveCompositorFrameAck();
1663 EXPECT_NO_ACTION(client_); 1662 EXPECT_NO_ACTION(client_);
1664 1663
1665 // Verify that we start the next BeginImplFrame and continue normally 1664 // Verify that we start the next BeginImplFrame and continue normally
1666 // after having just skipped a BeginImplFrame. 1665 // after having just skipped a BeginImplFrame.
1667 client_->Reset(); 1666 client_->Reset();
1668 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1667 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1669 SendNextBeginFrame(); 1668 SendNextBeginFrame();
1670 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1); 1669 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1);
1671 1670
1672 client_->Reset(); 1671 client_->Reset();
1673 // Deadline should be immediate. 1672 // Deadline should be immediate.
1674 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 1673 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
1675 task_runner().RunUntilTime(now_src_->NowTicks()); 1674 task_runner().RunUntilTime(now_src_->NowTicks());
1676 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 1675 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
1677 EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client_); 1676 EXPECT_SINGLE_ACTION("ScheduledActionDrawIfPossible", client_);
1678 } 1677 }
1679 } 1678 }
1680 1679
1681 void SchedulerTest::ImplFrameNotSkippedAfterLateSwapAck() { 1680 void SchedulerTest::ImplFrameNotSkippedAfterLateAck() {
1682 // To get into a high latency state, this test disables automatic swap acks. 1681 // To get into a high latency state, this test disables automatic swap acks.
1683 client_->SetAutomaticSwapAck(false); 1682 client_->SetAutomaticSubmitCompositorFrameAck(false);
1684 1683
1685 // Draw and swap for first BeginFrame 1684 // Draw and swap for first BeginFrame
1686 client_->Reset(); 1685 client_->Reset();
1687 scheduler_->SetNeedsBeginMainFrame(); 1686 scheduler_->SetNeedsBeginMainFrame();
1688 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1687 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1689 SendNextBeginFrame(); 1688 SendNextBeginFrame();
1690 EXPECT_ACTION("AddObserver(this)", client_, 0, 3); 1689 EXPECT_ACTION("AddObserver(this)", client_, 0, 3);
1691 EXPECT_ACTION("WillBeginImplFrame", client_, 1, 3); 1690 EXPECT_ACTION("WillBeginImplFrame", client_, 1, 3);
1692 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 2, 3); 1691 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 2, 3);
1693 1692
1694 client_->Reset(); 1693 client_->Reset();
1695 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); 1694 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks());
1696 scheduler_->NotifyReadyToCommit(); 1695 scheduler_->NotifyReadyToCommit();
1697 scheduler_->NotifyReadyToActivate(); 1696 scheduler_->NotifyReadyToActivate();
1698 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1697 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1699 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); 1698 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true));
1700 EXPECT_ACTION("ScheduledActionCommit", client_, 0, 3); 1699 EXPECT_ACTION("ScheduledActionCommit", client_, 0, 3);
1701 EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 1, 3); 1700 EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 1, 3);
1702 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 2, 3); 1701 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 2, 3);
1703 1702
1704 // Verify impl thread consistently operates in high latency mode 1703 // Verify impl thread consistently operates in high latency mode
1705 // without skipping any frames. 1704 // without skipping any frames.
1706 for (int i = 0; i < 10; i++) { 1705 for (int i = 0; i < 10; i++) {
1707 // Not calling scheduler_->DidSwapBuffersComplete() until after next frame 1706 // Not calling scheduler_->DidReceiveCompositorFrameAck() until after next
1707 // frame
1708 // puts the impl thread in high latency mode. 1708 // puts the impl thread in high latency mode.
1709 client_->Reset(); 1709 client_->Reset();
1710 scheduler_->SetNeedsBeginMainFrame(); 1710 scheduler_->SetNeedsBeginMainFrame();
1711 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1711 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1712 SendNextBeginFrame(); 1712 SendNextBeginFrame();
1713 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_); 1713 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_);
1714 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 1714 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
1715 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1715 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1716 1716
1717 client_->Reset(); 1717 client_->Reset();
1718 scheduler_->DidSwapBuffersComplete(); 1718 scheduler_->DidReceiveCompositorFrameAck();
1719 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); 1719 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks());
1720 scheduler_->NotifyReadyToCommit(); 1720 scheduler_->NotifyReadyToCommit();
1721 scheduler_->NotifyReadyToActivate(); 1721 scheduler_->NotifyReadyToActivate();
1722 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); 1722 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true));
1723 1723
1724 // Verify that we don't skip the actions of the BeginImplFrame 1724 // Verify that we don't skip the actions of the BeginImplFrame
1725 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 0, 4); 1725 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 0, 4);
1726 EXPECT_ACTION("ScheduledActionCommit", client_, 1, 4); 1726 EXPECT_ACTION("ScheduledActionCommit", client_, 1, 4);
1727 EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 2, 4); 1727 EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 2, 4);
1728 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 3, 4); 1728 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 3, 4);
1729 } 1729 }
1730 } 1730 }
1731 1731
1732 TEST_F( 1732 TEST_F(SchedulerTest,
1733 SchedulerTest, 1733 ImplFrameNotSkippedAfterLateAck_MainFrameQueueDurationCriticalTooLong) {
1734 ImplFrameNotSkippedAfterLateSwapAck_MainFrameQueueDurationCriticalTooLong) {
1735 SetUpScheduler(EXTERNAL_BFS); 1734 SetUpScheduler(EXTERNAL_BFS);
1736 fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); 1735 fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration);
1737 fake_compositor_timing_history_ 1736 fake_compositor_timing_history_
1738 ->SetBeginMainFrameQueueDurationCriticalEstimate(kSlowDuration); 1737 ->SetBeginMainFrameQueueDurationCriticalEstimate(kSlowDuration);
1739 fake_compositor_timing_history_ 1738 fake_compositor_timing_history_
1740 ->SetBeginMainFrameQueueDurationNotCriticalEstimate(kSlowDuration); 1739 ->SetBeginMainFrameQueueDurationNotCriticalEstimate(kSlowDuration);
1741 EXPECT_SCOPED(ImplFrameNotSkippedAfterLateSwapAck()); 1740 EXPECT_SCOPED(ImplFrameNotSkippedAfterLateAck());
1742 } 1741 }
1743 1742
1744 TEST_F(SchedulerTest, 1743 TEST_F(SchedulerTest, ImplFrameNotSkippedAfterLateAck_CommitEstimateTooLong) {
1745 ImplFrameNotSkippedAfterLateSwapAck_CommitEstimateTooLong) {
1746 SetUpScheduler(EXTERNAL_BFS); 1744 SetUpScheduler(EXTERNAL_BFS);
1747 fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); 1745 fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration);
1748 fake_compositor_timing_history_ 1746 fake_compositor_timing_history_
1749 ->SetBeginMainFrameStartToCommitDurationEstimate(kSlowDuration); 1747 ->SetBeginMainFrameStartToCommitDurationEstimate(kSlowDuration);
1750 EXPECT_SCOPED(ImplFrameNotSkippedAfterLateSwapAck()); 1748 EXPECT_SCOPED(ImplFrameNotSkippedAfterLateAck());
1751 } 1749 }
1752 1750
1753 TEST_F(SchedulerTest, 1751 TEST_F(SchedulerTest,
1754 ImplFrameNotSkippedAfterLateSwapAck_ReadyToActivateEstimateTooLong) { 1752 ImplFrameNotSkippedAfterLateAck_ReadyToActivateEstimateTooLong) {
1755 SetUpScheduler(EXTERNAL_BFS); 1753 SetUpScheduler(EXTERNAL_BFS);
1756 fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); 1754 fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration);
1757 fake_compositor_timing_history_->SetCommitToReadyToActivateDurationEstimate( 1755 fake_compositor_timing_history_->SetCommitToReadyToActivateDurationEstimate(
1758 kSlowDuration); 1756 kSlowDuration);
1759 EXPECT_SCOPED(ImplFrameNotSkippedAfterLateSwapAck()); 1757 EXPECT_SCOPED(ImplFrameNotSkippedAfterLateAck());
1760 } 1758 }
1761 1759
1762 TEST_F(SchedulerTest, 1760 TEST_F(SchedulerTest, ImplFrameNotSkippedAfterLateAck_ActivateEstimateTooLong) {
1763 ImplFrameNotSkippedAfterLateSwapAck_ActivateEstimateTooLong) {
1764 SetUpScheduler(EXTERNAL_BFS); 1761 SetUpScheduler(EXTERNAL_BFS);
1765 fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); 1762 fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration);
1766 fake_compositor_timing_history_->SetActivateDurationEstimate(kSlowDuration); 1763 fake_compositor_timing_history_->SetActivateDurationEstimate(kSlowDuration);
1767 EXPECT_SCOPED(ImplFrameNotSkippedAfterLateSwapAck()); 1764 EXPECT_SCOPED(ImplFrameNotSkippedAfterLateAck());
1768 } 1765 }
1769 1766
1770 TEST_F(SchedulerTest, ImplFrameNotSkippedAfterLateSwapAck_DrawEstimateTooLong) { 1767 TEST_F(SchedulerTest, ImplFrameNotSkippedAfterLateAck_DrawEstimateTooLong) {
1771 SetUpScheduler(EXTERNAL_BFS); 1768 SetUpScheduler(EXTERNAL_BFS);
1772 fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); 1769 fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration);
1773 fake_compositor_timing_history_->SetDrawDurationEstimate(kSlowDuration); 1770 fake_compositor_timing_history_->SetDrawDurationEstimate(kSlowDuration);
1774 EXPECT_SCOPED(ImplFrameNotSkippedAfterLateSwapAck()); 1771 EXPECT_SCOPED(ImplFrameNotSkippedAfterLateAck());
1775 } 1772 }
1776 1773
1777 TEST_F(SchedulerTest, 1774 TEST_F(SchedulerTest, MainFrameThenImplFrameSkippedAfterLateCommitAndLateAck) {
1778 MainFrameThenImplFrameSkippedAfterLateCommitAndLateSwapAck) {
1779 // Set up client with custom estimates. 1775 // Set up client with custom estimates.
1780 // This test starts off with expensive estimates to prevent latency recovery 1776 // This test starts off with expensive estimates to prevent latency recovery
1781 // initially, then lowers the estimates to enable it once both the main 1777 // initially, then lowers the estimates to enable it once both the main
1782 // and impl threads are in a high latency mode. 1778 // and impl threads are in a high latency mode.
1783 SetUpScheduler(EXTERNAL_BFS); 1779 SetUpScheduler(EXTERNAL_BFS);
1784 fake_compositor_timing_history_->SetAllEstimatesTo(kSlowDuration); 1780 fake_compositor_timing_history_->SetAllEstimatesTo(kSlowDuration);
1785 1781
1786 // To get into a high latency state, this test disables automatic swap acks. 1782 // To get into a high latency state, this test disables automatic swap acks.
1787 client_->SetAutomaticSwapAck(false); 1783 client_->SetAutomaticSubmitCompositorFrameAck(false);
1788 1784
1789 // Impl thread hits deadline before commit finishes to make 1785 // Impl thread hits deadline before commit finishes to make
1790 // MainThreadMissedLastDeadline true 1786 // MainThreadMissedLastDeadline true
1791 client_->Reset(); 1787 client_->Reset();
1792 scheduler_->SetNeedsBeginMainFrame(); 1788 scheduler_->SetNeedsBeginMainFrame();
1793 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1789 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1794 EXPECT_SCOPED(AdvanceFrame()); 1790 EXPECT_SCOPED(AdvanceFrame());
1795 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1791 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1796 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); 1792 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true));
1797 EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline()); 1793 EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline());
(...skipping 14 matching lines...) Expand all
1812 EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline()); 1808 EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline());
1813 EXPECT_SCOPED(AdvanceFrame()); 1809 EXPECT_SCOPED(AdvanceFrame());
1814 EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline()); 1810 EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline());
1815 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); 1811 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true));
1816 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); 1812 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks());
1817 scheduler_->NotifyReadyToCommit(); 1813 scheduler_->NotifyReadyToCommit();
1818 scheduler_->NotifyReadyToActivate(); 1814 scheduler_->NotifyReadyToActivate();
1819 1815
1820 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 5); 1816 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 5);
1821 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 5); 1817 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 5);
1822 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 2, 5); 1818 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 2, 5);
1823 EXPECT_ACTION("ScheduledActionCommit", client_, 3, 5); 1819 EXPECT_ACTION("ScheduledActionCommit", client_, 3, 5);
1824 EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 4, 5); 1820 EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 4, 5);
1825 1821
1826 // Don't call scheduler_->DidSwapBuffersComplete() until after next frame 1822 // Don't call scheduler_->DidReceiveCompositorFrameAck() until after next
1823 // frame
1827 // to put the impl thread in a high latency mode. 1824 // to put the impl thread in a high latency mode.
1828 client_->Reset(); 1825 client_->Reset();
1829 scheduler_->SetNeedsBeginMainFrame(); 1826 scheduler_->SetNeedsBeginMainFrame();
1830 EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline()); 1827 EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline());
1831 EXPECT_SCOPED(AdvanceFrame()); 1828 EXPECT_SCOPED(AdvanceFrame());
1832 EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline()); 1829 EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline());
1833 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); 1830 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true));
1834 1831
1835 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1); 1832 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1);
1836 // Note: BeginMainFrame and swap are skipped here because of 1833 // Note: BeginMainFrame and swap are skipped here because of
1837 // swap ack backpressure, not because of latency recovery. 1834 // swap ack backpressure, not because of latency recovery.
1838 EXPECT_FALSE(client_->HasAction("ScheduledActionSendBeginMainFrame")); 1835 EXPECT_FALSE(client_->HasAction("ScheduledActionSendBeginMainFrame"));
1839 EXPECT_FALSE(client_->HasAction("ScheduledActionDrawAndSwapIfPossible")); 1836 EXPECT_FALSE(client_->HasAction("ScheduledActionDrawIfPossible"));
1840 EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline()); 1837 EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline());
1841 1838
1842 // Lower estimates so that the scheduler will attempt latency recovery. 1839 // Lower estimates so that the scheduler will attempt latency recovery.
1843 fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); 1840 fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration);
1844 1841
1845 // Now that both threads are in a high latency mode, make sure we 1842 // Now that both threads are in a high latency mode, make sure we
1846 // skip the BeginMainFrame, then the BeginImplFrame, but not both 1843 // skip the BeginMainFrame, then the BeginImplFrame, but not both
1847 // at the same time. 1844 // at the same time.
1848 1845
1849 // Verify we skip BeginMainFrame first. 1846 // Verify we skip BeginMainFrame first.
1850 client_->Reset(); 1847 client_->Reset();
1851 // Previous commit request is still outstanding. 1848 // Previous commit request is still outstanding.
1852 EXPECT_TRUE(scheduler_->NeedsBeginMainFrame()); 1849 EXPECT_TRUE(scheduler_->NeedsBeginMainFrame());
1853 EXPECT_TRUE(scheduler_->SwapThrottled()); 1850 EXPECT_TRUE(scheduler_->IsDrawThrottled());
1854 SendNextBeginFrame(); 1851 SendNextBeginFrame();
1855 EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline()); 1852 EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline());
1856 scheduler_->DidSwapBuffersComplete(); 1853 scheduler_->DidReceiveCompositorFrameAck();
1857 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); 1854 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true));
1858 1855
1859 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1856 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1860 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); 1857 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2);
1861 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 1, 2); 1858 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 1, 2);
1862 1859
1863 // Verify we skip the BeginImplFrame second. 1860 // Verify we skip the BeginImplFrame second.
1864 client_->Reset(); 1861 client_->Reset();
1865 // Previous commit request is still outstanding. 1862 // Previous commit request is still outstanding.
1866 EXPECT_TRUE(scheduler_->NeedsBeginMainFrame()); 1863 EXPECT_TRUE(scheduler_->NeedsBeginMainFrame());
1867 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1864 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1868 SendNextBeginFrame(); 1865 SendNextBeginFrame();
1869 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); 1866 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true));
1870 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1867 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1871 scheduler_->DidSwapBuffersComplete(); 1868 scheduler_->DidReceiveCompositorFrameAck();
1872 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1869 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1873 1870
1874 EXPECT_NO_ACTION(client_); 1871 EXPECT_NO_ACTION(client_);
1875 1872
1876 // Then verify we operate in a low latency mode. 1873 // Then verify we operate in a low latency mode.
1877 client_->Reset(); 1874 client_->Reset();
1878 // Previous commit request is still outstanding. 1875 // Previous commit request is still outstanding.
1879 EXPECT_TRUE(scheduler_->NeedsBeginMainFrame()); 1876 EXPECT_TRUE(scheduler_->NeedsBeginMainFrame());
1880 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1877 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1881 SendNextBeginFrame(); 1878 SendNextBeginFrame();
1882 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1879 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1883 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); 1880 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks());
1884 scheduler_->NotifyReadyToCommit(); 1881 scheduler_->NotifyReadyToCommit();
1885 scheduler_->NotifyReadyToActivate(); 1882 scheduler_->NotifyReadyToActivate();
1886 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); 1883 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true));
1887 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1884 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1888 scheduler_->DidSwapBuffersComplete(); 1885 scheduler_->DidReceiveCompositorFrameAck();
1889 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1886 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1890 1887
1891 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 5); 1888 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 5);
1892 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 5); 1889 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 5);
1893 EXPECT_ACTION("ScheduledActionCommit", client_, 2, 5); 1890 EXPECT_ACTION("ScheduledActionCommit", client_, 2, 5);
1894 EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 3, 5); 1891 EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 3, 5);
1895 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 4, 5); 1892 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 4, 5);
1896 } 1893 }
1897 1894
1898 TEST_F( 1895 TEST_F(
1899 SchedulerTest, 1896 SchedulerTest,
1900 Deadlock_CommitMakesProgressWhileSwapTrottledAndActiveTreeNeedsFirstDraw) { 1897 Deadlock_CommitMakesProgressWhileSwapTrottledAndActiveTreeNeedsFirstDraw) {
1901 // NPAPI plugins on Windows block the Browser UI thread on the Renderer main 1898 // NPAPI plugins on Windows block the Browser UI thread on the Renderer main
1902 // thread. This prevents the scheduler from receiving any pending swap acks. 1899 // thread. This prevents the scheduler from receiving any pending swap acks.
1903 1900
1904 scheduler_settings_.main_frame_while_swap_throttled_enabled = true; 1901 scheduler_settings_.main_frame_while_submit_frame_throttled_enabled = true;
1905 SetUpScheduler(EXTERNAL_BFS); 1902 SetUpScheduler(EXTERNAL_BFS);
1906 1903
1907 // Disables automatic swap acks so this test can force swap ack throttling 1904 // Disables automatic swap acks so this test can force swap ack throttling
1908 // to simulate a blocked Browser ui thread. 1905 // to simulate a blocked Browser ui thread.
1909 client_->SetAutomaticSwapAck(false); 1906 client_->SetAutomaticSubmitCompositorFrameAck(false);
1910 1907
1911 // Get a new active tree in main-thread high latency mode and put us 1908 // Get a new active tree in main-thread high latency mode and put us
1912 // in a swap throttled state. 1909 // in a swap throttled state.
1913 client_->Reset(); 1910 client_->Reset();
1914 EXPECT_FALSE(scheduler_->CommitPending()); 1911 EXPECT_FALSE(scheduler_->CommitPending());
1915 scheduler_->SetNeedsBeginMainFrame(); 1912 scheduler_->SetNeedsBeginMainFrame();
1916 scheduler_->SetNeedsRedraw(); 1913 scheduler_->SetNeedsRedraw();
1917 EXPECT_SCOPED(AdvanceFrame()); 1914 EXPECT_SCOPED(AdvanceFrame());
1918 EXPECT_TRUE(scheduler_->CommitPending()); 1915 EXPECT_TRUE(scheduler_->CommitPending());
1919 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 1916 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
1920 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); 1917 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true));
1921 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 1918 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
1922 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); 1919 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks());
1923 scheduler_->NotifyReadyToCommit(); 1920 scheduler_->NotifyReadyToCommit();
1924 scheduler_->NotifyReadyToActivate(); 1921 scheduler_->NotifyReadyToActivate();
1925 EXPECT_FALSE(scheduler_->CommitPending()); 1922 EXPECT_FALSE(scheduler_->CommitPending());
1926 EXPECT_ACTION("AddObserver(this)", client_, 0, 6); 1923 EXPECT_ACTION("AddObserver(this)", client_, 0, 6);
1927 EXPECT_ACTION("WillBeginImplFrame", client_, 1, 6); 1924 EXPECT_ACTION("WillBeginImplFrame", client_, 1, 6);
1928 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 2, 6); 1925 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 2, 6);
1929 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 3, 6); 1926 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 3, 6);
1930 EXPECT_ACTION("ScheduledActionCommit", client_, 4, 6); 1927 EXPECT_ACTION("ScheduledActionCommit", client_, 4, 6);
1931 EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 5, 6); 1928 EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 5, 6);
1932 1929
1933 // Make sure that we can finish the next commit even while swap throttled. 1930 // Make sure that we can finish the next commit even while swap throttled.
1934 client_->Reset(); 1931 client_->Reset();
1935 EXPECT_FALSE(scheduler_->CommitPending()); 1932 EXPECT_FALSE(scheduler_->CommitPending());
1936 scheduler_->SetNeedsBeginMainFrame(); 1933 scheduler_->SetNeedsBeginMainFrame();
1937 EXPECT_SCOPED(AdvanceFrame()); 1934 EXPECT_SCOPED(AdvanceFrame());
1938 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); 1935 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks());
1939 scheduler_->NotifyReadyToCommit(); 1936 scheduler_->NotifyReadyToCommit();
(...skipping 17 matching lines...) Expand all
1957 } 1954 }
1958 1955
1959 TEST_F( 1956 TEST_F(
1960 SchedulerTest, 1957 SchedulerTest,
1961 CommitMakesProgressWhenIdleAndHasPendingTreeAndActiveTreeNeedsFirstDraw) { 1958 CommitMakesProgressWhenIdleAndHasPendingTreeAndActiveTreeNeedsFirstDraw) {
1962 // This verifies we don't block commits longer than we need to 1959 // This verifies we don't block commits longer than we need to
1963 // for performance reasons - not deadlock reasons. 1960 // for performance reasons - not deadlock reasons.
1964 1961
1965 // Since we are simulating a long commit, set up a client with draw duration 1962 // Since we are simulating a long commit, set up a client with draw duration
1966 // estimates that prevent skipping main frames to get to low latency mode. 1963 // estimates that prevent skipping main frames to get to low latency mode.
1967 scheduler_settings_.main_frame_while_swap_throttled_enabled = true; 1964 scheduler_settings_.main_frame_while_submit_frame_throttled_enabled = true;
1968 scheduler_settings_.main_frame_before_activation_enabled = true; 1965 scheduler_settings_.main_frame_before_activation_enabled = true;
1969 SetUpScheduler(EXTERNAL_BFS); 1966 SetUpScheduler(EXTERNAL_BFS);
1970 1967
1971 // Disables automatic swap acks so this test can force swap ack throttling 1968 // Disables automatic swap acks so this test can force swap ack throttling
1972 // to simulate a blocked Browser ui thread. 1969 // to simulate a blocked Browser ui thread.
1973 client_->SetAutomaticSwapAck(false); 1970 client_->SetAutomaticSubmitCompositorFrameAck(false);
1974 1971
1975 // Start a new commit in main-thread high latency mode and hold off on 1972 // Start a new commit in main-thread high latency mode and hold off on
1976 // activation. 1973 // activation.
1977 client_->Reset(); 1974 client_->Reset();
1978 EXPECT_FALSE(scheduler_->CommitPending()); 1975 EXPECT_FALSE(scheduler_->CommitPending());
1979 scheduler_->SetNeedsBeginMainFrame(); 1976 scheduler_->SetNeedsBeginMainFrame();
1980 scheduler_->SetNeedsRedraw(); 1977 scheduler_->SetNeedsRedraw();
1981 EXPECT_SCOPED(AdvanceFrame()); 1978 EXPECT_SCOPED(AdvanceFrame());
1982 EXPECT_TRUE(scheduler_->CommitPending()); 1979 EXPECT_TRUE(scheduler_->CommitPending());
1983 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 1980 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
1984 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); 1981 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true));
1985 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 1982 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
1986 scheduler_->DidSwapBuffersComplete(); 1983 scheduler_->DidReceiveCompositorFrameAck();
1987 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); 1984 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks());
1988 scheduler_->NotifyReadyToCommit(); 1985 scheduler_->NotifyReadyToCommit();
1989 EXPECT_FALSE(scheduler_->CommitPending()); 1986 EXPECT_FALSE(scheduler_->CommitPending());
1990 EXPECT_ACTION("AddObserver(this)", client_, 0, 5); 1987 EXPECT_ACTION("AddObserver(this)", client_, 0, 5);
1991 EXPECT_ACTION("WillBeginImplFrame", client_, 1, 5); 1988 EXPECT_ACTION("WillBeginImplFrame", client_, 1, 5);
1992 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 2, 5); 1989 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 2, 5);
1993 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 3, 5); 1990 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 3, 5);
1994 EXPECT_ACTION("ScheduledActionCommit", client_, 4, 5); 1991 EXPECT_ACTION("ScheduledActionCommit", client_, 4, 5);
1995 1992
1996 // Start another commit while we still have an active tree. 1993 // Start another commit while we still have an active tree.
1997 client_->Reset(); 1994 client_->Reset();
1998 EXPECT_FALSE(scheduler_->CommitPending()); 1995 EXPECT_FALSE(scheduler_->CommitPending());
1999 scheduler_->SetNeedsBeginMainFrame(); 1996 scheduler_->SetNeedsBeginMainFrame();
2000 scheduler_->SetNeedsRedraw(); 1997 scheduler_->SetNeedsRedraw();
2001 EXPECT_SCOPED(AdvanceFrame()); 1998 EXPECT_SCOPED(AdvanceFrame());
2002 EXPECT_TRUE(scheduler_->CommitPending()); 1999 EXPECT_TRUE(scheduler_->CommitPending());
2003 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 2000 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
2004 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); 2001 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true));
2005 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 2002 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
2006 scheduler_->DidSwapBuffersComplete(); 2003 scheduler_->DidReceiveCompositorFrameAck();
2007 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); 2004 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks());
2008 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 3); 2005 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 3);
2009 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 3); 2006 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 3);
2010 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 2, 3); 2007 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 2, 3);
2011 2008
2012 // Can't commit yet because there's still a pending tree. 2009 // Can't commit yet because there's still a pending tree.
2013 client_->Reset(); 2010 client_->Reset();
2014 scheduler_->NotifyReadyToCommit(); 2011 scheduler_->NotifyReadyToCommit();
2015 EXPECT_NO_ACTION(client_); 2012 EXPECT_NO_ACTION(client_);
2016 2013
2017 // Activate the pending tree, which also unblocks the commit immediately 2014 // Activate the pending tree, which also unblocks the commit immediately
2018 // while we are in an idle state. 2015 // while we are in an idle state.
2019 client_->Reset(); 2016 client_->Reset();
2020 scheduler_->NotifyReadyToActivate(); 2017 scheduler_->NotifyReadyToActivate();
(...skipping 30 matching lines...) Expand all
2051 client_->Reset(); 2048 client_->Reset();
2052 2049
2053 // NotifyReadyToActivate should trigger the activation. 2050 // NotifyReadyToActivate should trigger the activation.
2054 scheduler_->NotifyReadyToActivate(); 2051 scheduler_->NotifyReadyToActivate();
2055 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_); 2052 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_);
2056 client_->Reset(); 2053 client_->Reset();
2057 2054
2058 // BeginImplFrame deadline should draw. The following BeginImplFrame deadline 2055 // BeginImplFrame deadline should draw. The following BeginImplFrame deadline
2059 // should SetNeedsBeginFrame(false) to avoid excessive toggles. 2056 // should SetNeedsBeginFrame(false) to avoid excessive toggles.
2060 EXPECT_SCOPED(AdvanceFrame()); 2057 EXPECT_SCOPED(AdvanceFrame());
2061 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 2); 2058 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 2);
2062 EXPECT_ACTION("WillBeginImplFrame", client_, 1, 2); 2059 EXPECT_ACTION("WillBeginImplFrame", client_, 1, 2);
2063 client_->Reset(); 2060 client_->Reset();
2064 2061
2065 // Make sure SetNeedsBeginFrame isn't called on the client 2062 // Make sure SetNeedsBeginFrame isn't called on the client
2066 // when the BeginFrame is no longer needed. 2063 // when the BeginFrame is no longer needed.
2067 task_runner().RunPendingTasks(); // Run posted deadline. 2064 task_runner().RunPendingTasks(); // Run posted deadline.
2068 EXPECT_SINGLE_ACTION("SendBeginMainFrameNotExpectedSoon", client_); 2065 EXPECT_SINGLE_ACTION("SendBeginMainFrameNotExpectedSoon", client_);
2069 client_->Reset(); 2066 client_->Reset();
2070 } 2067 }
2071 2068
2072 TEST_F(SchedulerTest, SyntheticBeginFrames) { 2069 TEST_F(SchedulerTest, SyntheticBeginFrames) {
2073 BeginFramesNotFromClient(THROTTLED_BFS); 2070 BeginFramesNotFromClient(THROTTLED_BFS);
2074 } 2071 }
2075 2072
2076 TEST_F(SchedulerTest, UnthrottledBeginFrames) { 2073 TEST_F(SchedulerTest, UnthrottledBeginFrames) {
2077 BeginFramesNotFromClient(UNTHROTTLED_BFS); 2074 BeginFramesNotFromClient(UNTHROTTLED_BFS);
2078 } 2075 }
2079 2076
2080 void SchedulerTest::BeginFramesNotFromClient_SwapThrottled( 2077 void SchedulerTest::BeginFramesNotFromClient_IsDrawThrottled(
2081 BeginFrameSourceType bfs_type) { 2078 BeginFrameSourceType bfs_type) {
2082 SetUpScheduler(bfs_type); 2079 SetUpScheduler(bfs_type);
2083 2080
2084 // Set the draw duration estimate to zero so that deadlines are accurate. 2081 // Set the draw duration estimate to zero so that deadlines are accurate.
2085 fake_compositor_timing_history_->SetDrawDurationEstimate(base::TimeDelta()); 2082 fake_compositor_timing_history_->SetDrawDurationEstimate(base::TimeDelta());
2086 2083
2087 // To test swap ack throttling, this test disables automatic swap acks. 2084 // To test swap ack throttling, this test disables automatic swap acks.
2088 client_->SetAutomaticSwapAck(false); 2085 client_->SetAutomaticSubmitCompositorFrameAck(false);
2089 2086
2090 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame. 2087 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame.
2091 client_->Reset(); 2088 client_->Reset();
2092 scheduler_->SetNeedsBeginMainFrame(); 2089 scheduler_->SetNeedsBeginMainFrame();
2093 EXPECT_NO_ACTION(client_); 2090 EXPECT_NO_ACTION(client_);
2094 client_->Reset(); 2091 client_->Reset();
2095 2092
2096 // Trigger the first BeginImplFrame and BeginMainFrame 2093 // Trigger the first BeginImplFrame and BeginMainFrame
2097 EXPECT_SCOPED(AdvanceFrame()); 2094 EXPECT_SCOPED(AdvanceFrame());
2098 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); 2095 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2);
2099 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); 2096 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2);
2100 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 2097 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
2101 client_->Reset(); 2098 client_->Reset();
2102 2099
2103 // NotifyReadyToCommit should trigger the pending commit. 2100 // NotifyReadyToCommit should trigger the pending commit.
2104 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); 2101 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks());
2105 scheduler_->NotifyReadyToCommit(); 2102 scheduler_->NotifyReadyToCommit();
2106 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); 2103 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_);
2107 client_->Reset(); 2104 client_->Reset();
2108 2105
2109 // NotifyReadyToActivate should trigger the activation and draw. 2106 // NotifyReadyToActivate should trigger the activation and draw.
2110 scheduler_->NotifyReadyToActivate(); 2107 scheduler_->NotifyReadyToActivate();
2111 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_); 2108 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_);
2112 client_->Reset(); 2109 client_->Reset();
2113 2110
2114 // Swapping will put us into a swap throttled state. 2111 // Swapping will put us into a swap throttled state.
2115 // Run posted deadline. 2112 // Run posted deadline.
2116 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); 2113 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true));
2117 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); 2114 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 1);
2118 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 2115 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
2119 client_->Reset(); 2116 client_->Reset();
2120 2117
2121 // While swap throttled, BeginFrames should trigger BeginImplFrames, 2118 // While swap throttled, BeginFrames should trigger BeginImplFrames,
2122 // but not a BeginMainFrame or draw. 2119 // but not a BeginMainFrame or draw.
2123 scheduler_->SetNeedsBeginMainFrame(); 2120 scheduler_->SetNeedsBeginMainFrame();
2124 scheduler_->SetNeedsRedraw(); 2121 scheduler_->SetNeedsRedraw();
2125 EXPECT_SCOPED(AdvanceFrame()); // Run posted BeginFrame. 2122 EXPECT_SCOPED(AdvanceFrame()); // Run posted BeginFrame.
2126 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1); 2123 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1);
2127 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 2124 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
(...skipping 12 matching lines...) Expand all
2140 before_deadline + BeginFrameArgs::DefaultInterval()); 2137 before_deadline + BeginFrameArgs::DefaultInterval());
2141 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 2138 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
2142 client_->Reset(); 2139 client_->Reset();
2143 2140
2144 EXPECT_SCOPED(AdvanceFrame()); // Run posted BeginFrame. 2141 EXPECT_SCOPED(AdvanceFrame()); // Run posted BeginFrame.
2145 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1); 2142 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1);
2146 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 2143 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
2147 client_->Reset(); 2144 client_->Reset();
2148 2145
2149 // Take us out of a swap throttled state. 2146 // Take us out of a swap throttled state.
2150 scheduler_->DidSwapBuffersComplete(); 2147 scheduler_->DidReceiveCompositorFrameAck();
2151 EXPECT_SINGLE_ACTION("ScheduledActionSendBeginMainFrame", client_); 2148 EXPECT_SINGLE_ACTION("ScheduledActionSendBeginMainFrame", client_);
2152 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 2149 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
2153 client_->Reset(); 2150 client_->Reset();
2154 2151
2155 // The deadline is set to the regular deadline. 2152 // The deadline is set to the regular deadline.
2156 before_deadline = now_src()->NowTicks(); 2153 before_deadline = now_src()->NowTicks();
2157 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); 2154 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true));
2158 after_deadline = now_src()->NowTicks(); 2155 after_deadline = now_src()->NowTicks();
2159 // We can't do an equality comparison here because the scheduler uses a fudge 2156 // We can't do an equality comparison here because the scheduler uses a fudge
2160 // factor that's an internal implementation detail. 2157 // factor that's an internal implementation detail.
2161 EXPECT_GT(after_deadline, before_deadline); 2158 EXPECT_GT(after_deadline, before_deadline);
2162 EXPECT_LT(after_deadline, 2159 EXPECT_LT(after_deadline,
2163 before_deadline + BeginFrameArgs::DefaultInterval()); 2160 before_deadline + BeginFrameArgs::DefaultInterval());
2164 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 2161 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
2165 client_->Reset(); 2162 client_->Reset();
2166 } 2163 }
2167 2164
2168 TEST_F(SchedulerTest, SyntheticBeginFrames_SwapThrottled) { 2165 TEST_F(SchedulerTest, SyntheticBeginFrames_IsDrawThrottled) {
2169 BeginFramesNotFromClient_SwapThrottled(THROTTLED_BFS); 2166 BeginFramesNotFromClient_IsDrawThrottled(THROTTLED_BFS);
2170 } 2167 }
2171 2168
2172 TEST_F(SchedulerTest, UnthrottledBeginFrames_SwapThrottled) { 2169 TEST_F(SchedulerTest, UnthrottledBeginFrames_IsDrawThrottled) {
2173 BeginFramesNotFromClient_SwapThrottled(UNTHROTTLED_BFS); 2170 BeginFramesNotFromClient_IsDrawThrottled(UNTHROTTLED_BFS);
2174 } 2171 }
2175 2172
2176 TEST_F(SchedulerTest, 2173 TEST_F(SchedulerTest,
2177 DidLoseCompositorFrameSinkAfterCompositorFrameSinkIsInitialized) { 2174 DidLoseCompositorFrameSinkAfterCompositorFrameSinkIsInitialized) {
2178 SetUpSchedulerWithNoCompositorFrameSink(EXTERNAL_BFS); 2175 SetUpSchedulerWithNoCompositorFrameSink(EXTERNAL_BFS);
2179 2176
2180 scheduler_->SetVisible(true); 2177 scheduler_->SetVisible(true);
2181 scheduler_->SetCanDraw(true); 2178 scheduler_->SetCanDraw(true);
2182 2179
2183 EXPECT_SINGLE_ACTION("ScheduledActionBeginCompositorFrameSinkCreation", 2180 EXPECT_SINGLE_ACTION("ScheduledActionBeginCompositorFrameSinkCreation",
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
2387 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); 2384 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks());
2388 scheduler_->NotifyReadyToCommit(); 2385 scheduler_->NotifyReadyToCommit();
2389 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); 2386 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_);
2390 2387
2391 client_->Reset(); 2388 client_->Reset();
2392 scheduler_->NotifyReadyToActivate(); 2389 scheduler_->NotifyReadyToActivate();
2393 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_); 2390 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_);
2394 2391
2395 client_->Reset(); 2392 client_->Reset();
2396 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); 2393 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true));
2397 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); 2394 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 1);
2398 2395
2399 // Idle time between BeginFrames. 2396 // Idle time between BeginFrames.
2400 client_->Reset(); 2397 client_->Reset();
2401 scheduler_->DidLoseCompositorFrameSink(); 2398 scheduler_->DidLoseCompositorFrameSink();
2402 EXPECT_ACTION("ScheduledActionBeginCompositorFrameSinkCreation", client_, 0, 2399 EXPECT_ACTION("ScheduledActionBeginCompositorFrameSinkCreation", client_, 0,
2403 3); 2400 3);
2404 EXPECT_ACTION("RemoveObserver(this)", client_, 1, 3); 2401 EXPECT_ACTION("RemoveObserver(this)", client_, 1, 3);
2405 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3); 2402 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3);
2406 } 2403 }
2407 2404
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
2469 scheduler_->SetNeedsRedraw(); 2466 scheduler_->SetNeedsRedraw();
2470 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); 2467 EXPECT_SINGLE_ACTION("AddObserver(this)", client_);
2471 client_->Reset(); 2468 client_->Reset();
2472 2469
2473 EXPECT_SCOPED(AdvanceFrame()); 2470 EXPECT_SCOPED(AdvanceFrame());
2474 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1); 2471 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1);
2475 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 2472 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
2476 EXPECT_TRUE(scheduler_->begin_frames_expected()); 2473 EXPECT_TRUE(scheduler_->begin_frames_expected());
2477 client_->Reset(); 2474 client_->Reset();
2478 task_runner().RunPendingTasks(); // Run posted deadline. 2475 task_runner().RunPendingTasks(); // Run posted deadline.
2479 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); 2476 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 1);
2480 scheduler_->SetNeedsRedraw(); 2477 scheduler_->SetNeedsRedraw();
2481 2478
2482 // Switch to an unthrottled frame source. 2479 // Switch to an unthrottled frame source.
2483 scheduler_->SetBeginFrameSource(unthrottled_frame_source_.get()); 2480 scheduler_->SetBeginFrameSource(unthrottled_frame_source_.get());
2484 client_->Reset(); 2481 client_->Reset();
2485 2482
2486 // Unthrottled frame source will immediately begin a new frame. 2483 // Unthrottled frame source will immediately begin a new frame.
2487 task_runner().RunPendingTasks(); // Run posted BeginFrame. 2484 task_runner().RunPendingTasks(); // Run posted BeginFrame.
2488 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1); 2485 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1);
2489 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 2486 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
2490 client_->Reset(); 2487 client_->Reset();
2491 2488
2492 // If we don't swap on the deadline, we wait for the next BeginFrame. 2489 // If we don't swap on the deadline, we wait for the next BeginFrame.
2493 task_runner().RunPendingTasks(); // Run posted deadline. 2490 task_runner().RunPendingTasks(); // Run posted deadline.
2494 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); 2491 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 1);
2495 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 2492 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
2496 client_->Reset(); 2493 client_->Reset();
2497 } 2494 }
2498 2495
2499 // Tests to ensure frame sources can be successfully changed while a frame 2496 // Tests to ensure frame sources can be successfully changed while a frame
2500 // deadline is pending. 2497 // deadline is pending.
2501 TEST_F(SchedulerTest, SwitchFrameSourceToUnthrottledBeforeDeadline) { 2498 TEST_F(SchedulerTest, SwitchFrameSourceToUnthrottledBeforeDeadline) {
2502 SetUpScheduler(EXTERNAL_BFS); 2499 SetUpScheduler(EXTERNAL_BFS);
2503 2500
2504 // SetNeedsRedraw should begin the frame on the next BeginImplFrame. 2501 // SetNeedsRedraw should begin the frame on the next BeginImplFrame.
2505 scheduler_->SetNeedsRedraw(); 2502 scheduler_->SetNeedsRedraw();
2506 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); 2503 EXPECT_SINGLE_ACTION("AddObserver(this)", client_);
2507 client_->Reset(); 2504 client_->Reset();
2508 2505
2509 EXPECT_SCOPED(AdvanceFrame()); 2506 EXPECT_SCOPED(AdvanceFrame());
2510 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_); 2507 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_);
2511 2508
2512 // Switch to an unthrottled frame source before the frame deadline is hit. 2509 // Switch to an unthrottled frame source before the frame deadline is hit.
2513 scheduler_->SetBeginFrameSource(unthrottled_frame_source_.get()); 2510 scheduler_->SetBeginFrameSource(unthrottled_frame_source_.get());
2514 client_->Reset(); 2511 client_->Reset();
2515 2512
2516 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 2513 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
2517 EXPECT_TRUE(scheduler_->begin_frames_expected()); 2514 EXPECT_TRUE(scheduler_->begin_frames_expected());
2518 client_->Reset(); 2515 client_->Reset();
2519 2516
2520 task_runner().RunPendingTasks(); // Run posted deadline. 2517 task_runner().RunPendingTasks(); // Run posted deadline.
2521 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 2); 2518 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 2);
2522 // Unthrottled frame source will immediately begin a new frame. 2519 // Unthrottled frame source will immediately begin a new frame.
2523 EXPECT_ACTION("WillBeginImplFrame", client_, 1, 2); 2520 EXPECT_ACTION("WillBeginImplFrame", client_, 1, 2);
2524 scheduler_->SetNeedsRedraw(); 2521 scheduler_->SetNeedsRedraw();
2525 client_->Reset(); 2522 client_->Reset();
2526 2523
2527 task_runner().RunPendingTasks(); // Run posted deadline. 2524 task_runner().RunPendingTasks(); // Run posted deadline.
2528 EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client_); 2525 EXPECT_SINGLE_ACTION("ScheduledActionDrawIfPossible", client_);
2529 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 2526 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
2530 client_->Reset(); 2527 client_->Reset();
2531 } 2528 }
2532 2529
2533 // Tests to ensure that the active frame source can successfully be changed from 2530 // Tests to ensure that the active frame source can successfully be changed from
2534 // unthrottled to throttled. 2531 // unthrottled to throttled.
2535 TEST_F(SchedulerTest, SwitchFrameSourceToThrottled) { 2532 TEST_F(SchedulerTest, SwitchFrameSourceToThrottled) {
2536 SetUpScheduler(UNTHROTTLED_BFS); 2533 SetUpScheduler(UNTHROTTLED_BFS);
2537 2534
2538 scheduler_->SetNeedsRedraw(); 2535 scheduler_->SetNeedsRedraw();
2539 EXPECT_NO_ACTION(client_); 2536 EXPECT_NO_ACTION(client_);
2540 client_->Reset(); 2537 client_->Reset();
2541 2538
2542 task_runner().RunPendingTasks(); // Run posted BeginFrame. 2539 task_runner().RunPendingTasks(); // Run posted BeginFrame.
2543 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1); 2540 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1);
2544 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 2541 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
2545 client_->Reset(); 2542 client_->Reset();
2546 2543
2547 task_runner().RunPendingTasks(); // Run posted deadline. 2544 task_runner().RunPendingTasks(); // Run posted deadline.
2548 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); 2545 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 1);
2549 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 2546 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
2550 client_->Reset(); 2547 client_->Reset();
2551 2548
2552 // Switch to a throttled frame source. 2549 // Switch to a throttled frame source.
2553 scheduler_->SetBeginFrameSource(fake_external_begin_frame_source_.get()); 2550 scheduler_->SetBeginFrameSource(fake_external_begin_frame_source_.get());
2554 client_->Reset(); 2551 client_->Reset();
2555 2552
2556 // SetNeedsRedraw should begin the frame on the next BeginImplFrame. 2553 // SetNeedsRedraw should begin the frame on the next BeginImplFrame.
2557 scheduler_->SetNeedsRedraw(); 2554 scheduler_->SetNeedsRedraw();
2558 task_runner().RunPendingTasks(); 2555 task_runner().RunPendingTasks();
2559 EXPECT_NO_ACTION(client_); 2556 EXPECT_NO_ACTION(client_);
2560 client_->Reset(); 2557 client_->Reset();
2561 2558
2562 EXPECT_SCOPED(AdvanceFrame()); 2559 EXPECT_SCOPED(AdvanceFrame());
2563 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1); 2560 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1);
2564 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 2561 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
2565 EXPECT_TRUE(scheduler_->begin_frames_expected()); 2562 EXPECT_TRUE(scheduler_->begin_frames_expected());
2566 client_->Reset(); 2563 client_->Reset();
2567 task_runner().RunPendingTasks(); // Run posted deadline. 2564 task_runner().RunPendingTasks(); // Run posted deadline.
2568 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); 2565 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 1);
2569 } 2566 }
2570 2567
2571 TEST_F(SchedulerTest, SwitchFrameSourceToNullInsideDeadline) { 2568 TEST_F(SchedulerTest, SwitchFrameSourceToNullInsideDeadline) {
2572 SetUpScheduler(EXTERNAL_BFS); 2569 SetUpScheduler(EXTERNAL_BFS);
2573 2570
2574 scheduler_->SetNeedsRedraw(); 2571 scheduler_->SetNeedsRedraw();
2575 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); 2572 EXPECT_SINGLE_ACTION("AddObserver(this)", client_);
2576 client_->Reset(); 2573 client_->Reset();
2577 2574
2578 EXPECT_SCOPED(AdvanceFrame()); 2575 EXPECT_SCOPED(AdvanceFrame());
2579 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_); 2576 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_);
2580 client_->Reset(); 2577 client_->Reset();
2581 2578
2582 // Switch to a null frame source. 2579 // Switch to a null frame source.
2583 scheduler_->SetBeginFrameSource(nullptr); 2580 scheduler_->SetBeginFrameSource(nullptr);
2584 EXPECT_SINGLE_ACTION("RemoveObserver(this)", client_); 2581 EXPECT_SINGLE_ACTION("RemoveObserver(this)", client_);
2585 client_->Reset(); 2582 client_->Reset();
2586 2583
2587 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 2584 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
2588 task_runner().RunPendingTasks(); // Run posted deadline. 2585 task_runner().RunPendingTasks(); // Run posted deadline.
2589 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); 2586 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 1);
2590 EXPECT_FALSE(scheduler_->begin_frames_expected()); 2587 EXPECT_FALSE(scheduler_->begin_frames_expected());
2591 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 2588 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
2592 client_->Reset(); 2589 client_->Reset();
2593 2590
2594 // AdvanceFrame helper can't be used here because there's no deadline posted. 2591 // AdvanceFrame helper can't be used here because there's no deadline posted.
2595 scheduler_->SetNeedsRedraw(); 2592 scheduler_->SetNeedsRedraw();
2596 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 2593 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
2597 EXPECT_NO_ACTION(client_); 2594 EXPECT_NO_ACTION(client_);
2598 client_->Reset(); 2595 client_->Reset();
2599 2596
2600 scheduler_->SetNeedsBeginMainFrame(); 2597 scheduler_->SetNeedsBeginMainFrame();
2601 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 2598 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
2602 EXPECT_NO_ACTION(client_); 2599 EXPECT_NO_ACTION(client_);
2603 client_->Reset(); 2600 client_->Reset();
2604 2601
2605 // Switch back to the same source, make sure frames continue to be produced. 2602 // Switch back to the same source, make sure frames continue to be produced.
2606 scheduler_->SetBeginFrameSource(fake_external_begin_frame_source_.get()); 2603 scheduler_->SetBeginFrameSource(fake_external_begin_frame_source_.get());
2607 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); 2604 EXPECT_SINGLE_ACTION("AddObserver(this)", client_);
2608 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 2605 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
2609 client_->Reset(); 2606 client_->Reset();
2610 2607
2611 EXPECT_SCOPED(AdvanceFrame()); 2608 EXPECT_SCOPED(AdvanceFrame());
2612 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); 2609 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2);
2613 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); 2610 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2);
2614 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 2611 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
2615 client_->Reset(); 2612 client_->Reset();
2616 2613
2617 task_runner().RunPendingTasks(); 2614 task_runner().RunPendingTasks();
2618 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); 2615 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 1);
2619 } 2616 }
2620 2617
2621 // This test maskes sure that switching a frame source when not observing 2618 // This test maskes sure that switching a frame source when not observing
2622 // such as when not visible also works. 2619 // such as when not visible also works.
2623 TEST_F(SchedulerTest, SwitchFrameSourceWhenNotObserving) { 2620 TEST_F(SchedulerTest, SwitchFrameSourceWhenNotObserving) {
2624 SetUpScheduler(EXTERNAL_BFS); 2621 SetUpScheduler(EXTERNAL_BFS);
2625 2622
2626 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame. 2623 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame.
2627 scheduler_->SetNeedsBeginMainFrame(); 2624 scheduler_->SetNeedsBeginMainFrame();
2628 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); 2625 EXPECT_SINGLE_ACTION("AddObserver(this)", client_);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
2685 // Trigger a frame draw. 2682 // Trigger a frame draw.
2686 EXPECT_SCOPED(AdvanceFrame()); 2683 EXPECT_SCOPED(AdvanceFrame());
2687 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); 2684 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks());
2688 scheduler_->NotifyReadyToCommit(); 2685 scheduler_->NotifyReadyToCommit();
2689 scheduler_->NotifyReadyToActivate(); 2686 scheduler_->NotifyReadyToActivate();
2690 task_runner().RunPendingTasks(); 2687 task_runner().RunPendingTasks();
2691 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 5); 2688 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 5);
2692 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 5); 2689 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 5);
2693 EXPECT_ACTION("ScheduledActionCommit", client_, 2, 5); 2690 EXPECT_ACTION("ScheduledActionCommit", client_, 2, 5);
2694 EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 3, 5); 2691 EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 3, 5);
2695 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 4, 5); 2692 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 4, 5);
2696 client_->Reset(); 2693 client_->Reset();
2697 2694
2698 // The following BeginImplFrame deadline should SetNeedsBeginFrame(false) 2695 // The following BeginImplFrame deadline should SetNeedsBeginFrame(false)
2699 // and send a SendBeginMainFrameNotExpectedSoon. 2696 // and send a SendBeginMainFrameNotExpectedSoon.
2700 EXPECT_SCOPED(AdvanceFrame()); 2697 EXPECT_SCOPED(AdvanceFrame());
2701 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_); 2698 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_);
2702 EXPECT_TRUE(client_->IsInsideBeginImplFrame()); 2699 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
2703 client_->Reset(); 2700 client_->Reset();
2704 2701
2705 task_runner().RunPendingTasks(); // Run posted deadline. 2702 task_runner().RunPendingTasks(); // Run posted deadline.
(...skipping 19 matching lines...) Expand all
2725 AdvanceFrame(); 2722 AdvanceFrame();
2726 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); 2723 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2);
2727 EXPECT_ACTION("ScheduledActionInvalidateCompositorFrameSink", client_, 1, 2); 2724 EXPECT_ACTION("ScheduledActionInvalidateCompositorFrameSink", client_, 1, 2);
2728 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 2725 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
2729 client_->Reset(); 2726 client_->Reset();
2730 2727
2731 // Android onDraw. This doesn't consume the single begin frame request. 2728 // Android onDraw. This doesn't consume the single begin frame request.
2732 scheduler_->SetNeedsRedraw(); 2729 scheduler_->SetNeedsRedraw();
2733 bool resourceless_software_draw = false; 2730 bool resourceless_software_draw = false;
2734 scheduler_->OnDrawForCompositorFrameSink(resourceless_software_draw); 2731 scheduler_->OnDrawForCompositorFrameSink(resourceless_software_draw);
2735 EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client_); 2732 EXPECT_SINGLE_ACTION("ScheduledActionDrawIfPossible", client_);
2736 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 2733 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
2737 client_->Reset(); 2734 client_->Reset();
2738 2735
2739 // The animation inside of WillBeginImplFrame changes stuff on the screen, but 2736 // The animation inside of WillBeginImplFrame changes stuff on the screen, but
2740 // ends here, so does not cause another frame to happen. 2737 // ends here, so does not cause another frame to happen.
2741 client_->SetWillBeginImplFrameCausesRedraw(true); 2738 client_->SetWillBeginImplFrameCausesRedraw(true);
2742 2739
2743 // Next vsync. 2740 // Next vsync.
2744 AdvanceFrame(); 2741 AdvanceFrame();
2745 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); 2742 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2);
2746 EXPECT_ACTION("ScheduledActionInvalidateCompositorFrameSink", client_, 1, 2); 2743 EXPECT_ACTION("ScheduledActionInvalidateCompositorFrameSink", client_, 1, 2);
2747 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 2744 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
2748 client_->Reset(); 2745 client_->Reset();
2749 2746
2750 // Android onDraw. 2747 // Android onDraw.
2751 scheduler_->SetNeedsRedraw(); 2748 scheduler_->SetNeedsRedraw();
2752 scheduler_->OnDrawForCompositorFrameSink(resourceless_software_draw); 2749 scheduler_->OnDrawForCompositorFrameSink(resourceless_software_draw);
2753 EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client_); 2750 EXPECT_SINGLE_ACTION("ScheduledActionDrawIfPossible", client_);
2754 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 2751 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
2755 client_->Reset(); 2752 client_->Reset();
2756 2753
2757 // Idle on next vsync, as the animation has completed. 2754 // Idle on next vsync, as the animation has completed.
2758 AdvanceFrame(); 2755 AdvanceFrame();
2759 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 3); 2756 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 3);
2760 EXPECT_ACTION("RemoveObserver(this)", client_, 1, 3); 2757 EXPECT_ACTION("RemoveObserver(this)", client_, 1, 3);
2761 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3); 2758 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3);
2762 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 2759 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
2763 client_->Reset(); 2760 client_->Reset();
2764 } 2761 }
2765 2762
2766 TEST_F(SchedulerTest, SynchronousCompositorOnDrawDuringIdle) { 2763 TEST_F(SchedulerTest, SynchronousCompositorOnDrawDuringIdle) {
2767 scheduler_settings_.using_synchronous_renderer_compositor = true; 2764 scheduler_settings_.using_synchronous_renderer_compositor = true;
2768 SetUpScheduler(EXTERNAL_BFS); 2765 SetUpScheduler(EXTERNAL_BFS);
2769 2766
2770 scheduler_->SetNeedsRedraw(); 2767 scheduler_->SetNeedsRedraw();
2771 bool resourceless_software_draw = false; 2768 bool resourceless_software_draw = false;
2772 scheduler_->OnDrawForCompositorFrameSink(resourceless_software_draw); 2769 scheduler_->OnDrawForCompositorFrameSink(resourceless_software_draw);
2773 EXPECT_ACTION("AddObserver(this)", client_, 0, 2); 2770 EXPECT_ACTION("AddObserver(this)", client_, 0, 2);
2774 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 1, 2); 2771 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 1, 2);
2775 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 2772 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
2776 client_->Reset(); 2773 client_->Reset();
2777 2774
2778 // Idle on next vsync. 2775 // Idle on next vsync.
2779 AdvanceFrame(); 2776 AdvanceFrame();
2780 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 3); 2777 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 3);
2781 EXPECT_ACTION("RemoveObserver(this)", client_, 1, 3); 2778 EXPECT_ACTION("RemoveObserver(this)", client_, 1, 3);
2782 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3); 2779 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3);
2783 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 2780 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
2784 client_->Reset(); 2781 client_->Reset();
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
2857 AdvanceFrame(); 2854 AdvanceFrame();
2858 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); 2855 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2);
2859 EXPECT_ACTION("ScheduledActionInvalidateCompositorFrameSink", client_, 1, 2); 2856 EXPECT_ACTION("ScheduledActionInvalidateCompositorFrameSink", client_, 1, 2);
2860 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 2857 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
2861 client_->Reset(); 2858 client_->Reset();
2862 2859
2863 // Android onDraw. 2860 // Android onDraw.
2864 scheduler_->SetNeedsRedraw(); 2861 scheduler_->SetNeedsRedraw();
2865 bool resourceless_software_draw = false; 2862 bool resourceless_software_draw = false;
2866 scheduler_->OnDrawForCompositorFrameSink(resourceless_software_draw); 2863 scheduler_->OnDrawForCompositorFrameSink(resourceless_software_draw);
2867 EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client_); 2864 EXPECT_SINGLE_ACTION("ScheduledActionDrawIfPossible", client_);
2868 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 2865 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
2869 client_->Reset(); 2866 client_->Reset();
2870 2867
2871 // Idle on next vsync. 2868 // Idle on next vsync.
2872 AdvanceFrame(); 2869 AdvanceFrame();
2873 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 3); 2870 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 3);
2874 EXPECT_ACTION("RemoveObserver(this)", client_, 1, 3); 2871 EXPECT_ACTION("RemoveObserver(this)", client_, 1, 3);
2875 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3); 2872 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3);
2876 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 2873 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
2877 client_->Reset(); 2874 client_->Reset();
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2920 scheduler_->NotifyReadyToCommit(); 2917 scheduler_->NotifyReadyToCommit();
2921 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); 2918 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_);
2922 client_->Reset(); 2919 client_->Reset();
2923 } 2920 }
2924 2921
2925 class SchedulerClientSetNeedsPrepareTilesOnDraw : public FakeSchedulerClient { 2922 class SchedulerClientSetNeedsPrepareTilesOnDraw : public FakeSchedulerClient {
2926 public: 2923 public:
2927 SchedulerClientSetNeedsPrepareTilesOnDraw() : FakeSchedulerClient() {} 2924 SchedulerClientSetNeedsPrepareTilesOnDraw() : FakeSchedulerClient() {}
2928 2925
2929 protected: 2926 protected:
2930 DrawResult ScheduledActionDrawAndSwapIfPossible() override { 2927 DrawResult ScheduledActionDrawIfPossible() override {
2931 scheduler_->SetNeedsPrepareTiles(); 2928 scheduler_->SetNeedsPrepareTiles();
2932 return FakeSchedulerClient::ScheduledActionDrawAndSwapIfPossible(); 2929 return FakeSchedulerClient::ScheduledActionDrawIfPossible();
2933 } 2930 }
2934 }; 2931 };
2935 2932
2936 TEST_F(SchedulerTest, SynchronousCompositorPrepareTilesOnDraw) { 2933 TEST_F(SchedulerTest, SynchronousCompositorPrepareTilesOnDraw) {
2937 scheduler_settings_.using_synchronous_renderer_compositor = true; 2934 scheduler_settings_.using_synchronous_renderer_compositor = true;
2938 2935
2939 std::unique_ptr<FakeSchedulerClient> client = 2936 std::unique_ptr<FakeSchedulerClient> client =
2940 base::WrapUnique(new SchedulerClientSetNeedsPrepareTilesOnDraw); 2937 base::WrapUnique(new SchedulerClientSetNeedsPrepareTilesOnDraw);
2941 SetUpScheduler(EXTERNAL_BFS, std::move(client)); 2938 SetUpScheduler(EXTERNAL_BFS, std::move(client));
2942 2939
2943 scheduler_->SetNeedsRedraw(); 2940 scheduler_->SetNeedsRedraw();
2944 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); 2941 EXPECT_SINGLE_ACTION("AddObserver(this)", client_);
2945 client_->Reset(); 2942 client_->Reset();
2946 2943
2947 // Next vsync. 2944 // Next vsync.
2948 EXPECT_SCOPED(AdvanceFrame()); 2945 EXPECT_SCOPED(AdvanceFrame());
2949 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); 2946 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2);
2950 EXPECT_ACTION("ScheduledActionInvalidateCompositorFrameSink", client_, 1, 2); 2947 EXPECT_ACTION("ScheduledActionInvalidateCompositorFrameSink", client_, 1, 2);
2951 client_->Reset(); 2948 client_->Reset();
2952 2949
2953 // Android onDraw. 2950 // Android onDraw.
2954 scheduler_->SetNeedsRedraw(); 2951 scheduler_->SetNeedsRedraw();
2955 bool resourceless_software_draw = false; 2952 bool resourceless_software_draw = false;
2956 scheduler_->OnDrawForCompositorFrameSink(resourceless_software_draw); 2953 scheduler_->OnDrawForCompositorFrameSink(resourceless_software_draw);
2957 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 2); 2954 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 2);
2958 EXPECT_ACTION("ScheduledActionPrepareTiles", client_, 1, 2); 2955 EXPECT_ACTION("ScheduledActionPrepareTiles", client_, 1, 2);
2959 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 2956 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
2960 EXPECT_FALSE(scheduler_->PrepareTilesPending()); 2957 EXPECT_FALSE(scheduler_->PrepareTilesPending());
2961 client_->Reset(); 2958 client_->Reset();
2962 2959
2963 // Android onDraw. 2960 // Android onDraw.
2964 scheduler_->SetNeedsRedraw(); 2961 scheduler_->SetNeedsRedraw();
2965 scheduler_->OnDrawForCompositorFrameSink(resourceless_software_draw); 2962 scheduler_->OnDrawForCompositorFrameSink(resourceless_software_draw);
2966 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 2); 2963 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 2);
2967 EXPECT_ACTION("ScheduledActionPrepareTiles", client_, 1, 2); 2964 EXPECT_ACTION("ScheduledActionPrepareTiles", client_, 1, 2);
2968 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 2965 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
2969 EXPECT_FALSE(scheduler_->PrepareTilesPending()); 2966 EXPECT_FALSE(scheduler_->PrepareTilesPending());
2970 client_->Reset(); 2967 client_->Reset();
2971 2968
2972 // Next vsync. 2969 // Next vsync.
2973 EXPECT_SCOPED(AdvanceFrame()); 2970 EXPECT_SCOPED(AdvanceFrame());
2974 EXPECT_FALSE(scheduler_->PrepareTilesPending()); 2971 EXPECT_FALSE(scheduler_->PrepareTilesPending());
2975 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 3); 2972 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 3);
2976 EXPECT_ACTION("RemoveObserver(this)", client_, 1, 3); 2973 EXPECT_ACTION("RemoveObserver(this)", client_, 1, 3);
(...skipping 13 matching lines...) Expand all
2990 // Next vsync. 2987 // Next vsync.
2991 EXPECT_SCOPED(AdvanceFrame()); 2988 EXPECT_SCOPED(AdvanceFrame());
2992 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); 2989 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2);
2993 EXPECT_ACTION("ScheduledActionInvalidateCompositorFrameSink", client_, 1, 2); 2990 EXPECT_ACTION("ScheduledActionInvalidateCompositorFrameSink", client_, 1, 2);
2994 client_->Reset(); 2991 client_->Reset();
2995 2992
2996 // Android onDraw. 2993 // Android onDraw.
2997 scheduler_->SetNeedsRedraw(); 2994 scheduler_->SetNeedsRedraw();
2998 bool resourceless_software_draw = false; 2995 bool resourceless_software_draw = false;
2999 scheduler_->OnDrawForCompositorFrameSink(resourceless_software_draw); 2996 scheduler_->OnDrawForCompositorFrameSink(resourceless_software_draw);
3000 EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client_); 2997 EXPECT_SINGLE_ACTION("ScheduledActionDrawIfPossible", client_);
3001 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 2998 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
3002 EXPECT_FALSE(scheduler_->PrepareTilesPending()); 2999 EXPECT_FALSE(scheduler_->PrepareTilesPending());
3003 client_->Reset(); 3000 client_->Reset();
3004 3001
3005 // Simulate SetNeedsBeginMainFrame due to input event. 3002 // Simulate SetNeedsBeginMainFrame due to input event.
3006 scheduler_->SetNeedsBeginMainFrame(); 3003 scheduler_->SetNeedsBeginMainFrame();
3007 EXPECT_SINGLE_ACTION("ScheduledActionSendBeginMainFrame", client_); 3004 EXPECT_SINGLE_ACTION("ScheduledActionSendBeginMainFrame", client_);
3008 client_->Reset(); 3005 client_->Reset();
3009 3006
3010 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); 3007 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks());
3011 scheduler_->NotifyReadyToCommit(); 3008 scheduler_->NotifyReadyToCommit();
3012 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); 3009 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_);
3013 client_->Reset(); 3010 client_->Reset();
3014 3011
3015 scheduler_->NotifyReadyToActivate(); 3012 scheduler_->NotifyReadyToActivate();
3016 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_); 3013 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_);
3017 client_->Reset(); 3014 client_->Reset();
3018 3015
3019 // Next vsync. 3016 // Next vsync.
3020 EXPECT_SCOPED(AdvanceFrame()); 3017 EXPECT_SCOPED(AdvanceFrame());
3021 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); 3018 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2);
3022 EXPECT_ACTION("ScheduledActionInvalidateCompositorFrameSink", client_, 1, 2); 3019 EXPECT_ACTION("ScheduledActionInvalidateCompositorFrameSink", client_, 1, 2);
3023 client_->Reset(); 3020 client_->Reset();
3024 3021
3025 // Android onDraw. 3022 // Android onDraw.
3026 scheduler_->SetNeedsRedraw(); 3023 scheduler_->SetNeedsRedraw();
3027 scheduler_->OnDrawForCompositorFrameSink(resourceless_software_draw); 3024 scheduler_->OnDrawForCompositorFrameSink(resourceless_software_draw);
3028 EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client_); 3025 EXPECT_SINGLE_ACTION("ScheduledActionDrawIfPossible", client_);
3029 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 3026 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
3030 EXPECT_FALSE(scheduler_->PrepareTilesPending()); 3027 EXPECT_FALSE(scheduler_->PrepareTilesPending());
3031 client_->Reset(); 3028 client_->Reset();
3032 3029
3033 // Simulate SetNeedsBeginMainFrame due to input event. 3030 // Simulate SetNeedsBeginMainFrame due to input event.
3034 scheduler_->SetNeedsBeginMainFrame(); 3031 scheduler_->SetNeedsBeginMainFrame();
3035 EXPECT_SINGLE_ACTION("ScheduledActionSendBeginMainFrame", client_); 3032 EXPECT_SINGLE_ACTION("ScheduledActionSendBeginMainFrame", client_);
3036 client_->Reset(); 3033 client_->Reset();
3037 } 3034 }
3038 3035
3039 TEST_F(SchedulerTest, SynchronousCompositorResourcelessOnDrawWhenInvisible) { 3036 TEST_F(SchedulerTest, SynchronousCompositorResourcelessOnDrawWhenInvisible) {
3040 scheduler_settings_.using_synchronous_renderer_compositor = true; 3037 scheduler_settings_.using_synchronous_renderer_compositor = true;
3041 SetUpScheduler(EXTERNAL_BFS); 3038 SetUpScheduler(EXTERNAL_BFS);
3042 3039
3043 scheduler_->SetVisible(false); 3040 scheduler_->SetVisible(false);
3044 3041
3045 scheduler_->SetNeedsRedraw(); 3042 scheduler_->SetNeedsRedraw();
3046 bool resourceless_software_draw = true; 3043 bool resourceless_software_draw = true;
3047 scheduler_->OnDrawForCompositorFrameSink(resourceless_software_draw); 3044 scheduler_->OnDrawForCompositorFrameSink(resourceless_software_draw);
3048 // SynchronousCompositor has to draw regardless of visibility. 3045 // SynchronousCompositor has to draw regardless of visibility.
3049 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); 3046 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 1);
3050 EXPECT_FALSE(client_->IsInsideBeginImplFrame()); 3047 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
3051 client_->Reset(); 3048 client_->Reset();
3052 } 3049 }
3053 3050
3054 TEST_F(SchedulerTest, AuthoritativeVSyncInterval) { 3051 TEST_F(SchedulerTest, AuthoritativeVSyncInterval) {
3055 SetUpScheduler(THROTTLED_BFS); 3052 SetUpScheduler(THROTTLED_BFS);
3056 base::TimeDelta initial_interval = scheduler_->BeginImplFrameInterval(); 3053 base::TimeDelta initial_interval = scheduler_->BeginImplFrameInterval();
3057 base::TimeDelta authoritative_interval = 3054 base::TimeDelta authoritative_interval =
3058 base::TimeDelta::FromMilliseconds(33); 3055 base::TimeDelta::FromMilliseconds(33);
3059 3056
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
3242 } 3239 }
3243 3240
3244 TEST_F(SchedulerTest, BeginMainFrameOnCriticalPath_AHS) { 3241 TEST_F(SchedulerTest, BeginMainFrameOnCriticalPath_AHS) {
3245 EXPECT_FALSE(BeginMainFrameOnCriticalPath( 3242 EXPECT_FALSE(BeginMainFrameOnCriticalPath(
3246 SMOOTHNESS_TAKES_PRIORITY, 3243 SMOOTHNESS_TAKES_PRIORITY,
3247 ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, kSlowDuration)); 3244 ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, kSlowDuration));
3248 } 3245 }
3249 3246
3250 } // namespace 3247 } // namespace
3251 } // namespace cc 3248 } // namespace cc
OLDNEW
« no previous file with comments | « cc/scheduler/scheduler_state_machine_unittest.cc ('k') | cc/surfaces/direct_compositor_frame_sink.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698