1323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)/* 2323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * Copyright (C) 2009, 2010 Apple Inc. All rights reserved. 3323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * Copyright (C) 2014 Google Inc. All rights reserved. 4323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * 5323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without 6323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * modification, are permitted provided that the following conditions 7323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * are met: 8323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 9323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * notice, this list of conditions and the following disclaimer. 10323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 11323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 12323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * documentation and/or other materials provided with the distribution. 13323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * 14323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 15323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 18323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 21323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 22323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) */ 26323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 27323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#include "config.h" 28323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#include "core/rendering/compositing/CompositingLayerAssigner.h" 29323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/inspector/InspectorTraceEvents.h" 31323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#include "core/rendering/compositing/CompositedLayerMapping.h" 32197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "platform/TraceEvent.h" 33323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 34c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 35323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 36323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)// We will only allow squashing if the bbox-area:squashed-area doesn't exceed 37323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)// the ratio |gSquashingSparsityTolerance|:1. 38323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)static uint64_t gSquashingSparsityTolerance = 6; 39323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 40323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)CompositingLayerAssigner::CompositingLayerAssigner(RenderLayerCompositor* compositor) 41323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) : m_compositor(compositor) 42323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) , m_layerSquashingEnabled(compositor->layerSquashingEnabled()) 43197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch , m_layersChanged(false) 44323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 45323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 46323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 47323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)CompositingLayerAssigner::~CompositingLayerAssigner() 48323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 49323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 50323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 51e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void CompositingLayerAssigner::assign(RenderLayer* updateRoot, Vector<RenderLayer*>& layersNeedingPaintInvalidation) 52323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 53e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) TRACE_EVENT0("blink", "CompositingLayerAssigner::assign"); 54197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 55323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) SquashingState squashingState; 56e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) assignLayersToBackingsInternal(updateRoot, squashingState, layersNeedingPaintInvalidation); 57323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (squashingState.hasMostRecentMapping) 58323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) squashingState.mostRecentMapping->finishAccumulatingSquashingLayers(squashingState.nextSquashedLayerIndex); 59323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 60323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 61e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void CompositingLayerAssigner::SquashingState::updateSquashingStateForNewMapping(CompositedLayerMapping* newCompositedLayerMapping, bool hasNewCompositedLayerMapping) 62323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 63323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // The most recent backing is done accumulating any more squashing layers. 64323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (hasMostRecentMapping) 65323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) mostRecentMapping->finishAccumulatingSquashingLayers(nextSquashedLayerIndex); 66323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 67323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) nextSquashedLayerIndex = 0; 68d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) boundingRect = IntRect(); 69323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) mostRecentMapping = newCompositedLayerMapping; 70323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) hasMostRecentMapping = hasNewCompositedLayerMapping; 71d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) haveAssignedBackingsToEntireSquashingLayerSubtree = false; 72323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 73323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 74323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)bool CompositingLayerAssigner::squashingWouldExceedSparsityTolerance(const RenderLayer* candidate, const CompositingLayerAssigner::SquashingState& squashingState) 75323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 76197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch IntRect bounds = candidate->clippedAbsoluteBoundingBox(); 77323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) IntRect newBoundingRect = squashingState.boundingRect; 78323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) newBoundingRect.unite(bounds); 79323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) const uint64_t newBoundingRectArea = newBoundingRect.size().area(); 80323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) const uint64_t newSquashedArea = squashingState.totalAreaOfSquashedRects + bounds.size().area(); 81323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) return newBoundingRectArea > gSquashingSparsityTolerance * newSquashedArea; 82323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 83323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 84323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)bool CompositingLayerAssigner::needsOwnBacking(const RenderLayer* layer) const 85323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 86323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (!m_compositor->canBeComposited(layer)) 87323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) return false; 88323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 89323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // If squashing is disabled, then layers that would have been squashed should just be separately composited. 90323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) bool needsOwnBackingForDisabledSquashing = !m_layerSquashingEnabled && requiresSquashing(layer->compositingReasons()); 91323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 92323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) return requiresCompositing(layer->compositingReasons()) || needsOwnBackingForDisabledSquashing || (m_compositor->staleInCompositingMode() && layer->isRootLayer()); 93323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 94323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 95323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)CompositingStateTransitionType CompositingLayerAssigner::computeCompositedLayerUpdate(RenderLayer* layer) 96323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 97323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) CompositingStateTransitionType update = NoCompositingStateChange; 98d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (needsOwnBacking(layer)) { 99323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (!layer->hasCompositedLayerMapping()) { 100323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) update = AllocateOwnCompositedLayerMapping; 101323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } 102323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } else { 103323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (layer->hasCompositedLayerMapping()) 104323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) update = RemoveOwnCompositedLayerMapping; 105323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 106323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (m_layerSquashingEnabled) { 107323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (!layer->subtreeIsInvisible() && requiresSquashing(layer->compositingReasons())) { 108323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // We can't compute at this time whether the squashing layer update is a no-op, 109323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // since that requires walking the render layer tree. 110323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) update = PutInSquashingLayer; 111323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } else if (layer->groupedMapping() || layer->lostGroupedMapping()) { 112323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) update = RemoveFromSquashingLayer; 113323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } 114323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } 115323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } 116323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) return update; 117323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 118323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 1195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)CompositingReasons CompositingLayerAssigner::getReasonsPreventingSquashing(const RenderLayer* layer, const CompositingLayerAssigner::SquashingState& squashingState) 120323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 121d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (!squashingState.haveAssignedBackingsToEntireSquashingLayerSubtree) 1225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return CompositingReasonSquashingWouldBreakPaintOrder; 123d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 1247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(squashingState.hasMostRecentMapping); 1257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const RenderLayer& squashingLayer = squashingState.mostRecentMapping->owningLayer(); 1267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 127323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // FIXME: this special case for video exists only to deal with corner cases 128323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // where a RenderVideo does not report that it needs to be directly composited. 129323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // Video does not currently support sharing a backing, but this could be 130323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // generalized in the future. The following layout tests fail if we permit the 131323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // video to share a backing with other layers. 132323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // 133323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // compositing/video/video-controls-layer-creation.html 1347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (layer->renderer()->isVideo() || squashingLayer.renderer()->isVideo()) 1355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return CompositingReasonSquashingVideoIsDisallowed; 136323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 137197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // Don't squash iframes, frames or plugins. 138197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // FIXME: this is only necessary because there is frame code that assumes that composited frames are not squashed. 1397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (layer->renderer()->isRenderPart() || squashingLayer.renderer()->isRenderPart()) 140197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return CompositingReasonSquashingRenderPartIsDisallowed; 141197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 142197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (layer->reflectionInfo()) 143197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return CompositingReasonSquashingReflectionIsDisallowed; 144197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 145323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (squashingWouldExceedSparsityTolerance(layer, squashingState)) 1465d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return CompositingReasonSquashingSparsityExceeded; 147323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 1487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (layer->renderer()->hasBlendMode()) 1497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return CompositingReasonSquashingBlendingIsDisallowed; 150323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 1517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // FIXME: this is not efficient, since it walks up the tree. We should store these values on the CompositingInputsCache. 1522fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles) if (layer->clippingContainer() != squashingLayer.clippingContainer() && !squashingLayer.compositedLayerMapping()->containingSquashedLayer(layer->clippingContainer(), squashingState.nextSquashedLayerIndex)) 153197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return CompositingReasonSquashingClippingContainerMismatch; 154323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 1555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // Composited descendants need to be clipped by a child containment graphics layer, which would not be available if the layer is 1565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // squashed (and therefore has no CLM nor a child containment graphics layer). 157323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (m_compositor->clipsCompositingDescendants(layer)) 1585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return CompositingReasonSquashedLayerClipsCompositingDescendants; 159323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 160323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (layer->scrollsWithRespectTo(&squashingLayer)) 1615d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return CompositingReasonScrollsWithRespectToSquashingLayer; 162323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 163197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch const RenderLayer::AncestorDependentCompositingInputs& compositingInputs = layer->ancestorDependentCompositingInputs(); 164197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch const RenderLayer::AncestorDependentCompositingInputs& squashingLayerCompositingInputs = squashingLayer.ancestorDependentCompositingInputs(); 165323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 1665d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (compositingInputs.opacityAncestor != squashingLayerCompositingInputs.opacityAncestor) 1675d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return CompositingReasonSquashingOpacityAncestorMismatch; 168323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 1695d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (compositingInputs.transformAncestor != squashingLayerCompositingInputs.transformAncestor) 1705d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return CompositingReasonSquashingTransformAncestorMismatch; 171323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 1727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (layer->hasFilter() || compositingInputs.filterAncestor != squashingLayerCompositingInputs.filterAncestor) 1737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return CompositingReasonSquashingFilterMismatch; 174323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 1755d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return CompositingReasonNone; 176323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 177323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 178197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid CompositingLayerAssigner::updateSquashingAssignment(RenderLayer* layer, SquashingState& squashingState, const CompositingStateTransitionType compositedLayerUpdate, 179e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) Vector<RenderLayer*>& layersNeedingPaintInvalidation) 180323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 181323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // NOTE: In the future as we generalize this, the background of this layer may need to be assigned to a different backing than 182323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // the squashed RenderLayer's own primary contents. This would happen when we have a composited negative z-index element that needs 183323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // to paint on top of the background, but below the layer's main contents. For now, because we always composite layers 184323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // when they have a composited negative z-index child, such layers will never need squashing so it is not yet an issue. 185323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (compositedLayerUpdate == PutInSquashingLayer) { 186323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // A layer that is squashed with other layers cannot have its own CompositedLayerMapping. 187323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) ASSERT(!layer->hasCompositedLayerMapping()); 188323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) ASSERT(squashingState.hasMostRecentMapping); 189323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 190323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) bool changedSquashingLayer = 191d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) squashingState.mostRecentMapping->updateSquashingLayerAssignment(layer, squashingState.mostRecentMapping->owningLayer(), squashingState.nextSquashedLayerIndex); 192323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (!changedSquashingLayer) 193197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return; 194323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 195323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // If we've modified the collection of squashed layers, we must update 196323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // the graphics layer geometry. 19776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) squashingState.mostRecentMapping->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateSubtree); 198323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 199323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) layer->clipper().clearClipRectsIncludingDescendants(); 200323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 201e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) // Issue a paint invalidation, since |layer| may have been added to an already-existing squashing layer. 2027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci TRACE_LAYER_INVALIDATION(layer, InspectorLayerInvalidationTrackingEvent::AddedToSquashingLayer); 203e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) layersNeedingPaintInvalidation.append(layer); 204197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_layersChanged = true; 205197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } else if (compositedLayerUpdate == RemoveFromSquashingLayer) { 206323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (layer->groupedMapping()) { 207e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) // Before removing |layer| from an already-existing squashing layer that may have other content, issue a paint invalidation. 208e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) m_compositor->paintInvalidationOnCompositingChange(layer); 20976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) layer->groupedMapping()->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateSubtree); 210323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) layer->setGroupedMapping(0); 211323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } 212323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 213e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) // If we need to issue paint invalidations, do so now that we've removed it from a squashed layer. 2147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci TRACE_LAYER_INVALIDATION(layer, InspectorLayerInvalidationTrackingEvent::RemovedFromSquashingLayer); 215e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) layersNeedingPaintInvalidation.append(layer); 216197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_layersChanged = true; 217323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 218323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) layer->setLostGroupedMapping(false); 219323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } 220323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 221323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 222e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void CompositingLayerAssigner::assignLayersToBackingsForReflectionLayer(RenderLayer* reflectionLayer, Vector<RenderLayer*>& layersNeedingPaintInvalidation) 223323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 224323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) CompositingStateTransitionType compositedLayerUpdate = computeCompositedLayerUpdate(reflectionLayer); 225323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (compositedLayerUpdate != NoCompositingStateChange) { 2267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci TRACE_LAYER_INVALIDATION(reflectionLayer, InspectorLayerInvalidationTrackingEvent::ReflectionLayerChanged); 227e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) layersNeedingPaintInvalidation.append(reflectionLayer); 228197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_layersChanged = true; 229323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) m_compositor->allocateOrClearCompositedLayerMapping(reflectionLayer, compositedLayerUpdate); 230323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } 231323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) m_compositor->updateDirectCompositingReasons(reflectionLayer); 232197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 233197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // FIXME: Why do we updateGraphicsLayerConfiguration here instead of in the GraphicsLayerUpdater? 234323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (reflectionLayer->hasCompositedLayerMapping()) 235197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch reflectionLayer->compositedLayerMapping()->updateGraphicsLayerConfiguration(); 236323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 237323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 238e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void CompositingLayerAssigner::assignLayersToBackingsInternal(RenderLayer* layer, SquashingState& squashingState, Vector<RenderLayer*>& layersNeedingPaintInvalidation) 239323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 2405d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (m_layerSquashingEnabled && requiresSquashing(layer->compositingReasons())) { 2415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) CompositingReasons reasonsPreventingSquashing = getReasonsPreventingSquashing(layer, squashingState); 2425d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (reasonsPreventingSquashing) 2435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) layer->setCompositingReasons(layer->compositingReasons() | reasonsPreventingSquashing); 2445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 245323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 246323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) CompositingStateTransitionType compositedLayerUpdate = computeCompositedLayerUpdate(layer); 247323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 248f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (m_compositor->allocateOrClearCompositedLayerMapping(layer, compositedLayerUpdate)) { 2497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci TRACE_LAYER_INVALIDATION(layer, InspectorLayerInvalidationTrackingEvent::NewCompositedLayer); 250e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) layersNeedingPaintInvalidation.append(layer); 251197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_layersChanged = true; 252f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) } 253323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 254323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // FIXME: special-casing reflection layers here is not right. 255323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (layer->reflectionInfo()) 256e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) assignLayersToBackingsForReflectionLayer(layer->reflectionInfo()->reflectionLayer(), layersNeedingPaintInvalidation); 257323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 258323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // Add this layer to a squashing backing if needed. 259323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (m_layerSquashingEnabled) { 260e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) updateSquashingAssignment(layer, squashingState, compositedLayerUpdate, layersNeedingPaintInvalidation); 261323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 262323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) const bool layerIsSquashed = compositedLayerUpdate == PutInSquashingLayer || (compositedLayerUpdate == NoCompositingStateChange && layer->groupedMapping()); 263323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (layerIsSquashed) { 264323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) squashingState.nextSquashedLayerIndex++; 265197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch IntRect layerBounds = layer->clippedAbsoluteBoundingBox(); 266323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) squashingState.totalAreaOfSquashedRects += layerBounds.size().area(); 267323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) squashingState.boundingRect.unite(layerBounds); 268323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } 269323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } 270323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 271d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (layer->stackingNode()->isStackingContext()) { 272323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) RenderLayerStackingNodeIterator iterator(*layer->stackingNode(), NegativeZOrderChildren); 273323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) while (RenderLayerStackingNode* curNode = iterator.next()) 274e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) assignLayersToBackingsInternal(curNode->layer(), squashingState, layersNeedingPaintInvalidation); 275323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } 276323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 277323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (m_layerSquashingEnabled) { 278323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // At this point, if the layer is to be "separately" composited, then its backing becomes the most recent in paint-order. 279323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (layer->compositingState() == PaintsIntoOwnBacking || layer->compositingState() == HasOwnBackingButPaintsIntoAncestor) { 280323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) ASSERT(!requiresSquashing(layer->compositingReasons())); 281d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) squashingState.updateSquashingStateForNewMapping(layer->compositedLayerMapping(), layer->hasCompositedLayerMapping()); 282323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } 283323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } 284323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 285197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (layer->scrollParent()) 286197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch layer->scrollParent()->scrollableArea()->setTopmostScrollChild(layer); 287197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 288197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (layer->needsCompositedScrolling()) 289197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch layer->scrollableArea()->setTopmostScrollChild(0); 290197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 291323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) RenderLayerStackingNodeIterator iterator(*layer->stackingNode(), NormalFlowChildren | PositiveZOrderChildren); 292323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) while (RenderLayerStackingNode* curNode = iterator.next()) 293e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) assignLayersToBackingsInternal(curNode->layer(), squashingState, layersNeedingPaintInvalidation); 294d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 295d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (squashingState.hasMostRecentMapping && &squashingState.mostRecentMapping->owningLayer() == layer) 296d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) squashingState.haveAssignedBackingsToEntireSquashingLayerSubtree = true; 297323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 298323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 299323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 300