| Index: cc/CCSchedulerStateMachine.cpp
|
| diff --git a/cc/CCSchedulerStateMachine.cpp b/cc/CCSchedulerStateMachine.cpp
|
| index 323a188ce6a9019b10fa0c7846c1debb7cdfca35..94f755c7bbb46ba7947d1477608e8f7d93395080 100644
|
| --- a/cc/CCSchedulerStateMachine.cpp
|
| +++ b/cc/CCSchedulerStateMachine.cpp
|
| @@ -5,6 +5,8 @@
|
| #include "config.h"
|
|
|
| #include "CCSchedulerStateMachine.h"
|
| +#include "TextStream.h"
|
| +
|
|
|
| namespace WebCore {
|
|
|
| @@ -24,13 +26,38 @@ CCSchedulerStateMachine::CCSchedulerStateMachine()
|
| , m_insideVSync(false)
|
| , m_visible(false)
|
| , m_canBeginFrame(false)
|
| - , m_canDraw(true)
|
| + , m_canDraw(false)
|
| , m_drawIfPossibleFailed(false)
|
| , m_textureState(LAYER_TEXTURE_STATE_UNLOCKED)
|
| , m_contextState(CONTEXT_ACTIVE)
|
| {
|
| }
|
|
|
| +String CCSchedulerStateMachine::toString()
|
| +{
|
| + TextStream ts;
|
| + ts << "m_commitState = " << m_commitState << "; ";
|
| + ts << "m_currentFrameNumber = " << m_currentFrameNumber << "; ";
|
| + ts << "m_lastFrameNumberWhereDrawWasCalled = " << m_lastFrameNumberWhereDrawWasCalled << "; ";
|
| + ts << "m_consecutiveFailedDraws = " << m_consecutiveFailedDraws << "; ";
|
| + ts << "m_maximumNumberOfFailedDrawsBeforeDrawIsForced = " << m_maximumNumberOfFailedDrawsBeforeDrawIsForced << "; ";
|
| + ts << "m_needsRedraw = " << m_needsRedraw << "; ";
|
| + ts << "m_needsForcedRedraw = " << m_needsForcedRedraw << "; ";
|
| + ts << "m_needsForcedRedrawAfterNextCommit = " << m_needsForcedRedrawAfterNextCommit << "; ";
|
| + ts << "m_needsCommit = " << m_needsCommit << "; ";
|
| + ts << "m_needsForcedCommit = " << m_needsForcedCommit << "; ";
|
| + ts << "m_mainThreadNeedsLayerTextures = " << m_mainThreadNeedsLayerTextures << "; ";
|
| + ts << "m_updateMoreResourcesPending = " << m_updateMoreResourcesPending << "; ";
|
| + ts << "m_insideVSync = " << m_insideVSync << "; ";
|
| + ts << "m_visible = " << m_visible << "; ";
|
| + ts << "m_canBeginFrame = " << m_canBeginFrame << "; ";
|
| + ts << "m_canDraw = " << m_canDraw << "; ";
|
| + ts << "m_drawIfPossibleFailed = " << m_drawIfPossibleFailed << "; ";
|
| + ts << "m_textureState = " << m_textureState << "; ";
|
| + ts << "m_contextState = " << m_contextState << "; ";
|
| + return ts.release();
|
| +}
|
| +
|
| bool CCSchedulerStateMachine::hasDrawnThisFrame() const
|
| {
|
| return m_currentFrameNumber == m_lastFrameNumberWhereDrawWasCalled;
|
| @@ -210,14 +237,18 @@ void CCSchedulerStateMachine::setMainThreadNeedsLayerTextures()
|
|
|
| bool CCSchedulerStateMachine::vsyncCallbackNeeded() const
|
| {
|
| - if (!m_visible || m_contextState != CONTEXT_ACTIVE) {
|
| - if (m_needsForcedRedraw || m_commitState == COMMIT_STATE_UPDATING_RESOURCES)
|
| - return true;
|
| + // To prevent live-lock, we must always tick when updating resources.
|
| + if (m_updateMoreResourcesPending || m_commitState == COMMIT_STATE_UPDATING_RESOURCES)
|
| + return true;
|
|
|
| + // If we can't draw, don't tick until we are notified that we can draw again.
|
| + if (!m_canDraw)
|
| return false;
|
| - }
|
|
|
| - return m_needsRedraw || m_needsForcedRedraw || m_commitState == COMMIT_STATE_UPDATING_RESOURCES;
|
| + if (m_needsForcedRedraw)
|
| + return true;
|
| +
|
| + return m_needsRedraw && m_visible && m_contextState == CONTEXT_ACTIVE;
|
| }
|
|
|
| void CCSchedulerStateMachine::didEnterVSync()
|
|
|