From f36e727e15ab6ee2154ad5b2abe5639b1dafdf2e Mon Sep 17 00:00:00 2001 From: brianderson Date: Wed, 1 Apr 2015 15:06:28 -0700 Subject: [PATCH] cc: Don't background tick for needs redraw BUG=472237 Review URL: https://codereview.chromium.org/1047343002 Cr-Commit-Position: refs/heads/master@{#323334} --- cc/scheduler/scheduler_state_machine.cc | 10 +++- cc/scheduler/scheduler_state_machine_unittest.cc | 60 +++++++++++++++++++++++- 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc index e3c576306bbe..00076908ae29 100644 --- a/cc/scheduler/scheduler_state_machine.cc +++ b/cc/scheduler/scheduler_state_machine.cc @@ -733,7 +733,15 @@ bool SchedulerStateMachine::BeginFrameNeededToAnimateOrDraw() const { if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW) return true; - return needs_animate_ || needs_redraw_; + // TODO(mithro): Remove background animation ticking. crbug.com/371747 + if (needs_animate_) + return true; + + // Only background tick for animations - not draws, which will never happen. + if (!visible_) + return false; + + return needs_redraw_; } // These are cases where we are very likely to draw soon, but might not diff --git a/cc/scheduler/scheduler_state_machine_unittest.cc b/cc/scheduler/scheduler_state_machine_unittest.cc index ba184e569d84..0d94edbb9cc4 100644 --- a/cc/scheduler/scheduler_state_machine_unittest.cc +++ b/cc/scheduler/scheduler_state_machine_unittest.cc @@ -104,9 +104,17 @@ class StateMachine : public SchedulerStateMachine { return output_surface_state_; } + void SetNeedsCommitForTest(bool needs_commit) { + needs_commit_ = needs_commit; + } + bool NeedsCommit() const { return needs_commit_; } - void SetNeedsRedraw(bool b) { needs_redraw_ = b; } + void SetNeedsAnimateForTest(bool needs_animate) { + needs_animate_ = needs_animate; + } + + void SetNeedsRedraw(bool needs_redraw) { needs_redraw_ = needs_redraw; } void SetNeedsForcedRedrawForTimeout(bool b) { forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_COMMIT; @@ -136,6 +144,56 @@ class StateMachine : public SchedulerStateMachine { using SchedulerStateMachine::UpdateStateOnCommit; }; +TEST(SchedulerStateMachineTest, BeginFrameNeeded) { + SchedulerSettings default_scheduler_settings; + StateMachine state(default_scheduler_settings); + state.SetCanStart(); + EXPECT_ACTION_UPDATE_STATE( + SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION) + state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); + state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); + + // Don't request BeginFrames if we are idle. + state.SetVisible(true); + state.SetNeedsRedraw(false); + state.SetNeedsAnimateForTest(false); + EXPECT_FALSE(state.BeginFrameNeeded()); + + // Request BeginFrames if we are ready to draw. + state.SetVisible(true); + state.SetNeedsRedraw(true); + state.SetNeedsAnimateForTest(false); + EXPECT_TRUE(state.BeginFrameNeeded()); + + // Don't background tick for needs_redraw. + state.SetVisible(false); + state.SetNeedsRedraw(true); + state.SetNeedsAnimateForTest(false); + EXPECT_FALSE(state.BeginFrameNeeded()); + + // Background tick for animations. + state.SetVisible(false); + state.SetNeedsRedraw(false); + state.SetNeedsAnimateForTest(true); + EXPECT_TRUE(state.BeginFrameNeeded()); + + // Proactively request BeginFrames when commit is pending. + state.SetVisible(true); + state.SetNeedsRedraw(false); + state.SetNeedsAnimateForTest(false); + state.SetNeedsCommitForTest(true); + EXPECT_TRUE(state.BeginFrameNeeded()); + + // Don't request BeginFrames when commit is pending if + // we are currently deferring commits. + state.SetVisible(true); + state.SetNeedsRedraw(false); + state.SetNeedsAnimateForTest(false); + state.SetNeedsCommitForTest(true); + state.SetDeferCommits(true); + EXPECT_FALSE(state.BeginFrameNeeded()); +} + TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) { SchedulerSettings default_scheduler_settings; -- 2.11.4.GIT