diff options
author | enne@chromium.org <enne@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-20 02:57:27 +0000 |
---|---|---|
committer | enne@chromium.org <enne@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-20 02:57:27 +0000 |
commit | 2e7ca42d140fd97197b4c73513197da3855d214c (patch) | |
tree | e9523b9e9fb544ed53652f7029485c634cb73505 /cc/layer_tree_host.cc | |
parent | e8522294bd6a74d665fa8dabf7d8c71e747c67f8 (diff) | |
download | chromium_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.cc | 31 |
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); |