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

Unified Diff: Source/core/rendering/RenderLayer.cpp

Issue 20103002: Make composited scrolling codepaths co-operate. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: rebaseline TestExpectations Created 7 years, 2 months 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 | « Source/core/rendering/RenderLayer.h ('k') | Source/core/rendering/RenderLayerCompositor.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/rendering/RenderLayer.cpp
diff --git a/Source/core/rendering/RenderLayer.cpp b/Source/core/rendering/RenderLayer.cpp
index a18ab22ce0bc044933cbbba4ced6a615213cfcce..970b7d088dd528d3b39a73f9cf5de2b56e8612ed 100644
--- a/Source/core/rendering/RenderLayer.cpp
+++ b/Source/core/rendering/RenderLayer.cpp
@@ -114,11 +114,12 @@ RenderLayer::RenderLayer(RenderLayerModelObject* renderer)
, m_hasUnclippedDescendant(false)
, m_isUnclippedDescendant(false)
, m_needsCompositedScrolling(false)
- , m_needsCompositedScrollingHasBeenRecorded(false)
+ , m_needsToBeStackingContainerHasBeenRecorded(false)
, m_willUseCompositedScrollingHasBeenRecorded(false)
, m_isScrollableAreaHasBeenRecorded(false)
- , m_canBePromotedToStackingContainer(false)
- , m_canBePromotedToStackingContainerDirty(true)
+ , m_needsToBeStackingContainer(false)
+ , m_descendantsAreContiguousInStackingOrder(false)
+ , m_descendantsAreContiguousInStackingOrderDirty(true)
, m_isRootLayer(renderer->isRenderView())
, m_usedTransparency(false)
, m_childLayerHasBlendMode(false)
@@ -410,11 +411,11 @@ bool RenderLayer::compositorDrivenAcceleratedScrollingEnabled() const
// We do this by computing what positive and negative z-order lists would look
// like before and after promotion, and ensuring that proper stacking order is
// preserved between the two sets of lists.
-void RenderLayer::updateCanBeStackingContainer()
+void RenderLayer::updateDescendantsAreContiguousInStackingOrder()
{
- TRACE_EVENT0("blink_rendering,comp-scroll", "RenderLayer::updateCanBeStackingContainer");
+ TRACE_EVENT0("blink_rendering,comp-scroll", "RenderLayer::updateDescendantsAreContiguousInStackingOrder");
- if (isStackingContext() || !m_canBePromotedToStackingContainerDirty || !acceleratedCompositingForOverflowScrollEnabled())
+ if (isStackingContext() || !m_descendantsAreContiguousInStackingOrderDirty || !acceleratedCompositingForOverflowScrollEnabled())
return;
FrameView* frameView = renderer()->view()->frameView();
@@ -435,8 +436,8 @@ void RenderLayer::updateCanBeStackingContainer()
size_t maxIndex = std::min(posZOrderListAfterPromote->size() + negZOrderListAfterPromote->size(), posZOrderListBeforePromote->size() + negZOrderListBeforePromote->size());
- m_canBePromotedToStackingContainerDirty = false;
- m_canBePromotedToStackingContainer = false;
+ m_descendantsAreContiguousInStackingOrderDirty = false;
+ m_descendantsAreContiguousInStackingOrder = false;
const RenderLayer* layerAfterPromote = 0;
for (size_t i = 0; i < maxIndex && layerAfterPromote != this; ++i) {
@@ -464,7 +465,7 @@ void RenderLayer::updateCanBeStackingContainer()
return;
}
- m_canBePromotedToStackingContainer = true;
+ m_descendantsAreContiguousInStackingOrder = true;
}
static inline bool isPositionedContainer(const RenderLayer* layer)
@@ -905,13 +906,13 @@ void RenderLayer::updatePagination()
}
}
-bool RenderLayer::canBeStackingContainer() const
+bool RenderLayer::descendantsAreContiguousInStackingOrder() const
{
if (isStackingContext() || !ancestorStackingContainer())
return true;
- ASSERT(!m_canBePromotedToStackingContainerDirty);
- return m_canBePromotedToStackingContainer;
+ ASSERT(!m_descendantsAreContiguousInStackingOrderDirty);
+ return m_descendantsAreContiguousInStackingOrder;
}
void RenderLayer::setHasVisibleContent()
@@ -1685,7 +1686,7 @@ void RenderLayer::addChild(RenderLayer* child, RenderLayer* beforeChild)
// layer's stacking context. We need to manually do it here as well, in case
// we're adding this layer after the stacking context has already been
// updated.
- child->m_canBePromotedToStackingContainerDirty = true;
+ child->m_descendantsAreContiguousInStackingOrderDirty = true;
compositor()->layerWasAdded(this, child);
}
@@ -1950,20 +1951,11 @@ bool RenderLayer::usesCompositedScrolling() const
return compositedLayerMapping() && compositedLayerMapping()->scrollingLayer();
}
-bool RenderLayer::needsCompositedScrolling() const
-{
- if (!compositorDrivenAcceleratedScrollingEnabled())
- return needsToBeStackingContainer();
- if (FrameView* frameView = renderer()->view()->frameView())
- return frameView->containsScrollableArea(scrollableArea());
- return false;
-}
-
-bool RenderLayer::needsToBeStackingContainer() const
+bool RenderLayer::adjustForForceCompositedScrollingMode(bool value) const
{
switch (m_forceNeedsCompositedScrolling) {
case DoNotForceCompositedScrolling:
- return m_needsCompositedScrolling;
+ return value;
case CompositedScrollingAlwaysOn:
return true;
case CompositedScrollingAlwaysOff:
@@ -1971,7 +1963,17 @@ bool RenderLayer::needsToBeStackingContainer() const
}
ASSERT_NOT_REACHED();
- return m_needsCompositedScrolling;
+ return value;
+}
+
+bool RenderLayer::needsCompositedScrolling() const
+{
+ return adjustForForceCompositedScrollingMode(m_needsCompositedScrolling);
+}
+
+bool RenderLayer::needsToBeStackingContainer() const
+{
+ return adjustForForceCompositedScrollingMode(m_needsToBeStackingContainer);
}
RenderLayer* RenderLayer::scrollParent() const
@@ -1993,13 +1995,13 @@ RenderLayer* RenderLayer::scrollParent() const
// that we scroll with our scrolling ancestor and it cannot do this if we do not promote.
RenderLayer* scrollParent = ancestorScrollingLayer();
- if (!scrollParent || scrollParent->isStackingContext())
+ if (!scrollParent || scrollParent->isStackingContainer())
return 0;
// If we hit a stacking context on our way up to the ancestor scrolling layer, it will already
// be composited due to an overflow scrolling parent, so we don't need to.
for (RenderLayer* ancestor = parent(); ancestor && ancestor != scrollParent; ancestor = ancestor->parent()) {
- if (ancestor->isStackingContext())
+ if (ancestor->isStackingContainer())
return 0;
}
@@ -2023,14 +2025,19 @@ void RenderLayer::updateNeedsCompositedScrolling()
{
TRACE_EVENT0("comp-scroll", "RenderLayer::updateNeedsCompositedScrolling");
- updateCanBeStackingContainer();
+ updateDescendantsAreContiguousInStackingOrder();
updateDescendantDependentFlags();
ASSERT(renderer()->view()->frameView() && renderer()->view()->frameView()->containsScrollableArea(scrollableArea()));
- bool needsCompositedScrolling = acceleratedCompositingForOverflowScrollEnabled()
- && canBeStackingContainer()
+ const bool needsToBeStackingContainer = acceleratedCompositingForOverflowScrollEnabled()
+ && descendantsAreContiguousInStackingOrder()
&& !hasUnclippedDescendant();
+ const bool needsToBeStackingContainerDidChange = setNeedsToBeStackingContainer(needsToBeStackingContainer);
+
+ const bool needsCompositedScrolling = needsToBeStackingContainer
+ || compositorDrivenAcceleratedScrollingEnabled();
+
// We gather a boolean value for use with Google UMA histograms to
// quantify the actual effects of a set of patches attempting to
// relax composited scrolling requirements, thereby increasing the
@@ -2038,7 +2045,15 @@ void RenderLayer::updateNeedsCompositedScrolling()
if (acceleratedCompositingForOverflowScrollEnabled())
HistogramSupport::histogramEnumeration("Renderer.NeedsCompositedScrolling", needsCompositedScrolling, 2);
- setNeedsCompositedScrolling(needsCompositedScrolling);
+ const bool needsCompositedScrollingDidChange = setNeedsCompositedScrolling(needsCompositedScrolling);
+
+ if (needsToBeStackingContainerDidChange || needsCompositedScrollingDidChange) {
+ // Note, the z-order lists may need to be rebuilt, but our code guarantees
+ // that we have not affected stacking, so we will not dirty
+ // m_descendantsAreContiguousInStackingOrder for either us or our stacking
+ // context or container.
+ didUpdateNeedsCompositedScrolling();
+ }
}
enum CompositedScrollingHistogramBuckets {
@@ -2048,28 +2063,14 @@ enum CompositedScrollingHistogramBuckets {
CompositedScrollingHistogramMax = 3
};
-void RenderLayer::setNeedsCompositedScrolling(bool needsCompositedScrolling)
+bool RenderLayer::setNeedsCompositedScrolling(bool needsCompositedScrolling)
{
if (m_needsCompositedScrolling == needsCompositedScrolling)
- return;
-
- // Count the total number of RenderLayers which need to be stacking
- // containers some point. This should be recorded at most once per
- // RenderLayer, so we check m_needsCompositedScrollingHasBeenRecorded.
- if (acceleratedCompositingForOverflowScrollEnabled() && !m_needsCompositedScrollingHasBeenRecorded) {
- HistogramSupport::histogramEnumeration("Renderer.CompositedScrolling", NeedsToBeStackingContainerBucket, CompositedScrollingHistogramMax);
- m_needsCompositedScrollingHasBeenRecorded = true;
- }
+ return false;
// Count the total number of RenderLayers which need composited scrolling at
// some point. This should be recorded at most once per RenderLayer, so we
// check m_willUseCompositedScrollingHasBeenRecorded.
- //
- // FIXME: Currently, this computes the exact same value as the above.
- // However, it will soon be expanded to cover more than just stacking
- // containers (see crbug.com/249354). When this happens, we should see a
- // spike in "WillUseCompositedScrolling", while "NeedsToBeStackingContainer"
- // will remain relatively static.
if (acceleratedCompositingForOverflowScrollEnabled() && !m_willUseCompositedScrollingHasBeenRecorded) {
HistogramSupport::histogramEnumeration("Renderer.CompositedScrolling", WillUseCompositedScrollingBucket, CompositedScrollingHistogramMax);
m_willUseCompositedScrollingHasBeenRecorded = true;
@@ -2077,11 +2078,25 @@ void RenderLayer::setNeedsCompositedScrolling(bool needsCompositedScrolling)
m_needsCompositedScrolling = needsCompositedScrolling;
- // Note, the z-order lists may need to be rebuilt, but our code guarantees
- // that we have not affected stacking, so we will not dirty
- // m_canBePromotedToStackingContainer for either us or our stacking context
- // or container.
- didUpdateNeedsCompositedScrolling();
+ return true;
+}
+
+bool RenderLayer::setNeedsToBeStackingContainer(bool needsToBeStackingContainer)
+{
+ if (m_needsToBeStackingContainer == needsToBeStackingContainer)
+ return false;
+
+ // Count the total number of RenderLayers which need to be stacking
+ // containers some point. This should be recorded at most once per
+ // RenderLayer, so we check m_needsToBeStackingContainerHasBeenRecorded.
+ if (acceleratedCompositingForOverflowScrollEnabled() && !m_needsToBeStackingContainerHasBeenRecorded) {
+ HistogramSupport::histogramEnumeration("Renderer.CompositedScrolling", NeedsToBeStackingContainerBucket, CompositedScrollingHistogramMax);
+ m_needsToBeStackingContainerHasBeenRecorded = true;
+ }
+
+ m_needsToBeStackingContainer = needsToBeStackingContainer;
+
+ return true;
}
void RenderLayer::setForceNeedsCompositedScrolling(RenderLayer::ForceNeedsCompositedScrollingMode mode)
@@ -4644,7 +4659,7 @@ static inline bool compareZIndex(RenderLayer* first, RenderLayer* second)
void RenderLayer::dirtyNormalFlowListCanBePromotedToStackingContainer()
{
- m_canBePromotedToStackingContainerDirty = true;
+ m_descendantsAreContiguousInStackingOrderDirty = true;
if (m_normalFlowListDirty || !normalFlowList())
return;
@@ -4661,14 +4676,14 @@ void RenderLayer::dirtySiblingStackingContextCanBePromotedToStackingContainer()
if (!ancestorStackingContext->m_zOrderListsDirty && ancestorStackingContext->posZOrderList()) {
for (size_t index = 0; index < ancestorStackingContext->posZOrderList()->size(); ++index)
- ancestorStackingContext->posZOrderList()->at(index)->m_canBePromotedToStackingContainerDirty = true;
+ ancestorStackingContext->posZOrderList()->at(index)->m_descendantsAreContiguousInStackingOrderDirty = true;
}
ancestorStackingContext->dirtyNormalFlowListCanBePromotedToStackingContainer();
if (!ancestorStackingContext->m_zOrderListsDirty && ancestorStackingContext->negZOrderList()) {
for (size_t index = 0; index < ancestorStackingContext->negZOrderList()->size(); ++index)
- ancestorStackingContext->negZOrderList()->at(index)->m_canBePromotedToStackingContainerDirty = true;
+ ancestorStackingContext->negZOrderList()->at(index)->m_descendantsAreContiguousInStackingOrderDirty = true;
}
}
@@ -4683,7 +4698,7 @@ void RenderLayer::dirtyZOrderLists()
m_negZOrderList->clear();
m_zOrderListsDirty = true;
- m_canBePromotedToStackingContainerDirty = true;
+ m_descendantsAreContiguousInStackingOrderDirty = true;
if (!renderer()->documentBeingDestroyed()) {
compositor()->setNeedsUpdateCompositingRequirementsState();
@@ -4698,7 +4713,7 @@ void RenderLayer::dirtyStackingContainerZOrderLists()
// Any siblings in the ancestor stacking context could also be affected.
// Changing z-index, for example, could cause us to stack in between a
// sibling's descendants, meaning that we have to recompute
- // m_canBePromotedToStackingContainer for that sibling.
+ // m_descendantsAreContiguousInStackingOrder for that sibling.
dirtySiblingStackingContextCanBePromotedToStackingContainer();
RenderLayer* stackingContainer = this->ancestorStackingContainer();
« no previous file with comments | « Source/core/rendering/RenderLayer.h ('k') | Source/core/rendering/RenderLayerCompositor.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698