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
acceleratedCompositingForCanvasEnabled initial=true, invalidate=AcceleratedCompositing
acceleratedCompositingForAnimationEnabled initial=true, invalidate=AcceleratedCompositing
acceleratedCompositingForFiltersEnabled initial=false, invalidate=AcceleratedCompositing
acceleratedCompositingForFixedPositionEnabled initial=false
acceleratedCompositingForFixedPositionEnabled initial=false, invalidate=AcceleratedCompositing
acceleratedCompositingForOverflowScrollEnabled initial=false, invalidate=AcceleratedCompositing
acceleratedCompositingForFixedRootBackgroundEnabled initial=false
acceleratedCompositingForGpuRasterizationHintEnabled initial=false, invalidate=AcceleratedCompositing
......
......@@ -187,8 +187,11 @@ CompositingReasons CompositingReasonFinder::nonStyleDeterminedDirectReasons(cons
if (requiresCompositingForOverflowScrolling(layer))
directReasons |= CompositingReasonOverflowScrollingTouch;
if (requiresCompositingForPosition(renderer, layer, 0, needToRecomputeCompositingRequirements))
directReasons |= renderer->style()->position() == FixedPosition ? CompositingReasonPositionFixed : CompositingReasonPositionSticky;
if (requiresCompositingForPositionSticky(renderer, layer))
directReasons |= CompositingReasonPositionSticky;
if (requiresCompositingForPositionFixed(renderer, layer, 0, needToRecomputeCompositingRequirements))
directReasons |= CompositingReasonPositionFixed;
directReasons |= renderer->additionalCompositingReasons(m_compositingTriggers);
......@@ -221,10 +224,16 @@ bool CompositingReasonFinder::requiresCompositingForOverflowScrolling(const Rend
return layer->needsCompositedScrolling();
}
static bool isViewportConstrainedStickyLayer(const RenderLayer* layer)
{
ASSERT(layer->renderer()->isStickyPositioned());
return !layer->enclosingOverflowClipLayer(ExcludeSelf);
}
bool CompositingReasonFinder::isViewportConstrainedFixedOrStickyLayer(const RenderLayer* layer)
{
if (layer->renderer()->isStickyPositioned())
return !layer->enclosingOverflowClipLayer(ExcludeSelf);
return isViewportConstrainedStickyLayer(layer);
if (layer->renderer()->style()->position() != FixedPosition)
return false;
......@@ -241,30 +250,27 @@ bool CompositingReasonFinder::isViewportConstrainedFixedOrStickyLayer(const Rend
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,
// 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;
return requiresCompositingForPositionSticky(renderer, layer) || requiresCompositingForPositionFixed(renderer, layer, viewportConstrainedNotCompositedReason, needToRecomputeCompositingRequirements);
}
EPosition position = renderer->style()->position();
bool isFixed = renderer->isOutOfFlowPositioned() && position == FixedPosition;
// FIXME: The isStackingContainer check here is redundant. Fixed position elements are always stacking contexts.
if (isFixed && !layer->stackingNode()->isStackingContainer())
bool CompositingReasonFinder::requiresCompositingForPositionSticky(RenderObject* renderer, const RenderLayer* layer) const
{
if (!(m_compositingTriggers & ViewportConstrainedPositionedTrigger))
return false;
bool isSticky = renderer->isInFlowPositioned() && position == StickyPosition;
if (!isFixed && !isSticky)
if (renderer->style()->position() != StickyPosition)
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().
if (Settings* settings = m_renderView.document().settings()) {
if (!settings->acceleratedCompositingForFixedPositionEnabled())
return false;
}
bool CompositingReasonFinder::requiresCompositingForPositionFixed(RenderObject* renderer, const RenderLayer* layer, RenderLayer::ViewportConstrainedNotCompositedReason* viewportConstrainedNotCompositedReason, bool* needToRecomputeCompositingRequirements) const
{
if (!(m_compositingTriggers & ViewportConstrainedPositionedTrigger))
return false;
if (isSticky)
return isViewportConstrainedFixedOrStickyLayer(layer);
if (renderer->style()->position() != FixedPosition)
return false;
RenderObject* container = renderer->container();
// If the renderer is not hooked up yet then we have to wait until it is.
......
......@@ -48,6 +48,8 @@ private:
bool requiresCompositingForOverflowScrollingParent(const RenderLayer*) const;
bool requiresCompositingForOutOfFlowClipping(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;
RenderView& m_renderView;
......
......@@ -38,6 +38,7 @@ enum CompositingTrigger {
// path is ready (crbug.com/254111).
LegacyOverflowScrollTrigger = 1 << 8,
OverflowScrollTrigger = 1 << 9,
ViewportConstrainedPositionedTrigger = 1 << 10,
AllCompositingTriggers = 0xFFFFFFFF,
};
......
......@@ -745,6 +745,10 @@ WebCore::CompositingTriggerFlags ChromeClientImpl::allowedCompositingTriggers()
flags |= WebCore::LegacyOverflowScrollTrigger;
if (settings.compositorDrivenAcceleratedScrollingEnabled())
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;
}
......
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