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