summaryrefslogtreecommitdiffstats
path: root/cc
diff options
context:
space:
mode:
Diffstat (limited to 'cc')
-rw-r--r--cc/layer_tree_host_impl.cc35
-rw-r--r--cc/layer_tree_host_impl.h2
-rw-r--r--cc/scheduler.cc3
-rw-r--r--cc/scheduler.h1
-rw-r--r--cc/scheduler_state_machine.cc24
-rw-r--r--cc/scheduler_state_machine.h4
-rw-r--r--cc/scheduler_unittest.cc1
-rw-r--r--cc/test/fake_tile_manager_client.h1
-rw-r--r--cc/thread_proxy.cc7
-rw-r--r--cc/thread_proxy.h1
-rw-r--r--cc/tile_manager.cc15
-rw-r--r--cc/tile_manager.h3
12 files changed, 55 insertions, 42 deletions
diff --git a/cc/layer_tree_host_impl.cc b/cc/layer_tree_host_impl.cc
index 0aa769b..b1c0b7b 100644
--- a/cc/layer_tree_host_impl.cc
+++ b/cc/layer_tree_host_impl.cc
@@ -89,6 +89,7 @@ public:
if (!m_layerTreeHostImpl->proxy()->hasImplThread())
setImplThread.reset(new DebugScopedSetImplThread(m_layerTreeHostImpl->proxy()));
+ m_layerTreeHostImpl->activatePendingTreeIfNeeded();
m_layerTreeHostImpl->animate(base::TimeTicks::Now(), base::Time::Now());
}
@@ -200,14 +201,6 @@ bool LayerTreeHostImpl::canDraw()
// affect the result of canDraw, make sure to call m_client->onCanDrawStateChanged
// in the proper places and update the notifyIfCanDrawChanged test.
- // TODO(enne): Since prepareToDraw is the only place that currently does
- // tree activiation, this allows prepareToDraw to be entered even if the
- // active tree can't draw. This could cause flashing, though. This should
- // probably be refactored such that the scheduler handles the tree
- // activation rather than prepareToDrwa.
- if (pendingTree())
- return true;
-
if (!rootLayer()) {
TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw no root layer");
return false;
@@ -471,6 +464,9 @@ bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame)
// in the future.
bool drawFrame = true;
+ // Make sure we have the most recent info regarding which textures have been uploaded.
+ checkForCompletedSetPixels();
+
LayerIteratorType end = LayerIteratorType::end(frame.renderSurfaceLayerList);
for (LayerIteratorType it = LayerIteratorType::begin(frame.renderSurfaceLayerList); it != end; ++it) {
RenderPass::Id targetRenderPassId = it.targetRenderSurfaceLayer()->renderSurface()->renderPassId();
@@ -671,10 +667,6 @@ bool LayerTreeHostImpl::prepareToDraw(FrameData& frame)
{
TRACE_EVENT0("cc", "LayerTreeHostImpl::prepareToDraw");
- if (m_tileManager)
- m_tileManager->CheckForCompletedSetPixels();
-
- activatePendingTreeIfNeeded();
updateDrawProperties();
frame.renderSurfaceLayerList = &activeTree()->RenderSurfaceLayerList();
@@ -722,16 +714,6 @@ void LayerTreeHostImpl::ScheduleManageTiles()
m_client->setNeedsManageTilesOnImplThread();
}
-void LayerTreeHostImpl::ScheduleCheckForCompletedSetPixels()
-{
- // CheckForCompletedSetPixels() should be called before we draw and
- // preferably only once per vsync interval. For now just make sure
- // a redraw is scheduled and call CheckForCompletedSetPixels() in
- // prepareToDraw().
- if (m_client)
- m_client->setNeedsRedrawOnImplThread();
-}
-
bool LayerTreeHostImpl::shouldClearRootRenderPass() const
{
return m_settings.shouldClearRootRenderPass;
@@ -924,11 +906,19 @@ void LayerTreeHostImpl::createPendingTree()
m_client->onHasPendingTreeStateChanged(pendingTree());
}
+void LayerTreeHostImpl::checkForCompletedSetPixels()
+{
+ if (m_tileManager)
+ m_tileManager->CheckForCompletedSetPixels();
+}
+
void LayerTreeHostImpl::activatePendingTreeIfNeeded()
{
if (!pendingTree())
return;
+ checkForCompletedSetPixels();
+
// It's always fine to activate to an empty tree. Otherwise, only
// activate once all visible resources in pending tree are ready.
if (activeTree()->RootLayer() &&
@@ -948,6 +938,7 @@ void LayerTreeHostImpl::activatePendingTree()
m_pendingTree.reset();
m_client->onCanDrawStateChanged(canDraw());
m_client->onHasPendingTreeStateChanged(pendingTree());
+ m_client->setNeedsRedrawOnImplThread();
}
void LayerTreeHostImpl::setVisible(bool visible)
diff --git a/cc/layer_tree_host_impl.h b/cc/layer_tree_host_impl.h
index d1019c1..d3a5858 100644
--- a/cc/layer_tree_host_impl.h
+++ b/cc/layer_tree_host_impl.h
@@ -122,7 +122,6 @@ public:
// TileManagerClient implementation.
virtual void ScheduleManageTiles() OVERRIDE;
- virtual void ScheduleCheckForCompletedSetPixels() OVERRIDE;
// OutputSurfaceClient implementation.
virtual void OnVSyncParametersChanged(base::TimeTicks timebase, base::TimeDelta interval) OVERRIDE;
@@ -156,6 +155,7 @@ public:
LayerTreeImpl* pendingTree() { return m_pendingTree.get(); }
const LayerTreeImpl* pendingTree() const { return m_pendingTree.get(); }
void createPendingTree();
+ void checkForCompletedSetPixels();
virtual void activatePendingTreeIfNeeded();
// Shortcuts to layers on the active tree.
diff --git a/cc/scheduler.cc b/cc/scheduler.cc
index 630d25b..6442414 100644
--- a/cc/scheduler.cc
+++ b/cc/scheduler.cc
@@ -168,6 +168,9 @@ void Scheduler::processScheduledActions()
case SchedulerStateMachine::ACTION_COMMIT:
m_client->scheduledActionCommit();
break;
+ case SchedulerStateMachine::ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED:
+ m_client->scheduledActionActivatePendingTreeIfNeeded();
+ break;
case SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE: {
ScheduledActionDrawAndSwapResult result = m_client->scheduledActionDrawAndSwapIfPossible();
m_stateMachine.didDrawIfPossibleCompleted(result.didDraw);
diff --git a/cc/scheduler.h b/cc/scheduler.h
index 93cd100..eee40ef 100644
--- a/cc/scheduler.h
+++ b/cc/scheduler.h
@@ -38,6 +38,7 @@ public:
virtual ScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapIfPossible() = 0;
virtual ScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapForced() = 0;
virtual void scheduledActionCommit() = 0;
+ virtual void scheduledActionActivatePendingTreeIfNeeded() = 0;
virtual void scheduledActionBeginContextRecreation() = 0;
virtual void scheduledActionAcquireLayerTexturesForMainThread() = 0;
virtual void didAnticipatedDrawTimeChange(base::TimeTicks) = 0;
diff --git a/cc/scheduler_state_machine.cc b/cc/scheduler_state_machine.cc
index c4087e78..f9d8cbc 100644
--- a/cc/scheduler_state_machine.cc
+++ b/cc/scheduler_state_machine.cc
@@ -13,6 +13,7 @@ SchedulerStateMachine::SchedulerStateMachine()
: m_commitState(COMMIT_STATE_IDLE)
, m_currentFrameNumber(0)
, m_lastFrameNumberWhereDrawWasCalled(-1)
+ , m_lastFrameNumberWhereTreeActivationAttempted(-1)
, m_consecutiveFailedDraws(0)
, m_maximumNumberOfFailedDrawsBeforeDrawIsForced(3)
, m_needsRedraw(false)
@@ -64,6 +65,11 @@ bool SchedulerStateMachine::hasDrawnThisFrame() const
return m_currentFrameNumber == m_lastFrameNumberWhereDrawWasCalled;
}
+bool SchedulerStateMachine::hasAttemptedTreeActivationThisFrame() const
+{
+ return m_currentFrameNumber == m_lastFrameNumberWhereTreeActivationAttempted;
+}
+
bool SchedulerStateMachine::drawSuspendedUntilCommit() const
{
if (!m_canDraw)
@@ -100,6 +106,11 @@ bool SchedulerStateMachine::shouldDraw() const
return true;
}
+bool SchedulerStateMachine::shouldAttemptTreeActivation() const
+{
+ return m_hasPendingTree && m_insideVSync && !hasAttemptedTreeActivationThisFrame();
+}
+
bool SchedulerStateMachine::shouldAcquireLayerTexturesForMainThread() const
{
if (!m_mainThreadNeedsLayerTextures)
@@ -120,6 +131,7 @@ SchedulerStateMachine::Action SchedulerStateMachine::nextAction() const
{
if (shouldAcquireLayerTexturesForMainThread())
return ACTION_ACQUIRE_LAYER_TEXTURES_FOR_MAIN_THREAD;
+
switch (m_commitState) {
case COMMIT_STATE_IDLE:
if (m_outputSurfaceState != OUTPUT_SURFACE_ACTIVE && m_needsForcedRedraw)
@@ -131,6 +143,8 @@ SchedulerStateMachine::Action SchedulerStateMachine::nextAction() const
return ACTION_BEGIN_OUTPUT_SURFACE_RECREATION;
if (m_outputSurfaceState == OUTPUT_SURFACE_RECREATING)
return ACTION_NONE;
+ if (shouldAttemptTreeActivation())
+ return ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED;
if (shouldDraw())
return m_needsForcedRedraw ? ACTION_DRAW_FORCED : ACTION_DRAW_IF_POSSIBLE;
if (m_needsCommit && ((m_visible && m_canBeginFrame) || m_needsForcedCommit))
@@ -139,6 +153,8 @@ SchedulerStateMachine::Action SchedulerStateMachine::nextAction() const
return ACTION_NONE;
case COMMIT_STATE_FRAME_IN_PROGRESS:
+ if (shouldAttemptTreeActivation())
+ return ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED;
if (shouldDraw())
return m_needsForcedRedraw ? ACTION_DRAW_FORCED : ACTION_DRAW_IF_POSSIBLE;
return ACTION_NONE;
@@ -147,6 +163,8 @@ SchedulerStateMachine::Action SchedulerStateMachine::nextAction() const
return ACTION_COMMIT;
case COMMIT_STATE_WAITING_FOR_FIRST_DRAW: {
+ if (shouldAttemptTreeActivation())
+ return ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED;
if (shouldDraw() || m_outputSurfaceState == OUTPUT_SURFACE_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
@@ -158,6 +176,8 @@ SchedulerStateMachine::Action SchedulerStateMachine::nextAction() const
}
case COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW:
+ if (shouldAttemptTreeActivation())
+ return ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED;
if (m_needsForcedRedraw)
return ACTION_DRAW_FORCED;
return ACTION_NONE;
@@ -172,6 +192,10 @@ void SchedulerStateMachine::updateState(Action action)
case ACTION_NONE:
return;
+ case ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED:
+ m_lastFrameNumberWhereTreeActivationAttempted = m_currentFrameNumber;
+ return;
+
case ACTION_BEGIN_FRAME:
DCHECK(!m_hasPendingTree);
DCHECK(m_visible || m_needsForcedCommit);
diff --git a/cc/scheduler_state_machine.h b/cc/scheduler_state_machine.h
index 10df4df..1186827 100644
--- a/cc/scheduler_state_machine.h
+++ b/cc/scheduler_state_machine.h
@@ -58,6 +58,7 @@ public:
ACTION_NONE,
ACTION_BEGIN_FRAME,
ACTION_COMMIT,
+ ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED,
ACTION_DRAW_IF_POSSIBLE,
ACTION_DRAW_FORCED,
ACTION_BEGIN_OUTPUT_SURFACE_RECREATION,
@@ -143,13 +144,16 @@ protected:
bool drawSuspendedUntilCommit() const;
bool scheduledToDraw() const;
bool shouldDraw() const;
+ bool shouldAttemptTreeActivation() const;
bool shouldAcquireLayerTexturesForMainThread() const;
bool hasDrawnThisFrame() const;
+ bool hasAttemptedTreeActivationThisFrame() const;
CommitState m_commitState;
int m_currentFrameNumber;
int m_lastFrameNumberWhereDrawWasCalled;
+ int m_lastFrameNumberWhereTreeActivationAttempted;
int m_consecutiveFailedDraws;
int m_maximumNumberOfFailedDrawsBeforeDrawIsForced;
bool m_needsRedraw;
diff --git a/cc/scheduler_unittest.cc b/cc/scheduler_unittest.cc
index 16eefeb..74384ec 100644
--- a/cc/scheduler_unittest.cc
+++ b/cc/scheduler_unittest.cc
@@ -50,6 +50,7 @@ public:
}
virtual void scheduledActionCommit() OVERRIDE { m_actions.push_back("scheduledActionCommit"); }
+ virtual void scheduledActionActivatePendingTreeIfNeeded() OVERRIDE { m_actions.push_back("scheduledActionActivatePendingTreeIfNeeded"); }
virtual void scheduledActionBeginContextRecreation() OVERRIDE { m_actions.push_back("scheduledActionBeginContextRecreation"); }
virtual void scheduledActionAcquireLayerTexturesForMainThread() OVERRIDE { m_actions.push_back("scheduledActionAcquireLayerTexturesForMainThread"); }
virtual void didAnticipatedDrawTimeChange(base::TimeTicks) OVERRIDE { }
diff --git a/cc/test/fake_tile_manager_client.h b/cc/test/fake_tile_manager_client.h
index 118cbdd..6e94924 100644
--- a/cc/test/fake_tile_manager_client.h
+++ b/cc/test/fake_tile_manager_client.h
@@ -15,7 +15,6 @@ class FakeTileManagerClient : public TileManagerClient {
// TileManagerClient implementation.
virtual void ScheduleManageTiles() OVERRIDE {}
- virtual void ScheduleCheckForCompletedSetPixels() OVERRIDE {}
};
} // namespace cc
diff --git a/cc/thread_proxy.cc b/cc/thread_proxy.cc
index 69d819b..2618400 100644
--- a/cc/thread_proxy.cc
+++ b/cc/thread_proxy.cc
@@ -727,6 +727,11 @@ void ThreadProxy::scheduledActionCommit()
m_schedulerOnImplThread->setVisible(m_layerTreeHostImpl->visible());
}
+void ThreadProxy::scheduledActionActivatePendingTreeIfNeeded()
+{
+ m_layerTreeHostImpl->activatePendingTreeIfNeeded();
+}
+
void ThreadProxy::scheduledActionBeginContextRecreation()
{
DCHECK(isImplThread());
@@ -755,7 +760,7 @@ ScheduledActionDrawAndSwapResult ThreadProxy::scheduledActionDrawAndSwapInternal
if (m_inputHandlerOnImplThread.get())
m_inputHandlerOnImplThread->animate(monotonicTime);
- // TODO(nduca): make animation happen after tree activation.
+ m_layerTreeHostImpl->activatePendingTreeIfNeeded();
m_layerTreeHostImpl->animate(monotonicTime, wallClockTime);
// This method is called on a forced draw, regardless of whether we are able to produce a frame,
diff --git a/cc/thread_proxy.h b/cc/thread_proxy.h
index 500ee1c..261d11c 100644
--- a/cc/thread_proxy.h
+++ b/cc/thread_proxy.h
@@ -74,6 +74,7 @@ public:
virtual ScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapIfPossible() OVERRIDE;
virtual ScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapForced() OVERRIDE;
virtual void scheduledActionCommit() OVERRIDE;
+ virtual void scheduledActionActivatePendingTreeIfNeeded() OVERRIDE;
virtual void scheduledActionBeginContextRecreation() OVERRIDE;
virtual void scheduledActionAcquireLayerTexturesForMainThread() OVERRIDE;
virtual void didAnticipatedDrawTimeChange(base::TimeTicks) OVERRIDE;
diff --git a/cc/tile_manager.cc b/cc/tile_manager.cc
index 3058294..9ad382b 100644
--- a/cc/tile_manager.cc
+++ b/cc/tile_manager.cc
@@ -78,8 +78,7 @@ TileManager::TileManager(
resource_pool_(ResourcePool::Create(resource_provider)),
raster_worker_pool_(RasterWorkerPool::Create(num_raster_threads)),
manage_tiles_pending_(false),
- manage_tiles_call_count_(0),
- check_for_completed_set_pixels_pending_(false) {
+ manage_tiles_call_count_(0) {
}
TileManager::~TileManager() {
@@ -145,13 +144,6 @@ void TileManager::ScheduleManageTiles() {
manage_tiles_pending_ = true;
}
-void TileManager::ScheduleCheckForCompletedSetPixels() {
- if (check_for_completed_set_pixels_pending_)
- return;
- client_->ScheduleCheckForCompletedSetPixels();
- check_for_completed_set_pixels_pending_ = true;
-}
-
class BinComparator {
public:
bool operator() (const Tile* a, const Tile* b) const {
@@ -234,8 +226,6 @@ void TileManager::ManageTiles() {
}
void TileManager::CheckForCompletedSetPixels() {
- check_for_completed_set_pixels_pending_ = false;
-
while (!tiles_with_pending_set_pixels_.empty()) {
Tile* tile = tiles_with_pending_set_pixels_.front();
DCHECK(tile->managed_state().resource);
@@ -243,7 +233,6 @@ void TileManager::CheckForCompletedSetPixels() {
// Set pixel tasks complete in the order they are posted.
if (!resource_pool_->resource_provider()->didSetPixelsComplete(
tile->managed_state().resource->id())) {
- ScheduleCheckForCompletedSetPixels();
break;
}
@@ -515,8 +504,6 @@ void TileManager::OnRasterTaskCompleted(
resource_pool_->resource_provider()->shallowFlushIfSupported();
managed_tile_state.resource = resource.Pass();
tiles_with_pending_set_pixels_.push(tile);
-
- ScheduleCheckForCompletedSetPixels();
} else {
resource_pool_->resource_provider()->releasePixelBuffer(resource->id());
resource_pool_->ReleaseResource(resource.Pass());
diff --git a/cc/tile_manager.h b/cc/tile_manager.h
index b03fdd7..73cae58 100644
--- a/cc/tile_manager.h
+++ b/cc/tile_manager.h
@@ -25,7 +25,6 @@ class TileVersion;
class CC_EXPORT TileManagerClient {
public:
virtual void ScheduleManageTiles() = 0;
- virtual void ScheduleCheckForCompletedSetPixels() = 0;
protected:
virtual ~TileManagerClient() {}
@@ -102,7 +101,6 @@ class CC_EXPORT TileManager {
void AssignGpuMemoryToTiles();
void FreeResourcesForTile(Tile* tile);
void ScheduleManageTiles();
- void ScheduleCheckForCompletedSetPixels();
void DispatchMoreTasks();
void GatherPixelRefsForTile(Tile* tile);
void DispatchImageDecodeTasksForTile(Tile* tile);
@@ -122,7 +120,6 @@ class CC_EXPORT TileManager {
scoped_ptr<RasterWorkerPool> raster_worker_pool_;
bool manage_tiles_pending_;
int manage_tiles_call_count_;
- bool check_for_completed_set_pixels_pending_;
GlobalStateThatImpactsTilePriority global_state_;