Chromium Code Reviews| Index: cc/layer_tree_host_impl.cc |
| diff --git a/cc/layer_tree_host_impl.cc b/cc/layer_tree_host_impl.cc |
| index a3a0f9ad981f777bcd5fabedf08549fa8f2bea95..ce8b29d872689a26d117e68fe910047b0b9db0f3 100644 |
| --- a/cc/layer_tree_host_impl.cc |
| +++ b/cc/layer_tree_host_impl.cc |
| @@ -221,6 +221,7 @@ LayerTreeHostImpl::LayerTreeHostImpl(const LayerTreeSettings& settings, LayerTre |
| , m_backgroundColor(0) |
| , m_hasTransparentBackground(false) |
| , m_needsAnimateLayers(false) |
| + , m_needsUpdateLayers(false) |
| , m_pinchGestureActive(false) |
| , m_fpsCounter(FrameRateCounter::create(m_proxy->hasImplThread())) |
| , m_debugRectHistory(DebugRectHistory::create()) |
| @@ -248,6 +249,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 updateLayers |
| + // more lazily when needed prior to drawing. |
| + setNeedsUpdateLayers(); |
| + if (m_settings.implSidePainting) |
| + updateLayers(); |
| + |
| // Recompute max scroll position; must be after layer content bounds are |
| // updated. |
| updateMaxScrollOffset(); |
| @@ -325,6 +334,7 @@ void LayerTreeHostImpl::startPageScaleAnimation(gfx::Vector2d targetOffset, bool |
| m_pageScaleAnimation->zoomTo(scaledTargetOffset, pageScale, duration.InSecondsF()); |
| } |
| + setNeedsUpdateLayers(); |
| m_client->setNeedsRedrawOnImplThread(); |
| m_client->setNeedsCommitOnImplThread(); |
| } |
| @@ -367,15 +377,29 @@ void LayerTreeHostImpl::updateRootScrollLayerImplTransform() |
| { |
| if (m_rootScrollLayerImpl) { |
| m_rootScrollLayerImpl->setImplTransform(implTransform()); |
| + setNeedsUpdateLayers(); |
|
danakj
2012/12/06 03:23:04
The layer will do this.
|
| } |
| } |
| +void LayerTreeHostImpl::updateLayers() |
| +{ |
| + if (!needsUpdateLayers()) |
|
danakj
2012/12/06 03:23:04
m_
enne (OOO)
2012/12/06 17:20:23
Why?
danakj
2012/12/06 17:38:50
Cuz we always generally do this. Less indirection/
|
| + return; |
| + |
| + m_renderSurfaceLayerList.clear(); |
| + m_needsUpdateLayers = false; |
| + |
| + if (!m_rootLayerImpl) |
| + return; |
| + |
| + calculateRenderSurfaceLayerList(m_renderSurfaceLayerList); |
| +} |
| + |
| void LayerTreeHostImpl::calculateRenderSurfaceLayerList(LayerList& renderSurfaceLayerList) |
| { |
| DCHECK(renderSurfaceLayerList.empty()); |
| DCHECK(m_rootLayerImpl); |
| DCHECK(m_renderer); // For maxTextureSize. |
| - |
| { |
| updateRootScrollLayerImplTransform(); |
| @@ -383,7 +407,6 @@ void LayerTreeHostImpl::calculateRenderSurfaceLayerList(LayerList& renderSurface |
| float pageScaleFactor = m_pinchZoomViewport.pageScaleFactor(); |
| LayerTreeHostCommon::calculateDrawProperties(m_rootLayerImpl.get(), deviceViewportSize(), m_deviceScaleFactor, pageScaleFactor, &m_layerSorter, rendererCapabilities().maxTextureSize, renderSurfaceLayerList); |
| - trackDamageForAllSurfaces(m_rootLayerImpl.get(), renderSurfaceLayerList); |
| } |
| } |
| @@ -482,8 +505,10 @@ static void appendQuadsToFillScreen(RenderPass* targetRenderPass, LayerImpl* roo |
| bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame) |
| { |
| DCHECK(frame.renderPasses.empty()); |
| + if (!m_rootLayerImpl) |
|
danakj
2012/12/06 03:23:04
This is DCHECKed in prepareToDraw, by asking canDr
|
| + return false; |
| - calculateRenderSurfaceLayerList(*frame.renderSurfaceLayerList); |
| + trackDamageForAllSurfaces(m_rootLayerImpl.get(), *frame.renderSurfaceLayerList); |
| TRACE_EVENT1("cc", "LayerTreeHostImpl::calculateRenderPasses", "renderSurfaceLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerList->size())); |
| @@ -529,6 +554,7 @@ bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame) |
| if (occlusionTracker.occluded(it->renderTarget(), it->visibleContentRect(), it->drawTransform(), implDrawTransformIsUnknown, it->drawableContentRect(), &hasOcclusionFromOutsideTargetSurface)) |
| appendQuadsData.hadOcclusionFromOutsideTargetSurface |= hasOcclusionFromOutsideTargetSurface; |
| else { |
| + DCHECK(it->layerTreeHostImpl()); |
| it->willDraw(m_resourceProvider.get()); |
| frame.willDrawLayers.push_back(*it); |
| @@ -737,10 +763,10 @@ bool LayerTreeHostImpl::prepareToDraw(FrameData& frame) |
| TRACE_EVENT0("cc", "LayerTreeHostImpl::prepareToDraw"); |
| DCHECK(canDraw()); |
| + updateLayers(); |
| frame.renderSurfaceLayerList = &m_renderSurfaceLayerList; |
| frame.renderPasses.clear(); |
| frame.renderPassesById.clear(); |
| - frame.renderSurfaceLayerList->clear(); |
| frame.willDrawLayers.clear(); |
| if (!calculateRenderPasses(frame)) |
| @@ -946,6 +972,7 @@ void LayerTreeHostImpl::setRootLayer(scoped_ptr<LayerImpl> layer) |
| m_rootLayerImpl = layer.Pass(); |
| m_rootScrollLayerImpl = findRootScrollLayer(m_rootLayerImpl.get()); |
| m_currentlyScrollingLayerImpl = 0; |
| + setNeedsUpdateLayers(); |
| if (m_rootLayerImpl && m_scrollingLayerIdFromPreviousTree != -1) |
| m_currentlyScrollingLayerImpl = LayerTreeHostCommon::findLayerInSubtree(m_rootLayerImpl.get(), m_scrollingLayerIdFromPreviousTree); |
| @@ -961,6 +988,7 @@ scoped_ptr<LayerImpl> LayerTreeHostImpl::detachLayerTree() |
| m_scrollingLayerIdFromPreviousTree = m_currentlyScrollingLayerImpl ? m_currentlyScrollingLayerImpl->id() : -1; |
| m_currentlyScrollingLayerImpl = 0; |
| m_renderSurfaceLayerList.clear(); |
| + setNeedsUpdateLayers(); |
| return m_rootLayerImpl.Pass(); |
| } |
| @@ -1095,9 +1123,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(m_rootScrollLayerImpl, pageScaleChange); |
| + if (!m_settings.pageScalePinchZoomEnabled && pageScaleChange != 1) { |
| + adjustScrollsForPageScaleChange(m_rootScrollLayerImpl, pageScaleChange); |
| } |
| // Clamp delta to limits and refresh display matrix. |
| @@ -1166,8 +1193,7 @@ 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); |
| + updateLayers(); |
| return m_renderSurfaceLayerList.size(); |
| } |
| @@ -1220,6 +1246,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++; |
| + setNeedsUpdateLayers(); |
| return ScrollStarted; |
| } |
| return ScrollIgnored; |
| @@ -1332,6 +1359,7 @@ bool LayerTreeHostImpl::scrollBy(const gfx::Point& viewportPoint, |
| if (didScroll) { |
| m_client->setNeedsCommitOnImplThread(); |
| m_client->setNeedsRedrawOnImplThread(); |
| + setNeedsUpdateLayers(); |
| } |
| return didScroll; |
| } |
| @@ -1387,6 +1415,7 @@ void LayerTreeHostImpl::pinchGestureUpdate(float magnifyDelta, gfx::Point anchor |
| m_client->setNeedsCommitOnImplThread(); |
| m_client->setNeedsRedrawOnImplThread(); |
| + setNeedsUpdateLayers(); |
| } |
| void LayerTreeHostImpl::pinchGestureEnd() |
| @@ -1523,6 +1552,7 @@ void LayerTreeHostImpl::animatePageScale(base::TimeTicks time) |
| nextScroll.Scale(m_pinchZoomViewport.pageScaleFactor()); |
| m_rootScrollLayerImpl->scrollBy(nextScroll - scrollTotal); |
| m_client->setNeedsRedrawOnImplThread(); |
| + setNeedsUpdateLayers(); |
| if (m_pageScaleAnimation->isAnimationCompleteAtTime(monotonicTime)) { |
| m_pageScaleAnimation.reset(); |
| @@ -1545,8 +1575,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(); |
| + setNeedsUpdateLayers(); |
| + } |
| setBackgroundTickingEnabled(!m_visible && m_needsAnimateLayers); |
| } |
| @@ -1580,6 +1612,7 @@ void LayerTreeHostImpl::clearRenderSurfaces() |
| { |
| clearRenderSurfacesOnLayerImplRecursive(m_rootLayerImpl.get()); |
| m_renderSurfaceLayerList.clear(); |
| + setNeedsUpdateLayers(); |
| } |
| std::string LayerTreeHostImpl::layerTreeAsText() const |