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

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: Fix TODO comment about animations 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
Index: cc/layer_tree_host_impl.cc
diff --git a/cc/layer_tree_host_impl.cc b/cc/layer_tree_host_impl.cc
index c295e920432a6a22acd80869e3e09b513de998f1..857647838d2e3f6053bd42f629333f49e525a3d2 100644
--- a/cc/layer_tree_host_impl.cc
+++ b/cc/layer_tree_host_impl.cc
@@ -216,6 +216,7 @@ LayerTreeHostImpl::LayerTreeHostImpl(const LayerTreeSettings& settings, LayerTre
PriorityCalculator::allowNothingCutoff())
, m_backgroundColor(0)
, m_hasTransparentBackground(false)
+ , m_needsUpdateDrawProperties(false)
, m_pinchGestureActive(false)
, m_fpsCounter(FrameRateCounter::create(m_proxy->hasImplThread()))
, m_debugRectHistory(DebugRectHistory::create())
@@ -252,6 +253,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();
@@ -329,6 +338,7 @@ void LayerTreeHostImpl::startPageScaleAnimation(gfx::Vector2d targetOffset, bool
m_pageScaleAnimation->zoomTo(scaledTargetOffset, pageScale, duration.InSecondsF());
}
+ setNeedsUpdateDrawProperties();
m_client->setNeedsRedrawOnImplThread();
m_client->setNeedsCommitOnImplThread();
}
@@ -374,20 +384,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);
}
}
@@ -487,7 +508,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()));
@@ -533,6 +555,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);
@@ -718,7 +741,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))
@@ -914,13 +936,15 @@ static LayerImpl* findScrollLayerForContentLayer(LayerImpl* layerImpl)
void LayerTreeHostImpl::setRootLayer(scoped_ptr<LayerImpl> layer)
{
m_activeTree->SetRootLayer(layer.Pass());
+ setNeedsUpdateDrawProperties();
danakj 2012/12/07 21:14:02 nit: 4 space indents
enne (OOO) 2012/12/07 23:03:00 Done.
}
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)
@@ -1053,10 +1077,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());
@@ -1124,8 +1146,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();
danakj 2012/12/07 21:14:02 Ok, throw a big TODO here please and file a bug. T
enne (OOO) 2012/12/07 23:03:00 Done. https://code.google.com/p/chromium/issues/d
+ updateDrawProperties();
return m_renderSurfaceLayerList.size();
}
@@ -1178,6 +1200,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;
@@ -1292,6 +1315,7 @@ bool LayerTreeHostImpl::scrollBy(const gfx::Point& viewportPoint,
if (didScroll) {
m_client->setNeedsCommitOnImplThread();
m_client->setNeedsRedrawOnImplThread();
+ setNeedsUpdateDrawProperties();
}
return didScroll;
}
@@ -1346,6 +1370,7 @@ void LayerTreeHostImpl::pinchGestureUpdate(float magnifyDelta, gfx::Point anchor
m_client->setNeedsCommitOnImplThread();
m_client->setNeedsRedrawOnImplThread();
+ setNeedsUpdateDrawProperties();
}
void LayerTreeHostImpl::pinchGestureEnd()
@@ -1482,6 +1507,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();
@@ -1503,10 +1529,12 @@ void LayerTreeHostImpl::animateLayers(base::TimeTicks monotonicTime, base::Time
for (AnimationControllerSet::iterator iter = copy.begin(); iter != copy.end(); ++iter)
(*iter)->animate(monotonicSeconds, events.get());
+ if (copy.size() > 0)
danakj 2012/12/07 21:14:02 nit: !copy.empty() Or even better, save !m_active
enne (OOO) 2012/12/07 23:03:00 Actually, there's an early out for no active contr
+ m_client->setNeedsRedrawOnImplThread();
danakj 2012/12/07 21:14:02 did you mean to setNeedsUpdateDrawProperties() her
enne (OOO) 2012/12/07 23:03:00 Done.
+
if (!events->empty())
m_client->postAnimationEventsToMainThreadOnImplThread(events.Pass(), wallClockTime);
- m_client->setNeedsRedrawOnImplThread();
setBackgroundTickingEnabled(!m_visible && !m_activeAnimationControllers.empty());
}
@@ -1539,6 +1567,7 @@ void LayerTreeHostImpl::clearRenderSurfaces()
{
clearRenderSurfacesOnLayerImplRecursive(rootLayer());
m_renderSurfaceLayerList.clear();
+ setNeedsUpdateDrawProperties();
}
std::string LayerTreeHostImpl::layerTreeAsText() const

Powered by Google App Engine
This is Rietveld 408576698