| Index: cc/scheduler/scheduler_unittest.cc
|
| diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc
|
| index c04518320b0016d810846a16a3f0395f8d8b2a97..09fd0a7096963ae1e64949433c98ec7d2ef5e0e5 100644
|
| --- a/cc/scheduler/scheduler_unittest.cc
|
| +++ b/cc/scheduler/scheduler_unittest.cc
|
| @@ -8,6 +8,7 @@
|
|
|
| #include "base/logging.h"
|
| #include "base/memory/scoped_vector.h"
|
| +#include "base/time/time.h"
|
| #include "cc/test/scheduler_test_common.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| @@ -1080,5 +1081,93 @@ TEST(SchedulerTest, ManageTiles) {
|
| EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles"));
|
| }
|
|
|
| +class SchedulerClientWithFixedEstimates : public FakeSchedulerClient {
|
| + public:
|
| + SchedulerClientWithFixedEstimates(
|
| + base::TimeDelta draw_duration,
|
| + base::TimeDelta begin_main_frame_to_commit_duration,
|
| + base::TimeDelta commit_to_activate_duration)
|
| + : draw_duration_(draw_duration),
|
| + begin_main_frame_to_commit_duration_(
|
| + begin_main_frame_to_commit_duration),
|
| + commit_to_activate_duration_(commit_to_activate_duration) {}
|
| +
|
| + virtual base::TimeDelta DrawDurationEstimate() OVERRIDE {
|
| + return draw_duration_;
|
| + }
|
| + virtual base::TimeDelta BeginMainFrameToCommitDurationEstimate() OVERRIDE {
|
| + return begin_main_frame_to_commit_duration_;
|
| + }
|
| + virtual base::TimeDelta CommitToActivateDurationEstimate() OVERRIDE {
|
| + return commit_to_activate_duration_;
|
| + }
|
| +
|
| + private:
|
| + base::TimeDelta draw_duration_;
|
| + base::TimeDelta begin_main_frame_to_commit_duration_;
|
| + base::TimeDelta commit_to_activate_duration_;
|
| +};
|
| +
|
| +void MainFrameInHighLatencyMode(int64 begin_main_frame_to_commit_estimate_in_ms,
|
| + int64 commit_to_activate_estimate_in_ms,
|
| + bool should_send_begin_main_frame) {
|
| + // Set up client with specified estimates (draw duration is set to 1).
|
| + SchedulerClientWithFixedEstimates client(
|
| + base::TimeDelta::FromMilliseconds(1),
|
| + base::TimeDelta::FromMilliseconds(
|
| + begin_main_frame_to_commit_estimate_in_ms),
|
| + base::TimeDelta::FromMilliseconds(commit_to_activate_estimate_in_ms));
|
| + SchedulerSettings scheduler_settings;
|
| + scheduler_settings.deadline_scheduling_enabled = true;
|
| + scheduler_settings.switch_to_low_latency_if_possible = true;
|
| + Scheduler* scheduler = client.CreateScheduler(scheduler_settings);
|
| + scheduler->SetCanStart();
|
| + scheduler->SetVisible(true);
|
| + scheduler->SetCanDraw(true);
|
| + InitializeOutputSurfaceAndFirstCommit(scheduler);
|
| +
|
| + // Impl thread hits deadline before commit finishes.
|
| + client.Reset();
|
| + scheduler->SetNeedsCommit();
|
| + EXPECT_FALSE(scheduler->MainThreadIsInHighLatencyMode());
|
| + scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_FALSE(scheduler->MainThreadIsInHighLatencyMode());
|
| + scheduler->OnBeginImplFrameDeadline();
|
| + EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode());
|
| + scheduler->FinishCommit();
|
| + EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode());
|
| + EXPECT_TRUE(client.HasAction("ScheduledActionSendBeginMainFrame"));
|
| +
|
| + client.Reset();
|
| + scheduler->SetNeedsCommit();
|
| + EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode());
|
| + scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode());
|
| + scheduler->OnBeginImplFrameDeadline();
|
| + EXPECT_EQ(scheduler->MainThreadIsInHighLatencyMode(),
|
| + should_send_begin_main_frame);
|
| + EXPECT_EQ(client.HasAction("ScheduledActionSendBeginMainFrame"),
|
| + should_send_begin_main_frame);
|
| +}
|
| +
|
| +TEST(SchedulerTest,
|
| + SkipMainFrameIfHighLatencyAndCanCommitAndActivateBeforeDeadline) {
|
| + // Set up client so that estimates indicate that we can commit and activate
|
| + // before the deadline (~8ms by default).
|
| + MainFrameInHighLatencyMode(1, 1, false);
|
| +}
|
| +
|
| +TEST(SchedulerTest, NotSkipMainFrameIfHighLatencyAndCanCommitTooLong) {
|
| + // Set up client so that estimates indicate that the commit cannot finish
|
| + // before the deadline (~8ms by default).
|
| + MainFrameInHighLatencyMode(10, 1, true);
|
| +}
|
| +
|
| +TEST(SchedulerTest, NotSkipMainFrameIfHighLatencyAndCanActivateTooLong) {
|
| + // Set up client so that estimates indicate that the activate cannot finish
|
| + // before the deadline (~8ms by default).
|
| + MainFrameInHighLatencyMode(1, 10, true);
|
| +}
|
| +
|
| } // namespace
|
| } // namespace cc
|
|
|