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 |