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

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

Issue 1435133004: cc: Clean up max frames/swaps pending usage. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 5 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') | cc/surfaces/onscreen_display_client.cc » ('j') | 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 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 1453 matching lines...) Expand 10 before | Expand all | Expand 10 after
1464 fake_compositor_timing_history_->SetDrawDurationEstimate(slow_duration); 1464 fake_compositor_timing_history_->SetDrawDurationEstimate(slow_duration);
1465 1465
1466 bool expect_send_begin_main_frame = true; 1466 bool expect_send_begin_main_frame = true;
1467 EXPECT_SCOPED( 1467 EXPECT_SCOPED(
1468 CheckMainFrameSkippedAfterLateCommit(expect_send_begin_main_frame)); 1468 CheckMainFrameSkippedAfterLateCommit(expect_send_begin_main_frame));
1469 } 1469 }
1470 1470
1471 void SchedulerTest::ImplFrameSkippedAfterLateSwapAck( 1471 void SchedulerTest::ImplFrameSkippedAfterLateSwapAck(
1472 bool swap_ack_before_deadline) { 1472 bool swap_ack_before_deadline) {
1473 // To get into a high latency state, this test disables automatic swap acks. 1473 // To get into a high latency state, this test disables automatic swap acks.
1474 scheduler_->SetMaxSwapsPending(1);
1475 client_->SetAutomaticSwapAck(false); 1474 client_->SetAutomaticSwapAck(false);
1476 1475
1477 // Draw and swap for first BeginFrame 1476 // Draw and swap for first BeginFrame
1478 client_->Reset(); 1477 client_->Reset();
1479 scheduler_->SetNeedsBeginMainFrame(); 1478 scheduler_->SetNeedsBeginMainFrame();
1480 scheduler_->SetNeedsRedraw(); 1479 scheduler_->SetNeedsRedraw();
1481 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1480 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1482 SendNextBeginFrame(); 1481 SendNextBeginFrame();
1483 EXPECT_ACTION("SetNeedsBeginFrames(true)", client_, 0, 4); 1482 EXPECT_ACTION("SetNeedsBeginFrames(true)", client_, 0, 4);
1484 EXPECT_ACTION("WillBeginImplFrame", client_, 1, 4); 1483 EXPECT_ACTION("WillBeginImplFrame", client_, 1, 4);
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
1588 EXPECT_SCOPED(ImplFrameSkippedAfterLateSwapAck(swap_ack_before_deadline)); 1587 EXPECT_SCOPED(ImplFrameSkippedAfterLateSwapAck(swap_ack_before_deadline));
1589 } 1588 }
1590 1589
1591 TEST_F(SchedulerTest, 1590 TEST_F(SchedulerTest,
1592 ImplFrameSkippedAfterLateSwapAck_OnlyImplSideUpdatesExpected) { 1591 ImplFrameSkippedAfterLateSwapAck_OnlyImplSideUpdatesExpected) {
1593 // This tests that we recover impl thread latency when there are no commits. 1592 // This tests that we recover impl thread latency when there are no commits.
1594 scheduler_settings_.use_external_begin_frame_source = true; 1593 scheduler_settings_.use_external_begin_frame_source = true;
1595 SetUpScheduler(true); 1594 SetUpScheduler(true);
1596 1595
1597 // To get into a high latency state, this test disables automatic swap acks. 1596 // To get into a high latency state, this test disables automatic swap acks.
1598 scheduler_->SetMaxSwapsPending(1);
1599 client_->SetAutomaticSwapAck(false); 1597 client_->SetAutomaticSwapAck(false);
1600 1598
1601 // Even if every estimate related to the main thread is slow, we should 1599 // Even if every estimate related to the main thread is slow, we should
1602 // still expect to recover impl thread latency if there are no commits from 1600 // still expect to recover impl thread latency if there are no commits from
1603 // the main thread. 1601 // the main thread.
1604 auto slow_duration = base::TimeDelta::FromSeconds(1); 1602 auto slow_duration = base::TimeDelta::FromSeconds(1);
1605 fake_compositor_timing_history_->SetAllEstimatesTo(slow_duration); 1603 fake_compositor_timing_history_->SetAllEstimatesTo(slow_duration);
1606 auto fast_duration = base::TimeDelta::FromMilliseconds(1); 1604 auto fast_duration = base::TimeDelta::FromMilliseconds(1);
1607 fake_compositor_timing_history_->SetDrawDurationEstimate(fast_duration); 1605 fake_compositor_timing_history_->SetDrawDurationEstimate(fast_duration);
1608 1606
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1652 // Deadline should be immediate. 1650 // Deadline should be immediate.
1653 EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); 1651 EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending());
1654 task_runner().RunUntilTime(now_src_->NowTicks()); 1652 task_runner().RunUntilTime(now_src_->NowTicks());
1655 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); 1653 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending());
1656 EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client_); 1654 EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client_);
1657 } 1655 }
1658 } 1656 }
1659 1657
1660 void SchedulerTest::ImplFrameIsNotSkippedAfterLateSwapAck() { 1658 void SchedulerTest::ImplFrameIsNotSkippedAfterLateSwapAck() {
1661 // To get into a high latency state, this test disables automatic swap acks. 1659 // To get into a high latency state, this test disables automatic swap acks.
1662 scheduler_->SetMaxSwapsPending(1);
1663 client_->SetAutomaticSwapAck(false); 1660 client_->SetAutomaticSwapAck(false);
1664 1661
1665 // Draw and swap for first BeginFrame 1662 // Draw and swap for first BeginFrame
1666 client_->Reset(); 1663 client_->Reset();
1667 scheduler_->SetNeedsBeginMainFrame(); 1664 scheduler_->SetNeedsBeginMainFrame();
1668 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1665 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1669 SendNextBeginFrame(); 1666 SendNextBeginFrame();
1670 EXPECT_ACTION("SetNeedsBeginFrames(true)", client_, 0, 3); 1667 EXPECT_ACTION("SetNeedsBeginFrames(true)", client_, 0, 3);
1671 EXPECT_ACTION("WillBeginImplFrame", client_, 1, 3); 1668 EXPECT_ACTION("WillBeginImplFrame", client_, 1, 3);
1672 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 2, 3); 1669 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 2, 3);
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
1763 // This test starts off with expensive estimates to prevent latency recovery 1760 // This test starts off with expensive estimates to prevent latency recovery
1764 // initially, then lowers the estimates to enable it once both the main 1761 // initially, then lowers the estimates to enable it once both the main
1765 // and impl threads are in a high latency mode. 1762 // and impl threads are in a high latency mode.
1766 scheduler_settings_.use_external_begin_frame_source = true; 1763 scheduler_settings_.use_external_begin_frame_source = true;
1767 SetUpScheduler(true); 1764 SetUpScheduler(true);
1768 1765
1769 auto slow_duration = base::TimeDelta::FromSeconds(1); 1766 auto slow_duration = base::TimeDelta::FromSeconds(1);
1770 fake_compositor_timing_history_->SetAllEstimatesTo(slow_duration); 1767 fake_compositor_timing_history_->SetAllEstimatesTo(slow_duration);
1771 1768
1772 // To get into a high latency state, this test disables automatic swap acks. 1769 // To get into a high latency state, this test disables automatic swap acks.
1773 scheduler_->SetMaxSwapsPending(1);
1774 client_->SetAutomaticSwapAck(false); 1770 client_->SetAutomaticSwapAck(false);
1775 1771
1776 // Impl thread hits deadline before commit finishes to make 1772 // Impl thread hits deadline before commit finishes to make
1777 // MainThreadMissedLastDeadline true 1773 // MainThreadMissedLastDeadline true
1778 client_->Reset(); 1774 client_->Reset();
1779 scheduler_->SetNeedsBeginMainFrame(); 1775 scheduler_->SetNeedsBeginMainFrame();
1780 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1776 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1781 EXPECT_SCOPED(AdvanceFrame()); 1777 EXPECT_SCOPED(AdvanceFrame());
1782 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); 1778 EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
1783 task_runner().RunTasksWhile(client_->ImplFrameDeadlinePending(true)); 1779 task_runner().RunTasksWhile(client_->ImplFrameDeadlinePending(true));
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
1892 Deadlock_CommitMakesProgressWhileSwapTrottledAndActiveTreeNeedsFirstDraw) { 1888 Deadlock_CommitMakesProgressWhileSwapTrottledAndActiveTreeNeedsFirstDraw) {
1893 // NPAPI plugins on Windows block the Browser UI thread on the Renderer main 1889 // NPAPI plugins on Windows block the Browser UI thread on the Renderer main
1894 // thread. This prevents the scheduler from receiving any pending swap acks. 1890 // thread. This prevents the scheduler from receiving any pending swap acks.
1895 1891
1896 scheduler_settings_.use_external_begin_frame_source = true; 1892 scheduler_settings_.use_external_begin_frame_source = true;
1897 scheduler_settings_.main_frame_while_swap_throttled_enabled = true; 1893 scheduler_settings_.main_frame_while_swap_throttled_enabled = true;
1898 SetUpScheduler(true); 1894 SetUpScheduler(true);
1899 1895
1900 // Disables automatic swap acks so this test can force swap ack throttling 1896 // Disables automatic swap acks so this test can force swap ack throttling
1901 // to simulate a blocked Browser ui thread. 1897 // to simulate a blocked Browser ui thread.
1902 scheduler_->SetMaxSwapsPending(1);
1903 client_->SetAutomaticSwapAck(false); 1898 client_->SetAutomaticSwapAck(false);
1904 1899
1905 // Get a new active tree in main-thread high latency mode and put us 1900 // Get a new active tree in main-thread high latency mode and put us
1906 // in a swap throttled state. 1901 // in a swap throttled state.
1907 client_->Reset(); 1902 client_->Reset();
1908 EXPECT_FALSE(scheduler_->CommitPending()); 1903 EXPECT_FALSE(scheduler_->CommitPending());
1909 scheduler_->SetNeedsBeginMainFrame(); 1904 scheduler_->SetNeedsBeginMainFrame();
1910 scheduler_->SetNeedsRedraw(); 1905 scheduler_->SetNeedsRedraw();
1911 EXPECT_SCOPED(AdvanceFrame()); 1906 EXPECT_SCOPED(AdvanceFrame());
1912 EXPECT_TRUE(scheduler_->CommitPending()); 1907 EXPECT_TRUE(scheduler_->CommitPending());
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1963 // swap trottled and we have a pending tree and active tree that 1958 // swap trottled and we have a pending tree and active tree that
1964 // still needs to be drawn for the first time. 1959 // still needs to be drawn for the first time.
1965 1960
1966 scheduler_settings_.use_external_begin_frame_source = true; 1961 scheduler_settings_.use_external_begin_frame_source = true;
1967 scheduler_settings_.main_frame_while_swap_throttled_enabled = true; 1962 scheduler_settings_.main_frame_while_swap_throttled_enabled = true;
1968 scheduler_settings_.main_frame_before_activation_enabled = true; 1963 scheduler_settings_.main_frame_before_activation_enabled = true;
1969 SetUpScheduler(true); 1964 SetUpScheduler(true);
1970 1965
1971 // Disables automatic swap acks so this test can force swap ack throttling 1966 // Disables automatic swap acks so this test can force swap ack throttling
1972 // to simulate a blocked Browser ui thread. 1967 // to simulate a blocked Browser ui thread.
1973 scheduler_->SetMaxSwapsPending(1);
1974 client_->SetAutomaticSwapAck(false); 1968 client_->SetAutomaticSwapAck(false);
1975 1969
1976 // Start a new commit in main-thread high latency mode and hold off on 1970 // Start a new commit in main-thread high latency mode and hold off on
1977 // activation. 1971 // activation.
1978 client_->Reset(); 1972 client_->Reset();
1979 EXPECT_FALSE(scheduler_->CommitPending()); 1973 EXPECT_FALSE(scheduler_->CommitPending());
1980 scheduler_->SetNeedsBeginMainFrame(); 1974 scheduler_->SetNeedsBeginMainFrame();
1981 scheduler_->SetNeedsRedraw(); 1975 scheduler_->SetNeedsRedraw();
1982 EXPECT_SCOPED(AdvanceFrame()); 1976 EXPECT_SCOPED(AdvanceFrame());
1983 EXPECT_TRUE(scheduler_->CommitPending()); 1977 EXPECT_TRUE(scheduler_->CommitPending());
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
2044 2038
2045 // Since we are simulating a long commit, set up a client with draw duration 2039 // Since we are simulating a long commit, set up a client with draw duration
2046 // estimates that prevent skipping main frames to get to low latency mode. 2040 // estimates that prevent skipping main frames to get to low latency mode.
2047 scheduler_settings_.use_external_begin_frame_source = true; 2041 scheduler_settings_.use_external_begin_frame_source = true;
2048 scheduler_settings_.main_frame_while_swap_throttled_enabled = true; 2042 scheduler_settings_.main_frame_while_swap_throttled_enabled = true;
2049 scheduler_settings_.main_frame_before_activation_enabled = true; 2043 scheduler_settings_.main_frame_before_activation_enabled = true;
2050 SetUpScheduler(true); 2044 SetUpScheduler(true);
2051 2045
2052 // Disables automatic swap acks so this test can force swap ack throttling 2046 // Disables automatic swap acks so this test can force swap ack throttling
2053 // to simulate a blocked Browser ui thread. 2047 // to simulate a blocked Browser ui thread.
2054 scheduler_->SetMaxSwapsPending(1);
2055 client_->SetAutomaticSwapAck(false); 2048 client_->SetAutomaticSwapAck(false);
2056 2049
2057 // Start a new commit in main-thread high latency mode and hold off on 2050 // Start a new commit in main-thread high latency mode and hold off on
2058 // activation. 2051 // activation.
2059 client_->Reset(); 2052 client_->Reset();
2060 EXPECT_FALSE(scheduler_->CommitPending()); 2053 EXPECT_FALSE(scheduler_->CommitPending());
2061 scheduler_->SetNeedsBeginMainFrame(); 2054 scheduler_->SetNeedsBeginMainFrame();
2062 scheduler_->SetNeedsRedraw(); 2055 scheduler_->SetNeedsRedraw();
2063 EXPECT_SCOPED(AdvanceFrame()); 2056 EXPECT_SCOPED(AdvanceFrame());
2064 EXPECT_TRUE(scheduler_->CommitPending()); 2057 EXPECT_TRUE(scheduler_->CommitPending());
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after
2440 scheduler_settings_.throttle_frame_production = throttle_frame_production; 2433 scheduler_settings_.throttle_frame_production = throttle_frame_production;
2441 SetUpScheduler(true); 2434 SetUpScheduler(true);
2442 2435
2443 scheduler_->SetEstimatedParentDrawTime( 2436 scheduler_->SetEstimatedParentDrawTime(
2444 BeginFrameArgs::DefaultEstimatedParentDrawTime()); 2437 BeginFrameArgs::DefaultEstimatedParentDrawTime());
2445 2438
2446 // Set the draw duration estimate to zero so that deadlines are accurate. 2439 // Set the draw duration estimate to zero so that deadlines are accurate.
2447 fake_compositor_timing_history_->SetDrawDurationEstimate(base::TimeDelta()); 2440 fake_compositor_timing_history_->SetDrawDurationEstimate(base::TimeDelta());
2448 2441
2449 // To test swap ack throttling, this test disables automatic swap acks. 2442 // To test swap ack throttling, this test disables automatic swap acks.
2450 scheduler_->SetMaxSwapsPending(1);
2451 client_->SetAutomaticSwapAck(false); 2443 client_->SetAutomaticSwapAck(false);
2452 2444
2453 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame. 2445 // SetNeedsBeginMainFrame should begin the frame on the next BeginImplFrame.
2454 client_->Reset(); 2446 client_->Reset();
2455 scheduler_->SetNeedsBeginMainFrame(); 2447 scheduler_->SetNeedsBeginMainFrame();
2456 EXPECT_NO_ACTION(client_); 2448 EXPECT_NO_ACTION(client_);
2457 client_->Reset(); 2449 client_->Reset();
2458 2450
2459 // Trigger the first BeginImplFrame and BeginMainFrame 2451 // Trigger the first BeginImplFrame and BeginMainFrame
2460 EXPECT_SCOPED(AdvanceFrame()); 2452 EXPECT_SCOPED(AdvanceFrame());
(...skipping 1055 matching lines...) Expand 10 before | Expand all | Expand 10 after
3516 3508
3517 client_->Reset(); 3509 client_->Reset();
3518 EXPECT_FALSE(client_->last_begin_main_frame_args().IsValid()); 3510 EXPECT_FALSE(client_->last_begin_main_frame_args().IsValid());
3519 EXPECT_SCOPED(AdvanceFrame()); 3511 EXPECT_SCOPED(AdvanceFrame());
3520 EXPECT_TRUE(client_->last_begin_main_frame_args().IsValid()); 3512 EXPECT_TRUE(client_->last_begin_main_frame_args().IsValid());
3521 EXPECT_FALSE(client_->last_begin_main_frame_args().on_critical_path); 3513 EXPECT_FALSE(client_->last_begin_main_frame_args().on_critical_path);
3522 } 3514 }
3523 3515
3524 } // namespace 3516 } // namespace
3525 } // namespace cc 3517 } // namespace cc
OLDNEW
« no previous file with comments | « cc/scheduler/scheduler_state_machine.cc ('k') | cc/surfaces/onscreen_display_client.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698