| Index: cc/CCSchedulerStateMachine.cpp
|
| diff --git a/cc/CCSchedulerStateMachine.cpp b/cc/CCSchedulerStateMachine.cpp
|
| deleted file mode 100644
|
| index 3eaf5cd90125a7e8713f1a574aa72e1e93c668f1..0000000000000000000000000000000000000000
|
| --- a/cc/CCSchedulerStateMachine.cpp
|
| +++ /dev/null
|
| @@ -1,317 +0,0 @@
|
| -// Copyright 2011 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "config.h"
|
| -
|
| -#include "CCSchedulerStateMachine.h"
|
| -#include "base/stringprintf.h"
|
| -
|
| -
|
| -namespace cc {
|
| -
|
| -CCSchedulerStateMachine::CCSchedulerStateMachine()
|
| - : m_commitState(COMMIT_STATE_IDLE)
|
| - , m_currentFrameNumber(0)
|
| - , m_lastFrameNumberWhereDrawWasCalled(-1)
|
| - , m_consecutiveFailedDraws(0)
|
| - , m_maximumNumberOfFailedDrawsBeforeDrawIsForced(3)
|
| - , m_needsRedraw(false)
|
| - , m_needsForcedRedraw(false)
|
| - , m_needsForcedRedrawAfterNextCommit(false)
|
| - , m_needsCommit(false)
|
| - , m_needsForcedCommit(false)
|
| - , m_mainThreadNeedsLayerTextures(false)
|
| - , m_insideVSync(false)
|
| - , m_visible(false)
|
| - , m_canBeginFrame(false)
|
| - , m_canDraw(false)
|
| - , m_drawIfPossibleFailed(false)
|
| - , m_textureState(LAYER_TEXTURE_STATE_UNLOCKED)
|
| - , m_contextState(CONTEXT_ACTIVE)
|
| -{
|
| -}
|
| -
|
| -std::string CCSchedulerStateMachine::toString()
|
| -{
|
| - std::string str;
|
| - base::StringAppendF(&str, "m_commitState = %d; ", m_commitState);
|
| - base::StringAppendF(&str, "m_currentFrameNumber = %d; ", m_currentFrameNumber);
|
| - base::StringAppendF(&str, "m_lastFrameNumberWhereDrawWasCalled = %d; ", m_lastFrameNumberWhereDrawWasCalled);
|
| - 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_needsForcedRedraw = %d; ", m_needsForcedRedraw);
|
| - base::StringAppendF(&str, "m_needsForcedRedrawAfterNextCommit = %d; ", m_needsForcedRedrawAfterNextCommit);
|
| - base::StringAppendF(&str, "m_needsCommit = %d; ", m_needsCommit);
|
| - base::StringAppendF(&str, "m_needsForcedCommit = %d; ", m_needsForcedCommit);
|
| - base::StringAppendF(&str, "m_mainThreadNeedsLayerTextures = %d; ", m_mainThreadNeedsLayerTextures);
|
| - base::StringAppendF(&str, "m_insideVSync = %d; ", m_insideVSync);
|
| - base::StringAppendF(&str, "m_visible = %d; ", m_visible);
|
| - base::StringAppendF(&str, "m_canBeginFrame = %d; ", m_canBeginFrame);
|
| - base::StringAppendF(&str, "m_canDraw = %d; ", m_canDraw);
|
| - base::StringAppendF(&str, "m_drawIfPossibleFailed = %d; ", m_drawIfPossibleFailed);
|
| - base::StringAppendF(&str, "m_textureState = %d; ", m_textureState);
|
| - base::StringAppendF(&str, "m_contextState = %d; ", m_contextState);
|
| - return str;
|
| -}
|
| -
|
| -bool CCSchedulerStateMachine::hasDrawnThisFrame() const
|
| -{
|
| - return m_currentFrameNumber == m_lastFrameNumberWhereDrawWasCalled;
|
| -}
|
| -
|
| -bool CCSchedulerStateMachine::drawSuspendedUntilCommit() const
|
| -{
|
| - if (!m_canDraw)
|
| - return true;
|
| - if (!m_visible)
|
| - return true;
|
| - if (m_textureState == LAYER_TEXTURE_STATE_ACQUIRED_BY_MAIN_THREAD)
|
| - return true;
|
| - return false;
|
| -}
|
| -
|
| -bool CCSchedulerStateMachine::scheduledToDraw() const
|
| -{
|
| - if (!m_needsRedraw)
|
| - return false;
|
| - if (drawSuspendedUntilCommit())
|
| - return false;
|
| - return true;
|
| -}
|
| -
|
| -bool CCSchedulerStateMachine::shouldDraw() const
|
| -{
|
| - if (m_needsForcedRedraw)
|
| - return true;
|
| -
|
| - if (!scheduledToDraw())
|
| - return false;
|
| - if (!m_insideVSync)
|
| - return false;
|
| - if (hasDrawnThisFrame())
|
| - return false;
|
| - if (m_contextState != CONTEXT_ACTIVE)
|
| - return false;
|
| - return true;
|
| -}
|
| -
|
| -bool CCSchedulerStateMachine::shouldAcquireLayerTexturesForMainThread() const
|
| -{
|
| - if (!m_mainThreadNeedsLayerTextures)
|
| - return false;
|
| - if (m_textureState == LAYER_TEXTURE_STATE_UNLOCKED)
|
| - return true;
|
| - ASSERT(m_textureState == LAYER_TEXTURE_STATE_ACQUIRED_BY_IMPL_THREAD);
|
| - // Transfer the lock from impl thread to main thread immediately if the
|
| - // impl thread is not even scheduled to draw. Guards against deadlocking.
|
| - if (!scheduledToDraw())
|
| - return true;
|
| - if (!vsyncCallbackNeeded())
|
| - return true;
|
| - return false;
|
| -}
|
| -
|
| -CCSchedulerStateMachine::Action CCSchedulerStateMachine::nextAction() const
|
| -{
|
| - if (shouldAcquireLayerTexturesForMainThread())
|
| - return ACTION_ACQUIRE_LAYER_TEXTURES_FOR_MAIN_THREAD;
|
| - switch (m_commitState) {
|
| - case COMMIT_STATE_IDLE:
|
| - if (m_contextState != CONTEXT_ACTIVE && m_needsForcedRedraw)
|
| - return ACTION_DRAW_FORCED;
|
| - if (m_contextState != CONTEXT_ACTIVE && m_needsForcedCommit)
|
| - return ACTION_BEGIN_FRAME;
|
| - if (m_contextState == CONTEXT_LOST)
|
| - return ACTION_BEGIN_CONTEXT_RECREATION;
|
| - if (m_contextState == CONTEXT_RECREATING)
|
| - return ACTION_NONE;
|
| - if (shouldDraw())
|
| - return m_needsForcedRedraw ? ACTION_DRAW_FORCED : ACTION_DRAW_IF_POSSIBLE;
|
| - if (m_needsCommit && ((m_visible && m_canBeginFrame) || m_needsForcedCommit))
|
| - return ACTION_BEGIN_FRAME;
|
| - return ACTION_NONE;
|
| -
|
| - case COMMIT_STATE_FRAME_IN_PROGRESS:
|
| - if (shouldDraw())
|
| - return m_needsForcedRedraw ? ACTION_DRAW_FORCED : ACTION_DRAW_IF_POSSIBLE;
|
| - return ACTION_NONE;
|
| -
|
| - case COMMIT_STATE_READY_TO_COMMIT:
|
| - return ACTION_COMMIT;
|
| -
|
| - case COMMIT_STATE_WAITING_FOR_FIRST_DRAW:
|
| - if (shouldDraw() || m_contextState == CONTEXT_LOST)
|
| - return m_needsForcedRedraw ? ACTION_DRAW_FORCED : ACTION_DRAW_IF_POSSIBLE;
|
| - // 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;
|
| - if (m_needsCommit && canCommit && drawSuspendedUntilCommit())
|
| - return ACTION_BEGIN_FRAME;
|
| - return ACTION_NONE;
|
| - }
|
| - ASSERT_NOT_REACHED();
|
| - return ACTION_NONE;
|
| -}
|
| -
|
| -void CCSchedulerStateMachine::updateState(Action action)
|
| -{
|
| - switch (action) {
|
| - case ACTION_NONE:
|
| - return;
|
| -
|
| - case ACTION_BEGIN_FRAME:
|
| - ASSERT(m_visible || m_needsForcedCommit);
|
| - m_commitState = COMMIT_STATE_FRAME_IN_PROGRESS;
|
| - m_needsCommit = false;
|
| - m_needsForcedCommit = false;
|
| - return;
|
| -
|
| - case ACTION_COMMIT:
|
| - m_commitState = COMMIT_STATE_WAITING_FOR_FIRST_DRAW;
|
| - m_needsRedraw = true;
|
| - if (m_drawIfPossibleFailed)
|
| - m_lastFrameNumberWhereDrawWasCalled = -1;
|
| -
|
| - if (m_needsForcedRedrawAfterNextCommit) {
|
| - m_needsForcedRedrawAfterNextCommit = false;
|
| - m_needsForcedRedraw = true;
|
| - }
|
| -
|
| - m_textureState = LAYER_TEXTURE_STATE_ACQUIRED_BY_IMPL_THREAD;
|
| - return;
|
| -
|
| - case ACTION_DRAW_FORCED:
|
| - case ACTION_DRAW_IF_POSSIBLE:
|
| - m_needsRedraw = false;
|
| - m_needsForcedRedraw = false;
|
| - m_drawIfPossibleFailed = false;
|
| - if (m_insideVSync)
|
| - m_lastFrameNumberWhereDrawWasCalled = m_currentFrameNumber;
|
| - if (m_commitState == COMMIT_STATE_WAITING_FOR_FIRST_DRAW)
|
| - m_commitState = COMMIT_STATE_IDLE;
|
| - if (m_textureState == LAYER_TEXTURE_STATE_ACQUIRED_BY_IMPL_THREAD)
|
| - m_textureState = LAYER_TEXTURE_STATE_UNLOCKED;
|
| - return;
|
| -
|
| - case ACTION_BEGIN_CONTEXT_RECREATION:
|
| - ASSERT(m_commitState == COMMIT_STATE_IDLE);
|
| - ASSERT(m_contextState == CONTEXT_LOST);
|
| - m_contextState = CONTEXT_RECREATING;
|
| - return;
|
| -
|
| - case ACTION_ACQUIRE_LAYER_TEXTURES_FOR_MAIN_THREAD:
|
| - m_textureState = LAYER_TEXTURE_STATE_ACQUIRED_BY_MAIN_THREAD;
|
| - m_mainThreadNeedsLayerTextures = false;
|
| - if (m_commitState != COMMIT_STATE_FRAME_IN_PROGRESS)
|
| - m_needsCommit = true;
|
| - return;
|
| - }
|
| -}
|
| -
|
| -void CCSchedulerStateMachine::setMainThreadNeedsLayerTextures()
|
| -{
|
| - ASSERT(!m_mainThreadNeedsLayerTextures);
|
| - ASSERT(m_textureState != LAYER_TEXTURE_STATE_ACQUIRED_BY_MAIN_THREAD);
|
| - m_mainThreadNeedsLayerTextures = true;
|
| -}
|
| -
|
| -bool CCSchedulerStateMachine::vsyncCallbackNeeded() const
|
| -{
|
| - // If we can't draw, don't tick until we are notified that we can draw again.
|
| - if (!m_canDraw)
|
| - return false;
|
| -
|
| - if (m_needsForcedRedraw)
|
| - return true;
|
| -
|
| - return m_needsRedraw && m_visible && m_contextState == CONTEXT_ACTIVE;
|
| -}
|
| -
|
| -void CCSchedulerStateMachine::didEnterVSync()
|
| -{
|
| - m_insideVSync = true;
|
| -}
|
| -
|
| -void CCSchedulerStateMachine::didLeaveVSync()
|
| -{
|
| - m_currentFrameNumber++;
|
| - m_insideVSync = false;
|
| -}
|
| -
|
| -void CCSchedulerStateMachine::setVisible(bool visible)
|
| -{
|
| - m_visible = visible;
|
| -}
|
| -
|
| -void CCSchedulerStateMachine::setNeedsRedraw()
|
| -{
|
| - m_needsRedraw = true;
|
| -}
|
| -
|
| -void CCSchedulerStateMachine::setNeedsForcedRedraw()
|
| -{
|
| - m_needsForcedRedraw = true;
|
| -}
|
| -
|
| -void CCSchedulerStateMachine::didDrawIfPossibleCompleted(bool success)
|
| -{
|
| - m_drawIfPossibleFailed = !success;
|
| - if (m_drawIfPossibleFailed) {
|
| - m_needsRedraw = true;
|
| - m_needsCommit = true;
|
| - m_consecutiveFailedDraws++;
|
| - if (m_consecutiveFailedDraws >= m_maximumNumberOfFailedDrawsBeforeDrawIsForced) {
|
| - m_consecutiveFailedDraws = 0;
|
| - // We need to force a draw, but it doesn't make sense to do this until
|
| - // we've committed and have new textures.
|
| - m_needsForcedRedrawAfterNextCommit = true;
|
| - }
|
| - } else
|
| - m_consecutiveFailedDraws = 0;
|
| -}
|
| -
|
| -void CCSchedulerStateMachine::setNeedsCommit()
|
| -{
|
| - m_needsCommit = true;
|
| -}
|
| -
|
| -void CCSchedulerStateMachine::setNeedsForcedCommit()
|
| -{
|
| - m_needsForcedCommit = true;
|
| -}
|
| -
|
| -void CCSchedulerStateMachine::beginFrameComplete()
|
| -{
|
| - ASSERT(m_commitState == COMMIT_STATE_FRAME_IN_PROGRESS);
|
| - m_commitState = COMMIT_STATE_READY_TO_COMMIT;
|
| -}
|
| -
|
| -void CCSchedulerStateMachine::beginFrameAborted()
|
| -{
|
| - ASSERT(m_commitState == COMMIT_STATE_FRAME_IN_PROGRESS);
|
| - m_commitState = COMMIT_STATE_IDLE;
|
| - setNeedsCommit();
|
| -}
|
| -
|
| -void CCSchedulerStateMachine::didLoseContext()
|
| -{
|
| - if (m_contextState == CONTEXT_LOST || m_contextState == CONTEXT_RECREATING)
|
| - return;
|
| - m_contextState = CONTEXT_LOST;
|
| -}
|
| -
|
| -void CCSchedulerStateMachine::didRecreateContext()
|
| -{
|
| - ASSERT(m_contextState == CONTEXT_RECREATING);
|
| - m_contextState = CONTEXT_ACTIVE;
|
| - setNeedsCommit();
|
| -}
|
| -
|
| -void CCSchedulerStateMachine::setMaximumNumberOfFailedDrawsBeforeDrawIsForced(int numDraws)
|
| -{
|
| - m_maximumNumberOfFailedDrawsBeforeDrawIsForced = numDraws;
|
| -}
|
| -
|
| -}
|
|
|