| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 #include "cc/scheduler/scheduler.h" | 4 #include "cc/scheduler/scheduler.h" |
| 5 | 5 |
| 6 #include <string> | 6 #include <string> |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 actions_.clear(); | 107 actions_.clear(); |
| 108 states_.clear(); | 108 states_.clear(); |
| 109 draw_will_happen_ = true; | 109 draw_will_happen_ = true; |
| 110 swap_will_happen_if_draw_happens_ = true; | 110 swap_will_happen_if_draw_happens_ = true; |
| 111 num_draws_ = 0; | 111 num_draws_ = 0; |
| 112 log_anticipated_draw_time_change_ = false; | 112 log_anticipated_draw_time_change_ = false; |
| 113 } | 113 } |
| 114 | 114 |
| 115 TestScheduler* CreateScheduler(const SchedulerSettings& settings) { | 115 TestScheduler* CreateScheduler(const SchedulerSettings& settings) { |
| 116 scoped_ptr<FakeExternalBeginFrameSource> fake_external_begin_frame_source; | 116 scoped_ptr<FakeExternalBeginFrameSource> fake_external_begin_frame_source; |
| 117 if (settings.begin_frame_scheduling_enabled && | 117 if (settings.begin_frame_receiver && settings.throttle_frame_production) { |
| 118 settings.throttle_frame_production) { | |
| 119 fake_external_begin_frame_source.reset( | 118 fake_external_begin_frame_source.reset( |
| 120 new FakeExternalBeginFrameSource(this)); | 119 new FakeExternalBeginFrameSource(this)); |
| 121 fake_external_begin_frame_source_ = | 120 fake_external_begin_frame_source_ = |
| 122 fake_external_begin_frame_source.get(); | 121 fake_external_begin_frame_source.get(); |
| 123 } | 122 } |
| 124 scheduler_ = TestScheduler::Create(now_src_, | 123 scheduler_ = TestScheduler::Create(now_src_, |
| 125 this, | 124 this, |
| 126 settings, | 125 settings, |
| 127 0, | 126 0, |
| 128 task_runner_, | 127 task_runner_, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 143 } | 142 } |
| 144 int num_draws() const { return num_draws_; } | 143 int num_draws() const { return num_draws_; } |
| 145 int num_actions_() const { return static_cast<int>(actions_.size()); } | 144 int num_actions_() const { return static_cast<int>(actions_.size()); } |
| 146 const char* Action(int i) const { return actions_[i]; } | 145 const char* Action(int i) const { return actions_[i]; } |
| 147 std::string StateForAction(int i) const { return states_[i]->ToString(); } | 146 std::string StateForAction(int i) const { return states_[i]->ToString(); } |
| 148 base::TimeTicks posted_begin_impl_frame_deadline() const { | 147 base::TimeTicks posted_begin_impl_frame_deadline() const { |
| 149 return posted_begin_impl_frame_deadline_; | 148 return posted_begin_impl_frame_deadline_; |
| 150 } | 149 } |
| 151 | 150 |
| 152 bool ExternalBeginFrame() { | 151 bool ExternalBeginFrame() { |
| 153 return scheduler_->settings().begin_frame_scheduling_enabled && | 152 return scheduler_->settings().begin_frame_receiver && |
| 154 scheduler_->settings().throttle_frame_production; | 153 scheduler_->settings().throttle_frame_production; |
| 155 } | 154 } |
| 156 | 155 |
| 157 FakeExternalBeginFrameSource* ExternalBeginFrameSource() { | 156 FakeExternalBeginFrameSource* ExternalBeginFrameSource() { |
| 158 return fake_external_begin_frame_source_; | 157 return fake_external_begin_frame_source_; |
| 159 } | 158 } |
| 160 | 159 |
| 161 base::PowerMonitor* PowerMonitor() { return &power_monitor_; } | 160 base::PowerMonitor* PowerMonitor() { return &power_monitor_; } |
| 162 | 161 |
| 163 FakePowerMonitorSource* PowerMonitorSource() { | 162 FakePowerMonitorSource* PowerMonitorSource() { |
| (...skipping 1243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1407 EXPECT_TRUE(client.task_runner().RunTasksWhile( | 1406 EXPECT_TRUE(client.task_runner().RunTasksWhile( |
| 1408 client.ImplFrameDeadlinePending(true))); | 1407 client.ImplFrameDeadlinePending(true))); |
| 1409 | 1408 |
| 1410 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); | 1409 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); |
| 1411 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); | 1410 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
| 1412 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1411 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 1413 EXPECT_TRUE(client.needs_begin_frames()); | 1412 EXPECT_TRUE(client.needs_begin_frames()); |
| 1414 client.Reset(); | 1413 client.Reset(); |
| 1415 } | 1414 } |
| 1416 | 1415 |
| 1417 void BeginFramesNotFromClient(bool begin_frame_scheduling_enabled, | 1416 void BeginFramesNotFromClient(bool begin_frame_receiver, |
| 1418 bool throttle_frame_production) { | 1417 bool throttle_frame_production) { |
| 1419 FakeSchedulerClient client; | 1418 FakeSchedulerClient client; |
| 1420 SchedulerSettings scheduler_settings; | 1419 SchedulerSettings scheduler_settings; |
| 1421 scheduler_settings.begin_frame_scheduling_enabled = | 1420 scheduler_settings.begin_frame_receiver = begin_frame_receiver; |
| 1422 begin_frame_scheduling_enabled; | |
| 1423 scheduler_settings.throttle_frame_production = throttle_frame_production; | 1421 scheduler_settings.throttle_frame_production = throttle_frame_production; |
| 1424 TestScheduler* scheduler = client.CreateScheduler(scheduler_settings); | 1422 TestScheduler* scheduler = client.CreateScheduler(scheduler_settings); |
| 1425 scheduler->SetCanStart(); | 1423 scheduler->SetCanStart(); |
| 1426 scheduler->SetVisible(true); | 1424 scheduler->SetVisible(true); |
| 1427 scheduler->SetCanDraw(true); | 1425 scheduler->SetCanDraw(true); |
| 1428 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 1426 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
| 1429 | 1427 |
| 1430 DCHECK(!client.ExternalBeginFrameSource()); | 1428 DCHECK(!client.ExternalBeginFrameSource()); |
| 1431 | 1429 |
| 1432 // SetNeedsCommit should begin the frame on the next BeginImplFrame | 1430 // SetNeedsCommit should begin the frame on the next BeginImplFrame |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1477 client.Reset(); | 1475 client.Reset(); |
| 1478 | 1476 |
| 1479 // Make sure SetNeedsBeginFrame isn't called on the client | 1477 // Make sure SetNeedsBeginFrame isn't called on the client |
| 1480 // when the BeginFrame is no longer needed. | 1478 // when the BeginFrame is no longer needed. |
| 1481 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1479 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1482 EXPECT_NO_ACTION(client); | 1480 EXPECT_NO_ACTION(client); |
| 1483 client.Reset(); | 1481 client.Reset(); |
| 1484 } | 1482 } |
| 1485 | 1483 |
| 1486 TEST(SchedulerTest, SyntheticBeginFrames) { | 1484 TEST(SchedulerTest, SyntheticBeginFrames) { |
| 1487 bool begin_frame_scheduling_enabled = false; | 1485 bool begin_frame_receiver = false; |
| 1488 bool throttle_frame_production = true; | 1486 bool throttle_frame_production = true; |
| 1489 BeginFramesNotFromClient(begin_frame_scheduling_enabled, | 1487 BeginFramesNotFromClient(begin_frame_receiver, throttle_frame_production); |
| 1490 throttle_frame_production); | |
| 1491 } | 1488 } |
| 1492 | 1489 |
| 1493 TEST(SchedulerTest, VSyncThrottlingDisabled) { | 1490 TEST(SchedulerTest, VSyncThrottlingDisabled) { |
| 1494 bool begin_frame_scheduling_enabled = true; | 1491 bool begin_frame_receiver = true; |
| 1495 bool throttle_frame_production = false; | 1492 bool throttle_frame_production = false; |
| 1496 BeginFramesNotFromClient(begin_frame_scheduling_enabled, | 1493 BeginFramesNotFromClient(begin_frame_receiver, throttle_frame_production); |
| 1497 throttle_frame_production); | |
| 1498 } | 1494 } |
| 1499 | 1495 |
| 1500 TEST(SchedulerTest, SyntheticBeginFrames_And_VSyncThrottlingDisabled) { | 1496 TEST(SchedulerTest, SyntheticBeginFrames_And_VSyncThrottlingDisabled) { |
| 1501 bool begin_frame_scheduling_enabled = false; | 1497 bool begin_frame_receiver = false; |
| 1502 bool throttle_frame_production = false; | 1498 bool throttle_frame_production = false; |
| 1503 BeginFramesNotFromClient(begin_frame_scheduling_enabled, | 1499 BeginFramesNotFromClient(begin_frame_receiver, throttle_frame_production); |
| 1504 throttle_frame_production); | |
| 1505 } | 1500 } |
| 1506 | 1501 |
| 1507 void BeginFramesNotFromClient_SwapThrottled(bool begin_frame_scheduling_enabled, | 1502 void BeginFramesNotFromClient_SwapThrottled(bool begin_frame_receiver, |
| 1508 bool throttle_frame_production) { | 1503 bool throttle_frame_production) { |
| 1509 FakeSchedulerClient client; | 1504 FakeSchedulerClient client; |
| 1510 SchedulerSettings scheduler_settings; | 1505 SchedulerSettings scheduler_settings; |
| 1511 scheduler_settings.begin_frame_scheduling_enabled = | 1506 scheduler_settings.begin_frame_receiver = begin_frame_receiver; |
| 1512 begin_frame_scheduling_enabled; | |
| 1513 scheduler_settings.throttle_frame_production = throttle_frame_production; | 1507 scheduler_settings.throttle_frame_production = throttle_frame_production; |
| 1514 TestScheduler* scheduler = client.CreateScheduler(scheduler_settings); | 1508 TestScheduler* scheduler = client.CreateScheduler(scheduler_settings); |
| 1515 scheduler->SetCanStart(); | 1509 scheduler->SetCanStart(); |
| 1516 scheduler->SetVisible(true); | 1510 scheduler->SetVisible(true); |
| 1517 scheduler->SetCanDraw(true); | 1511 scheduler->SetCanDraw(true); |
| 1518 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 1512 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
| 1519 | 1513 |
| 1520 DCHECK(!client.ExternalBeginFrameSource()); | 1514 DCHECK(!client.ExternalBeginFrameSource()); |
| 1521 | 1515 |
| 1522 // To test swap ack throttling, this test disables automatic swap acks. | 1516 // To test swap ack throttling, this test disables automatic swap acks. |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1566 // BeginImplFrame deadline should draw. | 1560 // BeginImplFrame deadline should draw. |
| 1567 scheduler->SetNeedsRedraw(); | 1561 scheduler->SetNeedsRedraw(); |
| 1568 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1562 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1569 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); | 1563 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); |
| 1570 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); | 1564 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
| 1571 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1565 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 1572 client.Reset(); | 1566 client.Reset(); |
| 1573 } | 1567 } |
| 1574 | 1568 |
| 1575 TEST(SchedulerTest, SyntheticBeginFrames_SwapThrottled) { | 1569 TEST(SchedulerTest, SyntheticBeginFrames_SwapThrottled) { |
| 1576 bool begin_frame_scheduling_enabled = false; | 1570 bool begin_frame_receiver = false; |
| 1577 bool throttle_frame_production = true; | 1571 bool throttle_frame_production = true; |
| 1578 BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, | 1572 BeginFramesNotFromClient_SwapThrottled(begin_frame_receiver, |
| 1579 throttle_frame_production); | 1573 throttle_frame_production); |
| 1580 } | 1574 } |
| 1581 | 1575 |
| 1582 TEST(SchedulerTest, VSyncThrottlingDisabled_SwapThrottled) { | 1576 TEST(SchedulerTest, VSyncThrottlingDisabled_SwapThrottled) { |
| 1583 bool begin_frame_scheduling_enabled = true; | 1577 bool begin_frame_receiver = true; |
| 1584 bool throttle_frame_production = false; | 1578 bool throttle_frame_production = false; |
| 1585 BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, | 1579 BeginFramesNotFromClient_SwapThrottled(begin_frame_receiver, |
| 1586 throttle_frame_production); | 1580 throttle_frame_production); |
| 1587 } | 1581 } |
| 1588 | 1582 |
| 1589 TEST(SchedulerTest, | 1583 TEST(SchedulerTest, |
| 1590 SyntheticBeginFrames_And_VSyncThrottlingDisabled_SwapThrottled) { | 1584 SyntheticBeginFrames_And_VSyncThrottlingDisabled_SwapThrottled) { |
| 1591 bool begin_frame_scheduling_enabled = false; | 1585 bool begin_frame_receiver = false; |
| 1592 bool throttle_frame_production = false; | 1586 bool throttle_frame_production = false; |
| 1593 BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, | 1587 BeginFramesNotFromClient_SwapThrottled(begin_frame_receiver, |
| 1594 throttle_frame_production); | 1588 throttle_frame_production); |
| 1595 } | 1589 } |
| 1596 | 1590 |
| 1597 TEST(SchedulerTest, DidLoseOutputSurfaceAfterOutputSurfaceIsInitialized) { | 1591 TEST(SchedulerTest, DidLoseOutputSurfaceAfterOutputSurfaceIsInitialized) { |
| 1598 FakeSchedulerClient client; | 1592 FakeSchedulerClient client; |
| 1599 SchedulerSettings scheduler_settings; | 1593 SchedulerSettings scheduler_settings; |
| 1600 TestScheduler* scheduler = client.CreateScheduler(scheduler_settings); | 1594 TestScheduler* scheduler = client.CreateScheduler(scheduler_settings); |
| 1601 scheduler->SetCanStart(); | 1595 scheduler->SetCanStart(); |
| 1602 scheduler->SetVisible(true); | 1596 scheduler->SetVisible(true); |
| 1603 scheduler->SetCanDraw(true); | 1597 scheduler->SetCanDraw(true); |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1923 // No more BeginRetroFrame because BeginRetroFrame queue is cleared. | 1917 // No more BeginRetroFrame because BeginRetroFrame queue is cleared. |
| 1924 client.Reset(); | 1918 client.Reset(); |
| 1925 client.task_runner().RunPendingTasks(); | 1919 client.task_runner().RunPendingTasks(); |
| 1926 EXPECT_NO_ACTION(client); | 1920 EXPECT_NO_ACTION(client); |
| 1927 } | 1921 } |
| 1928 | 1922 |
| 1929 TEST(SchedulerTest, | 1923 TEST(SchedulerTest, |
| 1930 StopBeginFrameAfterDidLoseOutputSurfaceWithSyntheticBeginFrameSource) { | 1924 StopBeginFrameAfterDidLoseOutputSurfaceWithSyntheticBeginFrameSource) { |
| 1931 FakeSchedulerClient client; | 1925 FakeSchedulerClient client; |
| 1932 SchedulerSettings scheduler_settings; | 1926 SchedulerSettings scheduler_settings; |
| 1933 scheduler_settings.begin_frame_scheduling_enabled = false; | 1927 scheduler_settings.begin_frame_receiver = false; |
| 1934 TestScheduler* scheduler = client.CreateScheduler(scheduler_settings); | 1928 TestScheduler* scheduler = client.CreateScheduler(scheduler_settings); |
| 1935 scheduler->SetCanStart(); | 1929 scheduler->SetCanStart(); |
| 1936 scheduler->SetVisible(true); | 1930 scheduler->SetVisible(true); |
| 1937 scheduler->SetCanDraw(true); | 1931 scheduler->SetCanDraw(true); |
| 1938 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 1932 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
| 1939 | 1933 |
| 1940 // SetNeedsCommit should begin the frame on the next BeginImplFrame. | 1934 // SetNeedsCommit should begin the frame on the next BeginImplFrame. |
| 1941 client.Reset(); | 1935 client.Reset(); |
| 1942 EXPECT_FALSE(scheduler->frame_source().NeedsBeginFrames()); | 1936 EXPECT_FALSE(scheduler->frame_source().NeedsBeginFrames()); |
| 1943 scheduler->SetNeedsCommit(); | 1937 scheduler->SetNeedsCommit(); |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2145 | 2139 |
| 2146 // Deadline task is pending | 2140 // Deadline task is pending |
| 2147 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 2141 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 2148 client.task_runner().RunPendingTasks(); | 2142 client.task_runner().RunPendingTasks(); |
| 2149 // Deadline task runs immediately | 2143 // Deadline task runs immediately |
| 2150 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 2144 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 2151 } | 2145 } |
| 2152 | 2146 |
| 2153 } // namespace | 2147 } // namespace |
| 2154 } // namespace cc | 2148 } // namespace cc |
| OLD | NEW |