diff options
author | brianderson <brianderson@chromium.org> | 2016-02-16 16:23:22 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-02-17 00:24:32 +0000 |
commit | 18474c0ee0dc26d66216e7f0cabd5776a4110cb0 (patch) | |
tree | 36dd4dc1d1b6986fc361d42011bc39130a46cfbd /cc | |
parent | b3aebc3d2a2b6599308d9d886da29ab339182bde (diff) | |
download | chromium_src-18474c0ee0dc26d66216e7f0cabd5776a4110cb0.zip chromium_src-18474c0ee0dc26d66216e7f0cabd5776a4110cb0.tar.gz chromium_src-18474c0ee0dc26d66216e7f0cabd5776a4110cb0.tar.bz2 |
cc: Consider main thread making deadline upon abort.
This resets main_thread_missed_deadline in BeginMainFrameAborted,
which prevents latency recovery logic from skipping a frame
immediately after an aborted frame, since an aborted frame
is effectively already a skipped frame.
BUG=582749
CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel
Review URL: https://codereview.chromium.org/1691153002
Cr-Commit-Position: refs/heads/master@{#375723}
Diffstat (limited to 'cc')
-rw-r--r-- | cc/scheduler/scheduler_state_machine.cc | 9 | ||||
-rw-r--r-- | cc/scheduler/scheduler_state_machine.h | 4 | ||||
-rw-r--r-- | cc/scheduler/scheduler_unittest.cc | 37 |
3 files changed, 45 insertions, 5 deletions
diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc index 17d4ff6..b168034 100644 --- a/cc/scheduler/scheduler_state_machine.cc +++ b/cc/scheduler/scheduler_state_machine.cc @@ -953,10 +953,6 @@ bool SchedulerStateMachine::ShouldTriggerBeginImplFrameDeadlineImmediately() return false; } -bool SchedulerStateMachine::main_thread_missed_last_deadline() const { - return main_thread_missed_last_deadline_; -} - bool SchedulerStateMachine::SwapThrottled() const { return pending_swaps_ >= kMaxPendingSwaps; } @@ -1068,6 +1064,11 @@ void SchedulerStateMachine::NotifyReadyToCommit() { void SchedulerStateMachine::BeginMainFrameAborted(CommitEarlyOutReason reason) { DCHECK_EQ(begin_main_frame_state_, BEGIN_MAIN_FRAME_STATE_STARTED); + + // If the main thread aborted, it doesn't matter if the main thread missed + // the last deadline since it didn't have an update anyway. + main_thread_missed_last_deadline_ = false; + switch (reason) { case CommitEarlyOutReason::ABORTED_OUTPUT_SURFACE_LOST: case CommitEarlyOutReason::ABORTED_NOT_VISIBLE: diff --git a/cc/scheduler/scheduler_state_machine.h b/cc/scheduler/scheduler_state_machine.h index 7444432..ac10676 100644 --- a/cc/scheduler/scheduler_state_machine.h +++ b/cc/scheduler/scheduler_state_machine.h @@ -166,7 +166,9 @@ class CC_EXPORT SchedulerStateMachine { // If the main thread didn't manage to produce a new frame in time for the // impl thread to draw, it is in a high latency mode. - bool main_thread_missed_last_deadline() const; + bool main_thread_missed_last_deadline() const { + return main_thread_missed_last_deadline_; + } bool SwapThrottled() const; diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc index 4da406f..63b25cd 100644 --- a/cc/scheduler/scheduler_unittest.cc +++ b/cc/scheduler/scheduler_unittest.cc @@ -1481,6 +1481,43 @@ TEST_F(SchedulerTest, MainFrameNotSkippedAfterLateCommit_DrawEstimateTooLong) { CheckMainFrameSkippedAfterLateCommit(expect_send_begin_main_frame)); } +// If the BeginMainFrame aborts, it doesn't actually insert a frame into the +// queue, which means there is no latency to recover. +TEST_F(SchedulerTest, MainFrameNotSkippedAfterLateAbort) { + scheduler_settings_.use_external_begin_frame_source = true; + SetUpScheduler(true); + + // Use fast estimates so we think we can recover latency if needed. + fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); + + // Impl thread hits deadline before BeginMainFrame aborts. + scheduler_->SetNeedsBeginMainFrame(); + EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); + EXPECT_SCOPED(AdvanceFrame()); + EXPECT_ACTION("AddObserver(this)", client_, 0, 3); + EXPECT_ACTION("WillBeginImplFrame", client_, 1, 3); + EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 2, 3); + EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); + task_runner().RunTasksWhile(client_->ImplFrameDeadlinePending(true)); + EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline()); + scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); + EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline()); + + // After aborting the frame, make sure we don't skip the + // next BeginMainFrame. + client_->Reset(); + scheduler_->BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES); + EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); + scheduler_->SetNeedsBeginMainFrame(); + EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); + EXPECT_SCOPED(AdvanceFrame()); + EXPECT_TRUE(client_->HasAction("WillBeginImplFrame")); + EXPECT_TRUE(client_->HasAction("ScheduledActionSendBeginMainFrame")); + EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); + task_runner().RunTasksWhile(client_->ImplFrameDeadlinePending(true)); + EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline()); +} + void SchedulerTest::ImplFrameSkippedAfterLateSwapAck( bool swap_ack_before_deadline) { // To get into a high latency state, this test disables automatic swap acks. |