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

Unified Diff: cc/scheduler/scheduler_state_machine.cc

Issue 130483010: cc: Limit ManageTiles calls to once per-frame on average (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Add tests Created 6 years, 11 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/scheduler/scheduler_state_machine.h ('k') | cc/scheduler/scheduler_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/scheduler/scheduler_state_machine.cc
diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc
index 7d8fcd721a32059e07c9167647ea8b22aa7fc167..334c8480c19b8c26978a02ff6bb913f95a7d543f 100644
--- a/cc/scheduler/scheduler_state_machine.cc
+++ b/cc/scheduler/scheduler_state_machine.cc
@@ -26,7 +26,7 @@ SchedulerStateMachine::SchedulerStateMachine(const SchedulerSettings& settings)
last_frame_number_swap_performed_(-1),
last_frame_number_begin_main_frame_sent_(-1),
last_frame_number_update_visible_tiles_was_called_(-1),
- last_frame_number_manage_tiles_called_(-1),
+ manage_tiles_funnel_(0),
consecutive_failed_draws_(0),
needs_redraw_(false),
needs_manage_tiles_(false),
@@ -239,6 +239,7 @@ scoped_ptr<base::Value> SchedulerStateMachine::AsValue() const {
"last_frame_number_update_visible_tiles_was_called",
last_frame_number_update_visible_tiles_was_called_);
+ minor_state->SetInteger("manage_tiles_funnel", manage_tiles_funnel_);
minor_state->SetInteger("consecutive_failed_draws",
consecutive_failed_draws_);
minor_state->SetBoolean("needs_redraw", needs_redraw_);
@@ -270,6 +271,14 @@ scoped_ptr<base::Value> SchedulerStateMachine::AsValue() const {
return state.PassAs<base::Value>();
}
+void SchedulerStateMachine::AdvanceCurrentFrameNumber() {
+ current_frame_number_++;
+
+ // "Drain" the ManageTiles funnel.
+ if (manage_tiles_funnel_ > 0)
+ manage_tiles_funnel_--;
+}
+
bool SchedulerStateMachine::HasSentBeginMainFrameThisFrame() const {
return current_frame_number_ ==
last_frame_number_begin_main_frame_sent_;
@@ -507,9 +516,9 @@ bool SchedulerStateMachine::IsCommitStateWaiting() const {
bool SchedulerStateMachine::ShouldManageTiles() const {
// ManageTiles only really needs to be called immediately after commit
- // and then periodically after that. Limiting to once per frame prevents
- // post-commit and post-draw ManageTiles on the same frame.
- if (last_frame_number_manage_tiles_called_ == current_frame_number_)
+ // and then periodically after that. Use a funnel to make sure we average
+ // one ManageTiles per BeginImplFrame in the long run.
+ if (manage_tiles_funnel_ > 0)
return false;
// Limiting to once per-frame is not enough, since we only want to
@@ -885,7 +894,7 @@ bool SchedulerStateMachine::ProactiveBeginImplFrameWanted() const {
}
void SchedulerStateMachine::OnBeginImplFrame(const BeginFrameArgs& args) {
- current_frame_number_++;
+ AdvanceCurrentFrameNumber();
last_begin_impl_frame_args_ = args;
DCHECK_EQ(begin_impl_frame_state_, BEGIN_IMPL_FRAME_STATE_IDLE) << *AsValue();
begin_impl_frame_state_ = BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING;
@@ -981,7 +990,7 @@ bool SchedulerStateMachine::MainThreadIsInHighLatencyMode() const {
}
void SchedulerStateMachine::DidEnterPollForAnticipatedDrawTriggers() {
- current_frame_number_++;
+ AdvanceCurrentFrameNumber();
inside_poll_for_anticipated_draw_triggers_ = true;
}
@@ -1081,7 +1090,8 @@ void SchedulerStateMachine::BeginMainFrameAborted(bool did_handle) {
void SchedulerStateMachine::DidManageTiles() {
needs_manage_tiles_ = false;
- last_frame_number_manage_tiles_called_ = current_frame_number_;
+ // "Fill" the ManageTiles funnel.
+ manage_tiles_funnel_++;
}
void SchedulerStateMachine::DidLoseOutputSurface() {
« no previous file with comments | « cc/scheduler/scheduler_state_machine.h ('k') | cc/scheduler/scheduler_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698