| Index: cc/scheduler/scheduler_state_machine.cc
|
| diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc
|
| index 70c7f67cc66398046fac720c643fcf25ce3c2cc1..800f4131779189e3e5da873f3fe735f11405e59a 100644
|
| --- a/cc/scheduler/scheduler_state_machine.cc
|
| +++ b/cc/scheduler/scheduler_state_machine.cc
|
| @@ -123,6 +123,10 @@
|
| 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 "???";
|
| @@ -363,17 +367,6 @@
|
| if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE)
|
| return false;
|
|
|
| - // Wait for active tree to be rasterized before drawing in browser compositor.
|
| - if (wait_for_ready_to_draw_) {
|
| - DCHECK(settings_.commit_to_active_tree);
|
| - return false;
|
| - }
|
| -
|
| - // Browser compositor commit steals any resources submitted in draw. Therefore
|
| - // drawing while a commit is pending is wasteful.
|
| - if (settings_.commit_to_active_tree && CommitPending())
|
| - 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;
|
| @@ -435,16 +428,6 @@
|
| // immediately to IDLE.
|
| 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.
|
| @@ -501,12 +484,9 @@
|
| return false;
|
| }
|
|
|
| - // If we only have an active tree, it is incorrect to replace it before we've
|
| - // drawn it.
|
| + // 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_);
|
| -
|
| - // In browser compositor commit reclaims any resources submitted during draw.
|
| - DCHECK(!settings_.commit_to_active_tree || !SwapThrottled());
|
|
|
| return true;
|
| }
|
| @@ -586,7 +566,12 @@
|
| commit_has_no_updates));
|
| commit_count_++;
|
| last_commit_had_no_updates_ = commit_has_no_updates;
|
| - begin_main_frame_state_ = BEGIN_MAIN_FRAME_STATE_IDLE;
|
| +
|
| + 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;
|
| + }
|
|
|
| if (!commit_has_no_updates) {
|
| // Pending tree only exists if commit had updates.
|
| @@ -612,6 +597,13 @@
|
| }
|
|
|
| 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;
|
| @@ -644,6 +636,9 @@
|
|
|
| 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) {
|
| @@ -734,7 +729,8 @@
|
| }
|
|
|
| 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;
|
| }
|
| @@ -876,12 +872,12 @@
|
| if (settings_.using_synchronous_renderer_compositor) {
|
| // No deadline for synchronous compositor.
|
| return BEGIN_IMPL_FRAME_DEADLINE_MODE_NONE;
|
| - } else if (wait_for_ready_to_draw_) {
|
| - // In browser compositor, wait for active tree to be rasterized.
|
| - DCHECK(settings_.commit_to_active_tree);
|
| - return BEGIN_IMPL_FRAME_DEADLINE_MODE_BLOCKED_ON_READY_TO_DRAW;
|
| } else if (ShouldTriggerBeginImplFrameDeadlineImmediately()) {
|
| return BEGIN_IMPL_FRAME_DEADLINE_MODE_IMMEDIATE;
|
| + } else if (wait_for_ready_to_draw_) {
|
| + // When we are waiting for ready to draw signal, we do not wait to post a
|
| + // deadline yet.
|
| + return BEGIN_IMPL_FRAME_DEADLINE_MODE_BLOCKED_ON_READY_TO_DRAW;
|
| } else if (needs_redraw_) {
|
| // We have an animation or fast input path on the impl thread that wants
|
| // to draw, so don't wait too long for a new active tree.
|
| @@ -899,6 +895,11 @@
|
| if (PendingActivationsShouldBeForced() && !has_pending_tree_)
|
| return true;
|
|
|
| + // Do not trigger deadline immediately if we're waiting for READY_TO_DRAW
|
| + // unless it's one of the forced cases.
|
| + if (wait_for_ready_to_draw_)
|
| + return false;
|
| +
|
| // SwapAck throttle the deadline since we wont draw and swap anyway.
|
| if (SwapThrottled())
|
| return false;
|
| @@ -914,7 +915,8 @@
|
| // don't have a pending tree -- otherwise we should give it a chance to
|
| // activate.
|
| // TODO(skyostil): Revisit this when we have more accurate deadline estimates.
|
| - if (!CommitPending() && !has_pending_tree_)
|
| + if (begin_main_frame_state_ == BEGIN_MAIN_FRAME_STATE_IDLE &&
|
| + !has_pending_tree_)
|
| return true;
|
|
|
| // Prioritize impl-thread draws in ImplLatencyTakesPriority mode.
|
| @@ -951,13 +953,9 @@
|
| resourceless_draw_ = resourceless_draw;
|
| }
|
|
|
| -void SchedulerStateMachine::SetCanDraw(bool can_draw) {
|
| - can_draw_ = can_draw;
|
| -}
|
| -
|
| -void SchedulerStateMachine::SetNeedsRedraw() {
|
| - needs_redraw_ = true;
|
| -}
|
| +void SchedulerStateMachine::SetCanDraw(bool can_draw) { can_draw_ = can_draw; }
|
| +
|
| +void SchedulerStateMachine::SetNeedsRedraw() { needs_redraw_ = true; }
|
|
|
| bool SchedulerStateMachine::OnlyImplSideUpdatesExpected() const {
|
| bool has_impl_updates = needs_redraw_ || needs_one_begin_impl_frame_;
|
| @@ -1031,8 +1029,9 @@
|
| 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.
|
| + // 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());
|
| }
|
|
|