summaryrefslogtreecommitdiffstats
path: root/cc/scheduler_state_machine.cc
diff options
context:
space:
mode:
authorbrianderson@chromium.org <brianderson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-18 03:14:47 +0000
committerbrianderson@chromium.org <brianderson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-18 03:14:47 +0000
commit74d9063c0720b17938db7871cc2557f135d89b7f (patch)
treed1282aa9d900a5fe84f893ce8a50252cf9d9d5d5 /cc/scheduler_state_machine.cc
parent71691c246e751fdd2ed442c59bb3a4773106b745 (diff)
downloadchromium_src-74d9063c0720b17938db7871cc2557f135d89b7f.zip
chromium_src-74d9063c0720b17938db7871cc2557f135d89b7f.tar.gz
chromium_src-74d9063c0720b17938db7871cc2557f135d89b7f.tar.bz2
cc: Redraw incomplete frames when new texture uploads finish
This patch makes sure that, when the displayed frame has checkerboarding or uses low resolution tiles, we redraw on a vsync when a new visible high-res tile has been uploaded. Checking for completed texture uploads is given it's own scheduler state to centralize control and also to prevent texture uploads from triggering duplicate frames. BUG=169603 Review URL: https://chromiumcodereview.appspot.com/11879012 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@177580 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc/scheduler_state_machine.cc')
-rw-r--r--cc/scheduler_state_machine.cc46
1 files changed, 45 insertions, 1 deletions
diff --git a/cc/scheduler_state_machine.cc b/cc/scheduler_state_machine.cc
index 5d62297..01f2f00 100644
--- a/cc/scheduler_state_machine.cc
+++ b/cc/scheduler_state_machine.cc
@@ -15,9 +15,11 @@ SchedulerStateMachine::SchedulerStateMachine(const SchedulerSettings& settings)
, m_currentFrameNumber(0)
, m_lastFrameNumberWhereDrawWasCalled(-1)
, m_lastFrameNumberWhereTreeActivationAttempted(-1)
+ , m_lastFrameNumberWhereCheckForCompletedTexturesCalled(-1)
, m_consecutiveFailedDraws(0)
, m_maximumNumberOfFailedDrawsBeforeDrawIsForced(3)
, m_needsRedraw(false)
+ , m_swapUsedIncompleteTexture(false)
, m_needsForcedRedraw(false)
, m_needsForcedRedrawAfterNextCommit(false)
, m_needsCommit(false)
@@ -38,12 +40,16 @@ SchedulerStateMachine::SchedulerStateMachine(const SchedulerSettings& settings)
std::string SchedulerStateMachine::toString()
{
std::string str;
+ base::StringAppendF(&str, "m_settings.implSidePainting = %d; ", m_settings.implSidePainting);
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_lastFrameNumberWhereTreeActivationAttempted = %d; ", m_lastFrameNumberWhereTreeActivationAttempted);
+ base::StringAppendF(&str, "m_lastFrameNumberWhereCheckForCompletedTexturesCalled = %d; ", m_lastFrameNumberWhereCheckForCompletedTexturesCalled);
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_swapUsedIncompleteTexture = %d; ", m_swapUsedIncompleteTexture);
base::StringAppendF(&str, "m_needsForcedRedraw = %d; ", m_needsForcedRedraw);
base::StringAppendF(&str, "m_needsForcedRedrawAfterNextCommit = %d; ", m_needsForcedRedrawAfterNextCommit);
base::StringAppendF(&str, "m_needsCommit = %d; ", m_needsCommit);
@@ -71,6 +77,12 @@ bool SchedulerStateMachine::hasAttemptedTreeActivationThisFrame() const
return m_currentFrameNumber == m_lastFrameNumberWhereTreeActivationAttempted;
}
+bool SchedulerStateMachine::hasCheckedForCompletedTexturesThisFrame() const
+{
+ return m_currentFrameNumber ==
+ m_lastFrameNumberWhereCheckForCompletedTexturesCalled;
+}
+
bool SchedulerStateMachine::drawSuspendedUntilCommit() const
{
if (!m_canDraw)
@@ -109,7 +121,19 @@ bool SchedulerStateMachine::shouldDraw() const
bool SchedulerStateMachine::shouldAttemptTreeActivation() const
{
- return m_hasPendingTree && m_insideVSync && !hasAttemptedTreeActivationThisFrame();
+ return m_hasPendingTree && m_insideVSync && !hasAttemptedTreeActivationThisFrame();
+}
+
+bool SchedulerStateMachine::shouldCheckForCompletedTextures() const
+{
+ if (!m_settings.implSidePainting)
+ return false;
+ if (hasCheckedForCompletedTexturesThisFrame())
+ return false;
+
+ return shouldAttemptTreeActivation() ||
+ shouldDraw() ||
+ m_swapUsedIncompleteTexture;
}
bool SchedulerStateMachine::shouldAcquireLayerTexturesForMainThread() const
@@ -144,6 +168,8 @@ SchedulerStateMachine::Action SchedulerStateMachine::nextAction() const
return ACTION_BEGIN_OUTPUT_SURFACE_RECREATION;
if (m_outputSurfaceState == OUTPUT_SURFACE_RECREATING)
return ACTION_NONE;
+ if (shouldCheckForCompletedTextures())
+ return ACTION_CHECK_FOR_NEW_TEXTURES;
if (shouldAttemptTreeActivation())
return ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED;
if (shouldDraw())
@@ -154,6 +180,8 @@ SchedulerStateMachine::Action SchedulerStateMachine::nextAction() const
return ACTION_NONE;
case COMMIT_STATE_FRAME_IN_PROGRESS:
+ if (shouldCheckForCompletedTextures())
+ return ACTION_CHECK_FOR_NEW_TEXTURES;
if (shouldAttemptTreeActivation())
return ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED;
if (shouldDraw())
@@ -164,6 +192,8 @@ SchedulerStateMachine::Action SchedulerStateMachine::nextAction() const
return ACTION_COMMIT;
case COMMIT_STATE_WAITING_FOR_FIRST_DRAW: {
+ if (shouldCheckForCompletedTextures())
+ return ACTION_CHECK_FOR_NEW_TEXTURES;
if (shouldAttemptTreeActivation())
return ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED;
if (shouldDraw() || m_outputSurfaceState == OUTPUT_SURFACE_LOST)
@@ -177,6 +207,8 @@ SchedulerStateMachine::Action SchedulerStateMachine::nextAction() const
}
case COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW:
+ if (shouldCheckForCompletedTextures())
+ return ACTION_CHECK_FOR_NEW_TEXTURES;
if (shouldAttemptTreeActivation())
return ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED;
if (m_needsForcedRedraw)
@@ -193,6 +225,10 @@ void SchedulerStateMachine::updateState(Action action)
case ACTION_NONE:
return;
+ case ACTION_CHECK_FOR_NEW_TEXTURES:
+ m_lastFrameNumberWhereCheckForCompletedTexturesCalled = m_currentFrameNumber;
+ return;
+
case ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED:
m_lastFrameNumberWhereTreeActivationAttempted = m_currentFrameNumber;
return;
@@ -277,6 +313,9 @@ bool SchedulerStateMachine::vsyncCallbackNeeded() const
if (m_needsForcedRedraw)
return true;
+ if (m_visible && m_swapUsedIncompleteTexture)
+ return true;
+
return m_needsRedraw && m_visible && m_outputSurfaceState == OUTPUT_SURFACE_ACTIVE;
}
@@ -301,6 +340,11 @@ void SchedulerStateMachine::setNeedsRedraw()
m_needsRedraw = true;
}
+void SchedulerStateMachine::didSwapUseIncompleteTexture()
+{
+ m_swapUsedIncompleteTexture = true;
+}
+
void SchedulerStateMachine::setNeedsForcedRedraw()
{
m_needsForcedRedraw = true;