summaryrefslogtreecommitdiffstats
path: root/cc/scheduler
diff options
context:
space:
mode:
authormithro <mithro@mithis.com>2014-11-10 07:36:47 -0800
committerCommit bot <commit-bot@chromium.org>2014-11-10 15:37:19 +0000
commit719bf67948d010b5462993ee1b2697f437053c9c (patch)
tree982e5d8b31d4f1838cb566c5fd33b33f39144d40 /cc/scheduler
parentf302b0fe8d6f4b237a04696f52277f42ceefbb1a (diff)
downloadchromium_src-719bf67948d010b5462993ee1b2697f437053c9c.zip
chromium_src-719bf67948d010b5462993ee1b2697f437053c9c.tar.gz
chromium_src-719bf67948d010b5462993ee1b2697f437053c9c.tar.bz2
Moving background animation ticking from LayerTreeHostImpl into the Scheduler.
Background ticking currently happens in the LayerTreeHostImpl, this makes it very hard to preserve the monotonicity guarantee needed by frame times. http://crrev.com/267783004 set up the scheduler to become the source of background ticks and this CL makes use of that functionality. BUG=345459 Committed: https://crrev.com/4df3c4366015739a7c6b6c1539a8d7c9198e38ef Cr-Commit-Position: refs/heads/master@{#302757} Committed: https://crrev.com/185438b3e5e3f43ce2996da0022f510fbe193a6e Cr-Commit-Position: refs/heads/master@{#303423} Review URL: https://codereview.chromium.org/595973002 Cr-Commit-Position: refs/heads/master@{#303467}
Diffstat (limited to 'cc/scheduler')
-rw-r--r--cc/scheduler/scheduler.cc6
-rw-r--r--cc/scheduler/scheduler_settings.cc9
-rw-r--r--cc/scheduler/scheduler_settings.h3
-rw-r--r--cc/scheduler/scheduler_state_machine.cc16
-rw-r--r--cc/scheduler/scheduler_state_machine_unittest.cc2
5 files changed, 16 insertions, 20 deletions
diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc
index 88c27c1..4c2316f 100644
--- a/cc/scheduler/scheduler.cc
+++ b/cc/scheduler/scheduler.cc
@@ -62,9 +62,9 @@ SchedulerFrameSourcesConstructor::ConstructBackgroundFrameSource(
"SyntheticBeginFrameSource");
DCHECK(!(scheduler->background_frame_source_internal_));
scheduler->background_frame_source_internal_ =
- SyntheticBeginFrameSource::Create(scheduler->task_runner_.get(),
- scheduler->Now(),
- base::TimeDelta::FromSeconds(1));
+ SyntheticBeginFrameSource::Create(
+ scheduler->task_runner_.get(), scheduler->Now(),
+ scheduler->settings_.background_frame_interval);
return scheduler->background_frame_source_internal_.get();
}
diff --git a/cc/scheduler/scheduler_settings.cc b/cc/scheduler/scheduler_settings.cc
index ab9add0..95294ad 100644
--- a/cc/scheduler/scheduler_settings.cc
+++ b/cc/scheduler/scheduler_settings.cc
@@ -17,7 +17,8 @@ SchedulerSettings::SchedulerSettings()
maximum_number_of_failed_draws_before_draw_is_forced_(3),
using_synchronous_renderer_compositor(false),
throttle_frame_production(true),
- disable_hi_res_timer_tasks_on_battery(false) {
+ disable_hi_res_timer_tasks_on_battery(false),
+ background_frame_interval(base::TimeDelta::FromSeconds(1)) {
}
SchedulerSettings::SchedulerSettings(const LayerTreeSettings& settings)
@@ -33,7 +34,9 @@ SchedulerSettings::SchedulerSettings(const LayerTreeSettings& settings)
settings.using_synchronous_renderer_compositor),
throttle_frame_production(settings.throttle_frame_production),
disable_hi_res_timer_tasks_on_battery(
- settings.disable_hi_res_timer_tasks_on_battery) {
+ settings.disable_hi_res_timer_tasks_on_battery),
+ background_frame_interval(base::TimeDelta::FromSecondsD(
+ 1.0 / settings.background_animation_rate)) {
}
SchedulerSettings::~SchedulerSettings() {}
@@ -56,6 +59,8 @@ SchedulerSettings::AsValue() const {
state->SetBoolean("throttle_frame_production", throttle_frame_production);
state->SetBoolean("disable_hi_res_timer_tasks_on_battery",
disable_hi_res_timer_tasks_on_battery);
+ state->SetInteger("background_frame_interval",
+ background_frame_interval.InMicroseconds());
return state;
}
diff --git a/cc/scheduler/scheduler_settings.h b/cc/scheduler/scheduler_settings.h
index 8607991..561d265 100644
--- a/cc/scheduler/scheduler_settings.h
+++ b/cc/scheduler/scheduler_settings.h
@@ -6,6 +6,7 @@
#define CC_SCHEDULER_SCHEDULER_SETTINGS_H_
#include "base/memory/ref_counted.h"
+#include "base/time/time.h"
#include "base/values.h"
#include "cc/base/cc_export.h"
@@ -33,6 +34,8 @@ class CC_EXPORT SchedulerSettings {
bool throttle_frame_production;
bool disable_hi_res_timer_tasks_on_battery;
+ base::TimeDelta background_frame_interval;
+
scoped_refptr<base::debug::ConvertableToTraceFormat> AsValue() const;
};
diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc
index 2b8210d..94016f3 100644
--- a/cc/scheduler/scheduler_state_machine.cc
+++ b/cc/scheduler/scheduler_state_machine.cc
@@ -423,9 +423,6 @@ bool SchedulerStateMachine::ShouldUpdateVisibleTiles() const {
}
bool SchedulerStateMachine::ShouldAnimate() const {
- if (!can_draw_)
- return false;
-
// If a commit occurred after our last call, we need to do animation again.
if (HasAnimatedThisFrame() && !did_commit_after_animating_)
return false;
@@ -765,29 +762,18 @@ bool SchedulerStateMachine::BeginFrameNeededToAnimateOrDraw() const {
if (!HasInitializedOutputSurface())
return false;
- // If we can't draw, don't tick until we are notified that we can draw again.
- if (!can_draw_)
- return false;
-
// The forced draw respects our normal draw scheduling, so we need to
// request a BeginImplFrame for it.
if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW)
return true;
- // There's no need to produce frames if we are not visible.
- if (!visible_)
- return false;
-
// We need to draw a more complete frame than we did the last BeginImplFrame,
// so request another BeginImplFrame in anticipation that we will have
// additional visible tiles.
if (swap_used_incomplete_tile_)
return true;
- if (needs_animate_)
- return true;
-
- return needs_redraw_;
+ return needs_animate_ || 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 e3530c8..85160ed 100644
--- a/cc/scheduler/scheduler_state_machine_unittest.cc
+++ b/cc/scheduler/scheduler_state_machine_unittest.cc
@@ -703,6 +703,7 @@ TEST(SchedulerStateMachineTest,
state.SetVisible(true);
state.SetCanDraw(false);
state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
@@ -711,6 +712,7 @@ TEST(SchedulerStateMachineTest,
state.NotifyReadyToCommit();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
state.OnBeginImplFrameDeadline();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
}