diff options
author | enne@chromium.org <enne@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-05 22:38:51 +0000 |
---|---|---|
committer | enne@chromium.org <enne@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-05 22:38:51 +0000 |
commit | bac0e556066f3b10a46a0c479a25096acc07e40c (patch) | |
tree | ee769163851dd08b21f11148dee67730996d451b /cc/scheduler/scheduler_state_machine.cc | |
parent | 86137956129413201db0be8c9d94f601b63ade61 (diff) | |
download | chromium_src-bac0e556066f3b10a46a0c479a25096acc07e40c.zip chromium_src-bac0e556066f3b10a46a0c479a25096acc07e40c.tar.gz chromium_src-bac0e556066f3b10a46a0c479a25096acc07e40c.tar.bz2 |
cc: Don't ManageTiles twice in one frame
Any external callers of ManageTiles should inform the Scheduler that
ManageTiles happened so that (1) it can clear the "needs manage tiles"
flag and (2) it can avoid doing a second ManageTiles on the same frame.
Other than after commit, where ManageTiles needs to be called
immediately in order to kick off new raster tasks (or determine that no
raster tasks are required to activate the tree), ManageTiles just needs
to be called periodically to keep the raster jobs working on the most
important content. Delaying the periodic caller to prevent these bad
frames with commits is a worthwhile tradeoff.
R=brianderson@chromium.org
BUG=314882
Review URL: https://codereview.chromium.org/45923005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@233111 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc/scheduler/scheduler_state_machine.cc')
-rw-r--r-- | cc/scheduler/scheduler_state_machine.cc | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc index 0fd0f57..4d9e5e9 100644 --- a/cc/scheduler/scheduler_state_machine.cc +++ b/cc/scheduler/scheduler_state_machine.cc @@ -26,6 +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), consecutive_failed_draws_(0), needs_redraw_(false), needs_manage_tiles_(false), @@ -493,6 +494,12 @@ bool SchedulerStateMachine::ShouldCommit() 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_) + return false; + // Limiting to once per-frame is not enough, since we only want to // manage tiles _after_ draws. Polling for draw triggers and // begin-frame are mutually exclusive, so we limit to these two cases. @@ -1018,6 +1025,11 @@ void SchedulerStateMachine::BeginMainFrameAborted(bool did_handle) { } } +void SchedulerStateMachine::DidManageTiles() { + needs_manage_tiles_ = false; + last_frame_number_manage_tiles_called_ = current_frame_number_; +} + void SchedulerStateMachine::DidLoseOutputSurface() { if (output_surface_state_ == OUTPUT_SURFACE_LOST || output_surface_state_ == OUTPUT_SURFACE_CREATING) |