Commit 0b159c6a authored by ojan@chromium.org's avatar ojan@chromium.org

CompositingReasonFinder::requiresCompositingForPosition

-Split up the sticky and fixed position logic as they're quite
different.
-Add a CompositingTrigger for viewport constrained positioned
elements. This gets rid of the last use of settings in
CompositingReasonFinder. Each other use has been high on
profiles and it makes the code more consistent.
-Get rid of redundant checks of renderer->isPositioned(),
renderer->isOutOfFlowPositioned(),
renderer->isInFlowPositioned() and 
!layer->stackingNode()->isStackingContainer(). All those
bits are implied by the position being fixed or sticky.

Review URL: https://codereview.chromium.org/231613002

git-svn-id: svn://svn.chromium.org/blink/trunk@171504 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 20a46bbb
...@@ -102,7 +102,7 @@ acceleratedCompositingForPluginsEnabled initial=true, invalidate=AcceleratedComp ...@@ -102,7 +102,7 @@ acceleratedCompositingForPluginsEnabled initial=true, invalidate=AcceleratedComp
acceleratedCompositingForCanvasEnabled initial=true, invalidate=AcceleratedCompositing acceleratedCompositingForCanvasEnabled initial=true, invalidate=AcceleratedCompositing
acceleratedCompositingForAnimationEnabled initial=true, invalidate=AcceleratedCompositing acceleratedCompositingForAnimationEnabled initial=true, invalidate=AcceleratedCompositing
acceleratedCompositingForFiltersEnabled initial=false, invalidate=AcceleratedCompositing acceleratedCompositingForFiltersEnabled initial=false, invalidate=AcceleratedCompositing
acceleratedCompositingForFixedPositionEnabled initial=false acceleratedCompositingForFixedPositionEnabled initial=false, invalidate=AcceleratedCompositing
acceleratedCompositingForOverflowScrollEnabled initial=false, invalidate=AcceleratedCompositing acceleratedCompositingForOverflowScrollEnabled initial=false, invalidate=AcceleratedCompositing
acceleratedCompositingForFixedRootBackgroundEnabled initial=false acceleratedCompositingForFixedRootBackgroundEnabled initial=false
acceleratedCompositingForGpuRasterizationHintEnabled initial=false, invalidate=AcceleratedCompositing acceleratedCompositingForGpuRasterizationHintEnabled initial=false, invalidate=AcceleratedCompositing
......
...@@ -187,8 +187,11 @@ CompositingReasons CompositingReasonFinder::nonStyleDeterminedDirectReasons(cons ...@@ -187,8 +187,11 @@ CompositingReasons CompositingReasonFinder::nonStyleDeterminedDirectReasons(cons
if (requiresCompositingForOverflowScrolling(layer)) if (requiresCompositingForOverflowScrolling(layer))
directReasons |= CompositingReasonOverflowScrollingTouch; directReasons |= CompositingReasonOverflowScrollingTouch;
if (requiresCompositingForPosition(renderer, layer, 0, needToRecomputeCompositingRequirements)) if (requiresCompositingForPositionSticky(renderer, layer))
directReasons |= renderer->style()->position() == FixedPosition ? CompositingReasonPositionFixed : CompositingReasonPositionSticky; directReasons |= CompositingReasonPositionSticky;
if (requiresCompositingForPositionFixed(renderer, layer, 0, needToRecomputeCompositingRequirements))
directReasons |= CompositingReasonPositionFixed;
directReasons |= renderer->additionalCompositingReasons(m_compositingTriggers); directReasons |= renderer->additionalCompositingReasons(m_compositingTriggers);
...@@ -221,10 +224,16 @@ bool CompositingReasonFinder::requiresCompositingForOverflowScrolling(const Rend ...@@ -221,10 +224,16 @@ bool CompositingReasonFinder::requiresCompositingForOverflowScrolling(const Rend
return layer->needsCompositedScrolling(); return layer->needsCompositedScrolling();
} }
static bool isViewportConstrainedStickyLayer(const RenderLayer* layer)
{
ASSERT(layer->renderer()->isStickyPositioned());
return !layer->enclosingOverflowClipLayer(ExcludeSelf);
}
bool CompositingReasonFinder::isViewportConstrainedFixedOrStickyLayer(const RenderLayer* layer) bool CompositingReasonFinder::isViewportConstrainedFixedOrStickyLayer(const RenderLayer* layer)
{ {
if (layer->renderer()->isStickyPositioned()) if (layer->renderer()->isStickyPositioned())
return !layer->enclosingOverflowClipLayer(ExcludeSelf); return isViewportConstrainedStickyLayer(layer);
if (layer->renderer()->style()->position() != FixedPosition) if (layer->renderer()->style()->position() != FixedPosition)
return false; return false;
...@@ -241,30 +250,27 @@ bool CompositingReasonFinder::isViewportConstrainedFixedOrStickyLayer(const Rend ...@@ -241,30 +250,27 @@ bool CompositingReasonFinder::isViewportConstrainedFixedOrStickyLayer(const Rend
bool CompositingReasonFinder::requiresCompositingForPosition(RenderObject* renderer, const RenderLayer* layer, RenderLayer::ViewportConstrainedNotCompositedReason* viewportConstrainedNotCompositedReason, bool* needToRecomputeCompositingRequirements) const bool CompositingReasonFinder::requiresCompositingForPosition(RenderObject* renderer, const RenderLayer* layer, RenderLayer::ViewportConstrainedNotCompositedReason* viewportConstrainedNotCompositedReason, bool* needToRecomputeCompositingRequirements) const
{ {
// position:fixed elements that create their own stacking context (e.g. have an explicit z-index, return requiresCompositingForPositionSticky(renderer, layer) || requiresCompositingForPositionFixed(renderer, layer, viewportConstrainedNotCompositedReason, needToRecomputeCompositingRequirements);
// opacity, transform) can get their own composited layer. A stacking context is required otherwise }
// z-index and clipping will be broken.
if (!renderer->isPositioned())
return false;
EPosition position = renderer->style()->position(); bool CompositingReasonFinder::requiresCompositingForPositionSticky(RenderObject* renderer, const RenderLayer* layer) const
bool isFixed = renderer->isOutOfFlowPositioned() && position == FixedPosition; {
// FIXME: The isStackingContainer check here is redundant. Fixed position elements are always stacking contexts. if (!(m_compositingTriggers & ViewportConstrainedPositionedTrigger))
if (isFixed && !layer->stackingNode()->isStackingContainer())
return false; return false;
if (renderer->style()->position() != StickyPosition)
bool isSticky = renderer->isInFlowPositioned() && position == StickyPosition;
if (!isFixed && !isSticky)
return false; return false;
// FIXME: This probably isn't correct for accelerated overflow scrolling. crbug.com/361723
// Instead it should return false only if the layer is not inside a scrollable region.
return isViewportConstrainedStickyLayer(layer);
}
// FIXME: acceleratedCompositingForFixedPositionEnabled should probably be renamed acceleratedCompositingForViewportConstrainedPositionEnabled(). bool CompositingReasonFinder::requiresCompositingForPositionFixed(RenderObject* renderer, const RenderLayer* layer, RenderLayer::ViewportConstrainedNotCompositedReason* viewportConstrainedNotCompositedReason, bool* needToRecomputeCompositingRequirements) const
if (Settings* settings = m_renderView.document().settings()) { {
if (!settings->acceleratedCompositingForFixedPositionEnabled()) if (!(m_compositingTriggers & ViewportConstrainedPositionedTrigger))
return false; return false;
}
if (isSticky) if (renderer->style()->position() != FixedPosition)
return isViewportConstrainedFixedOrStickyLayer(layer); return false;
RenderObject* container = renderer->container(); RenderObject* container = renderer->container();
// If the renderer is not hooked up yet then we have to wait until it is. // If the renderer is not hooked up yet then we have to wait until it is.
......
...@@ -48,6 +48,8 @@ private: ...@@ -48,6 +48,8 @@ private:
bool requiresCompositingForOverflowScrollingParent(const RenderLayer*) const; bool requiresCompositingForOverflowScrollingParent(const RenderLayer*) const;
bool requiresCompositingForOutOfFlowClipping(const RenderLayer*) const; bool requiresCompositingForOutOfFlowClipping(const RenderLayer*) const;
bool requiresCompositingForOverflowScrolling(const RenderLayer*) const; bool requiresCompositingForOverflowScrolling(const RenderLayer*) const;
bool requiresCompositingForPositionSticky(RenderObject*, const RenderLayer*) const;
bool requiresCompositingForPositionFixed(RenderObject*, const RenderLayer*, RenderLayer::ViewportConstrainedNotCompositedReason*, bool* needToRecomputeCompositingRequirements) const;
bool requiresCompositingForWillChange(const RenderObject*) const; bool requiresCompositingForWillChange(const RenderObject*) const;
RenderView& m_renderView; RenderView& m_renderView;
......
...@@ -38,6 +38,7 @@ enum CompositingTrigger { ...@@ -38,6 +38,7 @@ enum CompositingTrigger {
// path is ready (crbug.com/254111). // path is ready (crbug.com/254111).
LegacyOverflowScrollTrigger = 1 << 8, LegacyOverflowScrollTrigger = 1 << 8,
OverflowScrollTrigger = 1 << 9, OverflowScrollTrigger = 1 << 9,
ViewportConstrainedPositionedTrigger = 1 << 10,
AllCompositingTriggers = 0xFFFFFFFF, AllCompositingTriggers = 0xFFFFFFFF,
}; };
......
...@@ -745,6 +745,10 @@ WebCore::CompositingTriggerFlags ChromeClientImpl::allowedCompositingTriggers() ...@@ -745,6 +745,10 @@ WebCore::CompositingTriggerFlags ChromeClientImpl::allowedCompositingTriggers()
flags |= WebCore::LegacyOverflowScrollTrigger; flags |= WebCore::LegacyOverflowScrollTrigger;
if (settings.compositorDrivenAcceleratedScrollingEnabled()) if (settings.compositorDrivenAcceleratedScrollingEnabled())
flags |= WebCore::OverflowScrollTrigger; flags |= WebCore::OverflowScrollTrigger;
// FIXME: acceleratedCompositingForFixedPositionEnabled should be renamed acceleratedCompositingForViewportConstrainedPositionEnabled().
// Or the sticky and fixed position elements should be behind different flags.
if (settings.acceleratedCompositingForFixedPositionEnabled())
flags |= WebCore::ViewportConstrainedPositionedTrigger;
return flags; return flags;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment