| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2009, 2010 Apple Inc. All rights reserved. | 2 * Copyright (C) 2009, 2010 Apple Inc. All rights reserved. |
| 3 * Copyright (C) 2014 Google Inc. All rights reserved. | 3 * Copyright (C) 2014 Google Inc. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 // We can't compute at this time whether the squashing layer update
is a no-op, | 105 // We can't compute at this time whether the squashing layer update
is a no-op, |
| 106 // since that requires walking the paint layer tree. | 106 // since that requires walking the paint layer tree. |
| 107 update = PutInSquashingLayer; | 107 update = PutInSquashingLayer; |
| 108 } else if (layer->groupedMapping() || layer->lostGroupedMapping()) { | 108 } else if (layer->groupedMapping() || layer->lostGroupedMapping()) { |
| 109 update = RemoveFromSquashingLayer; | 109 update = RemoveFromSquashingLayer; |
| 110 } | 110 } |
| 111 } | 111 } |
| 112 return update; | 112 return update; |
| 113 } | 113 } |
| 114 | 114 |
| 115 CompositingReasons CompositingLayerAssigner::getReasonsPreventingSquashing(const
PaintLayer* layer, const CompositingLayerAssigner::SquashingState& squashingSta
te) | 115 SquashingDisallowedReasons CompositingLayerAssigner::getReasonsPreventingSquashi
ng(const PaintLayer* layer, const CompositingLayerAssigner::SquashingState& squa
shingState) |
| 116 { | 116 { |
| 117 if (!squashingState.haveAssignedBackingsToEntireSquashingLayerSubtree) | 117 if (!squashingState.haveAssignedBackingsToEntireSquashingLayerSubtree) |
| 118 return CompositingReasonSquashingWouldBreakPaintOrder; | 118 return SquashingDisallowedReasonWouldBreakPaintOrder; |
| 119 | 119 |
| 120 ASSERT(squashingState.hasMostRecentMapping); | 120 ASSERT(squashingState.hasMostRecentMapping); |
| 121 const PaintLayer& squashingLayer = squashingState.mostRecentMapping->owningL
ayer(); | 121 const PaintLayer& squashingLayer = squashingState.mostRecentMapping->owningL
ayer(); |
| 122 | 122 |
| 123 // FIXME: this special case for video exists only to deal with corner cases | 123 // FIXME: this special case for video exists only to deal with corner cases |
| 124 // where a LayoutVideo does not report that it needs to be directly composit
ed. | 124 // where a LayoutVideo does not report that it needs to be directly composit
ed. |
| 125 // Video does not currently support sharing a backing, but this could be | 125 // Video does not currently support sharing a backing, but this could be |
| 126 // generalized in the future. The following layout tests fail if we permit t
he | 126 // generalized in the future. The following layout tests fail if we permit t
he |
| 127 // video to share a backing with other layers. | 127 // video to share a backing with other layers. |
| 128 // | 128 // |
| 129 // compositing/video/video-controls-layer-creation.html | 129 // compositing/video/video-controls-layer-creation.html |
| 130 if (layer->layoutObject()->isVideo() || squashingLayer.layoutObject()->isVid
eo()) | 130 if (layer->layoutObject()->isVideo() || squashingLayer.layoutObject()->isVid
eo()) |
| 131 return CompositingReasonSquashingVideoIsDisallowed; | 131 return SquashingDisallowedReasonSquashingVideoIsDisallowed; |
| 132 | 132 |
| 133 // Don't squash iframes, frames or plugins. | 133 // Don't squash iframes, frames or plugins. |
| 134 // FIXME: this is only necessary because there is frame code that assumes th
at composited frames are not squashed. | 134 // FIXME: this is only necessary because there is frame code that assumes th
at composited frames are not squashed. |
| 135 if (layer->layoutObject()->isLayoutPart() || squashingLayer.layoutObject()->
isLayoutPart()) | 135 if (layer->layoutObject()->isLayoutPart() || squashingLayer.layoutObject()->
isLayoutPart()) |
| 136 return CompositingReasonSquashingLayoutPartIsDisallowed; | 136 return SquashingDisallowedReasonSquashingLayoutPartIsDisallowed; |
| 137 | 137 |
| 138 if (layer->reflectionInfo()) | 138 if (layer->reflectionInfo()) |
| 139 return CompositingReasonSquashingReflectionIsDisallowed; | 139 return SquashingDisallowedReasonSquashingReflectionIsDisallowed; |
| 140 | 140 |
| 141 if (squashingWouldExceedSparsityTolerance(layer, squashingState)) | 141 if (squashingWouldExceedSparsityTolerance(layer, squashingState)) |
| 142 return CompositingReasonSquashingSparsityExceeded; | 142 return SquashingDisallowedReasonSquashingSparsityExceeded; |
| 143 | 143 |
| 144 if (layer->layoutObject()->style()->hasBlendMode() || squashingLayer.layoutO
bject()->style()->hasBlendMode()) | 144 if (layer->layoutObject()->style()->hasBlendMode() || squashingLayer.layoutO
bject()->style()->hasBlendMode()) |
| 145 return CompositingReasonSquashingBlendingIsDisallowed; | 145 return SquashingDisallowedReasonSquashingBlendingIsDisallowed; |
| 146 | 146 |
| 147 // FIXME: this is not efficient, since it walks up the tree. We should store
these values on the CompositingInputsCache. | 147 // FIXME: this is not efficient, since it walks up the tree. We should store
these values on the CompositingInputsCache. |
| 148 if (layer->clippingContainer() != squashingLayer.clippingContainer() && !squ
ashingLayer.compositedLayerMapping()->containingSquashedLayer(layer->clippingCon
tainer(), squashingState.nextSquashedLayerIndex)) | 148 if (layer->clippingContainer() != squashingLayer.clippingContainer() && !squ
ashingLayer.compositedLayerMapping()->containingSquashedLayer(layer->clippingCon
tainer(), squashingState.nextSquashedLayerIndex)) |
| 149 return CompositingReasonSquashingClippingContainerMismatch; | 149 return SquashingDisallowedReasonClippingContainerMismatch; |
| 150 | 150 |
| 151 // Composited descendants need to be clipped by a child containment graphics
layer, which would not be available if the layer is | 151 // Composited descendants need to be clipped by a child containment graphics
layer, which would not be available if the layer is |
| 152 // squashed (and therefore has no CLM nor a child containment graphics layer
). | 152 // squashed (and therefore has no CLM nor a child containment graphics layer
). |
| 153 if (m_compositor->clipsCompositingDescendants(layer)) | 153 if (m_compositor->clipsCompositingDescendants(layer)) |
| 154 return CompositingReasonSquashedLayerClipsCompositingDescendants; | 154 return SquashingDisallowedReasonSquashedLayerClipsCompositingDescendants
; |
| 155 | 155 |
| 156 if (layer->scrollsWithRespectTo(&squashingLayer)) | 156 if (layer->scrollsWithRespectTo(&squashingLayer)) |
| 157 return CompositingReasonScrollsWithRespectToSquashingLayer; | 157 return SquashingDisallowedReasonScrollsWithRespectToSquashingLayer; |
| 158 | 158 |
| 159 if (layer->scrollParent() && layer->hasCompositingDescendant()) | 159 if (layer->scrollParent() && layer->hasCompositingDescendant()) |
| 160 return CompositingReasonScrollChildWithCompositedDescendants; | 160 return SquashingDisallowedReasonScrollChildWithCompositedDescendants; |
| 161 | 161 |
| 162 if (layer->opacityAncestor() != squashingLayer.opacityAncestor()) | 162 if (layer->opacityAncestor() != squashingLayer.opacityAncestor()) |
| 163 return CompositingReasonSquashingOpacityAncestorMismatch; | 163 return SquashingDisallowedReasonOpacityAncestorMismatch; |
| 164 | 164 |
| 165 if (layer->transformAncestor() != squashingLayer.transformAncestor()) | 165 if (layer->transformAncestor() != squashingLayer.transformAncestor()) |
| 166 return CompositingReasonSquashingTransformAncestorMismatch; | 166 return SquashingDisallowedReasonTransformAncestorMismatch; |
| 167 | 167 |
| 168 if (layer->hasFilter() || layer->filterAncestor() != squashingLayer.filterAn
cestor()) | 168 if (layer->hasFilter() || layer->filterAncestor() != squashingLayer.filterAn
cestor()) |
| 169 return CompositingReasonSquashingFilterMismatch; | 169 return SquashingDisallowedReasonFilterMismatch; |
| 170 | 170 |
| 171 if (layer->nearestFixedPositionLayer() != squashingLayer.nearestFixedPositio
nLayer()) | 171 if (layer->nearestFixedPositionLayer() != squashingLayer.nearestFixedPositio
nLayer()) |
| 172 return CompositingReasonSquashingNearestFixedPositionMismatch; | 172 return SquashingDisallowedReasonNearestFixedPositionMismatch; |
| 173 ASSERT(layer->layoutObject()->style()->position() != FixedPosition); | 173 ASSERT(layer->layoutObject()->style()->position() != FixedPosition); |
| 174 | 174 |
| 175 if ((squashingLayer.layoutObject()->style()->subtreeWillChangeContents() &&
squashingLayer.layoutObject()->style()->isRunningAnimationOnCompositor()) | 175 if ((squashingLayer.layoutObject()->style()->subtreeWillChangeContents() &&
squashingLayer.layoutObject()->style()->isRunningAnimationOnCompositor()) |
| 176 || squashingLayer.layoutObject()->style()->shouldCompositeForCurrentAnim
ations()) | 176 || squashingLayer.layoutObject()->style()->shouldCompositeForCurrentAnim
ations()) |
| 177 return CompositingReasonSquashingLayerIsAnimating; | 177 return SquashingDisallowedReasonSquashingLayerIsAnimating; |
| 178 | 178 |
| 179 return CompositingReasonNone; | 179 return SquashingDisallowedReasonsNone; |
| 180 } | 180 } |
| 181 | 181 |
| 182 void CompositingLayerAssigner::updateSquashingAssignment(PaintLayer* layer, Squa
shingState& squashingState, const CompositingStateTransitionType compositedLayer
Update, | 182 void CompositingLayerAssigner::updateSquashingAssignment(PaintLayer* layer, Squa
shingState& squashingState, const CompositingStateTransitionType compositedLayer
Update, |
| 183 Vector<PaintLayer*>& layersNeedingPaintInvalidation) | 183 Vector<PaintLayer*>& layersNeedingPaintInvalidation) |
| 184 { | 184 { |
| 185 // NOTE: In the future as we generalize this, the background of this layer m
ay need to be assigned to a different backing than | 185 // NOTE: In the future as we generalize this, the background of this layer m
ay need to be assigned to a different backing than |
| 186 // the squashed PaintLayer's own primary contents. This would happen when we
have a composited negative z-index element that needs | 186 // the squashed PaintLayer's own primary contents. This would happen when we
have a composited negative z-index element that needs |
| 187 // to paint on top of the background, but below the layer's main contents. F
or now, because we always composite layers | 187 // to paint on top of the background, but below the layer's main contents. F
or now, because we always composite layers |
| 188 // when they have a composited negative z-index child, such layers will neve
r need squashing so it is not yet an issue. | 188 // when they have a composited negative z-index child, such layers will neve
r need squashing so it is not yet an issue. |
| 189 if (compositedLayerUpdate == PutInSquashingLayer) { | 189 if (compositedLayerUpdate == PutInSquashingLayer) { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 241 | 241 |
| 242 static ScrollingCoordinator* scrollingCoordinatorFromLayer(PaintLayer& layer) | 242 static ScrollingCoordinator* scrollingCoordinatorFromLayer(PaintLayer& layer) |
| 243 { | 243 { |
| 244 Page* page = layer.layoutObject()->frame()->page(); | 244 Page* page = layer.layoutObject()->frame()->page(); |
| 245 return (!page) ? nullptr : page->scrollingCoordinator(); | 245 return (!page) ? nullptr : page->scrollingCoordinator(); |
| 246 } | 246 } |
| 247 | 247 |
| 248 void CompositingLayerAssigner::assignLayersToBackingsInternal(PaintLayer* layer,
SquashingState& squashingState, Vector<PaintLayer*>& layersNeedingPaintInvalida
tion) | 248 void CompositingLayerAssigner::assignLayersToBackingsInternal(PaintLayer* layer,
SquashingState& squashingState, Vector<PaintLayer*>& layersNeedingPaintInvalida
tion) |
| 249 { | 249 { |
| 250 if (requiresSquashing(layer->compositingReasons())) { | 250 if (requiresSquashing(layer->compositingReasons())) { |
| 251 CompositingReasons reasonsPreventingSquashing = getReasonsPreventingSqua
shing(layer, squashingState); | 251 SquashingDisallowedReasons reasonsPreventingSquashing = getReasonsPreven
tingSquashing(layer, squashingState); |
| 252 if (reasonsPreventingSquashing) | 252 if (reasonsPreventingSquashing) { |
| 253 layer->setCompositingReasons(layer->compositingReasons() | reasonsPr
eventingSquashing); | 253 layer->setCompositingReasons(layer->compositingReasons() | Compositi
ngReasonSquashingDisallowed); |
| 254 layer->setSquashingDisallowedReasons(reasonsPreventingSquashing); |
| 255 } |
| 254 } | 256 } |
| 255 | 257 |
| 256 CompositingStateTransitionType compositedLayerUpdate = computeCompositedLaye
rUpdate(layer); | 258 CompositingStateTransitionType compositedLayerUpdate = computeCompositedLaye
rUpdate(layer); |
| 257 | 259 |
| 258 if (m_compositor->allocateOrClearCompositedLayerMapping(layer, compositedLay
erUpdate)) { | 260 if (m_compositor->allocateOrClearCompositedLayerMapping(layer, compositedLay
erUpdate)) { |
| 259 TRACE_LAYER_INVALIDATION(layer, InspectorLayerInvalidationTrackingEvent:
:NewCompositedLayer); | 261 TRACE_LAYER_INVALIDATION(layer, InspectorLayerInvalidationTrackingEvent:
:NewCompositedLayer); |
| 260 layersNeedingPaintInvalidation.append(layer); | 262 layersNeedingPaintInvalidation.append(layer); |
| 261 m_layersChanged = true; | 263 m_layersChanged = true; |
| 262 if (ScrollingCoordinator* scrollingCoordinator = scrollingCoordinatorFro
mLayer(*layer)) { | 264 if (ScrollingCoordinator* scrollingCoordinator = scrollingCoordinatorFro
mLayer(*layer)) { |
| 263 if (layer->layoutObject()->style()->hasViewportConstrainedPosition()
) | 265 if (layer->layoutObject()->style()->hasViewportConstrainedPosition()
) |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 | 302 |
| 301 PaintLayerStackingNodeIterator iterator(*layer->stackingNode(), NormalFlowCh
ildren | PositiveZOrderChildren); | 303 PaintLayerStackingNodeIterator iterator(*layer->stackingNode(), NormalFlowCh
ildren | PositiveZOrderChildren); |
| 302 while (PaintLayerStackingNode* curNode = iterator.next()) | 304 while (PaintLayerStackingNode* curNode = iterator.next()) |
| 303 assignLayersToBackingsInternal(curNode->layer(), squashingState, layersN
eedingPaintInvalidation); | 305 assignLayersToBackingsInternal(curNode->layer(), squashingState, layersN
eedingPaintInvalidation); |
| 304 | 306 |
| 305 if (squashingState.hasMostRecentMapping && &squashingState.mostRecentMapping
->owningLayer() == layer) | 307 if (squashingState.hasMostRecentMapping && &squashingState.mostRecentMapping
->owningLayer() == layer) |
| 306 squashingState.haveAssignedBackingsToEntireSquashingLayerSubtree = true; | 308 squashingState.haveAssignedBackingsToEntireSquashingLayerSubtree = true; |
| 307 } | 309 } |
| 308 | 310 |
| 309 } // namespace blink | 311 } // namespace blink |
| OLD | NEW |