OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 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> |
11 | 11 |
12 #include "base/logging.h" | 12 #include "base/logging.h" |
| 13 #include "base/memory/ptr_util.h" |
13 #include "base/message_loop/message_loop.h" | 14 #include "base/message_loop/message_loop.h" |
14 #include "base/numerics/safe_conversions.h" | 15 #include "base/numerics/safe_conversions.h" |
15 #include "base/run_loop.h" | 16 #include "base/run_loop.h" |
16 #include "base/time/time.h" | 17 #include "base/time/time.h" |
17 #include "base/trace_event/trace_event.h" | 18 #include "base/trace_event/trace_event.h" |
18 #include "cc/test/begin_frame_args_test.h" | 19 #include "cc/test/begin_frame_args_test.h" |
19 #include "cc/test/ordered_simple_task_runner.h" | 20 #include "cc/test/ordered_simple_task_runner.h" |
20 #include "cc/test/scheduler_test_common.h" | 21 #include "cc/test/scheduler_test_common.h" |
21 #include "testing/gmock/include/gmock/gmock.h" | 22 #include "testing/gmock/include/gmock/gmock.h" |
22 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 bool will_begin_impl_frame_causes_redraw_; | 201 bool will_begin_impl_frame_causes_redraw_; |
201 bool will_begin_impl_frame_requests_one_begin_impl_frame_; | 202 bool will_begin_impl_frame_requests_one_begin_impl_frame_; |
202 bool draw_will_happen_; | 203 bool draw_will_happen_; |
203 bool swap_will_happen_if_draw_happens_; | 204 bool swap_will_happen_if_draw_happens_; |
204 bool automatic_swap_ack_; | 205 bool automatic_swap_ack_; |
205 int num_draws_; | 206 int num_draws_; |
206 BeginFrameArgs begin_frame_args_sent_to_children_; | 207 BeginFrameArgs begin_frame_args_sent_to_children_; |
207 BeginFrameArgs last_begin_main_frame_args_; | 208 BeginFrameArgs last_begin_main_frame_args_; |
208 base::TimeTicks posted_begin_impl_frame_deadline_; | 209 base::TimeTicks posted_begin_impl_frame_deadline_; |
209 std::vector<const char*> actions_; | 210 std::vector<const char*> actions_; |
210 std::vector<scoped_ptr<base::trace_event::ConvertableToTraceFormat>> states_; | 211 std::vector<std::unique_ptr<base::trace_event::ConvertableToTraceFormat>> |
| 212 states_; |
211 TestScheduler* scheduler_; | 213 TestScheduler* scheduler_; |
212 }; | 214 }; |
213 | 215 |
214 class FakeExternalBeginFrameSource : public BeginFrameSourceBase { | 216 class FakeExternalBeginFrameSource : public BeginFrameSourceBase { |
215 public: | 217 public: |
216 explicit FakeExternalBeginFrameSource(FakeSchedulerClient* client) | 218 explicit FakeExternalBeginFrameSource(FakeSchedulerClient* client) |
217 : client_(client) {} | 219 : client_(client) {} |
218 ~FakeExternalBeginFrameSource() override {} | 220 ~FakeExternalBeginFrameSource() override {} |
219 | 221 |
220 void AddObserver(BeginFrameObserver* obs) override { | 222 void AddObserver(BeginFrameObserver* obs) override { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 synthetic_frame_source_.reset(new TestSyntheticBeginFrameSource( | 266 synthetic_frame_source_.reset(new TestSyntheticBeginFrameSource( |
265 now_src_.get(), task_runner_.get(), BeginFrameArgs::DefaultInterval())); | 267 now_src_.get(), task_runner_.get(), BeginFrameArgs::DefaultInterval())); |
266 if (!scheduler_settings_.throttle_frame_production) { | 268 if (!scheduler_settings_.throttle_frame_production) { |
267 frame_source = unthrottled_frame_source_.get(); | 269 frame_source = unthrottled_frame_source_.get(); |
268 } else if (scheduler_settings_.use_external_begin_frame_source) { | 270 } else if (scheduler_settings_.use_external_begin_frame_source) { |
269 frame_source = fake_external_begin_frame_source_.get(); | 271 frame_source = fake_external_begin_frame_source_.get(); |
270 } else { | 272 } else { |
271 frame_source = synthetic_frame_source_.get(); | 273 frame_source = synthetic_frame_source_.get(); |
272 } | 274 } |
273 | 275 |
274 scoped_ptr<FakeCompositorTimingHistory> fake_compositor_timing_history = | 276 std::unique_ptr<FakeCompositorTimingHistory> |
275 FakeCompositorTimingHistory::Create( | 277 fake_compositor_timing_history = FakeCompositorTimingHistory::Create( |
276 scheduler_settings_.using_synchronous_renderer_compositor); | 278 scheduler_settings_.using_synchronous_renderer_compositor); |
277 fake_compositor_timing_history_ = fake_compositor_timing_history.get(); | 279 fake_compositor_timing_history_ = fake_compositor_timing_history.get(); |
278 | 280 |
279 scheduler_.reset( | 281 scheduler_.reset( |
280 new TestScheduler(now_src_.get(), client_.get(), scheduler_settings_, 0, | 282 new TestScheduler(now_src_.get(), client_.get(), scheduler_settings_, 0, |
281 task_runner_.get(), frame_source, | 283 task_runner_.get(), frame_source, |
282 std::move(fake_compositor_timing_history))); | 284 std::move(fake_compositor_timing_history))); |
283 DCHECK(scheduler_); | 285 DCHECK(scheduler_); |
284 client_->set_scheduler(scheduler_.get()); | 286 client_->set_scheduler(scheduler_.get()); |
285 | 287 |
286 // Use large estimates by default to avoid latency recovery in most tests. | 288 // Use large estimates by default to avoid latency recovery in most tests. |
287 fake_compositor_timing_history_->SetAllEstimatesTo(kSlowDuration); | 289 fake_compositor_timing_history_->SetAllEstimatesTo(kSlowDuration); |
288 | 290 |
289 return scheduler_.get(); | 291 return scheduler_.get(); |
290 } | 292 } |
291 | 293 |
292 void CreateSchedulerAndInitSurface() { | 294 void CreateSchedulerAndInitSurface() { |
293 CreateScheduler(); | 295 CreateScheduler(); |
294 EXPECT_SCOPED(InitializeOutputSurfaceAndFirstCommit()); | 296 EXPECT_SCOPED(InitializeOutputSurfaceAndFirstCommit()); |
295 } | 297 } |
296 | 298 |
297 void SetUpScheduler(bool initSurface) { | 299 void SetUpScheduler(bool initSurface) { |
298 SetUpScheduler(make_scoped_ptr(new FakeSchedulerClient), initSurface); | 300 SetUpScheduler(base::WrapUnique(new FakeSchedulerClient), initSurface); |
299 } | 301 } |
300 | 302 |
301 void SetUpScheduler(scoped_ptr<FakeSchedulerClient> client, | 303 void SetUpScheduler(std::unique_ptr<FakeSchedulerClient> client, |
302 bool initSurface) { | 304 bool initSurface) { |
303 client_ = std::move(client); | 305 client_ = std::move(client); |
304 if (initSurface) | 306 if (initSurface) |
305 CreateSchedulerAndInitSurface(); | 307 CreateSchedulerAndInitSurface(); |
306 else | 308 else |
307 CreateScheduler(); | 309 CreateScheduler(); |
308 } | 310 } |
309 | 311 |
310 OrderedSimpleTaskRunner& task_runner() { return *task_runner_; } | 312 OrderedSimpleTaskRunner& task_runner() { return *task_runner_; } |
311 base::SimpleTestTickClock* now_src() { return now_src_.get(); } | 313 base::SimpleTestTickClock* now_src() { return now_src_.get(); } |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
430 void ImplFrameNotSkippedAfterLateSwapAck(); | 432 void ImplFrameNotSkippedAfterLateSwapAck(); |
431 void BeginFramesNotFromClient(bool use_external_begin_frame_source, | 433 void BeginFramesNotFromClient(bool use_external_begin_frame_source, |
432 bool throttle_frame_production); | 434 bool throttle_frame_production); |
433 void BeginFramesNotFromClient_SwapThrottled( | 435 void BeginFramesNotFromClient_SwapThrottled( |
434 bool use_external_begin_frame_source, | 436 bool use_external_begin_frame_source, |
435 bool throttle_frame_production); | 437 bool throttle_frame_production); |
436 bool BeginMainFrameOnCriticalPath(TreePriority tree_priority, | 438 bool BeginMainFrameOnCriticalPath(TreePriority tree_priority, |
437 ScrollHandlerState scroll_handler_state, | 439 ScrollHandlerState scroll_handler_state, |
438 base::TimeDelta durations); | 440 base::TimeDelta durations); |
439 | 441 |
440 scoped_ptr<base::SimpleTestTickClock> now_src_; | 442 std::unique_ptr<base::SimpleTestTickClock> now_src_; |
441 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; | 443 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; |
442 scoped_ptr<FakeExternalBeginFrameSource> fake_external_begin_frame_source_; | 444 std::unique_ptr<FakeExternalBeginFrameSource> |
443 scoped_ptr<TestSyntheticBeginFrameSource> synthetic_frame_source_; | 445 fake_external_begin_frame_source_; |
444 scoped_ptr<TestBackToBackBeginFrameSource> unthrottled_frame_source_; | 446 std::unique_ptr<TestSyntheticBeginFrameSource> synthetic_frame_source_; |
| 447 std::unique_ptr<TestBackToBackBeginFrameSource> unthrottled_frame_source_; |
445 SchedulerSettings scheduler_settings_; | 448 SchedulerSettings scheduler_settings_; |
446 scoped_ptr<FakeSchedulerClient> client_; | 449 std::unique_ptr<FakeSchedulerClient> client_; |
447 scoped_ptr<TestScheduler> scheduler_; | 450 std::unique_ptr<TestScheduler> scheduler_; |
448 FakeCompositorTimingHistory* fake_compositor_timing_history_; | 451 FakeCompositorTimingHistory* fake_compositor_timing_history_; |
449 }; | 452 }; |
450 | 453 |
451 TEST_F(SchedulerTest, InitializeOutputSurfaceDoesNotBeginImplFrame) { | 454 TEST_F(SchedulerTest, InitializeOutputSurfaceDoesNotBeginImplFrame) { |
452 scheduler_settings_.use_external_begin_frame_source = true; | 455 scheduler_settings_.use_external_begin_frame_source = true; |
453 SetUpScheduler(false); | 456 SetUpScheduler(false); |
454 scheduler_->SetVisible(true); | 457 scheduler_->SetVisible(true); |
455 scheduler_->SetCanDraw(true); | 458 scheduler_->SetCanDraw(true); |
456 | 459 |
457 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_); | 460 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_); |
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
777 }; | 780 }; |
778 | 781 |
779 // Tests for two different situations: | 782 // Tests for two different situations: |
780 // 1. the scheduler dropping SetNeedsRedraw requests that happen inside | 783 // 1. the scheduler dropping SetNeedsRedraw requests that happen inside |
781 // a ScheduledActionDrawAndSwap | 784 // a ScheduledActionDrawAndSwap |
782 // 2. the scheduler drawing twice inside a single tick | 785 // 2. the scheduler drawing twice inside a single tick |
783 TEST_F(SchedulerTest, RequestRedrawInsideDraw) { | 786 TEST_F(SchedulerTest, RequestRedrawInsideDraw) { |
784 SchedulerClientThatsetNeedsDrawInsideDraw* client = | 787 SchedulerClientThatsetNeedsDrawInsideDraw* client = |
785 new SchedulerClientThatsetNeedsDrawInsideDraw; | 788 new SchedulerClientThatsetNeedsDrawInsideDraw; |
786 scheduler_settings_.use_external_begin_frame_source = true; | 789 scheduler_settings_.use_external_begin_frame_source = true; |
787 SetUpScheduler(make_scoped_ptr(client), true); | 790 SetUpScheduler(base::WrapUnique(client), true); |
788 client->SetRequestRedrawsInsideDraw(true); | 791 client->SetRequestRedrawsInsideDraw(true); |
789 | 792 |
790 scheduler_->SetNeedsRedraw(); | 793 scheduler_->SetNeedsRedraw(); |
791 EXPECT_TRUE(scheduler_->RedrawPending()); | 794 EXPECT_TRUE(scheduler_->RedrawPending()); |
792 EXPECT_TRUE(client->needs_begin_frames()); | 795 EXPECT_TRUE(client->needs_begin_frames()); |
793 EXPECT_EQ(0, client->num_draws()); | 796 EXPECT_EQ(0, client->num_draws()); |
794 | 797 |
795 EXPECT_SCOPED(AdvanceFrame()); | 798 EXPECT_SCOPED(AdvanceFrame()); |
796 task_runner().RunPendingTasks(); // Run posted deadline. | 799 task_runner().RunPendingTasks(); // Run posted deadline. |
797 EXPECT_EQ(1, client->num_draws()); | 800 EXPECT_EQ(1, client->num_draws()); |
(...skipping 15 matching lines...) Expand all Loading... |
813 EXPECT_EQ(2, client->num_draws()); | 816 EXPECT_EQ(2, client->num_draws()); |
814 EXPECT_FALSE(scheduler_->RedrawPending()); | 817 EXPECT_FALSE(scheduler_->RedrawPending()); |
815 EXPECT_FALSE(client->needs_begin_frames()); | 818 EXPECT_FALSE(client->needs_begin_frames()); |
816 } | 819 } |
817 | 820 |
818 // Test that requesting redraw inside a failed draw doesn't lose the request. | 821 // Test that requesting redraw inside a failed draw doesn't lose the request. |
819 TEST_F(SchedulerTest, RequestRedrawInsideFailedDraw) { | 822 TEST_F(SchedulerTest, RequestRedrawInsideFailedDraw) { |
820 SchedulerClientThatsetNeedsDrawInsideDraw* client = | 823 SchedulerClientThatsetNeedsDrawInsideDraw* client = |
821 new SchedulerClientThatsetNeedsDrawInsideDraw; | 824 new SchedulerClientThatsetNeedsDrawInsideDraw; |
822 scheduler_settings_.use_external_begin_frame_source = true; | 825 scheduler_settings_.use_external_begin_frame_source = true; |
823 SetUpScheduler(make_scoped_ptr(client), true); | 826 SetUpScheduler(base::WrapUnique(client), true); |
824 | 827 |
825 client->SetRequestRedrawsInsideDraw(true); | 828 client->SetRequestRedrawsInsideDraw(true); |
826 client->SetDrawWillHappen(false); | 829 client->SetDrawWillHappen(false); |
827 | 830 |
828 scheduler_->SetNeedsRedraw(); | 831 scheduler_->SetNeedsRedraw(); |
829 EXPECT_TRUE(scheduler_->RedrawPending()); | 832 EXPECT_TRUE(scheduler_->RedrawPending()); |
830 EXPECT_TRUE(client->needs_begin_frames()); | 833 EXPECT_TRUE(client->needs_begin_frames()); |
831 EXPECT_EQ(0, client->num_draws()); | 834 EXPECT_EQ(0, client->num_draws()); |
832 | 835 |
833 // Fail the draw. | 836 // Fail the draw. |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
889 bool set_needs_commit_on_next_draw_; | 892 bool set_needs_commit_on_next_draw_; |
890 }; | 893 }; |
891 | 894 |
892 // Tests for the scheduler infinite-looping on SetNeedsBeginMainFrame requests | 895 // Tests for the scheduler infinite-looping on SetNeedsBeginMainFrame requests |
893 // that happen inside a ScheduledActionDrawAndSwap | 896 // that happen inside a ScheduledActionDrawAndSwap |
894 TEST_F(SchedulerTest, RequestCommitInsideDraw) { | 897 TEST_F(SchedulerTest, RequestCommitInsideDraw) { |
895 SchedulerClientThatSetNeedsBeginMainFrameInsideDraw* client = | 898 SchedulerClientThatSetNeedsBeginMainFrameInsideDraw* client = |
896 new SchedulerClientThatSetNeedsBeginMainFrameInsideDraw; | 899 new SchedulerClientThatSetNeedsBeginMainFrameInsideDraw; |
897 | 900 |
898 scheduler_settings_.use_external_begin_frame_source = true; | 901 scheduler_settings_.use_external_begin_frame_source = true; |
899 SetUpScheduler(make_scoped_ptr(client), true); | 902 SetUpScheduler(base::WrapUnique(client), true); |
900 | 903 |
901 EXPECT_FALSE(client->needs_begin_frames()); | 904 EXPECT_FALSE(client->needs_begin_frames()); |
902 scheduler_->SetNeedsRedraw(); | 905 scheduler_->SetNeedsRedraw(); |
903 EXPECT_TRUE(scheduler_->RedrawPending()); | 906 EXPECT_TRUE(scheduler_->RedrawPending()); |
904 EXPECT_EQ(0, client->num_draws()); | 907 EXPECT_EQ(0, client->num_draws()); |
905 EXPECT_TRUE(client->needs_begin_frames()); | 908 EXPECT_TRUE(client->needs_begin_frames()); |
906 | 909 |
907 client->SetNeedsBeginMainFrameOnNextDraw(); | 910 client->SetNeedsBeginMainFrameOnNextDraw(); |
908 EXPECT_SCOPED(AdvanceFrame()); | 911 EXPECT_SCOPED(AdvanceFrame()); |
909 client->SetNeedsBeginMainFrameOnNextDraw(); | 912 client->SetNeedsBeginMainFrameOnNextDraw(); |
(...skipping 21 matching lines...) Expand all Loading... |
931 EXPECT_FALSE(scheduler_->RedrawPending()); | 934 EXPECT_FALSE(scheduler_->RedrawPending()); |
932 EXPECT_FALSE(scheduler_->CommitPending()); | 935 EXPECT_FALSE(scheduler_->CommitPending()); |
933 EXPECT_FALSE(client->needs_begin_frames()); | 936 EXPECT_FALSE(client->needs_begin_frames()); |
934 } | 937 } |
935 | 938 |
936 // Tests that when a draw fails then the pending commit should not be dropped. | 939 // Tests that when a draw fails then the pending commit should not be dropped. |
937 TEST_F(SchedulerTest, RequestCommitInsideFailedDraw) { | 940 TEST_F(SchedulerTest, RequestCommitInsideFailedDraw) { |
938 SchedulerClientThatsetNeedsDrawInsideDraw* client = | 941 SchedulerClientThatsetNeedsDrawInsideDraw* client = |
939 new SchedulerClientThatsetNeedsDrawInsideDraw; | 942 new SchedulerClientThatsetNeedsDrawInsideDraw; |
940 scheduler_settings_.use_external_begin_frame_source = true; | 943 scheduler_settings_.use_external_begin_frame_source = true; |
941 SetUpScheduler(make_scoped_ptr(client), true); | 944 SetUpScheduler(base::WrapUnique(client), true); |
942 | 945 |
943 client->SetDrawWillHappen(false); | 946 client->SetDrawWillHappen(false); |
944 | 947 |
945 scheduler_->SetNeedsRedraw(); | 948 scheduler_->SetNeedsRedraw(); |
946 EXPECT_TRUE(scheduler_->RedrawPending()); | 949 EXPECT_TRUE(scheduler_->RedrawPending()); |
947 EXPECT_TRUE(client->needs_begin_frames()); | 950 EXPECT_TRUE(client->needs_begin_frames()); |
948 EXPECT_EQ(0, client->num_draws()); | 951 EXPECT_EQ(0, client->num_draws()); |
949 | 952 |
950 // Fail the draw. | 953 // Fail the draw. |
951 EXPECT_SCOPED(AdvanceFrame()); | 954 EXPECT_SCOPED(AdvanceFrame()); |
(...skipping 22 matching lines...) Expand all Loading... |
974 EXPECT_EQ(3, client->num_draws()); | 977 EXPECT_EQ(3, client->num_draws()); |
975 EXPECT_TRUE(scheduler_->CommitPending()); | 978 EXPECT_TRUE(scheduler_->CommitPending()); |
976 EXPECT_FALSE(scheduler_->RedrawPending()); | 979 EXPECT_FALSE(scheduler_->RedrawPending()); |
977 EXPECT_TRUE(client->needs_begin_frames()); | 980 EXPECT_TRUE(client->needs_begin_frames()); |
978 } | 981 } |
979 | 982 |
980 TEST_F(SchedulerTest, NoSwapWhenDrawFails) { | 983 TEST_F(SchedulerTest, NoSwapWhenDrawFails) { |
981 SchedulerClientThatSetNeedsBeginMainFrameInsideDraw* client = | 984 SchedulerClientThatSetNeedsBeginMainFrameInsideDraw* client = |
982 new SchedulerClientThatSetNeedsBeginMainFrameInsideDraw; | 985 new SchedulerClientThatSetNeedsBeginMainFrameInsideDraw; |
983 scheduler_settings_.use_external_begin_frame_source = true; | 986 scheduler_settings_.use_external_begin_frame_source = true; |
984 SetUpScheduler(make_scoped_ptr(client), true); | 987 SetUpScheduler(base::WrapUnique(client), true); |
985 | 988 |
986 scheduler_->SetNeedsRedraw(); | 989 scheduler_->SetNeedsRedraw(); |
987 EXPECT_TRUE(scheduler_->RedrawPending()); | 990 EXPECT_TRUE(scheduler_->RedrawPending()); |
988 EXPECT_TRUE(client->needs_begin_frames()); | 991 EXPECT_TRUE(client->needs_begin_frames()); |
989 EXPECT_EQ(0, client->num_draws()); | 992 EXPECT_EQ(0, client->num_draws()); |
990 | 993 |
991 // Draw successfully, this starts a new frame. | 994 // Draw successfully, this starts a new frame. |
992 client->SetNeedsBeginMainFrameOnNextDraw(); | 995 client->SetNeedsBeginMainFrameOnNextDraw(); |
993 EXPECT_SCOPED(AdvanceFrame()); | 996 EXPECT_SCOPED(AdvanceFrame()); |
994 task_runner().RunPendingTasks(); // Run posted deadline. | 997 task_runner().RunPendingTasks(); // Run posted deadline. |
(...skipping 17 matching lines...) Expand all Loading... |
1012 scheduler_->SetNeedsPrepareTiles(); | 1015 scheduler_->SetNeedsPrepareTiles(); |
1013 return FakeSchedulerClient::ScheduledActionDrawAndSwapIfPossible(); | 1016 return FakeSchedulerClient::ScheduledActionDrawAndSwapIfPossible(); |
1014 } | 1017 } |
1015 }; | 1018 }; |
1016 | 1019 |
1017 // Test prepare tiles is independant of draws. | 1020 // Test prepare tiles is independant of draws. |
1018 TEST_F(SchedulerTest, PrepareTiles) { | 1021 TEST_F(SchedulerTest, PrepareTiles) { |
1019 SchedulerClientNeedsPrepareTilesInDraw* client = | 1022 SchedulerClientNeedsPrepareTilesInDraw* client = |
1020 new SchedulerClientNeedsPrepareTilesInDraw; | 1023 new SchedulerClientNeedsPrepareTilesInDraw; |
1021 scheduler_settings_.use_external_begin_frame_source = true; | 1024 scheduler_settings_.use_external_begin_frame_source = true; |
1022 SetUpScheduler(make_scoped_ptr(client), true); | 1025 SetUpScheduler(base::WrapUnique(client), true); |
1023 | 1026 |
1024 // Request both draw and prepare tiles. PrepareTiles shouldn't | 1027 // Request both draw and prepare tiles. PrepareTiles shouldn't |
1025 // be trigged until BeginImplFrame. | 1028 // be trigged until BeginImplFrame. |
1026 client->Reset(); | 1029 client->Reset(); |
1027 scheduler_->SetNeedsPrepareTiles(); | 1030 scheduler_->SetNeedsPrepareTiles(); |
1028 scheduler_->SetNeedsRedraw(); | 1031 scheduler_->SetNeedsRedraw(); |
1029 EXPECT_TRUE(scheduler_->RedrawPending()); | 1032 EXPECT_TRUE(scheduler_->RedrawPending()); |
1030 EXPECT_TRUE(scheduler_->PrepareTilesPending()); | 1033 EXPECT_TRUE(scheduler_->PrepareTilesPending()); |
1031 EXPECT_TRUE(client->needs_begin_frames()); | 1034 EXPECT_TRUE(client->needs_begin_frames()); |
1032 EXPECT_EQ(0, client->num_draws()); | 1035 EXPECT_EQ(0, client->num_draws()); |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1222 EXPECT_TRUE(client_->HasAction("ScheduledActionDrawAndSwapIfPossible")); | 1225 EXPECT_TRUE(client_->HasAction("ScheduledActionDrawAndSwapIfPossible")); |
1223 EXPECT_TRUE(client_->HasAction("ScheduledActionPrepareTiles")); | 1226 EXPECT_TRUE(client_->HasAction("ScheduledActionPrepareTiles")); |
1224 EXPECT_LT(client_->ActionIndex("ScheduledActionDrawAndSwapIfPossible"), | 1227 EXPECT_LT(client_->ActionIndex("ScheduledActionDrawAndSwapIfPossible"), |
1225 client_->ActionIndex("ScheduledActionPrepareTiles")); | 1228 client_->ActionIndex("ScheduledActionPrepareTiles")); |
1226 EXPECT_FALSE(scheduler_->RedrawPending()); | 1229 EXPECT_FALSE(scheduler_->RedrawPending()); |
1227 EXPECT_FALSE(scheduler_->PrepareTilesPending()); | 1230 EXPECT_FALSE(scheduler_->PrepareTilesPending()); |
1228 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); | 1231 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
1229 } | 1232 } |
1230 | 1233 |
1231 TEST_F(SchedulerTest, PrepareTilesFunnelResetOnVisibilityChange) { | 1234 TEST_F(SchedulerTest, PrepareTilesFunnelResetOnVisibilityChange) { |
1232 scoped_ptr<SchedulerClientNeedsPrepareTilesInDraw> client = | 1235 std::unique_ptr<SchedulerClientNeedsPrepareTilesInDraw> client = |
1233 make_scoped_ptr(new SchedulerClientNeedsPrepareTilesInDraw); | 1236 base::WrapUnique(new SchedulerClientNeedsPrepareTilesInDraw); |
1234 scheduler_settings_.use_external_begin_frame_source = true; | 1237 scheduler_settings_.use_external_begin_frame_source = true; |
1235 SetUpScheduler(std::move(client), true); | 1238 SetUpScheduler(std::move(client), true); |
1236 | 1239 |
1237 // Simulate a few visibility changes and associated PrepareTiles. | 1240 // Simulate a few visibility changes and associated PrepareTiles. |
1238 for (int i = 0; i < 10; i++) { | 1241 for (int i = 0; i < 10; i++) { |
1239 scheduler_->SetVisible(false); | 1242 scheduler_->SetVisible(false); |
1240 scheduler_->WillPrepareTiles(); | 1243 scheduler_->WillPrepareTiles(); |
1241 scheduler_->DidPrepareTiles(); | 1244 scheduler_->DidPrepareTiles(); |
1242 | 1245 |
1243 scheduler_->SetVisible(true); | 1246 scheduler_->SetVisible(true); |
(...skipping 14 matching lines...) Expand all Loading... |
1258 task_runner().RunTasksWhile(client_->ImplFrameDeadlinePending(true)); | 1261 task_runner().RunTasksWhile(client_->ImplFrameDeadlinePending(true)); |
1259 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); | 1262 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
1260 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 2); | 1263 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 2); |
1261 EXPECT_ACTION("ScheduledActionPrepareTiles", client_, 1, 2); | 1264 EXPECT_ACTION("ScheduledActionPrepareTiles", client_, 1, 2); |
1262 } | 1265 } |
1263 | 1266 |
1264 TEST_F(SchedulerTest, TriggerBeginFrameDeadlineEarly) { | 1267 TEST_F(SchedulerTest, TriggerBeginFrameDeadlineEarly) { |
1265 SchedulerClientNeedsPrepareTilesInDraw* client = | 1268 SchedulerClientNeedsPrepareTilesInDraw* client = |
1266 new SchedulerClientNeedsPrepareTilesInDraw; | 1269 new SchedulerClientNeedsPrepareTilesInDraw; |
1267 scheduler_settings_.use_external_begin_frame_source = true; | 1270 scheduler_settings_.use_external_begin_frame_source = true; |
1268 SetUpScheduler(make_scoped_ptr(client), true); | 1271 SetUpScheduler(base::WrapUnique(client), true); |
1269 | 1272 |
1270 scheduler_->SetNeedsRedraw(); | 1273 scheduler_->SetNeedsRedraw(); |
1271 EXPECT_SCOPED(AdvanceFrame()); | 1274 EXPECT_SCOPED(AdvanceFrame()); |
1272 | 1275 |
1273 // The deadline should be zero since there is no work other than drawing | 1276 // The deadline should be zero since there is no work other than drawing |
1274 // pending. | 1277 // pending. |
1275 EXPECT_EQ(base::TimeTicks(), client->posted_begin_impl_frame_deadline()); | 1278 EXPECT_EQ(base::TimeTicks(), client->posted_begin_impl_frame_deadline()); |
1276 } | 1279 } |
1277 | 1280 |
1278 TEST_F(SchedulerTest, WaitForReadyToDrawDoNotPostDeadline) { | 1281 TEST_F(SchedulerTest, WaitForReadyToDrawDoNotPostDeadline) { |
1279 SchedulerClientNeedsPrepareTilesInDraw* client = | 1282 SchedulerClientNeedsPrepareTilesInDraw* client = |
1280 new SchedulerClientNeedsPrepareTilesInDraw; | 1283 new SchedulerClientNeedsPrepareTilesInDraw; |
1281 scheduler_settings_.use_external_begin_frame_source = true; | 1284 scheduler_settings_.use_external_begin_frame_source = true; |
1282 scheduler_settings_.commit_to_active_tree = true; | 1285 scheduler_settings_.commit_to_active_tree = true; |
1283 SetUpScheduler(make_scoped_ptr(client), true); | 1286 SetUpScheduler(base::WrapUnique(client), true); |
1284 | 1287 |
1285 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame. | 1288 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame. |
1286 scheduler_->SetNeedsBeginMainFrame(); | 1289 scheduler_->SetNeedsBeginMainFrame(); |
1287 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); | 1290 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); |
1288 client_->Reset(); | 1291 client_->Reset(); |
1289 | 1292 |
1290 // Begin new frame. | 1293 // Begin new frame. |
1291 EXPECT_SCOPED(AdvanceFrame()); | 1294 EXPECT_SCOPED(AdvanceFrame()); |
1292 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); | 1295 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); |
1293 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); | 1296 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
(...skipping 19 matching lines...) Expand all Loading... |
1313 task_runner().RunPendingTasks(); // Run posted deadline. | 1316 task_runner().RunPendingTasks(); // Run posted deadline. |
1314 EXPECT_EQ(1, client_->num_draws()); | 1317 EXPECT_EQ(1, client_->num_draws()); |
1315 EXPECT_TRUE(client_->HasAction("ScheduledActionDrawAndSwapIfPossible")); | 1318 EXPECT_TRUE(client_->HasAction("ScheduledActionDrawAndSwapIfPossible")); |
1316 } | 1319 } |
1317 | 1320 |
1318 TEST_F(SchedulerTest, WaitForReadyToDrawCancelledWhenLostOutputSurface) { | 1321 TEST_F(SchedulerTest, WaitForReadyToDrawCancelledWhenLostOutputSurface) { |
1319 SchedulerClientNeedsPrepareTilesInDraw* client = | 1322 SchedulerClientNeedsPrepareTilesInDraw* client = |
1320 new SchedulerClientNeedsPrepareTilesInDraw; | 1323 new SchedulerClientNeedsPrepareTilesInDraw; |
1321 scheduler_settings_.use_external_begin_frame_source = true; | 1324 scheduler_settings_.use_external_begin_frame_source = true; |
1322 scheduler_settings_.commit_to_active_tree = true; | 1325 scheduler_settings_.commit_to_active_tree = true; |
1323 SetUpScheduler(make_scoped_ptr(client), true); | 1326 SetUpScheduler(base::WrapUnique(client), true); |
1324 | 1327 |
1325 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame. | 1328 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame. |
1326 scheduler_->SetNeedsBeginMainFrame(); | 1329 scheduler_->SetNeedsBeginMainFrame(); |
1327 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); | 1330 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); |
1328 client_->Reset(); | 1331 client_->Reset(); |
1329 | 1332 |
1330 // Begin new frame. | 1333 // Begin new frame. |
1331 EXPECT_SCOPED(AdvanceFrame()); | 1334 EXPECT_SCOPED(AdvanceFrame()); |
1332 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); | 1335 scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); |
1333 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); | 1336 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
(...skipping 2203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3537 DrawResult ScheduledActionDrawAndSwapIfPossible() override { | 3540 DrawResult ScheduledActionDrawAndSwapIfPossible() override { |
3538 scheduler_->SetNeedsPrepareTiles(); | 3541 scheduler_->SetNeedsPrepareTiles(); |
3539 return FakeSchedulerClient::ScheduledActionDrawAndSwapIfPossible(); | 3542 return FakeSchedulerClient::ScheduledActionDrawAndSwapIfPossible(); |
3540 } | 3543 } |
3541 }; | 3544 }; |
3542 | 3545 |
3543 TEST_F(SchedulerTest, SynchronousCompositorPrepareTilesOnDraw) { | 3546 TEST_F(SchedulerTest, SynchronousCompositorPrepareTilesOnDraw) { |
3544 scheduler_settings_.using_synchronous_renderer_compositor = true; | 3547 scheduler_settings_.using_synchronous_renderer_compositor = true; |
3545 scheduler_settings_.use_external_begin_frame_source = true; | 3548 scheduler_settings_.use_external_begin_frame_source = true; |
3546 | 3549 |
3547 scoped_ptr<FakeSchedulerClient> client = | 3550 std::unique_ptr<FakeSchedulerClient> client = |
3548 make_scoped_ptr(new SchedulerClientSetNeedsPrepareTilesOnDraw); | 3551 base::WrapUnique(new SchedulerClientSetNeedsPrepareTilesOnDraw); |
3549 SetUpScheduler(std::move(client), true); | 3552 SetUpScheduler(std::move(client), true); |
3550 | 3553 |
3551 scheduler_->SetNeedsRedraw(); | 3554 scheduler_->SetNeedsRedraw(); |
3552 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); | 3555 EXPECT_SINGLE_ACTION("AddObserver(this)", client_); |
3553 client_->Reset(); | 3556 client_->Reset(); |
3554 | 3557 |
3555 // Next vsync. | 3558 // Next vsync. |
3556 EXPECT_SCOPED(AdvanceFrame()); | 3559 EXPECT_SCOPED(AdvanceFrame()); |
3557 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); | 3560 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
3558 EXPECT_ACTION("ScheduledActionInvalidateOutputSurface", client_, 1, 2); | 3561 EXPECT_ACTION("ScheduledActionInvalidateOutputSurface", client_, 1, 2); |
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3850 } | 3853 } |
3851 | 3854 |
3852 TEST_F(SchedulerTest, BeginMainFrameOnCriticalPath_AHS) { | 3855 TEST_F(SchedulerTest, BeginMainFrameOnCriticalPath_AHS) { |
3853 EXPECT_FALSE(BeginMainFrameOnCriticalPath( | 3856 EXPECT_FALSE(BeginMainFrameOnCriticalPath( |
3854 SMOOTHNESS_TAKES_PRIORITY, | 3857 SMOOTHNESS_TAKES_PRIORITY, |
3855 ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, kSlowDuration)); | 3858 ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, kSlowDuration)); |
3856 } | 3859 } |
3857 | 3860 |
3858 } // namespace | 3861 } // namespace |
3859 } // namespace cc | 3862 } // namespace cc |
OLD | NEW |