Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4187)

Unified Diff: cc/layer_tree_host_impl.cc

Issue 11447028: cc: Split out calcDrawEtc from drawLayers (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/layer_tree_host_impl.h ('k') | cc/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/layer_tree_host_impl.cc
diff --git a/cc/layer_tree_host_impl.cc b/cc/layer_tree_host_impl.cc
index 3050ec2217a20235b1a2403a9bfbc6a4907281ba..f6b753915070bb426cf9fcb728db7a9f9d36ec29 100644
--- a/cc/layer_tree_host_impl.cc
+++ b/cc/layer_tree_host_impl.cc
@@ -219,6 +219,7 @@ LayerTreeHostImpl::LayerTreeHostImpl(const LayerTreeSettings& settings, LayerTre
, m_backgroundColor(0)
, m_hasTransparentBackground(false)
, m_needsAnimateLayers(false)
+ , m_needsUpdateDrawProperties(false)
, m_pinchGestureActive(false)
, m_fpsCounter(FrameRateCounter::create(m_proxy->hasImplThread()))
, m_debugRectHistory(DebugRectHistory::create())
@@ -254,6 +255,14 @@ void LayerTreeHostImpl::beginCommit()
void LayerTreeHostImpl::commitComplete()
{
TRACE_EVENT0("cc", "LayerTreeHostImpl::commitComplete");
+
+ // Impl-side painting needs an update immediately post-commit to have the
+ // opportunity to create tilings. Other paths can call updateDrawProperties
+ // more lazily when needed prior to drawing.
+ setNeedsUpdateDrawProperties();
+ if (m_settings.implSidePainting)
+ updateDrawProperties();
+
// Recompute max scroll position; must be after layer content bounds are
// updated.
updateMaxScrollOffset();
@@ -331,6 +340,7 @@ void LayerTreeHostImpl::startPageScaleAnimation(gfx::Vector2d targetOffset, bool
m_pageScaleAnimation->zoomTo(scaledTargetOffset, pageScale, duration.InSecondsF());
}
+ setNeedsUpdateDrawProperties();
m_client->setNeedsRedrawOnImplThread();
m_client->setNeedsCommitOnImplThread();
}
@@ -376,20 +386,31 @@ void LayerTreeHostImpl::updateRootScrollLayerImplTransform()
}
}
+void LayerTreeHostImpl::updateDrawProperties()
+{
+ if (!needsUpdateDrawProperties())
+ return;
+
+ m_renderSurfaceLayerList.clear();
+ m_needsUpdateDrawProperties = false;
+
+ if (!rootLayer())
+ return;
+
+ calculateRenderSurfaceLayerList(m_renderSurfaceLayerList);
+}
+
void LayerTreeHostImpl::calculateRenderSurfaceLayerList(LayerList& renderSurfaceLayerList)
{
DCHECK(renderSurfaceLayerList.empty());
DCHECK(rootLayer());
DCHECK(m_renderer); // For maxTextureSize.
-
{
updateRootScrollLayerImplTransform();
TRACE_EVENT0("cc", "LayerTreeHostImpl::calcDrawEtc");
float pageScaleFactor = m_pinchZoomViewport.pageScaleFactor();
LayerTreeHostCommon::calculateDrawProperties(rootLayer(), deviceViewportSize(), m_deviceScaleFactor, pageScaleFactor, rendererCapabilities().maxTextureSize, renderSurfaceLayerList);
-
- trackDamageForAllSurfaces(rootLayer(), renderSurfaceLayerList);
}
}
@@ -489,7 +510,8 @@ bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame)
{
DCHECK(frame.renderPasses.empty());
- calculateRenderSurfaceLayerList(*frame.renderSurfaceLayerList);
+ updateDrawProperties();
+ trackDamageForAllSurfaces(rootLayer(), *frame.renderSurfaceLayerList);
TRACE_EVENT1("cc", "LayerTreeHostImpl::calculateRenderPasses", "renderSurfaceLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerList->size()));
@@ -535,6 +557,7 @@ bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame)
if (occlusionTracker.occluded(it->renderTarget(), it->visibleContentRect(), it->drawTransform(), implDrawTransformIsUnknown, it->drawableContentRect(), &hasOcclusionFromOutsideTargetSurface))
appendQuadsData.hadOcclusionFromOutsideTargetSurface |= hasOcclusionFromOutsideTargetSurface;
else {
+ DCHECK_EQ(this, it->layerTreeHostImpl());
it->willDraw(m_resourceProvider.get());
frame.willDrawLayers.push_back(*it);
@@ -750,7 +773,6 @@ bool LayerTreeHostImpl::prepareToDraw(FrameData& frame)
frame.renderSurfaceLayerList = &m_renderSurfaceLayerList;
frame.renderPasses.clear();
frame.renderPassesById.clear();
- frame.renderSurfaceLayerList->clear();
frame.willDrawLayers.clear();
if (!calculateRenderPasses(frame))
@@ -952,14 +974,16 @@ static LayerImpl* findScrollLayerForContentLayer(LayerImpl* layerImpl)
void LayerTreeHostImpl::setRootLayer(scoped_ptr<LayerImpl> layer)
{
- m_activeTree->SetRootLayer(layer.Pass());
+ m_activeTree->SetRootLayer(layer.Pass());
+ setNeedsUpdateDrawProperties();
}
scoped_ptr<LayerImpl> LayerTreeHostImpl::detachLayerTree()
{
- scoped_ptr<LayerImpl> layer = m_activeTree->DetachLayerTree();
- m_renderSurfaceLayerList.clear();
- return layer.Pass();
+ scoped_ptr<LayerImpl> layer = m_activeTree->DetachLayerTree();
+ m_renderSurfaceLayerList.clear();
+ setNeedsUpdateDrawProperties();
+ return layer.Pass();
}
void LayerTreeHostImpl::setVisible(bool visible)
@@ -1094,10 +1118,8 @@ void LayerTreeHostImpl::setPageScaleFactorAndLimits(float pageScaleFactor, float
float pageScaleChange = pageScaleFactor / m_pinchZoomViewport.pageScaleFactor();
m_pinchZoomViewport.setPageScaleFactorAndLimits(pageScaleFactor, minPageScaleFactor, maxPageScaleFactor);
- if (!m_settings.pageScalePinchZoomEnabled) {
- if (pageScaleChange != 1)
- adjustScrollsForPageScaleChange(rootScrollLayer(), pageScaleChange);
- }
+ if (!m_settings.pageScalePinchZoomEnabled && pageScaleChange != 1)
+ adjustScrollsForPageScaleChange(rootScrollLayer(), pageScaleChange);
// Clamp delta to limits and refresh display matrix.
setPageScaleDelta(m_pinchZoomViewport.pageScaleDelta() / m_pinchZoomViewport.sentPageScaleDelta());
@@ -1152,6 +1174,9 @@ void LayerTreeHostImpl::setNeedsRedraw()
bool LayerTreeHostImpl::ensureRenderSurfaceLayerList()
{
+ // TODO(enne): See http://crbug.com/164949. This function should really
+ // just call updateDrawProperties(), but that breaks a number of
+ // impl transform tests that don't expect the tree to be updated.
if (!rootLayer())
return false;
if (!m_renderer)
@@ -1165,8 +1190,8 @@ bool LayerTreeHostImpl::ensureRenderSurfaceLayerList()
// If we are called after setRootLayer() but before prepareToDraw(), we need
// to recalculate the visible layers. This prevents being unable to scroll
// during part of a commit.
- m_renderSurfaceLayerList.clear();
- calculateRenderSurfaceLayerList(m_renderSurfaceLayerList);
+ setNeedsUpdateDrawProperties();
+ updateDrawProperties();
return m_renderSurfaceLayerList.size();
}
@@ -1219,6 +1244,7 @@ InputHandlerClient::ScrollStatus LayerTreeHostImpl::scrollBegin(gfx::Point viewp
// events are already in local layer coordinates so we can just apply them directly.
m_scrollDeltaIsInViewportSpace = (type == Gesture);
m_numImplThreadScrolls++;
+ setNeedsUpdateDrawProperties();
return ScrollStarted;
}
return ScrollIgnored;
@@ -1333,6 +1359,7 @@ bool LayerTreeHostImpl::scrollBy(const gfx::Point& viewportPoint,
if (didScroll) {
m_client->setNeedsCommitOnImplThread();
m_client->setNeedsRedrawOnImplThread();
+ setNeedsUpdateDrawProperties();
}
return didScroll;
}
@@ -1387,6 +1414,7 @@ void LayerTreeHostImpl::pinchGestureUpdate(float magnifyDelta, gfx::Point anchor
m_client->setNeedsCommitOnImplThread();
m_client->setNeedsRedrawOnImplThread();
+ setNeedsUpdateDrawProperties();
}
void LayerTreeHostImpl::pinchGestureEnd()
@@ -1523,6 +1551,7 @@ void LayerTreeHostImpl::animatePageScale(base::TimeTicks time)
nextScroll.Scale(m_pinchZoomViewport.pageScaleFactor());
rootScrollLayer()->scrollBy(nextScroll - scrollTotal);
m_client->setNeedsRedrawOnImplThread();
+ setNeedsUpdateDrawProperties();
if (m_pageScaleAnimation->isAnimationCompleteAtTime(monotonicTime)) {
m_pageScaleAnimation.reset();
@@ -1545,8 +1574,10 @@ void LayerTreeHostImpl::animateLayers(base::TimeTicks monotonicTime, base::Time
if (!events->empty())
m_client->postAnimationEventsToMainThreadOnImplThread(events.Pass(), wallClockTime);
- if (didAnimate)
+ if (didAnimate) {
m_client->setNeedsRedrawOnImplThread();
+ setNeedsUpdateDrawProperties();
+ }
setBackgroundTickingEnabled(!m_visible && m_needsAnimateLayers);
}
@@ -1580,6 +1611,7 @@ void LayerTreeHostImpl::clearRenderSurfaces()
{
clearRenderSurfacesOnLayerImplRecursive(rootLayer());
m_renderSurfaceLayerList.clear();
+ setNeedsUpdateDrawProperties();
}
std::string LayerTreeHostImpl::layerTreeAsText() const
« no previous file with comments | « cc/layer_tree_host_impl.h ('k') | cc/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698