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

Unified Diff: cc/scheduler/scheduler_state_machine.cc

Issue 1133673004: cc: Heuristic for Renderer latency recovery (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix lots of issues; improve test coverage; Created 5 years, 7 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
Index: cc/scheduler/scheduler_state_machine.cc
diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc
index 2fbeca2d8a992d87cd118a09a78eeb5db8b61d3b..fb602609f2d4cb7cf72313149dd2ab8ef8ccce1a 100644
--- a/cc/scheduler/scheduler_state_machine.cc
+++ b/cc/scheduler/scheduler_state_machine.cc
@@ -35,6 +35,8 @@ SchedulerStateMachine::SchedulerStateMachine(const SchedulerSettings& settings)
consecutive_checkerboard_animations_(0),
max_pending_swaps_(1),
pending_swaps_(0),
+ swaps_are_likely_high_latency_(false),
+ was_swap_throttled_on_begin_impl_frame_(false),
needs_redraw_(false),
needs_animate_(false),
needs_prepare_tiles_(false),
@@ -48,7 +50,7 @@ SchedulerStateMachine::SchedulerStateMachine(const SchedulerSettings& settings)
did_create_and_initialize_first_output_surface_(false),
impl_latency_takes_priority_(false),
skip_next_begin_main_frame_to_reduce_latency_(false),
- skip_begin_main_frame_to_reduce_latency_(false),
+ skip_next_swap_to_reduce_latency_(false),
continuous_painting_(false),
children_need_begin_frames_(false),
defer_commits_(false),
@@ -238,8 +240,6 @@ void SchedulerStateMachine::AsValueInto(
impl_latency_takes_priority_);
state->SetBoolean("main_thread_is_in_high_latency_mode",
MainThreadIsInHighLatencyMode());
- state->SetBoolean("skip_begin_main_frame_to_reduce_latency",
- skip_begin_main_frame_to_reduce_latency_);
state->SetBoolean("skip_next_begin_main_frame_to_reduce_latency",
skip_next_begin_main_frame_to_reduce_latency_);
state->SetBoolean("continuous_painting", continuous_painting_);
@@ -345,6 +345,10 @@ bool SchedulerStateMachine::ShouldDraw() const {
if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE)
return false;
+ // We are intentionally skipping this swap to reduce our latency.
+ if (skip_next_swap_to_reduce_latency_)
+ return false;
+
// Only handle forced redraws due to timeouts on the regular deadline.
if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW)
return true;
@@ -447,7 +451,7 @@ bool SchedulerStateMachine::ShouldSendBeginMainFrame() const {
if (pending_swaps_ >= max_pending_swaps_ && !just_swapped_in_deadline)
return false;
- if (skip_begin_main_frame_to_reduce_latency_)
+ if (skip_next_begin_main_frame_to_reduce_latency_)
return false;
return true;
@@ -727,6 +731,21 @@ void SchedulerStateMachine::SetSkipNextBeginMainFrameToReduceLatency() {
skip_next_begin_main_frame_to_reduce_latency_ = true;
}
+void SchedulerStateMachine::SetSkipNextSwapToReduceLatency() {
+ TRACE_EVENT_INSTANT0("cc", "Scheduler: SetSkipNextSwapToReduceLatency",
+ TRACE_EVENT_SCOPE_THREAD);
+ // We need to skip both the BeginMainFrame and swap to make sure we
+ // don't keep stuffing the pipeline.
+ skip_next_swap_to_reduce_latency_ = true;
+ skip_next_begin_main_frame_to_reduce_latency_ = true;
+
+ // If there are no swap ack's pending to update swaps_are_likely_high_latency
+ // later, reset it now.
+ // TODO(brianderson): A unittest that fails without this.
+ if (!pending_swaps_)
sunnyps 2015/05/21 23:42:23 nit: Don't use boolean operators on numeric types.
brianderson 2015/05/22 01:12:53 Done.
+ swaps_are_likely_high_latency_ = false;
+}
+
bool SchedulerStateMachine::BeginFrameRequiredForChildren() const {
return children_need_begin_frames_;
}
@@ -834,9 +853,13 @@ void SchedulerStateMachine::OnBeginImplFrame() {
if (prepare_tiles_funnel_ > 0)
prepare_tiles_funnel_--;
- skip_begin_main_frame_to_reduce_latency_ =
- skip_next_begin_main_frame_to_reduce_latency_;
+ was_swap_throttled_on_begin_impl_frame_ =
+ pending_swaps_ >= max_pending_swaps_;
+ swaps_are_likely_high_latency_ =
+ swaps_are_likely_high_latency_ || was_swap_throttled_on_begin_impl_frame_;
+
skip_next_begin_main_frame_to_reduce_latency_ = false;
+ skip_next_swap_to_reduce_latency_ = false;
}
void SchedulerStateMachine::OnBeginImplFrameDeadlinePending() {
@@ -882,7 +905,6 @@ SchedulerStateMachine::CurrentBeginImplFrameDeadlineMode() const {
bool SchedulerStateMachine::ShouldTriggerBeginImplFrameDeadlineImmediately()
const {
- // TODO(brianderson): This should take into account multiple commit sources.
if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME)
return false;
@@ -890,6 +912,11 @@ bool SchedulerStateMachine::ShouldTriggerBeginImplFrameDeadlineImmediately()
if (PendingActivationsShouldBeForced() && !has_pending_tree_)
return true;
+ // We aren't going to draw in the deadline if we want to reduce our latency,
+ // so we might as well trigger the deadline immediately.
+ if (skip_next_swap_to_reduce_latency_)
+ return true;
+
// SwapAck throttle the deadline since we wont draw and swap anyway.
if (pending_swaps_ >= max_pending_swaps_)
return false;
@@ -993,6 +1020,11 @@ void SchedulerStateMachine::DidSwapBuffers() {
void SchedulerStateMachine::DidSwapBuffersComplete() {
DCHECK_GT(pending_swaps_, 0);
pending_swaps_--;
+
+ // If we just skipped a swap, assume the attempt to reduce latency
+ // was successful.
+ swaps_are_likely_high_latency_ = was_swap_throttled_on_begin_impl_frame_ &&
+ !skip_next_swap_to_reduce_latency_;
}
void SchedulerStateMachine::SetImplLatencyTakesPriority(

Powered by Google App Engine
This is Rietveld 408576698