| Index: Source/core/rendering/compositing/RenderLayerCompositor.cpp
|
| diff --git a/Source/core/rendering/compositing/RenderLayerCompositor.cpp b/Source/core/rendering/compositing/RenderLayerCompositor.cpp
|
| index 0286ae96c52aecff0296a611633638bc19c67cf0..0b4403f6cd5c025d8e163e72e8fc1690f9a2ffcb 100644
|
| --- a/Source/core/rendering/compositing/RenderLayerCompositor.cpp
|
| +++ b/Source/core/rendering/compositing/RenderLayerCompositor.cpp
|
| @@ -51,7 +51,6 @@
|
| #include "core/rendering/RenderApplet.h"
|
| #include "core/rendering/RenderEmbeddedObject.h"
|
| #include "core/rendering/RenderFullScreen.h"
|
| -#include "core/rendering/RenderGeometryMap.h"
|
| #include "core/rendering/RenderIFrame.h"
|
| #include "core/rendering/RenderLayerStackingNode.h"
|
| #include "core/rendering/RenderLayerStackingNodeIterator.h"
|
| @@ -112,7 +111,6 @@ class RenderLayerCompositor::OverlapMap {
|
| WTF_MAKE_NONCOPYABLE(OverlapMap);
|
| public:
|
| OverlapMap()
|
| - : m_geometryMap(UseTransforms)
|
| {
|
| // Begin by assuming the root layer will be composited so that there
|
| // is something on the stack. The root layer should also never get a
|
| @@ -155,18 +153,14 @@ public:
|
| m_overlapStack.removeLast();
|
| }
|
|
|
| - RenderGeometryMap& geometryMap() { return m_geometryMap; }
|
| -
|
| private:
|
| Vector<OverlapMapContainer> m_overlapStack;
|
| - RenderGeometryMap m_geometryMap;
|
| };
|
|
|
| struct CompositingRecursionData {
|
| - CompositingRecursionData(RenderLayer* compAncestor, RenderLayer* mostRecentCompositedLayer, RenderLayerCompositor::BoundsUpdateType boundsUpdateType, bool testOverlap)
|
| + CompositingRecursionData(RenderLayer* compAncestor, RenderLayer* mostRecentCompositedLayer, bool testOverlap)
|
| : m_compositingAncestor(compAncestor)
|
| , m_mostRecentCompositedLayer(mostRecentCompositedLayer)
|
| - , m_recomputeLayerBoundsUpdateType(boundsUpdateType)
|
| , m_subtreeIsCompositing(false)
|
| , m_hasUnisolatedCompositedBlendingDescendant(false)
|
| , m_testingOverlap(testOverlap)
|
| @@ -179,7 +173,6 @@ struct CompositingRecursionData {
|
| CompositingRecursionData(const CompositingRecursionData& other)
|
| : m_compositingAncestor(other.m_compositingAncestor)
|
| , m_mostRecentCompositedLayer(other.m_mostRecentCompositedLayer)
|
| - , m_recomputeLayerBoundsUpdateType(other.m_recomputeLayerBoundsUpdateType)
|
| , m_subtreeIsCompositing(other.m_subtreeIsCompositing)
|
| , m_hasUnisolatedCompositedBlendingDescendant(other.m_hasUnisolatedCompositedBlendingDescendant)
|
| , m_testingOverlap(other.m_testingOverlap)
|
| @@ -191,7 +184,6 @@ struct CompositingRecursionData {
|
|
|
| RenderLayer* m_compositingAncestor;
|
| RenderLayer* m_mostRecentCompositedLayer; // in paint order regardless of hierarchy.
|
| - RenderLayerCompositor::BoundsUpdateType m_recomputeLayerBoundsUpdateType;
|
| bool m_subtreeIsCompositing;
|
| bool m_hasUnisolatedCompositedBlendingDescendant;
|
| bool m_testingOverlap;
|
| @@ -208,7 +200,7 @@ RenderLayerCompositor::RenderLayerCompositor(RenderView& renderView)
|
| , m_needsToRecomputeCompositingRequirements(false)
|
| , m_needsToUpdateLayerTreeGeometry(false)
|
| , m_pendingUpdateType(GraphicsLayerUpdater::DoNotForceUpdate)
|
| - , m_recomputeLayerBoundsUpdateType(DoNotForceUpdate)
|
| + , m_pendingPropertyUpdateType(CompositingPropertyUpdater::DoNotForceUpdate)
|
| , m_compositing(false)
|
| , m_compositingLayersNeedRebuild(false)
|
| , m_forceCompositingMode(false)
|
| @@ -374,7 +366,7 @@ void RenderLayerCompositor::setNeedsCompositingUpdate(CompositingUpdateType upda
|
| // FIXME: Ideally we'd be smarter about tracking dirtiness and wouldn't need a ForceUpdate here.
|
| m_pendingUpdateType = GraphicsLayerUpdater::ForceUpdate;
|
| // FIXME: Ideally we'd be smarter about tracking dirtiness and wouldn't need a ForceUpdate here.
|
| - m_recomputeLayerBoundsUpdateType = ForceUpdate;
|
| + m_pendingPropertyUpdateType = CompositingPropertyUpdater::ForceUpdate;
|
| break;
|
| case CompositingUpdateOnScroll:
|
| m_needsToRecomputeCompositingRequirements = true; // Overlap can change with scrolling, so need to check for hierarchy updates.
|
| @@ -382,14 +374,14 @@ void RenderLayerCompositor::setNeedsCompositingUpdate(CompositingUpdateType upda
|
| // FIXME: Ideally we'd be smarter about tracking dirtiness and wouldn't need a ForceUpdate here.
|
| m_pendingUpdateType = GraphicsLayerUpdater::ForceUpdate;
|
| // FIXME: Ideally we'd be smarter about tracking dirtiness and wouldn't need a ForceUpdate here.
|
| - m_recomputeLayerBoundsUpdateType = ForceUpdate;
|
| + m_pendingPropertyUpdateType = CompositingPropertyUpdater::ForceUpdate;
|
| break;
|
| case CompositingUpdateOnCompositedScroll:
|
| m_needsToUpdateLayerTreeGeometry = true;
|
| // FIXME: Ideally we'd be smarter about tracking dirtiness and wouldn't need a ForceUpdate here.
|
| m_pendingUpdateType = GraphicsLayerUpdater::ForceUpdate;
|
| // FIXME: Ideally we'd be smarter about tracking dirtiness and wouldn't need a ForceUpdate here.
|
| - m_recomputeLayerBoundsUpdateType = ForceUpdate;
|
| + m_pendingPropertyUpdateType = CompositingPropertyUpdater::ForceUpdate;
|
| break;
|
| case CompositingUpdateAfterCanvasContextChange:
|
| m_needsToUpdateLayerTreeGeometry = true;
|
| @@ -452,14 +444,6 @@ bool RenderLayerCompositor::hasUnresolvedDirtyBits()
|
| return m_needsToRecomputeCompositingRequirements || m_compositingLayersNeedRebuild || m_needsToUpdateLayerTreeGeometry || m_needsUpdateCompositingRequirementsState || m_pendingUpdateType != GraphicsLayerUpdater::DoNotForceUpdate;
|
| }
|
|
|
| -static void assertNeedsRecomputeBoundsBitsCleared(RenderLayer* updateRoot)
|
| -{
|
| - // We don't do overlap testing on the root layer, so we never compute its absolute bounding box.
|
| - ASSERT(updateRoot->isRootLayer() || !updateRoot->needsToRecomputeBounds());
|
| - for (RenderLayer* child = updateRoot->firstChild(); child; child = child->nextSibling())
|
| - assertNeedsRecomputeBoundsBitsCleared(child);
|
| -}
|
| -
|
| void RenderLayerCompositor::updateCompositingLayersInternal()
|
| {
|
| if (isMainFrame() && m_renderView.frameView())
|
| @@ -492,10 +476,19 @@ void RenderLayerCompositor::updateCompositingLayersInternal()
|
| if (needCompositingRequirementsUpdate) {
|
| // Go through the layers in presentation order, so that we can compute which RenderLayers need compositing layers.
|
| // FIXME: we could maybe do this and the hierarchy udpate in one pass, but the parenting logic would be more complex.
|
| - CompositingRecursionData recursionData(updateRoot, 0, m_recomputeLayerBoundsUpdateType, true);
|
| - m_recomputeLayerBoundsUpdateType = DoNotForceUpdate;
|
| + CompositingRecursionData recursionData(updateRoot, 0, true);
|
| bool layersChanged = false;
|
| bool saw3DTransform = false;
|
| +
|
| + {
|
| + TRACE_EVENT0("blink_rendering", "CompositingPropertyUpdater::updateAncestorDependentProperties");
|
| + CompositingPropertyUpdater().updateAncestorDependentProperties(updateRoot, m_pendingPropertyUpdateType);
|
| + m_pendingPropertyUpdateType = CompositingPropertyUpdater::DoNotForceUpdate;
|
| +#if !ASSERT_DISABLED
|
| + CompositingPropertyUpdater::assertNeedsToUpdateAncestorDependantPropertiesBitsCleared(updateRoot);
|
| +#endif
|
| + }
|
| +
|
| {
|
| TRACE_EVENT0("blink_rendering", "RenderLayerCompositor::computeCompositingRequirements");
|
| OverlapMap overlapTestRequestMap;
|
| @@ -507,9 +500,6 @@ void RenderLayerCompositor::updateCompositingLayersInternal()
|
| Vector<RenderLayer*> unclippedDescendants;
|
| IntRect absoluteDecendantBoundingBox;
|
| computeCompositingRequirements(0, updateRoot, overlapTestRequestMap, recursionData, saw3DTransform, unclippedDescendants, absoluteDecendantBoundingBox);
|
| -#if !ASSERT_DISABLED
|
| - assertNeedsRecomputeBoundsBitsCleared(updateRoot);
|
| -#endif
|
| }
|
|
|
| {
|
| @@ -938,8 +928,6 @@ void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestor
|
| {
|
| layer->stackingNode()->updateLayerListsIfNeeded();
|
|
|
| - overlapMap.geometryMap().pushMappingsToAncestor(layer, ancestorLayer);
|
| -
|
| // Clear the flag
|
| layer->setHasCompositingDescendant(false);
|
| layer->setHasNonCompositedChild(false);
|
| @@ -992,14 +980,7 @@ void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestor
|
|
|
| IntRect absBounds;
|
| if (!layer->isRootLayer()) {
|
| - if (currentRecursionData.m_recomputeLayerBoundsUpdateType == ForceUpdate || layer->needsToRecomputeBounds()) {
|
| - // FIXME: If the absolute bounds didn't change, then we don't need to ForceUpdate descendant RenderLayers.
|
| - currentRecursionData.m_recomputeLayerBoundsUpdateType = ForceUpdate;
|
| - absBounds = enclosingIntRect(overlapMap.geometryMap().absoluteRect(layer->overlapBounds()));
|
| - layer->setAbsoluteBoundingBox(absBounds);
|
| - } else {
|
| - absBounds = layer->absoluteBoundingBox();
|
| - }
|
| + absBounds = layer->ancestorDependentProperties().absoluteBoundingBox;
|
| // 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/
|
| @@ -1065,13 +1046,9 @@ void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestor
|
| // FIXME: temporary solution for the first negative z-index composited child:
|
| // re-compute the absBounds for the child so that we can add the
|
| // negative z-index child's bounds to the new overlap context.
|
| - overlapMap.geometryMap().pushMappingsToAncestor(curNode->layer(), layer);
|
| - // The above call to computeCompositinRequirements will have already updated this layer's absolute bounding box.
|
| overlapMap.beginNewOverlapTestingContext();
|
| - ASSERT(!curNode->layer()->needsToRecomputeBounds());
|
| - addToOverlapMap(overlapMap, curNode->layer(), curNode->layer()->absoluteBoundingBox());
|
| + addToOverlapMap(overlapMap, curNode->layer(), curNode->layer()->ancestorDependentProperties().absoluteBoundingBox);
|
| overlapMap.finishCurrentOverlapTestingContext();
|
| - overlapMap.geometryMap().popMappingsToAncestor(layer);
|
| }
|
| }
|
| }
|
| @@ -1142,7 +1119,6 @@ void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestor
|
| if (layer->reflectionInfo()) {
|
| // FIXME: Shouldn't we call computeCompositingRequirements to handle a reflection overlapping with another renderer?
|
| RenderLayer* reflectionLayer = layer->reflectionInfo()->reflectionLayer();
|
| - reflectionLayer->clearNeedsToRecomputeBounds();
|
| CompositingReasons reflectionCompositingReason = willBeCompositedOrSquashed ? CompositingReasonReflectionOfCompositedParent : CompositingReasonNone;
|
| reflectionLayer->setCompositingReasons(reflectionLayer->compositingReasons() | reflectionCompositingReason);
|
| }
|
| @@ -1190,7 +1166,6 @@ void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestor
|
| layer->parent()->setHasNonCompositedChild(true);
|
|
|
| descendantHas3DTransform |= anyDescendantHas3DTransform || layer->has3DTransform();
|
| - overlapMap.geometryMap().popMappingsToAncestor(ancestorLayer);
|
| }
|
|
|
| void RenderLayerCompositor::SquashingState::updateSquashingStateForNewMapping(CompositedLayerMappingPtr newCompositedLayerMapping, bool hasNewCompositedLayerMapping, LayoutPoint newOffsetFromAbsoluteForSquashingCLM, RenderLayer* newClippingAncestorForMostRecentMapping)
|
|
|