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

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

Issue 54913003: Scheduler: Switch from high to low latency mode if possible. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update and add scheduler unit tests. Created 7 years, 1 month 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
« no previous file with comments | « cc/scheduler/scheduler_state_machine.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #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/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/scoped_vector.h" 10 #include "base/memory/scoped_vector.h"
11 #include "base/time/time.h"
11 #include "cc/test/scheduler_test_common.h" 12 #include "cc/test/scheduler_test_common.h"
12 #include "testing/gmock/include/gmock/gmock.h" 13 #include "testing/gmock/include/gmock/gmock.h"
13 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/gtest/include/gtest/gtest.h"
14 15
15 #define EXPECT_ACTION(action, client, action_index, expected_num_actions) \ 16 #define EXPECT_ACTION(action, client, action_index, expected_num_actions) \
16 EXPECT_EQ(expected_num_actions, client.num_actions_()); \ 17 EXPECT_EQ(expected_num_actions, client.num_actions_()); \
17 ASSERT_LT(action_index, client.num_actions_()); \ 18 ASSERT_LT(action_index, client.num_actions_()); \
18 do { \ 19 do { \
19 EXPECT_STREQ(action, client.Action(action_index)); \ 20 EXPECT_STREQ(action, client.Action(action_index)); \
20 for (int i = expected_num_actions; i < client.num_actions_(); ++i) \ 21 for (int i = expected_num_actions; i < client.num_actions_(); ++i) \
(...skipping 1052 matching lines...) Expand 10 before | Expand all | Expand 10 after
1073 client.Reset(); 1074 client.Reset();
1074 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); 1075 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
1075 EXPECT_SINGLE_ACTION("PostBeginImplFrameDeadlineTask", client); 1076 EXPECT_SINGLE_ACTION("PostBeginImplFrameDeadlineTask", client);
1076 client.Reset(); 1077 client.Reset();
1077 scheduler->OnBeginImplFrameDeadline(); 1078 scheduler->OnBeginImplFrameDeadline();
1078 EXPECT_EQ(0, client.num_draws()); 1079 EXPECT_EQ(0, client.num_draws());
1079 EXPECT_FALSE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); 1080 EXPECT_FALSE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
1080 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); 1081 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles"));
1081 } 1082 }
1082 1083
1084 class SchedulerClientWithFixedEstimates : public FakeSchedulerClient {
1085 public:
1086 SchedulerClientWithFixedEstimates(
1087 base::TimeDelta draw_duration,
1088 base::TimeDelta begin_main_frame_to_commit_duration,
1089 base::TimeDelta commit_to_activate_duration)
1090 : draw_duration_(draw_duration),
1091 begin_main_frame_to_commit_duration_(
1092 begin_main_frame_to_commit_duration),
1093 commit_to_activate_duration_(commit_to_activate_duration) {}
1094
1095 virtual base::TimeDelta DrawDurationEstimate() OVERRIDE {
1096 return draw_duration_;
1097 }
1098 virtual base::TimeDelta BeginMainFrameToCommitDurationEstimate() OVERRIDE {
1099 return begin_main_frame_to_commit_duration_;
1100 }
1101 virtual base::TimeDelta CommitToActivateDurationEstimate() OVERRIDE {
1102 return commit_to_activate_duration_;
1103 }
1104
1105 private:
1106 base::TimeDelta draw_duration_;
1107 base::TimeDelta begin_main_frame_to_commit_duration_;
1108 base::TimeDelta commit_to_activate_duration_;
1109 };
1110
1111 void MainFrameInHighLatencyMode(int64 begin_main_frame_to_commit_estimate_in_ms,
1112 int64 commit_to_activate_estimate_in_ms,
1113 bool should_send_begin_main_frame) {
1114 // Set up client with specified estimates (draw duration is set to 1).
1115 SchedulerClientWithFixedEstimates client(
1116 base::TimeDelta::FromMilliseconds(1),
1117 base::TimeDelta::FromMilliseconds(
1118 begin_main_frame_to_commit_estimate_in_ms),
1119 base::TimeDelta::FromMilliseconds(commit_to_activate_estimate_in_ms));
1120 SchedulerSettings scheduler_settings;
1121 scheduler_settings.deadline_scheduling_enabled = true;
1122 scheduler_settings.switch_to_low_latency_if_possible = true;
1123 Scheduler* scheduler = client.CreateScheduler(scheduler_settings);
1124 scheduler->SetCanStart();
1125 scheduler->SetVisible(true);
1126 scheduler->SetCanDraw(true);
1127 InitializeOutputSurfaceAndFirstCommit(scheduler);
1128
1129 // Impl thread hits deadline before commit finishes.
1130 client.Reset();
1131 scheduler->SetNeedsCommit();
brianderson 2013/11/06 02:38:07 Before you land this, can you check the expected v
1132 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
1133 scheduler->OnBeginImplFrameDeadline();
1134 scheduler->FinishCommit();
1135 EXPECT_TRUE(client.HasAction("ScheduledActionSendBeginMainFrame"));
1136
1137 client.Reset();
1138 scheduler->SetNeedsCommit();
1139 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
1140 scheduler->OnBeginImplFrameDeadline();
1141 EXPECT_EQ(client.HasAction("ScheduledActionSendBeginMainFrame"),
1142 should_send_begin_main_frame);
1143 }
1144
1145 TEST(SchedulerTest,
1146 SkipMainFrameIfHighLatencyAndCanCommitAndActivateBeforeDeadline) {
1147 // Set up client so that estimates indicate that we can commit and activate
1148 // before the deadline (~8ms by default).
1149 MainFrameInHighLatencyMode(1, 1, false);
1150 }
1151
1152 TEST(SchedulerTest, NotSkipMainFrameIfHighLatencyAndCanCommitTooLong) {
1153 // Set up client so that estimates indicate that the commit cannot finish
1154 // before the deadline (~8ms by default).
1155 MainFrameInHighLatencyMode(10, 1, true);
1156 }
1157
1158 TEST(SchedulerTest, NotSkipMainFrameIfHighLatencyAndCanActivateTooLong) {
1159 // Set up client so that estimates indicate that the activate cannot finish
1160 // before the deadline (~8ms by default).
1161 MainFrameInHighLatencyMode(1, 10, true);
1162 }
1163
1083 } // namespace 1164 } // namespace
1084 } // namespace cc 1165 } // namespace cc
OLDNEW
« no previous file with comments | « cc/scheduler/scheduler_state_machine.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698