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