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

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

Issue 1184863004: cc: Move timing history to the Scheduler. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase, add include Created 5 years, 6 months 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
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 4
5 #include "cc/scheduler/scheduler.h" 5 #include "cc/scheduler/scheduler.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/memory/scoped_vector.h" 11 #include "base/memory/scoped_vector.h"
12 #include "base/message_loop/message_loop.h" 12 #include "base/message_loop/message_loop.h"
13 #include "base/numerics/safe_conversions.h" 13 #include "base/numerics/safe_conversions.h"
14 #include "base/run_loop.h" 14 #include "base/run_loop.h"
15 #include "base/time/time.h" 15 #include "base/time/time.h"
16 #include "base/trace_event/trace_event.h" 16 #include "base/trace_event/trace_event.h"
17 #include "cc/debug/rendering_stats_instrumentation.h"
17 #include "cc/test/begin_frame_args_test.h" 18 #include "cc/test/begin_frame_args_test.h"
18 #include "cc/test/ordered_simple_task_runner.h" 19 #include "cc/test/ordered_simple_task_runner.h"
19 #include "cc/test/scheduler_test_common.h" 20 #include "cc/test/scheduler_test_common.h"
20 #include "testing/gmock/include/gmock/gmock.h" 21 #include "testing/gmock/include/gmock/gmock.h"
21 #include "testing/gtest/include/gtest/gtest.h" 22 #include "testing/gtest/include/gtest/gtest.h"
22 23
23 #define EXPECT_ACTION(action, client, action_index, expected_num_actions) \ 24 #define EXPECT_ACTION(action, client, action_index, expected_num_actions) \
24 do { \ 25 do { \
25 EXPECT_EQ(expected_num_actions, client->num_actions_()); \ 26 EXPECT_EQ(expected_num_actions, client->num_actions_()); \
26 if (action_index >= 0) { \ 27 if (action_index >= 0) { \
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 void ScheduledActionBeginOutputSurfaceCreation() override { 135 void ScheduledActionBeginOutputSurfaceCreation() override {
135 PushAction("ScheduledActionBeginOutputSurfaceCreation"); 136 PushAction("ScheduledActionBeginOutputSurfaceCreation");
136 } 137 }
137 void ScheduledActionPrepareTiles() override { 138 void ScheduledActionPrepareTiles() override {
138 PushAction("ScheduledActionPrepareTiles"); 139 PushAction("ScheduledActionPrepareTiles");
139 } 140 }
140 void ScheduledActionInvalidateOutputSurface() override { 141 void ScheduledActionInvalidateOutputSurface() override {
141 actions_.push_back("ScheduledActionInvalidateOutputSurface"); 142 actions_.push_back("ScheduledActionInvalidateOutputSurface");
142 states_.push_back(scheduler_->AsValue()); 143 states_.push_back(scheduler_->AsValue());
143 } 144 }
144 base::TimeDelta DrawDurationEstimate() override { return base::TimeDelta(); }
145 base::TimeDelta BeginMainFrameToCommitDurationEstimate() override {
146 return base::TimeDelta();
147 }
148 base::TimeDelta CommitToActivateDurationEstimate() override {
149 return base::TimeDelta();
150 }
151 145
152 void SendBeginFramesToChildren(const BeginFrameArgs& args) override { 146 void SendBeginFramesToChildren(const BeginFrameArgs& args) override {
153 begin_frame_args_sent_to_children_ = args; 147 begin_frame_args_sent_to_children_ = args;
154 } 148 }
155 149
156 void SendBeginMainFrameNotExpectedSoon() override { 150 void SendBeginMainFrameNotExpectedSoon() override {
157 PushAction("SendBeginMainFrameNotExpectedSoon"); 151 PushAction("SendBeginMainFrameNotExpectedSoon");
158 } 152 }
159 153
160 base::Callback<bool(void)> ImplFrameDeadlinePending(bool state) { 154 base::Callback<bool(void)> ImplFrameDeadlinePending(bool state) {
(...skipping 25 matching lines...) Expand all
186 bool automatic_swap_ack_; 180 bool automatic_swap_ack_;
187 int num_draws_; 181 int num_draws_;
188 BeginFrameArgs begin_frame_args_sent_to_children_; 182 BeginFrameArgs begin_frame_args_sent_to_children_;
189 base::TimeTicks posted_begin_impl_frame_deadline_; 183 base::TimeTicks posted_begin_impl_frame_deadline_;
190 std::vector<const char*> actions_; 184 std::vector<const char*> actions_;
191 std::vector<scoped_refptr<base::trace_event::ConvertableToTraceFormat>> 185 std::vector<scoped_refptr<base::trace_event::ConvertableToTraceFormat>>
192 states_; 186 states_;
193 TestScheduler* scheduler_; 187 TestScheduler* scheduler_;
194 }; 188 };
195 189
196 class SchedulerClientWithFixedEstimates : public FakeSchedulerClient {
197 public:
198 SchedulerClientWithFixedEstimates(
199 base::TimeDelta draw_duration,
200 base::TimeDelta begin_main_frame_to_commit_duration,
201 base::TimeDelta commit_to_activate_duration)
202 : draw_duration_(draw_duration),
203 begin_main_frame_to_commit_duration_(
204 begin_main_frame_to_commit_duration),
205 commit_to_activate_duration_(commit_to_activate_duration) {}
206
207 base::TimeDelta DrawDurationEstimate() override { return draw_duration_; }
208 base::TimeDelta BeginMainFrameToCommitDurationEstimate() override {
209 return begin_main_frame_to_commit_duration_;
210 }
211 base::TimeDelta CommitToActivateDurationEstimate() override {
212 return commit_to_activate_duration_;
213 }
214
215 private:
216 base::TimeDelta draw_duration_;
217 base::TimeDelta begin_main_frame_to_commit_duration_;
218 base::TimeDelta commit_to_activate_duration_;
219 };
220
221 class FakeExternalBeginFrameSource : public BeginFrameSourceBase { 190 class FakeExternalBeginFrameSource : public BeginFrameSourceBase {
222 public: 191 public:
223 explicit FakeExternalBeginFrameSource(FakeSchedulerClient* client) 192 explicit FakeExternalBeginFrameSource(FakeSchedulerClient* client)
224 : client_(client) {} 193 : client_(client) {}
225 ~FakeExternalBeginFrameSource() override {} 194 ~FakeExternalBeginFrameSource() override {}
226 195
227 void OnNeedsBeginFramesChange(bool needs_begin_frames) override { 196 void OnNeedsBeginFramesChange(bool needs_begin_frames) override {
228 if (needs_begin_frames) { 197 if (needs_begin_frames) {
229 client_->PushAction("SetNeedsBeginFrames(true)"); 198 client_->PushAction("SetNeedsBeginFrames(true)");
230 } else { 199 } else {
(...skipping 27 matching lines...) Expand all
258 227
259 protected: 228 protected:
260 TestScheduler* CreateScheduler() { 229 TestScheduler* CreateScheduler() {
261 scoped_ptr<FakeExternalBeginFrameSource> fake_external_begin_frame_source; 230 scoped_ptr<FakeExternalBeginFrameSource> fake_external_begin_frame_source;
262 if (scheduler_settings_.use_external_begin_frame_source) { 231 if (scheduler_settings_.use_external_begin_frame_source) {
263 fake_external_begin_frame_source.reset( 232 fake_external_begin_frame_source.reset(
264 new FakeExternalBeginFrameSource(client_.get())); 233 new FakeExternalBeginFrameSource(client_.get()));
265 fake_external_begin_frame_source_ = 234 fake_external_begin_frame_source_ =
266 fake_external_begin_frame_source.get(); 235 fake_external_begin_frame_source.get();
267 } 236 }
237 rendering_stats_instrumentation_ = RenderingStatsInstrumentation::Create();
268 scheduler_ = TestScheduler::Create(now_src_.get(), client_.get(), 238 scheduler_ = TestScheduler::Create(now_src_.get(), client_.get(),
269 scheduler_settings_, 0, task_runner_, 239 scheduler_settings_, 0, task_runner_,
270 fake_external_begin_frame_source.Pass()); 240 fake_external_begin_frame_source.Pass(),
241 rendering_stats_instrumentation_.get());
271 DCHECK(scheduler_); 242 DCHECK(scheduler_);
272 client_->set_scheduler(scheduler_.get()); 243 client_->set_scheduler(scheduler_.get());
273 return scheduler_.get(); 244 return scheduler_.get();
274 } 245 }
275 246
276 void CreateSchedulerAndInitSurface() { 247 void CreateSchedulerAndInitSurface() {
277 CreateScheduler(); 248 CreateScheduler();
278 EXPECT_SCOPED(InitializeOutputSurfaceAndFirstCommit()); 249 EXPECT_SCOPED(InitializeOutputSurfaceAndFirstCommit());
279 } 250 }
280 251
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
418 void BeginFramesNotFromClient_SwapThrottled( 389 void BeginFramesNotFromClient_SwapThrottled(
419 bool use_external_begin_frame_source, 390 bool use_external_begin_frame_source,
420 bool throttle_frame_production); 391 bool throttle_frame_production);
421 392
422 scoped_ptr<base::SimpleTestTickClock> now_src_; 393 scoped_ptr<base::SimpleTestTickClock> now_src_;
423 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; 394 scoped_refptr<OrderedSimpleTaskRunner> task_runner_;
424 FakeExternalBeginFrameSource* fake_external_begin_frame_source_; 395 FakeExternalBeginFrameSource* fake_external_begin_frame_source_;
425 SchedulerSettings scheduler_settings_; 396 SchedulerSettings scheduler_settings_;
426 scoped_ptr<FakeSchedulerClient> client_; 397 scoped_ptr<FakeSchedulerClient> client_;
427 scoped_ptr<TestScheduler> scheduler_; 398 scoped_ptr<TestScheduler> scheduler_;
399 scoped_ptr<RenderingStatsInstrumentation> rendering_stats_instrumentation_;
428 }; 400 };
429 401
430 TEST_F(SchedulerTest, InitializeOutputSurfaceDoesNotBeginImplFrame) { 402 TEST_F(SchedulerTest, InitializeOutputSurfaceDoesNotBeginImplFrame) {
431 scheduler_settings_.use_external_begin_frame_source = true; 403 scheduler_settings_.use_external_begin_frame_source = true;
432 SetUpScheduler(false); 404 SetUpScheduler(false);
433 scheduler_->SetCanStart(); 405 scheduler_->SetCanStart();
434 scheduler_->SetVisible(true); 406 scheduler_->SetVisible(true);
435 scheduler_->SetCanDraw(true); 407 scheduler_->SetCanDraw(true);
436 408
437 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_); 409 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
469 EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); 441 EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_);
470 EXPECT_TRUE(client_->needs_begin_frames()); 442 EXPECT_TRUE(client_->needs_begin_frames());
471 443
472 client_->Reset(); 444 client_->Reset();
473 EXPECT_SCOPED(AdvanceFrame()); 445 EXPECT_SCOPED(AdvanceFrame());
474 EXPECT_TRUE(client_->begin_frame_is_sent_to_children()); 446 EXPECT_TRUE(client_->begin_frame_is_sent_to_children());
475 } 447 }
476 448
477 TEST_F(SchedulerTest, SendBeginFramesToChildrenDeadlineNotAdjusted) { 449 TEST_F(SchedulerTest, SendBeginFramesToChildrenDeadlineNotAdjusted) {
478 // Set up client with specified estimates. 450 // Set up client with specified estimates.
479 SchedulerClientWithFixedEstimates* client =
480 new SchedulerClientWithFixedEstimates(
481 base::TimeDelta::FromMilliseconds(1),
482 base::TimeDelta::FromMilliseconds(2),
483 base::TimeDelta::FromMilliseconds(4));
484 scheduler_settings_.use_external_begin_frame_source = true; 451 scheduler_settings_.use_external_begin_frame_source = true;
485 SetUpScheduler(make_scoped_ptr(client).Pass(), true); 452 SetUpScheduler(true);
453 scheduler_->SetDrawDurationEstimate(base::TimeDelta::FromMilliseconds(1));
454 scheduler_->SetBeginMainFrameToCommitDurationEstimate(
455 base::TimeDelta::FromMilliseconds(2));
456 scheduler_->SetCommitToActivateDurationEstimate(
457 base::TimeDelta::FromMilliseconds(4));
486 458
487 EXPECT_FALSE(client_->needs_begin_frames()); 459 EXPECT_FALSE(client_->needs_begin_frames());
488 scheduler_->SetChildrenNeedBeginFrames(true); 460 scheduler_->SetChildrenNeedBeginFrames(true);
489 EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); 461 EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_);
490 EXPECT_TRUE(client_->needs_begin_frames()); 462 EXPECT_TRUE(client_->needs_begin_frames());
491 463
492 client_->Reset(); 464 client_->Reset();
493 465
494 BeginFrameArgs frame_args = 466 BeginFrameArgs frame_args =
495 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src()); 467 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src());
(...skipping 818 matching lines...) Expand 10 before | Expand all | Expand 10 after
1314 EXPECT_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_, 0, 3); 1286 EXPECT_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_, 0, 3);
1315 EXPECT_ACTION("SetNeedsBeginFrames(false)", client_, 1, 3); 1287 EXPECT_ACTION("SetNeedsBeginFrames(false)", client_, 1, 3);
1316 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3); 1288 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3);
1317 } 1289 }
1318 1290
1319 void SchedulerTest::MainFrameInHighLatencyMode( 1291 void SchedulerTest::MainFrameInHighLatencyMode(
1320 int64 begin_main_frame_to_commit_estimate_in_ms, 1292 int64 begin_main_frame_to_commit_estimate_in_ms,
1321 int64 commit_to_activate_estimate_in_ms, 1293 int64 commit_to_activate_estimate_in_ms,
1322 bool impl_latency_takes_priority, 1294 bool impl_latency_takes_priority,
1323 bool should_send_begin_main_frame) { 1295 bool should_send_begin_main_frame) {
1324 // Set up client with specified estimates (draw duration is set to 1). 1296 scheduler_settings_.use_external_begin_frame_source = true;
1325 SchedulerClientWithFixedEstimates* client = 1297 SetUpScheduler(true);
1326 new SchedulerClientWithFixedEstimates(
1327 base::TimeDelta::FromMilliseconds(1),
1328 base::TimeDelta::FromMilliseconds(
1329 begin_main_frame_to_commit_estimate_in_ms),
1330 base::TimeDelta::FromMilliseconds(commit_to_activate_estimate_in_ms));
1331 1298
1332 scheduler_settings_.use_external_begin_frame_source = true; 1299 scheduler_->SetDrawDurationEstimate(base::TimeDelta::FromMilliseconds(1));
1333 SetUpScheduler(make_scoped_ptr(client).Pass(), true); 1300 scheduler_->SetBeginMainFrameToCommitDurationEstimate(
1301 base::TimeDelta::FromMilliseconds(
1302 begin_main_frame_to_commit_estimate_in_ms));
1303 scheduler_->SetCommitToActivateDurationEstimate(
1304 base::TimeDelta::FromMilliseconds(commit_to_activate_estimate_in_ms));
1334 1305
1335 scheduler_->SetImplLatencyTakesPriority(impl_latency_takes_priority); 1306 scheduler_->SetImplLatencyTakesPriority(impl_latency_takes_priority);
1336 1307
1337 // Impl thread hits deadline before commit finishes. 1308 // Impl thread hits deadline before commit finishes.
1338 scheduler_->SetNeedsCommit(); 1309 scheduler_->SetNeedsCommit();
1339 EXPECT_FALSE(scheduler_->MainThreadIsInHighLatencyMode()); 1310 EXPECT_FALSE(scheduler_->MainThreadIsInHighLatencyMode());
1340 EXPECT_SCOPED(AdvanceFrame()); 1311 EXPECT_SCOPED(AdvanceFrame());
1341 EXPECT_FALSE(scheduler_->MainThreadIsInHighLatencyMode()); 1312 EXPECT_FALSE(scheduler_->MainThreadIsInHighLatencyMode());
1342 task_runner().RunPendingTasks(); // Run posted deadline. 1313 task_runner().RunPendingTasks(); // Run posted deadline.
1343 EXPECT_TRUE(scheduler_->MainThreadIsInHighLatencyMode()); 1314 EXPECT_TRUE(scheduler_->MainThreadIsInHighLatencyMode());
1344 scheduler_->NotifyBeginMainFrameStarted(); 1315 scheduler_->NotifyBeginMainFrameStarted();
1345 scheduler_->NotifyReadyToCommit(); 1316 scheduler_->NotifyReadyToCommit();
1346 scheduler_->NotifyReadyToActivate(); 1317 scheduler_->NotifyReadyToActivate();
1347 EXPECT_TRUE(scheduler_->MainThreadIsInHighLatencyMode()); 1318 EXPECT_TRUE(scheduler_->MainThreadIsInHighLatencyMode());
1348 EXPECT_TRUE(client->HasAction("ScheduledActionSendBeginMainFrame")); 1319 EXPECT_TRUE(client_->HasAction("ScheduledActionSendBeginMainFrame"));
1349 1320
1350 client->Reset(); 1321 client_->Reset();
1351 scheduler_->SetNeedsCommit(); 1322 scheduler_->SetNeedsCommit();
1352 EXPECT_TRUE(scheduler_->MainThreadIsInHighLatencyMode()); 1323 EXPECT_TRUE(scheduler_->MainThreadIsInHighLatencyMode());
1353 EXPECT_SCOPED(AdvanceFrame()); 1324 EXPECT_SCOPED(AdvanceFrame());
1354 EXPECT_TRUE(scheduler_->MainThreadIsInHighLatencyMode()); 1325 EXPECT_TRUE(scheduler_->MainThreadIsInHighLatencyMode());
1355 task_runner().RunPendingTasks(); // Run posted deadline. 1326 task_runner().RunPendingTasks(); // Run posted deadline.
1356 EXPECT_EQ(scheduler_->MainThreadIsInHighLatencyMode(), 1327 EXPECT_EQ(scheduler_->MainThreadIsInHighLatencyMode(),
1357 should_send_begin_main_frame); 1328 should_send_begin_main_frame);
1358 EXPECT_EQ(client->HasAction("ScheduledActionSendBeginMainFrame"), 1329 EXPECT_EQ(client_->HasAction("ScheduledActionSendBeginMainFrame"),
1359 should_send_begin_main_frame); 1330 should_send_begin_main_frame);
1360 } 1331 }
1361 1332
1362 TEST_F(SchedulerTest, 1333 TEST_F(SchedulerTest,
1363 SkipMainFrameIfHighLatencyAndCanCommitAndActivateBeforeDeadline) { 1334 SkipMainFrameIfHighLatencyAndCanCommitAndActivateBeforeDeadline) {
1364 // Set up client so that estimates indicate that we can commit and activate 1335 // Set up client so that estimates indicate that we can commit and activate
1365 // before the deadline (~8ms by default). 1336 // before the deadline (~8ms by default).
1366 EXPECT_SCOPED(MainFrameInHighLatencyMode(1, 1, false, false)); 1337 EXPECT_SCOPED(MainFrameInHighLatencyMode(1, 1, false, false));
1367 } 1338 }
1368 1339
(...skipping 17 matching lines...) Expand all
1386 } 1357 }
1387 1358
1388 TEST_F( 1359 TEST_F(
1389 SchedulerTest, 1360 SchedulerTest,
1390 Deadlock_CommitMakesProgressWhileSwapTrottledAndActiveTreeNeedsFirstDraw) { 1361 Deadlock_CommitMakesProgressWhileSwapTrottledAndActiveTreeNeedsFirstDraw) {
1391 // NPAPI plugins on Windows block the Browser UI thread on the Renderer main 1362 // NPAPI plugins on Windows block the Browser UI thread on the Renderer main
1392 // thread. This prevents the scheduler from receiving any pending swap acks. 1363 // thread. This prevents the scheduler from receiving any pending swap acks.
1393 1364
1394 // Since we are simulating a long commit, set up a client with draw duration 1365 // Since we are simulating a long commit, set up a client with draw duration
1395 // estimates that prevent skipping main frames to get to low latency mode. 1366 // estimates that prevent skipping main frames to get to low latency mode.
1396 SchedulerClientWithFixedEstimates* client =
1397 new SchedulerClientWithFixedEstimates(
1398 base::TimeDelta::FromMilliseconds(1),
1399 base::TimeDelta::FromMilliseconds(32),
1400 base::TimeDelta::FromMilliseconds(32));
1401 scheduler_settings_.use_external_begin_frame_source = true; 1367 scheduler_settings_.use_external_begin_frame_source = true;
1402 scheduler_settings_.main_frame_while_swap_throttled_enabled = true; 1368 scheduler_settings_.main_frame_while_swap_throttled_enabled = true;
1403 SetUpScheduler(make_scoped_ptr(client).Pass(), true); 1369 SetUpScheduler(true);
1370
1371 scheduler_->SetDrawDurationEstimate(base::TimeDelta::FromMilliseconds(1));
1372 scheduler_->SetBeginMainFrameToCommitDurationEstimate(
1373 base::TimeDelta::FromMilliseconds(32));
1374 scheduler_->SetCommitToActivateDurationEstimate(
1375 base::TimeDelta::FromMilliseconds(32));
1404 1376
1405 // Disables automatic swap acks so this test can force swap ack throttling 1377 // Disables automatic swap acks so this test can force swap ack throttling
1406 // to simulate a blocked Browser ui thread. 1378 // to simulate a blocked Browser ui thread.
1407 scheduler_->SetMaxSwapsPending(1); 1379 scheduler_->SetMaxSwapsPending(1);
1408 client_->SetAutomaticSwapAck(false); 1380 client_->SetAutomaticSwapAck(false);
1409 1381
1410 // Get a new active tree in main-thread high latency mode and put us 1382 // Get a new active tree in main-thread high latency mode and put us
1411 // in a swap throttled state. 1383 // in a swap throttled state.
1412 client_->Reset(); 1384 client_->Reset();
1413 EXPECT_FALSE(scheduler_->CommitPending()); 1385 EXPECT_FALSE(scheduler_->CommitPending());
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1463 Deadlock_NoBeginMainFrameWhileSwapTrottledAndPipelineFull) { 1435 Deadlock_NoBeginMainFrameWhileSwapTrottledAndPipelineFull) {
1464 // NPAPI plugins on Windows block the Browser UI thread on the Renderer main 1436 // NPAPI plugins on Windows block the Browser UI thread on the Renderer main
1465 // thread. This prevents the scheduler from receiving any pending swap acks. 1437 // thread. This prevents the scheduler from receiving any pending swap acks.
1466 1438
1467 // This particular test makes sure we do not send a BeginMainFrame while 1439 // This particular test makes sure we do not send a BeginMainFrame while
1468 // swap trottled and we have a pending tree and active tree that 1440 // swap trottled and we have a pending tree and active tree that
1469 // still needs to be drawn for the first time. 1441 // still needs to be drawn for the first time.
1470 1442
1471 // Since we are simulating a long commit, set up a client with draw duration 1443 // Since we are simulating a long commit, set up a client with draw duration
1472 // estimates that prevent skipping main frames to get to low latency mode. 1444 // estimates that prevent skipping main frames to get to low latency mode.
1473 SchedulerClientWithFixedEstimates* client =
1474 new SchedulerClientWithFixedEstimates(
1475 base::TimeDelta::FromMilliseconds(1),
1476 base::TimeDelta::FromMilliseconds(32),
1477 base::TimeDelta::FromMilliseconds(32));
1478 scheduler_settings_.use_external_begin_frame_source = true; 1445 scheduler_settings_.use_external_begin_frame_source = true;
1479 scheduler_settings_.main_frame_while_swap_throttled_enabled = true; 1446 scheduler_settings_.main_frame_while_swap_throttled_enabled = true;
1480 scheduler_settings_.main_frame_before_activation_enabled = true; 1447 scheduler_settings_.main_frame_before_activation_enabled = true;
1481 SetUpScheduler(make_scoped_ptr(client).Pass(), true); 1448 SetUpScheduler(true);
1449
1450 scheduler_->SetDrawDurationEstimate(base::TimeDelta::FromMilliseconds(1));
1451 scheduler_->SetBeginMainFrameToCommitDurationEstimate(
1452 base::TimeDelta::FromMilliseconds(32));
1453 scheduler_->SetCommitToActivateDurationEstimate(
1454 base::TimeDelta::FromMilliseconds(32));
1482 1455
1483 // Disables automatic swap acks so this test can force swap ack throttling 1456 // Disables automatic swap acks so this test can force swap ack throttling
1484 // to simulate a blocked Browser ui thread. 1457 // to simulate a blocked Browser ui thread.
1485 scheduler_->SetMaxSwapsPending(1); 1458 scheduler_->SetMaxSwapsPending(1);
1486 client_->SetAutomaticSwapAck(false); 1459 client_->SetAutomaticSwapAck(false);
1487 1460
1488 // Start a new commit in main-thread high latency mode and hold off on 1461 // Start a new commit in main-thread high latency mode and hold off on
1489 // activation. 1462 // activation.
1490 client_->Reset(); 1463 client_->Reset();
1491 EXPECT_FALSE(scheduler_->CommitPending()); 1464 EXPECT_FALSE(scheduler_->CommitPending());
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1549 } 1522 }
1550 1523
1551 TEST_F( 1524 TEST_F(
1552 SchedulerTest, 1525 SchedulerTest,
1553 CommitMakesProgressWhenIdleAndHasPendingTreeAndActiveTreeNeedsFirstDraw) { 1526 CommitMakesProgressWhenIdleAndHasPendingTreeAndActiveTreeNeedsFirstDraw) {
1554 // This verifies we don't block commits longer than we need to 1527 // This verifies we don't block commits longer than we need to
1555 // for performance reasons - not deadlock reasons. 1528 // for performance reasons - not deadlock reasons.
1556 1529
1557 // Since we are simulating a long commit, set up a client with draw duration 1530 // Since we are simulating a long commit, set up a client with draw duration
1558 // estimates that prevent skipping main frames to get to low latency mode. 1531 // estimates that prevent skipping main frames to get to low latency mode.
1559 SchedulerClientWithFixedEstimates* client =
1560 new SchedulerClientWithFixedEstimates(
1561 base::TimeDelta::FromMilliseconds(1),
1562 base::TimeDelta::FromMilliseconds(32),
1563 base::TimeDelta::FromMilliseconds(32));
1564 scheduler_settings_.use_external_begin_frame_source = true; 1532 scheduler_settings_.use_external_begin_frame_source = true;
1565 scheduler_settings_.main_frame_while_swap_throttled_enabled = true; 1533 scheduler_settings_.main_frame_while_swap_throttled_enabled = true;
1566 scheduler_settings_.main_frame_before_activation_enabled = true; 1534 scheduler_settings_.main_frame_before_activation_enabled = true;
1567 SetUpScheduler(make_scoped_ptr(client).Pass(), true); 1535 SetUpScheduler(true);
1536
1537 scheduler_->SetDrawDurationEstimate(base::TimeDelta::FromMilliseconds(1));
1538 scheduler_->SetBeginMainFrameToCommitDurationEstimate(
1539 base::TimeDelta::FromMilliseconds(32));
1540 scheduler_->SetCommitToActivateDurationEstimate(
1541 base::TimeDelta::FromMilliseconds(32));
1568 1542
1569 // Disables automatic swap acks so this test can force swap ack throttling 1543 // Disables automatic swap acks so this test can force swap ack throttling
1570 // to simulate a blocked Browser ui thread. 1544 // to simulate a blocked Browser ui thread.
1571 scheduler_->SetMaxSwapsPending(1); 1545 scheduler_->SetMaxSwapsPending(1);
1572 client_->SetAutomaticSwapAck(false); 1546 client_->SetAutomaticSwapAck(false);
1573 1547
1574 // Start a new commit in main-thread high latency mode and hold off on 1548 // Start a new commit in main-thread high latency mode and hold off on
1575 // activation. 1549 // activation.
1576 client_->Reset(); 1550 client_->Reset();
1577 EXPECT_FALSE(scheduler_->CommitPending()); 1551 EXPECT_FALSE(scheduler_->CommitPending());
(...skipping 1403 matching lines...) Expand 10 before | Expand all | Expand 10 after
2981 scheduler_->SetImplLatencyTakesPriority(true); 2955 scheduler_->SetImplLatencyTakesPriority(true);
2982 scheduler_->SetChildrenNeedBeginFrames(true); 2956 scheduler_->SetChildrenNeedBeginFrames(true);
2983 2957
2984 EXPECT_SCOPED(AdvanceFrame()); 2958 EXPECT_SCOPED(AdvanceFrame());
2985 EXPECT_TRUE(client_->begin_frame_is_sent_to_children()); 2959 EXPECT_TRUE(client_->begin_frame_is_sent_to_children());
2986 EXPECT_FALSE(client_->begin_frame_args_sent_to_children().on_critical_path); 2960 EXPECT_FALSE(client_->begin_frame_args_sent_to_children().on_critical_path);
2987 } 2961 }
2988 2962
2989 } // namespace 2963 } // namespace
2990 } // namespace cc 2964 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698