summaryrefslogtreecommitdiffstats
path: root/cc/layer_tree_host.cc
diff options
context:
space:
mode:
authorenne@chromium.org <enne@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-20 02:57:27 +0000
committerenne@chromium.org <enne@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-20 02:57:27 +0000
commit2e7ca42d140fd97197b4c73513197da3855d214c (patch)
treee9523b9e9fb544ed53652f7029485c634cb73505 /cc/layer_tree_host.cc
parente8522294bd6a74d665fa8dabf7d8c71e747c67f8 (diff)
downloadchromium_src-2e7ca42d140fd97197b4c73513197da3855d214c.zip
chromium_src-2e7ca42d140fd97197b4c73513197da3855d214c.tar.gz
chromium_src-2e7ca42d140fd97197b4c73513197da3855d214c.tar.bz2
cc: Add pending tree for impl-side painting
Do tree synchronization to pending tree. Inform scheduler when there is a pending tree so that vsync can continue to be scheduled. Right now everything is hooked through redraw, so canDraw is true when there is a pending tree, prepareToDraw is the one that checks for tree swap, and TileManager::DidFinishTileInitialization ends up calling setNeedsRedraw. I'm not sure this is ideal, but it's a start. BUG=155209 Review URL: https://chromiumcodereview.appspot.com/11569040 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@174089 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc/layer_tree_host.cc')
-rw-r--r--cc/layer_tree_host.cc31
1 files changed, 25 insertions, 6 deletions
diff --git a/cc/layer_tree_host.cc b/cc/layer_tree_host.cc
index 3ec9c82..4a228f4 100644
--- a/cc/layer_tree_host.cc
+++ b/cc/layer_tree_host.cc
@@ -281,20 +281,39 @@ void LayerTreeHost::finishCommitOnImplThread(LayerTreeHostImpl* hostImpl)
m_contentsTextureManager->updateBackingsInDrawingImplTree();
m_contentsTextureManager->reduceMemory(hostImpl->resourceProvider());
- if (m_needsFullTreeSync) {
- hostImpl->setRootLayer(TreeSynchronizer::synchronizeTrees(rootLayer(), hostImpl->detachLayerTree(), hostImpl->activeTree()));
+ // In impl-side painting, synchronize to the pending tree so that it has
+ // time to raster before being displayed. If no pending tree is needed,
+ // synchronization can happen directly to the active tree.
+ LayerTreeImpl* syncTree;
+ bool needsFullTreeSync = false;
+ if (m_settings.implSidePainting) {
+ // Commits should not occur while there is already a pending tree.
+ DCHECK(!hostImpl->pendingTree());
+ hostImpl->createPendingTree();
+ syncTree = hostImpl->pendingTree();
+ // TODO(enne): we could recycle old active trees and keep track for
+ // multiple main thread frames whether a sync is needed
+ needsFullTreeSync = true;
+ } else {
+ syncTree = hostImpl->activeTree();
+ needsFullTreeSync = m_needsFullTreeSync;
+ }
+
+ if (needsFullTreeSync) {
+ syncTree->SetRootLayer(TreeSynchronizer::synchronizeTrees(rootLayer(), syncTree->DetachLayerTree(), syncTree));
} else {
TRACE_EVENT0("cc", "LayerTreeHost::pushPropertiesRecursive");
- pushPropertiesRecursive(rootLayer(), hostImpl->rootLayer());
+ pushPropertiesRecursive(rootLayer(), syncTree->RootLayer());
}
m_needsFullTreeSync = false;
if (m_rootLayer && m_hudLayer)
- hostImpl->activeTree()->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(LayerTreeHostCommon::findLayerInSubtree(hostImpl->rootLayer(), m_hudLayer->id())));
+ syncTree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(LayerTreeHostCommon::findLayerInSubtree(syncTree->RootLayer(), m_hudLayer->id())));
else
- hostImpl->activeTree()->set_hud_layer(0);
+ syncTree->set_hud_layer(0);
- hostImpl->activeTree()->set_source_frame_number(commitNumber());
+ // TODO(enne): Do these need to be moved to layer tree as well?
+ syncTree->set_source_frame_number(commitNumber());
hostImpl->setViewportSize(layoutViewportSize(), deviceViewportSize());
hostImpl->setDeviceScaleFactor(deviceScaleFactor());
hostImpl->setPageScaleFactorAndLimits(m_pageScaleFactor, m_minPageScaleFactor, m_maxPageScaleFactor);