| 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 "config.h" | 5 #include "config.h" |
| 6 | 6 |
| 7 #include "CCFrameRateController.h" | 7 #include "CCFrameRateController.h" |
| 8 | 8 |
| 9 #include "cc/test/scheduler_test_common.h" | 9 #include "cc/test/scheduler_test_common.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
| 11 | 11 |
| 12 using namespace cc; | 12 using namespace cc; |
| 13 using namespace WebKitTests; | 13 using namespace WebKitTests; |
| 14 | 14 |
| 15 namespace { | 15 namespace { |
| 16 | 16 |
| 17 class FakeCCFrameRateControllerClient : public cc::CCFrameRateControllerClient { | 17 class FakeFrameRateControllerClient : public cc::FrameRateControllerClient { |
| 18 public: | 18 public: |
| 19 FakeCCFrameRateControllerClient() { reset(); } | 19 FakeFrameRateControllerClient() { reset(); } |
| 20 | 20 |
| 21 void reset() { m_vsyncTicked = false; } | 21 void reset() { m_vsyncTicked = false; } |
| 22 bool vsyncTicked() const { return m_vsyncTicked; } | 22 bool vsyncTicked() const { return m_vsyncTicked; } |
| 23 | 23 |
| 24 virtual void vsyncTick(bool throttled) { m_vsyncTicked = !throttled; } | 24 virtual void vsyncTick(bool throttled) { m_vsyncTicked = !throttled; } |
| 25 | 25 |
| 26 protected: | 26 protected: |
| 27 bool m_vsyncTicked; | 27 bool m_vsyncTicked; |
| 28 }; | 28 }; |
| 29 | 29 |
| 30 | 30 |
| 31 TEST(CCFrameRateControllerTest, TestFrameThrottling_ImmediateAck) | 31 TEST(FrameRateControllerTest, TestFrameThrottling_ImmediateAck) |
| 32 { | 32 { |
| 33 FakeCCThread thread; | 33 FakeThread thread; |
| 34 FakeCCFrameRateControllerClient client; | 34 FakeFrameRateControllerClient client; |
| 35 base::TimeDelta interval = base::TimeDelta::FromMicroseconds(base::Time::kMi
crosecondsPerSecond / 60); | 35 base::TimeDelta interval = base::TimeDelta::FromMicroseconds(base::Time::kMi
crosecondsPerSecond / 60); |
| 36 scoped_refptr<FakeCCDelayBasedTimeSource> timeSource = FakeCCDelayBasedTimeS
ource::create(interval, &thread); | 36 scoped_refptr<FakeDelayBasedTimeSource> timeSource = FakeDelayBasedTimeSourc
e::create(interval, &thread); |
| 37 CCFrameRateController controller(timeSource); | 37 FrameRateController controller(timeSource); |
| 38 | 38 |
| 39 controller.setClient(&client); | 39 controller.setClient(&client); |
| 40 controller.setActive(true); | 40 controller.setActive(true); |
| 41 | 41 |
| 42 base::TimeTicks elapsed; // Muck around with time a bit | 42 base::TimeTicks elapsed; // Muck around with time a bit |
| 43 | 43 |
| 44 // Trigger one frame, make sure the vsync callback is called | 44 // Trigger one frame, make sure the vsync callback is called |
| 45 elapsed += base::TimeDelta::FromMilliseconds(thread.pendingDelayMs()); | 45 elapsed += base::TimeDelta::FromMilliseconds(thread.pendingDelayMs()); |
| 46 timeSource->setNow(elapsed); | 46 timeSource->setNow(elapsed); |
| 47 thread.runPendingTask(); | 47 thread.runPendingTask(); |
| 48 EXPECT_TRUE(client.vsyncTicked()); | 48 EXPECT_TRUE(client.vsyncTicked()); |
| 49 client.reset(); | 49 client.reset(); |
| 50 | 50 |
| 51 // Tell the controller we drew | 51 // Tell the controller we drew |
| 52 controller.didBeginFrame(); | 52 controller.didBeginFrame(); |
| 53 | 53 |
| 54 // Tell the controller the frame ended 5ms later | 54 // Tell the controller the frame ended 5ms later |
| 55 timeSource->setNow(timeSource->now() + base::TimeDelta::FromMilliseconds(5))
; | 55 timeSource->setNow(timeSource->now() + base::TimeDelta::FromMilliseconds(5))
; |
| 56 controller.didFinishFrame(); | 56 controller.didFinishFrame(); |
| 57 | 57 |
| 58 // Trigger another frame, make sure vsync runs again | 58 // Trigger another frame, make sure vsync runs again |
| 59 elapsed += base::TimeDelta::FromMilliseconds(thread.pendingDelayMs()); | 59 elapsed += base::TimeDelta::FromMilliseconds(thread.pendingDelayMs()); |
| 60 EXPECT_TRUE(elapsed >= timeSource->now()); // Sanity check that previous cod
e didn't move time backward. | 60 EXPECT_TRUE(elapsed >= timeSource->now()); // Sanity check that previous cod
e didn't move time backward. |
| 61 timeSource->setNow(elapsed); | 61 timeSource->setNow(elapsed); |
| 62 thread.runPendingTask(); | 62 thread.runPendingTask(); |
| 63 EXPECT_TRUE(client.vsyncTicked()); | 63 EXPECT_TRUE(client.vsyncTicked()); |
| 64 } | 64 } |
| 65 | 65 |
| 66 TEST(CCFrameRateControllerTest, TestFrameThrottling_TwoFramesInFlight) | 66 TEST(FrameRateControllerTest, TestFrameThrottling_TwoFramesInFlight) |
| 67 { | 67 { |
| 68 FakeCCThread thread; | 68 FakeThread thread; |
| 69 FakeCCFrameRateControllerClient client; | 69 FakeFrameRateControllerClient client; |
| 70 base::TimeDelta interval = base::TimeDelta::FromMicroseconds(base::Time::kMi
crosecondsPerSecond / 60); | 70 base::TimeDelta interval = base::TimeDelta::FromMicroseconds(base::Time::kMi
crosecondsPerSecond / 60); |
| 71 scoped_refptr<FakeCCDelayBasedTimeSource> timeSource = FakeCCDelayBasedTimeS
ource::create(interval, &thread); | 71 scoped_refptr<FakeDelayBasedTimeSource> timeSource = FakeDelayBasedTimeSourc
e::create(interval, &thread); |
| 72 CCFrameRateController controller(timeSource); | 72 FrameRateController controller(timeSource); |
| 73 | 73 |
| 74 controller.setClient(&client); | 74 controller.setClient(&client); |
| 75 controller.setActive(true); | 75 controller.setActive(true); |
| 76 controller.setMaxFramesPending(2); | 76 controller.setMaxFramesPending(2); |
| 77 | 77 |
| 78 base::TimeTicks elapsed; // Muck around with time a bit | 78 base::TimeTicks elapsed; // Muck around with time a bit |
| 79 | 79 |
| 80 // Trigger one frame, make sure the vsync callback is called | 80 // Trigger one frame, make sure the vsync callback is called |
| 81 elapsed += base::TimeDelta::FromMilliseconds(thread.pendingDelayMs()); | 81 elapsed += base::TimeDelta::FromMilliseconds(thread.pendingDelayMs()); |
| 82 timeSource->setNow(elapsed); | 82 timeSource->setNow(elapsed); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 113 EXPECT_FALSE(client.vsyncTicked()); | 113 EXPECT_FALSE(client.vsyncTicked()); |
| 114 | 114 |
| 115 // Trigger yet another frame. Since one frames is pending, another vsync cal
lback should run. | 115 // Trigger yet another frame. Since one frames is pending, another vsync cal
lback should run. |
| 116 elapsed += base::TimeDelta::FromMilliseconds(thread.pendingDelayMs()); | 116 elapsed += base::TimeDelta::FromMilliseconds(thread.pendingDelayMs()); |
| 117 EXPECT_TRUE(elapsed >= timeSource->now()); // Sanity check that previous cod
e didn't move time backward. | 117 EXPECT_TRUE(elapsed >= timeSource->now()); // Sanity check that previous cod
e didn't move time backward. |
| 118 timeSource->setNow(elapsed); | 118 timeSource->setNow(elapsed); |
| 119 thread.runPendingTask(); | 119 thread.runPendingTask(); |
| 120 EXPECT_TRUE(client.vsyncTicked()); | 120 EXPECT_TRUE(client.vsyncTicked()); |
| 121 } | 121 } |
| 122 | 122 |
| 123 TEST(CCFrameRateControllerTest, TestFrameThrottling_Unthrottled) | 123 TEST(FrameRateControllerTest, TestFrameThrottling_Unthrottled) |
| 124 { | 124 { |
| 125 FakeCCThread thread; | 125 FakeThread thread; |
| 126 FakeCCFrameRateControllerClient client; | 126 FakeFrameRateControllerClient client; |
| 127 CCFrameRateController controller(&thread); | 127 FrameRateController controller(&thread); |
| 128 | 128 |
| 129 controller.setClient(&client); | 129 controller.setClient(&client); |
| 130 controller.setMaxFramesPending(2); | 130 controller.setMaxFramesPending(2); |
| 131 | 131 |
| 132 // setActive triggers 1st frame, make sure the vsync callback is called | 132 // setActive triggers 1st frame, make sure the vsync callback is called |
| 133 controller.setActive(true); | 133 controller.setActive(true); |
| 134 thread.runPendingTask(); | 134 thread.runPendingTask(); |
| 135 EXPECT_TRUE(client.vsyncTicked()); | 135 EXPECT_TRUE(client.vsyncTicked()); |
| 136 client.reset(); | 136 client.reset(); |
| 137 | 137 |
| 138 // Even if we don't call didBeginFrame, CCFrameRateController should | 138 // Even if we don't call didBeginFrame, FrameRateController should |
| 139 // still attempt to vsync tick multiple times until it does result in | 139 // still attempt to vsync tick multiple times until it does result in |
| 140 // a didBeginFrame. | 140 // a didBeginFrame. |
| 141 thread.runPendingTask(); | 141 thread.runPendingTask(); |
| 142 EXPECT_TRUE(client.vsyncTicked()); | 142 EXPECT_TRUE(client.vsyncTicked()); |
| 143 client.reset(); | 143 client.reset(); |
| 144 | 144 |
| 145 thread.runPendingTask(); | 145 thread.runPendingTask(); |
| 146 EXPECT_TRUE(client.vsyncTicked()); | 146 EXPECT_TRUE(client.vsyncTicked()); |
| 147 client.reset(); | 147 client.reset(); |
| 148 | 148 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 161 // Make sure there is no pending task since we can't do anything until we re
ceive a didFinishFrame anyway. | 161 // Make sure there is no pending task since we can't do anything until we re
ceive a didFinishFrame anyway. |
| 162 EXPECT_FALSE(thread.hasPendingTask()); | 162 EXPECT_FALSE(thread.hasPendingTask()); |
| 163 | 163 |
| 164 // didFinishFrame triggers a frame, make sure the vsync callback is called | 164 // didFinishFrame triggers a frame, make sure the vsync callback is called |
| 165 controller.didFinishFrame(); | 165 controller.didFinishFrame(); |
| 166 thread.runPendingTask(); | 166 thread.runPendingTask(); |
| 167 EXPECT_TRUE(client.vsyncTicked()); | 167 EXPECT_TRUE(client.vsyncTicked()); |
| 168 } | 168 } |
| 169 | 169 |
| 170 } | 170 } |
| OLD | NEW |