| Index: cc/scheduler_state_machine.cc
|
| diff --git a/cc/scheduler_state_machine.cc b/cc/scheduler_state_machine.cc
|
| index 60a1ce9a3a1dffb0892ebf0fc45e3f64660f43bf..0e3c2630471491bf2cecfae0ffb377d2ebc7a2ce 100644
|
| --- a/cc/scheduler_state_machine.cc
|
| +++ b/cc/scheduler_state_machine.cc
|
| @@ -16,9 +16,11 @@ SchedulerStateMachine::SchedulerStateMachine(const LayerTreeSettings &layerTreeS
|
| , m_currentFrameNumber(0)
|
| , m_lastFrameNumberWhereDrawWasCalled(-1)
|
| , m_lastFrameNumberWhereTreeActivationAttempted(-1)
|
| + , m_lastFrameNumberWhereRedrawOnVisibleTextureUploadAttempted(-1)
|
| , m_consecutiveFailedDraws(0)
|
| , m_maximumNumberOfFailedDrawsBeforeDrawIsForced(3)
|
| , m_needsRedraw(false)
|
| + , m_needsRedrawOnVisibleTextureUpload(false)
|
| , m_needsForcedRedraw(false)
|
| , m_needsForcedRedrawAfterNextCommit(false)
|
| , m_needsCommit(false)
|
| @@ -45,6 +47,7 @@ std::string SchedulerStateMachine::toString()
|
| base::StringAppendF(&str, "m_consecutiveFailedDraws = %d; ", m_consecutiveFailedDraws);
|
| base::StringAppendF(&str, "m_maximumNumberOfFailedDrawsBeforeDrawIsForced = %d; ", m_maximumNumberOfFailedDrawsBeforeDrawIsForced);
|
| base::StringAppendF(&str, "m_needsRedraw = %d; ", m_needsRedraw);
|
| + base::StringAppendF(&str, "m_needsRedrawOnVisibleTextureUpload = %d; ", m_needsRedrawOnVisibleTextureUpload);
|
| base::StringAppendF(&str, "m_needsForcedRedraw = %d; ", m_needsForcedRedraw);
|
| base::StringAppendF(&str, "m_needsForcedRedrawAfterNextCommit = %d; ", m_needsForcedRedrawAfterNextCommit);
|
| base::StringAppendF(&str, "m_needsCommit = %d; ", m_needsCommit);
|
| @@ -72,6 +75,12 @@ bool SchedulerStateMachine::hasAttemptedTreeActivationThisFrame() const
|
| return m_currentFrameNumber == m_lastFrameNumberWhereTreeActivationAttempted;
|
| }
|
|
|
| +bool SchedulerStateMachine::hasAttemptedRedrawOnVisibleTextureUploadThisFrame() const
|
| +{
|
| + return m_currentFrameNumber ==
|
| + m_lastFrameNumberWhereRedrawOnVisibleTextureUploadAttempted;
|
| +}
|
| +
|
| bool SchedulerStateMachine::drawSuspendedUntilCommit() const
|
| {
|
| if (!m_canDraw)
|
| @@ -110,7 +119,14 @@ bool SchedulerStateMachine::shouldDraw() const
|
|
|
| bool SchedulerStateMachine::shouldAttemptTreeActivation() const
|
| {
|
| - return m_hasPendingTree && m_insideVSync && !hasAttemptedTreeActivationThisFrame();
|
| + return m_hasPendingTree && m_insideVSync && !hasAttemptedTreeActivationThisFrame();
|
| +}
|
| +
|
| +bool SchedulerStateMachine::shouldAttemptRedrawOnVisibleTextureUpload() const
|
| +{
|
| + return m_needsRedrawOnVisibleTextureUpload &&
|
| + !hasAttemptedRedrawOnVisibleTextureUploadThisFrame() &&
|
| + !hasDrawnThisFrame();
|
| }
|
|
|
| bool SchedulerStateMachine::shouldAcquireLayerTexturesForMainThread() const
|
| @@ -149,6 +165,8 @@ SchedulerStateMachine::Action SchedulerStateMachine::nextAction() const
|
| return ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED;
|
| if (shouldDraw())
|
| return m_needsForcedRedraw ? ACTION_DRAW_FORCED : ACTION_DRAW_IF_POSSIBLE;
|
| + if (shouldAttemptRedrawOnVisibleTextureUpload())
|
| + return ACTION_CHECK_FOR_NEW_VISIBLE_TEXTURES;
|
| if (m_needsCommit && ((m_visible && m_canBeginFrame) || m_needsForcedCommit))
|
| // TODO(enne): Should probably drop the active tree on force commit
|
| return m_hasPendingTree ? ACTION_NONE : ACTION_BEGIN_FRAME;
|
| @@ -159,6 +177,8 @@ SchedulerStateMachine::Action SchedulerStateMachine::nextAction() const
|
| return ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED;
|
| if (shouldDraw())
|
| return m_needsForcedRedraw ? ACTION_DRAW_FORCED : ACTION_DRAW_IF_POSSIBLE;
|
| + if (shouldAttemptRedrawOnVisibleTextureUpload())
|
| + return ACTION_CHECK_FOR_NEW_VISIBLE_TEXTURES;
|
| return ACTION_NONE;
|
|
|
| case COMMIT_STATE_READY_TO_COMMIT:
|
| @@ -169,6 +189,8 @@ SchedulerStateMachine::Action SchedulerStateMachine::nextAction() const
|
| return ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED;
|
| if (shouldDraw() || m_outputSurfaceState == OUTPUT_SURFACE_LOST)
|
| return m_needsForcedRedraw ? ACTION_DRAW_FORCED : ACTION_DRAW_IF_POSSIBLE;
|
| + if (shouldAttemptRedrawOnVisibleTextureUpload())
|
| + return ACTION_CHECK_FOR_NEW_VISIBLE_TEXTURES;
|
| // COMMIT_STATE_WAITING_FOR_FIRST_DRAW wants to enforce a draw. If m_canDraw is false
|
| // or textures are not available, proceed to the next step (similar as in COMMIT_STATE_IDLE).
|
| bool canCommit = m_visible || m_needsForcedCommit;
|
| @@ -182,6 +204,8 @@ SchedulerStateMachine::Action SchedulerStateMachine::nextAction() const
|
| return ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED;
|
| if (m_needsForcedRedraw)
|
| return ACTION_DRAW_FORCED;
|
| + if (shouldAttemptRedrawOnVisibleTextureUpload())
|
| + return ACTION_CHECK_FOR_NEW_VISIBLE_TEXTURES;
|
| return ACTION_NONE;
|
| }
|
| NOTREACHED();
|
| @@ -198,6 +222,13 @@ void SchedulerStateMachine::updateState(Action action)
|
| m_lastFrameNumberWhereTreeActivationAttempted = m_currentFrameNumber;
|
| return;
|
|
|
| + case ACTION_CHECK_FOR_NEW_VISIBLE_TEXTURES:
|
| + // We set this false here and the caller must actively set this back
|
| + // to true for each frame that it still needs to check for uploads.
|
| + m_needsRedrawOnVisibleTextureUpload = false;
|
| + m_lastFrameNumberWhereRedrawOnVisibleTextureUploadAttempted = m_currentFrameNumber;
|
| + return;
|
| +
|
| case ACTION_BEGIN_FRAME:
|
| DCHECK(!m_hasPendingTree);
|
| DCHECK(m_visible || m_needsForcedCommit);
|
| @@ -277,6 +308,9 @@ bool SchedulerStateMachine::vsyncCallbackNeeded() const
|
| if (m_needsForcedRedraw)
|
| return true;
|
|
|
| + if (m_visible && m_needsRedrawOnVisibleTextureUpload)
|
| + return true;
|
| +
|
| return m_needsRedraw && m_visible && m_outputSurfaceState == OUTPUT_SURFACE_ACTIVE;
|
| }
|
|
|
| @@ -301,6 +335,11 @@ void SchedulerStateMachine::setNeedsRedraw()
|
| m_needsRedraw = true;
|
| }
|
|
|
| +void SchedulerStateMachine::setNeedsRedrawOnVisibleTextureUpload()
|
| +{
|
| + m_needsRedrawOnVisibleTextureUpload = true;
|
| +}
|
| +
|
| void SchedulerStateMachine::setNeedsForcedRedraw()
|
| {
|
| m_needsForcedRedraw = true;
|
|
|