Index: Source/core/rendering/RenderLayer.cpp |
diff --git a/Source/core/rendering/RenderLayer.cpp b/Source/core/rendering/RenderLayer.cpp |
index 5c9e098c33c79084c7bb6ecfbc2f89833f7a00a9..099b4a35e0a40a334a45f96fa724c91a235e6c26 100644 |
--- a/Source/core/rendering/RenderLayer.cpp |
+++ b/Source/core/rendering/RenderLayer.cpp |
@@ -131,9 +131,10 @@ 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_needsToBeStackingContainer(false) |
, m_canBePromotedToStackingContainer(false) |
, m_canBePromotedToStackingContainerDirty(true) |
, m_isRootLayer(renderer->isRenderView()) |
@@ -477,6 +478,24 @@ bool RenderLayer::acceleratedCompositingForOverflowScrollEnabled() const |
return settings && settings->acceleratedCompositingForOverflowScrollEnabled(); |
} |
+bool RenderLayer::useCompositorDrivenAcceleratedScrolling() const |
Ian Vollick
2013/09/06 02:01:05
It looks like there's some repeated logic here in
hartmanng
2013/09/06 20:18:36
Yeah, I guess we can... I thought we needed it fro
|
+{ |
+ if (!compositorDrivenAcceleratedScrollingEnabled()) |
+ return false; |
+ |
+ const RenderLayer* scrollingLayer = ancestorScrollingLayer(); |
+ if (!scrollingLayer || scrollingLayer->isStackingContainer()) |
+ return false; |
+ |
+ if (scrollingLayer->m_canBePromotedToStackingContainerDirty) { |
+ // We don't know if it's safe to promote to stacking container, and |
+ // aren't in a position to find out, so we have to assume the worst. |
+ return true; |
+ } |
+ |
+ return !scrollingLayer->needsToBeStackingContainer(); |
+} |
+ |
// FIXME: This is a temporary flag and should be removed once accelerated |
// overflow scroll is ready (crbug.com/254111). |
bool RenderLayer::compositorDrivenAcceleratedScrollingEnabled() const |
@@ -2038,20 +2057,11 @@ bool RenderLayer::usesCompositedScrolling() const |
return isComposited() && backing()->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: |
@@ -2059,12 +2069,22 @@ 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); |
} |
bool RenderLayer::hasScrollParent() const |
{ |
- if (!compositorDrivenAcceleratedScrollingEnabled()) |
+ if (!useCompositorDrivenAcceleratedScrolling()) |
return false; |
// A layer scrolls with its containing block. So to find the overflow scrolling layer |
@@ -2102,10 +2122,15 @@ void RenderLayer::updateNeedsCompositedScrolling() |
updateDescendantDependentFlags(); |
ASSERT(renderer()->view()->frameView() && renderer()->view()->frameView()->containsScrollableArea(scrollableArea())); |
- bool needsCompositedScrolling = acceleratedCompositingForOverflowScrollEnabled() |
+ const bool needsToBeStackingContainer = acceleratedCompositingForOverflowScrollEnabled() |
&& canBeStackingContainer() |
&& !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 |
@@ -2113,7 +2138,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_canBePromotedToStackingContainer for either us or our stacking context |
+ // or container. |
+ didUpdateNeedsCompositedScrolling(); |
+ } |
} |
enum CompositedScrollingHistogramBuckets { |
@@ -2123,28 +2156,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; |
@@ -2152,11 +2171,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) |