Commit 426946ce authored by vollick@chromium.org's avatar vollick@chromium.org

Improve the compositing reasons when squashing fails

Currently we just report that "no squashing target was found". There
are many reasons why squashing might fail and this message is not very
informative. This cl expands the list of squashing-related compositing
reasons to make diagnosing layer explosions easier.

R=chrishtr@chromium.org
BUG=None

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

git-svn-id: svn://svn.chromium.org/blink/trunk@176259 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 18d0781c
......@@ -111,10 +111,10 @@ CompositingStateTransitionType CompositingLayerAssigner::computeCompositedLayerU
return update;
}
bool CompositingLayerAssigner::canSquashIntoCurrentSquashingOwner(const RenderLayer* layer, const CompositingLayerAssigner::SquashingState& squashingState)
CompositingReasons CompositingLayerAssigner::getReasonsPreventingSquashing(const RenderLayer* layer, const CompositingLayerAssigner::SquashingState& squashingState)
{
if (!squashingState.haveAssignedBackingsToEntireSquashingLayerSubtree)
return false;
return CompositingReasonSquashingWouldBreakPaintOrder;
// FIXME: this special case for video exists only to deal with corner cases
// where a RenderVideo does not report that it needs to be directly composited.
......@@ -125,10 +125,10 @@ bool CompositingLayerAssigner::canSquashIntoCurrentSquashingOwner(const RenderLa
// compositing/video/video-controls-layer-creation.html
// virtual/softwarecompositing/video/video-controls-layer-creation.html
if (layer->renderer()->isVideo())
return false;
return CompositingReasonSquashingVideoIsDisallowed;
if (squashingWouldExceedSparsityTolerance(layer, squashingState))
return false;
return CompositingReasonSquashingSparsityExceeded;
// FIXME: this is not efficient, since it walks up the tree . We should store these values on the CompositingInputsCache.
ASSERT(squashingState.hasMostRecentMapping);
......@@ -136,29 +136,30 @@ bool CompositingLayerAssigner::canSquashIntoCurrentSquashingOwner(const RenderLa
if (layer->renderer()->clippingContainer() != squashingLayer.renderer()->clippingContainer()) {
if (!squashingLayer.compositedLayerMapping()->containingSquashedLayer(layer->renderer()->clippingContainer()))
return false;
return CompositingReasonSquashingClippingContainerMismatch;
}
// Composited descendants need to be clipped by a child contianment graphics layer, which would not be available if the layer is
// Composited descendants need to be clipped by a child containment graphics layer, which would not be available if the layer is
// squashed (and therefore has no CLM nor a child containment graphics layer).
if (m_compositor->clipsCompositingDescendants(layer))
return false;
return CompositingReasonSquashedLayerClipsCompositingDescendants;
if (layer->scrollsWithRespectTo(&squashingLayer))
return false;
return CompositingReasonScrollsWithRespectToSquashingLayer;
const RenderLayer::CompositingInputs& compositingInputs = layer->compositingInputs();
const RenderLayer::CompositingInputs& squashingLayerCompositingInputs = squashingLayer.compositingInputs();
if (compositingInputs.opacityAncestor != squashingLayerCompositingInputs.opacityAncestor)
return false;
return CompositingReasonSquashingOpacityAncestorMismatch;
if (compositingInputs.transformAncestor != squashingLayerCompositingInputs.transformAncestor)
return false;
return CompositingReasonSquashingTransformAncestorMismatch;
if (compositingInputs.filterAncestor != squashingLayerCompositingInputs.filterAncestor)
return false;
return CompositingReasonSquashingFilterAncestorMismatch;
return true;
return CompositingReasonNone;
}
bool CompositingLayerAssigner::updateSquashingAssignment(RenderLayer* layer, SquashingState& squashingState, const CompositingStateTransitionType compositedLayerUpdate,
......@@ -222,8 +223,11 @@ void CompositingLayerAssigner::assignLayersToBackingsForReflectionLayer(RenderLa
void CompositingLayerAssigner::assignLayersToBackingsInternal(RenderLayer* layer, SquashingState& squashingState, bool& layersChanged, Vector<RenderLayer*>& layersNeedingRepaint)
{
if (m_layerSquashingEnabled && requiresSquashing(layer->compositingReasons()) && !canSquashIntoCurrentSquashingOwner(layer, squashingState))
layer->setCompositingReasons(layer->compositingReasons() | CompositingReasonNoSquashingTargetFound);
if (m_layerSquashingEnabled && requiresSquashing(layer->compositingReasons())) {
CompositingReasons reasonsPreventingSquashing = getReasonsPreventingSquashing(layer, squashingState);
if (reasonsPreventingSquashing)
layer->setCompositingReasons(layer->compositingReasons() | reasonsPreventingSquashing);
}
CompositingStateTransitionType compositedLayerUpdate = computeCompositedLayerUpdate(layer);
......
......@@ -79,7 +79,7 @@ private:
void assignLayersToBackingsInternal(RenderLayer*, SquashingState&, bool& layersChanged, Vector<RenderLayer*>& layersNeedingRepaint);
void assignLayersToBackingsForReflectionLayer(RenderLayer* reflectionLayer, bool& layersChanged, Vector<RenderLayer*>& layersNeedingRepaint);
bool canSquashIntoCurrentSquashingOwner(const RenderLayer*, const SquashingState&);
CompositingReasons getReasonsPreventingSquashing(const RenderLayer*, const SquashingState&);
bool squashingWouldExceedSparsityTolerance(const RenderLayer* candidate, const SquashingState&);
bool updateSquashingAssignment(RenderLayer*, SquashingState&, CompositingStateTransitionType, Vector<RenderLayer*>& layersNeedingRepaint);
bool needsOwnBacking(const RenderLayer*) const;
......
......@@ -10,67 +10,73 @@
namespace WebCore {
const uint64_t CompositingReasonNone = 0;
const uint64_t CompositingReasonAll = ~static_cast<uint64_t>(0);
const uint64_t CompositingReasonNone = 0;
const uint64_t CompositingReasonAll = ~static_cast<uint64_t>(0);
// Intrinsic reasons that can be known right away by the layer
const uint64_t CompositingReason3DTransform = UINT64_C(1) << 0;
const uint64_t CompositingReasonVideo = UINT64_C(1) << 1;
const uint64_t CompositingReasonCanvas = UINT64_C(1) << 2;
const uint64_t CompositingReasonPlugin = UINT64_C(1) << 3;
const uint64_t CompositingReasonIFrame = UINT64_C(1) << 4;
const uint64_t CompositingReasonBackfaceVisibilityHidden = UINT64_C(1) << 5;
const uint64_t CompositingReasonActiveAnimation = UINT64_C(1) << 6;
const uint64_t CompositingReasonTransitionProperty = UINT64_C(1) << 7;
const uint64_t CompositingReasonFilters = UINT64_C(1) << 8;
const uint64_t CompositingReasonPositionFixed = UINT64_C(1) << 9;
// Bit 10 is available.
const uint64_t CompositingReasonOverflowScrollingTouch = UINT64_C(1) << 11;
const uint64_t CompositingReasonOverflowScrollingParent = UINT64_C(1) << 12;
const uint64_t CompositingReasonOutOfFlowClipping = UINT64_C(1) << 13;
const uint64_t CompositingReasonVideoOverlay = UINT64_C(1) << 14;
const uint64_t CompositingReasonWillChangeCompositingHint = UINT64_C(1) << 15;
// Bit 16 is available.
const uint64_t CompositingReason3DTransform = UINT64_C(1) << 0;
const uint64_t CompositingReasonVideo = UINT64_C(1) << 1;
const uint64_t CompositingReasonCanvas = UINT64_C(1) << 2;
const uint64_t CompositingReasonPlugin = UINT64_C(1) << 3;
const uint64_t CompositingReasonIFrame = UINT64_C(1) << 4;
const uint64_t CompositingReasonBackfaceVisibilityHidden = UINT64_C(1) << 5;
const uint64_t CompositingReasonActiveAnimation = UINT64_C(1) << 6;
const uint64_t CompositingReasonTransitionProperty = UINT64_C(1) << 7;
const uint64_t CompositingReasonFilters = UINT64_C(1) << 8;
const uint64_t CompositingReasonPositionFixed = UINT64_C(1) << 9;
const uint64_t CompositingReasonOverflowScrollingTouch = UINT64_C(1) << 10;
const uint64_t CompositingReasonOverflowScrollingParent = UINT64_C(1) << 11;
const uint64_t CompositingReasonOutOfFlowClipping = UINT64_C(1) << 12;
const uint64_t CompositingReasonVideoOverlay = UINT64_C(1) << 13;
const uint64_t CompositingReasonWillChangeCompositingHint = UINT64_C(1) << 14;
// Overlap reasons that require knowing what's behind you in paint-order before knowing the answer
const uint64_t CompositingReasonAssumedOverlap = UINT64_C(1) << 17;
const uint64_t CompositingReasonOverlap = UINT64_C(1) << 18;
const uint64_t CompositingReasonNegativeZIndexChildren = UINT64_C(1) << 19;
const uint64_t CompositingReasonNoSquashingTargetFound = UINT64_C(1) << 20;
const uint64_t CompositingReasonAssumedOverlap = UINT64_C(1) << 15;
const uint64_t CompositingReasonOverlap = UINT64_C(1) << 16;
const uint64_t CompositingReasonNegativeZIndexChildren = UINT64_C(1) << 17;
const uint64_t CompositingReasonScrollsWithRespectToSquashingLayer = UINT64_C(1) << 18;
const uint64_t CompositingReasonSquashingSparsityExceeded = UINT64_C(1) << 19;
const uint64_t CompositingReasonSquashingClippingContainerMismatch = UINT64_C(1) << 20;
const uint64_t CompositingReasonSquashingOpacityAncestorMismatch = UINT64_C(1) << 21;
const uint64_t CompositingReasonSquashingTransformAncestorMismatch = UINT64_C(1) << 22;
const uint64_t CompositingReasonSquashingFilterAncestorMismatch = UINT64_C(1) << 23;
const uint64_t CompositingReasonSquashingWouldBreakPaintOrder = UINT64_C(1) << 24;
const uint64_t CompositingReasonSquashingVideoIsDisallowed = UINT64_C(1) << 25;
const uint64_t CompositingReasonSquashedLayerClipsCompositingDescendants = UINT64_C(1) << 26;
// Subtree reasons that require knowing what the status of your subtree is before knowing the answer
const uint64_t CompositingReasonTransformWithCompositedDescendants = UINT64_C(1) << 21;
const uint64_t CompositingReasonOpacityWithCompositedDescendants = UINT64_C(1) << 22;
const uint64_t CompositingReasonMaskWithCompositedDescendants = UINT64_C(1) << 23;
const uint64_t CompositingReasonReflectionWithCompositedDescendants = UINT64_C(1) << 24;
const uint64_t CompositingReasonFilterWithCompositedDescendants = UINT64_C(1) << 25;
const uint64_t CompositingReasonBlendingWithCompositedDescendants = UINT64_C(1) << 26;
const uint64_t CompositingReasonClipsCompositingDescendants = UINT64_C(1) << 27;
const uint64_t CompositingReasonPerspectiveWith3DDescendants = UINT64_C(1) << 28;
const uint64_t CompositingReasonPreserve3DWith3DDescendants = UINT64_C(1) << 29;
const uint64_t CompositingReasonReflectionOfCompositedParent = UINT64_C(1) << 30;
const uint64_t CompositingReasonIsolateCompositedDescendants = UINT64_C(1) << 31;
const uint64_t CompositingReasonTransformWithCompositedDescendants = UINT64_C(1) << 27;
const uint64_t CompositingReasonOpacityWithCompositedDescendants = UINT64_C(1) << 28;
const uint64_t CompositingReasonMaskWithCompositedDescendants = UINT64_C(1) << 29;
const uint64_t CompositingReasonReflectionWithCompositedDescendants = UINT64_C(1) << 30;
const uint64_t CompositingReasonFilterWithCompositedDescendants = UINT64_C(1) << 31;
const uint64_t CompositingReasonBlendingWithCompositedDescendants = UINT64_C(1) << 32;
const uint64_t CompositingReasonClipsCompositingDescendants = UINT64_C(1) << 33;
const uint64_t CompositingReasonPerspectiveWith3DDescendants = UINT64_C(1) << 34;
const uint64_t CompositingReasonPreserve3DWith3DDescendants = UINT64_C(1) << 35;
const uint64_t CompositingReasonReflectionOfCompositedParent = UINT64_C(1) << 36;
const uint64_t CompositingReasonIsolateCompositedDescendants = UINT64_C(1) << 37;
// The root layer is a special case that may be forced to be a layer, but also it needs to be
// a layer if anything else in the subtree is composited.
const uint64_t CompositingReasonRoot = UINT64_C(1) << 32;
const uint64_t CompositingReasonRoot = UINT64_C(1) << 38;
// CompositedLayerMapping internal hierarchy reasons
const uint64_t CompositingReasonLayerForAncestorClip = UINT64_C(1) << 33;
const uint64_t CompositingReasonLayerForDescendantClip = UINT64_C(1) << 34;
const uint64_t CompositingReasonLayerForPerspective = UINT64_C(1) << 35;
const uint64_t CompositingReasonLayerForHorizontalScrollbar = UINT64_C(1) << 36;
const uint64_t CompositingReasonLayerForVerticalScrollbar = UINT64_C(1) << 37;
const uint64_t CompositingReasonLayerForScrollCorner = UINT64_C(1) << 38;
const uint64_t CompositingReasonLayerForScrollingContents = UINT64_C(1) << 39;
const uint64_t CompositingReasonLayerForScrollingContainer = UINT64_C(1) << 40;
const uint64_t CompositingReasonLayerForSquashingContents = UINT64_C(1) << 41;
const uint64_t CompositingReasonLayerForSquashingContainer = UINT64_C(1) << 42;
const uint64_t CompositingReasonLayerForForeground = UINT64_C(1) << 43;
const uint64_t CompositingReasonLayerForBackground = UINT64_C(1) << 44;
const uint64_t CompositingReasonLayerForMask = UINT64_C(1) << 45;
const uint64_t CompositingReasonLayerForClippingMask = UINT64_C(1) << 46;
const uint64_t CompositingReasonLayerForScrollingBlockSelection = UINT64_C(1) << 47;
const uint64_t CompositingReasonLayerForAncestorClip = UINT64_C(1) << 39;
const uint64_t CompositingReasonLayerForDescendantClip = UINT64_C(1) << 40;
const uint64_t CompositingReasonLayerForPerspective = UINT64_C(1) << 41;
const uint64_t CompositingReasonLayerForHorizontalScrollbar = UINT64_C(1) << 42;
const uint64_t CompositingReasonLayerForVerticalScrollbar = UINT64_C(1) << 43;
const uint64_t CompositingReasonLayerForScrollCorner = UINT64_C(1) << 44;
const uint64_t CompositingReasonLayerForScrollingContents = UINT64_C(1) << 45;
const uint64_t CompositingReasonLayerForScrollingContainer = UINT64_C(1) << 46;
const uint64_t CompositingReasonLayerForSquashingContents = UINT64_C(1) << 47;
const uint64_t CompositingReasonLayerForSquashingContainer = UINT64_C(1) << 48;
const uint64_t CompositingReasonLayerForForeground = UINT64_C(1) << 49;
const uint64_t CompositingReasonLayerForBackground = UINT64_C(1) << 50;
const uint64_t CompositingReasonLayerForMask = UINT64_C(1) << 51;
const uint64_t CompositingReasonLayerForClippingMask = UINT64_C(1) << 52;
const uint64_t CompositingReasonLayerForScrollingBlockSelection = UINT64_C(1) << 53;
// Various combinations of compositing reasons are defined here also, for more intutive and faster bitwise logic.
const uint64_t CompositingReasonComboAllDirectReasons =
......@@ -103,7 +109,15 @@ const uint64_t CompositingReasonComboReasonsThatRequireOwnBacking =
| CompositingReasonOverlap
| CompositingReasonAssumedOverlap
| CompositingReasonNegativeZIndexChildren
| CompositingReasonNoSquashingTargetFound
| CompositingReasonScrollsWithRespectToSquashingLayer
| CompositingReasonSquashingSparsityExceeded
| CompositingReasonSquashingClippingContainerMismatch
| CompositingReasonSquashingOpacityAncestorMismatch
| CompositingReasonSquashingTransformAncestorMismatch
| CompositingReasonSquashingFilterAncestorMismatch
| CompositingReasonSquashingWouldBreakPaintOrder
| CompositingReasonSquashingVideoIsDisallowed
| CompositingReasonSquashedLayerClipsCompositingDescendants
| CompositingReasonTransformWithCompositedDescendants
| CompositingReasonOpacityWithCompositedDescendants
| CompositingReasonMaskWithCompositedDescendants
......@@ -199,9 +213,33 @@ static const CompositingReasonStringMap compositingReasonStringMap[] = {
{ CompositingReasonNegativeZIndexChildren,
"negativeZIndexChildren",
"Parent with composited negative z-index content" },
{ CompositingReasonNoSquashingTargetFound,
"noSquashingTargetFound",
"Cannot be squashed due to no compatible squashing owner found" },
{ CompositingReasonScrollsWithRespectToSquashingLayer,
"scrollsWithRespectToSquashingLayer",
"Cannot be squashed since this layer scrolls with respect to the squashing layer" },
{ CompositingReasonSquashingSparsityExceeded,
"squashingSparsityExceeded",
"Cannot be squashed as the squashing layer would become too sparse" },
{ CompositingReasonSquashingClippingContainerMismatch,
"squashingClippingContainerMismatch",
"Cannot be squashed because this layer has a different clipping container than the squashing layer" },
{ CompositingReasonSquashingOpacityAncestorMismatch,
"squashingOpacityAncestorMismatch",
"Cannot be squashed because this layer has a different opacity ancestor than the squashing layer" },
{ CompositingReasonSquashingTransformAncestorMismatch,
"squashingTransformAncestorMismatch",
"Cannot be squashed because this layer has a different transform ancestor than the squashing layer" },
{ CompositingReasonSquashingFilterAncestorMismatch,
"squashingFilterAncestorMismatch",
"Cannot be squashed because this layer has a different filter ancestor than the squashing layer" },
{ CompositingReasonSquashingWouldBreakPaintOrder,
"squashingWouldBreakPaintOrder",
"Cannot be squashed without breaking paint order" },
{ CompositingReasonSquashingVideoIsDisallowed,
"squashingVideoIsDisallowed",
"Squashing video is not supported" },
{ CompositingReasonSquashedLayerClipsCompositingDescendants,
"squashedLayerClipsCompositingDescendants",
"Squashing a layer that clips composited descendants is not supported." },
{ CompositingReasonTransformWithCompositedDescendants,
"transformWithCompositedDescendants",
"Has a transform that needs to be known by compositor because of composited descendants" },
......
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