Index: cc/scheduler/scheduler_state_machine.cc |
diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc |
index 800f4131779189e3e5da873f3fe735f11405e59a..ecc131b434c75ac0bd03994bdf62503381807b22 100644 |
--- a/cc/scheduler/scheduler_state_machine.cc |
+++ b/cc/scheduler/scheduler_state_machine.cc |
@@ -123,10 +123,6 @@ const char* SchedulerStateMachine::BeginMainFrameStateToString( |
return "BEGIN_MAIN_FRAME_STATE_STARTED"; |
case BEGIN_MAIN_FRAME_STATE_READY_TO_COMMIT: |
return "BEGIN_MAIN_FRAME_STATE_READY_TO_COMMIT"; |
- case BEGIN_MAIN_FRAME_STATE_WAITING_FOR_ACTIVATION: |
- return "BEGIN_MAIN_FRAME_STATE_WAITING_FOR_ACTIVATION"; |
- case BEGIN_MAIN_FRAME_STATE_WAITING_FOR_DRAW: |
- return "BEGIN_MAIN_FRAME_STATE_WAITING_FOR_DRAW"; |
} |
NOTREACHED(); |
return "???"; |
@@ -367,6 +363,9 @@ bool SchedulerStateMachine::ShouldDraw() const { |
if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) |
return false; |
+ if (wait_for_ready_to_draw_) |
+ 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; |
@@ -429,6 +428,16 @@ bool SchedulerStateMachine::ShouldSendBeginMainFrame() const { |
if (begin_main_frame_state_ != BEGIN_MAIN_FRAME_STATE_IDLE) |
return false; |
+ // MFBA is disabled and we are waiting for previous activation. |
+ if (!settings_.main_frame_before_activation_enabled && has_pending_tree_) |
+ return false; |
+ |
+ // We are waiting for previous frame to be drawn, swapped and acked. |
+ if (settings_.commit_to_active_tree && |
+ (active_tree_needs_first_draw_ || SwapThrottled())) { |
+ return false; |
+ } |
+ |
// Don't send BeginMainFrame early if we are prioritizing the active tree |
// because of ImplLatencyTakesPriority. |
if (ImplLatencyTakesPriority() && |
@@ -484,6 +493,11 @@ bool SchedulerStateMachine::ShouldCommit() const { |
return false; |
} |
+ // Active tree resources might still be in use until the Display draws. |
+ // if (settings_.commit_to_active_tree && SwapThrottled()) |
enne (OOO)
2016/09/22 19:01:47
Leftover code?
sunnyps
2016/09/24 01:15:02
Removed.
|
+ // return false; |
+ DCHECK(!settings_.commit_to_active_tree || !SwapThrottled()); |
enne (OOO)
2016/09/22 19:01:47
It's nice to DCHECK this.
sunnyps
2016/09/24 01:15:02
Yes, although this crashes when we have pure impl-
|
+ |
// If we only have an active tree, it is incorrect to replace it |
// before we've drawn it. |
DCHECK(!settings_.commit_to_active_tree || !active_tree_needs_first_draw_); |
@@ -566,12 +580,7 @@ void SchedulerStateMachine::WillCommit(bool commit_has_no_updates) { |
commit_has_no_updates)); |
commit_count_++; |
last_commit_had_no_updates_ = commit_has_no_updates; |
- |
- if (commit_has_no_updates || settings_.main_frame_before_activation_enabled) { |
- begin_main_frame_state_ = BEGIN_MAIN_FRAME_STATE_IDLE; |
- } else { |
- begin_main_frame_state_ = BEGIN_MAIN_FRAME_STATE_WAITING_FOR_ACTIVATION; |
- } |
+ begin_main_frame_state_ = BEGIN_MAIN_FRAME_STATE_IDLE; |
if (!commit_has_no_updates) { |
// Pending tree only exists if commit had updates. |
@@ -597,13 +606,6 @@ void SchedulerStateMachine::WillCommit(bool commit_has_no_updates) { |
} |
void SchedulerStateMachine::WillActivate() { |
- if (begin_main_frame_state_ == |
- BEGIN_MAIN_FRAME_STATE_WAITING_FOR_ACTIVATION) { |
- begin_main_frame_state_ = settings_.commit_to_active_tree |
- ? BEGIN_MAIN_FRAME_STATE_WAITING_FOR_DRAW |
- : BEGIN_MAIN_FRAME_STATE_IDLE; |
- } |
- |
if (compositor_frame_sink_state_ == |
COMPOSITOR_FRAME_SINK_WAITING_FOR_FIRST_ACTIVATION) |
compositor_frame_sink_state_ = COMPOSITOR_FRAME_SINK_ACTIVE; |
@@ -636,9 +638,6 @@ void SchedulerStateMachine::WillDrawInternal() { |
if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW) |
forced_redraw_state_ = FORCED_REDRAW_STATE_IDLE; |
- |
- if (begin_main_frame_state_ == BEGIN_MAIN_FRAME_STATE_WAITING_FOR_DRAW) |
- begin_main_frame_state_ = BEGIN_MAIN_FRAME_STATE_IDLE; |
} |
void SchedulerStateMachine::DidDrawInternal(DrawResult draw_result) { |
@@ -729,8 +728,7 @@ void SchedulerStateMachine::WillInvalidateCompositorFrameSink() { |
} |
void SchedulerStateMachine::SetSkipNextBeginMainFrameToReduceLatency() { |
- TRACE_EVENT_INSTANT0("cc", |
- "Scheduler: SkipNextBeginMainFrameToReduceLatency", |
+ TRACE_EVENT_INSTANT0("cc", "Scheduler: SkipNextBeginMainFrameToReduceLatency", |
TRACE_EVENT_SCOPE_THREAD); |
skip_next_begin_main_frame_to_reduce_latency_ = true; |
} |
@@ -953,9 +951,13 @@ void SchedulerStateMachine::SetResourcelessSoftwareDraw( |
resourceless_draw_ = resourceless_draw; |
} |
-void SchedulerStateMachine::SetCanDraw(bool can_draw) { can_draw_ = can_draw; } |
+void SchedulerStateMachine::SetCanDraw(bool can_draw) { |
+ can_draw_ = can_draw; |
+} |
-void SchedulerStateMachine::SetNeedsRedraw() { needs_redraw_ = true; } |
+void SchedulerStateMachine::SetNeedsRedraw() { |
+ needs_redraw_ = true; |
+} |
bool SchedulerStateMachine::OnlyImplSideUpdatesExpected() const { |
bool has_impl_updates = needs_redraw_ || needs_one_begin_impl_frame_; |
@@ -1029,11 +1031,6 @@ void SchedulerStateMachine::NotifyReadyToCommit() { |
DCHECK_EQ(begin_main_frame_state_, BEGIN_MAIN_FRAME_STATE_STARTED) |
<< AsValue()->ToString(); |
begin_main_frame_state_ = BEGIN_MAIN_FRAME_STATE_READY_TO_COMMIT; |
- // In commit_to_active_tree mode, commit should happen right after |
- // BeginFrame, meaning when this function is called, next action should be |
- // commit. |
- if (settings_.commit_to_active_tree) |
- DCHECK(ShouldCommit()); |
} |
void SchedulerStateMachine::BeginMainFrameAborted(CommitEarlyOutReason reason) { |