Index: Source/core/rendering/compositing/RenderLayerCompositor.cpp |
diff --git a/Source/core/rendering/compositing/RenderLayerCompositor.cpp b/Source/core/rendering/compositing/RenderLayerCompositor.cpp |
index 0d7effb3e1639ba474bfc04dcdba459e105c0c0f..810b4176f69c06c22e41f428be8e47cf424fc6a6 100644 |
--- a/Source/core/rendering/compositing/RenderLayerCompositor.cpp |
+++ b/Source/core/rendering/compositing/RenderLayerCompositor.cpp |
@@ -119,19 +119,13 @@ public: |
beginNewOverlapTestingContext(); |
} |
- void add(const RenderLayer* layer, const IntRect& bounds) |
+ void add(const IntRect& bounds) |
{ |
// Layers do not contribute to overlap immediately--instead, they will |
// contribute to overlap as soon as they have been recursively processed |
// and popped off the stack. |
ASSERT(m_overlapStack.size() >= 2); |
m_overlapStack[m_overlapStack.size() - 2].add(bounds); |
- m_layers.add(layer); |
- } |
- |
- bool contains(const RenderLayer* layer) |
- { |
- return m_layers.contains(layer); |
} |
bool overlapsLayers(const IntRect& bounds) const |
@@ -139,11 +133,6 @@ public: |
return m_overlapStack.last().overlapsLayers(bounds); |
} |
- bool isEmpty() |
- { |
- return m_layers.isEmpty(); |
- } |
- |
void beginNewOverlapTestingContext() |
{ |
// This effectively creates a new "clean slate" for overlap state. |
@@ -169,7 +158,6 @@ public: |
private: |
Vector<OverlapMapContainer> m_overlapStack; |
- HashSet<const RenderLayer*> m_layers; |
RenderGeometryMap m_geometryMap; |
}; |
@@ -455,7 +443,8 @@ void RenderLayerCompositor::updateCompositingLayersInternal() |
// should be removed as soon as proper overlap testing based on |
// scrolling and animation bounds is implemented (crbug.com/252472). |
Vector<RenderLayer*> unclippedDescendants; |
- computeCompositingRequirements(0, updateRoot, overlapMap, recursionData, saw3DTransform, unclippedDescendants); |
+ IntRect absoluteDecendantBoundingBox; |
+ computeCompositingRequirements(0, updateRoot, overlapMap, recursionData, saw3DTransform, unclippedDescendants, absoluteDecendantBoundingBox); |
} |
{ |
@@ -866,49 +855,14 @@ RenderLayer* RenderLayerCompositor::enclosingNonStackingClippingLayer(const Rend |
return 0; |
} |
-void RenderLayerCompositor::addToOverlapMap(OverlapMap& overlapMap, RenderLayer* layer, IntRect& layerBounds, bool& boundsComputed) |
+void RenderLayerCompositor::addToOverlapMap(OverlapMap& overlapMap, RenderLayer* layer, IntRect& layerBounds) |
{ |
if (layer->isRootLayer()) |
return; |
- if (!boundsComputed) { |
- // FIXME: If this layer's overlap bounds include its children, we don't need to add its |
- // children's bounds to the overlap map. |
- layerBounds = enclosingIntRect(overlapMap.geometryMap().absoluteRect(layer->overlapBounds())); |
- // Empty rects never intersect, but we need them to for the purposes of overlap testing. |
- if (layerBounds.isEmpty()) |
- layerBounds.setSize(IntSize(1, 1)); |
- boundsComputed = true; |
- } |
- |
IntRect clipRect = pixelSnappedIntRect(layer->clipper().backgroundClipRect(ClipRectsContext(rootRenderLayer(), AbsoluteClipRects)).rect()); |
clipRect.intersect(layerBounds); |
- overlapMap.add(layer, clipRect); |
-} |
- |
-void RenderLayerCompositor::addToOverlapMapRecursive(OverlapMap& overlapMap, RenderLayer* layer, RenderLayer* ancestorLayer) |
-{ |
- if (!canBeComposited(layer) || overlapMap.contains(layer)) |
- return; |
- |
- // A null ancestorLayer is an indication that 'layer' has already been pushed. |
- if (ancestorLayer) |
- overlapMap.geometryMap().pushMappingsToAncestor(layer, ancestorLayer); |
- |
- IntRect bounds; |
- bool haveComputedBounds = false; |
- addToOverlapMap(overlapMap, layer, bounds, haveComputedBounds); |
- |
-#if !ASSERT_DISABLED |
- LayerListMutationDetector mutationChecker(layer->stackingNode()); |
-#endif |
- |
- RenderLayerStackingNodeIterator iterator(*layer->stackingNode(), AllChildren); |
- while (RenderLayerStackingNode* curNode = iterator.next()) |
- addToOverlapMapRecursive(overlapMap, curNode->layer(), layer); |
- |
- if (ancestorLayer) |
- overlapMap.geometryMap().popMappingsToAncestor(ancestorLayer); |
+ overlapMap.add(clipRect); |
} |
// Recurse through the layers in z-index and overflow order (which is equivalent to painting order) |
@@ -920,7 +874,7 @@ void RenderLayerCompositor::addToOverlapMapRecursive(OverlapMap& overlapMap, Ren |
// must be compositing so that its contents render over that child. |
// This implies that its positive z-index children must also be compositing. |
// |
-void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestorLayer, RenderLayer* layer, OverlapMap* overlapMap, CompositingRecursionData& currentRecursionData, bool& descendantHas3DTransform, Vector<RenderLayer*>& unclippedDescendants) |
+void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestorLayer, RenderLayer* layer, OverlapMap* overlapMap, CompositingRecursionData& currentRecursionData, bool& descendantHas3DTransform, Vector<RenderLayer*>& unclippedDescendants, IntRect& absoluteDecendantBoundingBox) |
{ |
layer->stackingNode()->updateLayerListsIfNeeded(); |
@@ -977,19 +931,19 @@ void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestor |
unclippedDescendants.append(layer); |
} |
- bool haveComputedBounds = false; |
IntRect absBounds; |
- // If we know for sure the layer is going to be composited, don't bother looking it up in the overlap map. |
- if (overlapMap && !overlapMap->isEmpty() && currentRecursionData.m_testingOverlap && !requiresCompositingOrSquashing(directReasons)) { |
- // If we're testing for overlap, we only need to composite if we overlap something that is already composited. |
+ if (overlapMap && !layer->isRootLayer()) { |
absBounds = enclosingIntRect(overlapMap->geometryMap().absoluteRect(layer->overlapBounds())); |
- |
- // Empty rects never intersect, but we need them to for the purposes of overlap testing. |
+ // Setting the absBounds to 1x1 instead of 0x0 makes very little sense, |
+ // but removing this code will make JSGameBench sad. |
+ // See https://codereview.chromium.org/13912020/ |
if (absBounds.isEmpty()) |
absBounds.setSize(IntSize(1, 1)); |
- haveComputedBounds = true; |
- overlapCompositingReason = overlapMap->overlapsLayers(absBounds) ? CompositingReasonOverlap : CompositingReasonNone; |
} |
+ absoluteDecendantBoundingBox = absBounds; |
+ |
+ if (overlapMap && currentRecursionData.m_testingOverlap && !requiresCompositingOrSquashing(directReasons)) |
+ overlapCompositingReason = overlapMap->overlapsLayers(absBounds) ? CompositingReasonOverlap : CompositingReasonNone; |
reasonsToComposite |= overlapCompositingReason; |
@@ -1035,7 +989,9 @@ void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestor |
if (layer->stackingNode()->isStackingContainer()) { |
RenderLayerStackingNodeIterator iterator(*layer->stackingNode(), NegativeZOrderChildren); |
while (RenderLayerStackingNode* curNode = iterator.next()) { |
- computeCompositingRequirements(layer, curNode->layer(), overlapMap, childRecursionData, anyDescendantHas3DTransform, unclippedDescendants); |
+ IntRect absoluteChildDecendantBoundingBox; |
+ computeCompositingRequirements(layer, curNode->layer(), overlapMap, childRecursionData, anyDescendantHas3DTransform, unclippedDescendants, absoluteChildDecendantBoundingBox); |
+ absoluteDecendantBoundingBox.unite(absoluteChildDecendantBoundingBox); |
// If we have to make a layer for this child, make one now so we can have a contents layer |
// (since we need to ensure that the -ve z-order child renders underneath our contents). |
@@ -1056,9 +1012,8 @@ void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestor |
if (overlapMap) { |
overlapMap->geometryMap().pushMappingsToAncestor(curNode->layer(), layer); |
IntRect childAbsBounds = enclosingIntRect(overlapMap->geometryMap().absoluteRect(curNode->layer()->overlapBounds())); |
- bool boundsComputed = true; |
overlapMap->beginNewOverlapTestingContext(); |
- addToOverlapMap(*overlapMap, curNode->layer(), childAbsBounds, boundsComputed); |
+ addToOverlapMap(*overlapMap, curNode->layer(), childAbsBounds); |
overlapMap->finishCurrentOverlapTestingContext(); |
overlapMap->geometryMap().popMappingsToAncestor(layer); |
} |
@@ -1086,8 +1041,11 @@ void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestor |
} |
RenderLayerStackingNodeIterator iterator(*layer->stackingNode(), NormalFlowChildren | PositiveZOrderChildren); |
- while (RenderLayerStackingNode* curNode = iterator.next()) |
- computeCompositingRequirements(layer, curNode->layer(), overlapMap, childRecursionData, anyDescendantHas3DTransform, unclippedDescendants); |
+ while (RenderLayerStackingNode* curNode = iterator.next()) { |
+ IntRect absoluteChildDecendantBoundingBox; |
+ computeCompositingRequirements(layer, curNode->layer(), overlapMap, childRecursionData, anyDescendantHas3DTransform, unclippedDescendants, absoluteChildDecendantBoundingBox); |
+ absoluteDecendantBoundingBox.unite(absoluteChildDecendantBoundingBox); |
+ } |
currentRecursionData.m_mostRecentCompositedLayer = childRecursionData.m_mostRecentCompositedLayer; |
@@ -1103,7 +1061,7 @@ void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestor |
// the overlap map. Layers that are not separately composited will paint into their |
// compositing ancestor's backing, and so are still considered for overlap. |
if (overlapMap && childRecursionData.m_compositingAncestor && !childRecursionData.m_compositingAncestor->isRootLayer()) |
- addToOverlapMap(*overlapMap, layer, absBounds, haveComputedBounds); |
+ addToOverlapMap(*overlapMap, layer, absBounds); |
if (layer->stackingNode()->isStackingContext()) { |
layer->setShouldIsolateCompositedDescendants(childRecursionData.m_hasUnisolatedCompositedBlendingDescendant); |
@@ -1122,7 +1080,7 @@ void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestor |
// now, because the code is designed to push overlap information to the |
// second-from-top context of the stack. |
overlapMap->beginNewOverlapTestingContext(); |
- addToOverlapMapRecursive(*overlapMap, layer); |
+ addToOverlapMap(*overlapMap, layer, absoluteDecendantBoundingBox); |
} |
willBeCompositedOrSquashed = true; |
} |