void CompositingLayerAssigner::assignLayersToBackingsInternal(PaintLayer* layer, SquashingState& squashingState, Vector<PaintLayer*>& layersNeedingPaintInvalidation) { if (requiresSquashing(layer->compositingReasons())) { CompositingReasons reasonsPreventingSquashing = getReasonsPreventingSquashing(layer, squashingState); if (reasonsPreventingSquashing) layer->setCompositingReasons(layer->compositingReasons() | reasonsPreventingSquashing); } CompositingStateTransitionType compositedLayerUpdate = computeCompositedLayerUpdate(layer); if (m_compositor->allocateOrClearCompositedLayerMapping(layer, compositedLayerUpdate)) { TRACE_LAYER_INVALIDATION(layer, InspectorLayerInvalidationTrackingEvent::NewCompositedLayer); layersNeedingPaintInvalidation.append(layer); m_layersChanged = true; if (ScrollingCoordinator* scrollingCoordinator = scrollingCoordinatorFromLayer(*layer)) { if (layer->layoutObject()->style()->hasViewportConstrainedPosition()) scrollingCoordinator->frameViewFixedObjectsDidChange(layer->layoutObject()->view()->frameView()); } } // FIXME: special-casing reflection layers here is not right. if (layer->reflectionInfo()) assignLayersToBackingsForReflectionLayer(layer->reflectionInfo()->reflectionLayer(), layersNeedingPaintInvalidation); // Add this layer to a squashing backing if needed. updateSquashingAssignment(layer, squashingState, compositedLayerUpdate, layersNeedingPaintInvalidation); const bool layerIsSquashed = compositedLayerUpdate == PutInSquashingLayer || (compositedLayerUpdate == NoCompositingStateChange && layer->groupedMapping()); if (layerIsSquashed) { squashingState.nextSquashedLayerIndex++; IntRect layerBounds = layer->clippedAbsoluteBoundingBox(); squashingState.totalAreaOfSquashedRects += layerBounds.size().area(); squashingState.boundingRect.unite(layerBounds); } if (layer->stackingNode()->isStackingContext()) { PaintLayerStackingNodeIterator iterator(*layer->stackingNode(), NegativeZOrderChildren); while (PaintLayerStackingNode* curNode = iterator.next()) assignLayersToBackingsInternal(curNode->layer(), squashingState, layersNeedingPaintInvalidation); } // At this point, if the layer is to be separately composited, then its backing becomes the most recent in paint-order. if (layer->compositingState() == PaintsIntoOwnBacking) { ASSERT(!requiresSquashing(layer->compositingReasons())); squashingState.updateSquashingStateForNewMapping(layer->compositedLayerMapping(), layer->hasCompositedLayerMapping()); } if (layer->scrollParent()) layer->scrollParent()->scrollableArea()->setTopmostScrollChild(layer); if (layer->needsCompositedScrolling()) layer->scrollableArea()->setTopmostScrollChild(nullptr); PaintLayerStackingNodeIterator iterator(*layer->stackingNode(), NormalFlowChildren | PositiveZOrderChildren); while (PaintLayerStackingNode* curNode = iterator.next()) assignLayersToBackingsInternal(curNode->layer(), squashingState, layersNeedingPaintInvalidation); if (squashingState.hasMostRecentMapping && &squashingState.mostRecentMapping->owningLayer() == layer) squashingState.haveAssignedBackingsToEntireSquashingLayerSubtree = true; }
void CompositingLayerAssigner::updateSquashingAssignment(DeprecatedPaintLayer* layer, SquashingState& squashingState, const CompositingStateTransitionType compositedLayerUpdate, Vector<DeprecatedPaintLayer*>& layersNeedingPaintInvalidation) { // NOTE: In the future as we generalize this, the background of this layer may need to be assigned to a different backing than // the squashed DeprecatedPaintLayer's own primary contents. This would happen when we have a composited negative z-index element that needs // to paint on top of the background, but below the layer's main contents. For now, because we always composite layers // when they have a composited negative z-index child, such layers will never need squashing so it is not yet an issue. if (compositedLayerUpdate == PutInSquashingLayer) { // A layer that is squashed with other layers cannot have its own CompositedDeprecatedPaintLayerMapping. ASSERT(!layer->hasCompositedDeprecatedPaintLayerMapping()); ASSERT(squashingState.hasMostRecentMapping); bool changedSquashingLayer = squashingState.mostRecentMapping->updateSquashingLayerAssignment(layer, squashingState.nextSquashedLayerIndex); if (!changedSquashingLayer) return; // If we've modified the collection of squashed layers, we must update // the graphics layer geometry. squashingState.mostRecentMapping->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateSubtree); layer->clipper().clearClipRectsIncludingDescendants(); // Issue a paint invalidation, since |layer| may have been added to an already-existing squashing layer. TRACE_LAYER_INVALIDATION(layer, InspectorLayerInvalidationTrackingEvent::AddedToSquashingLayer); layersNeedingPaintInvalidation.append(layer); m_layersChanged = true; } else if (compositedLayerUpdate == RemoveFromSquashingLayer) { if (layer->groupedMapping()) { // Before removing |layer| from an already-existing squashing layer that may have other content, issue a paint invalidation. m_compositor->paintInvalidationOnCompositingChange(layer); layer->groupedMapping()->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateSubtree); layer->setGroupedMapping(nullptr, DeprecatedPaintLayer::InvalidateLayerAndRemoveFromMapping); } // If we need to issue paint invalidations, do so now that we've removed it from a squashed layer. TRACE_LAYER_INVALIDATION(layer, InspectorLayerInvalidationTrackingEvent::RemovedFromSquashingLayer); layersNeedingPaintInvalidation.append(layer); m_layersChanged = true; layer->setLostGroupedMapping(false); } }
void CompositingLayerAssigner::assignLayersToBackingsForReflectionLayer(DeprecatedPaintLayer* reflectionLayer, Vector<DeprecatedPaintLayer*>& layersNeedingPaintInvalidation) { CompositingStateTransitionType compositedLayerUpdate = computeCompositedLayerUpdate(reflectionLayer); if (compositedLayerUpdate != NoCompositingStateChange) { TRACE_LAYER_INVALIDATION(reflectionLayer, InspectorLayerInvalidationTrackingEvent::ReflectionLayerChanged); layersNeedingPaintInvalidation.append(reflectionLayer); m_layersChanged = true; m_compositor->allocateOrClearCompositedDeprecatedPaintLayerMapping(reflectionLayer, compositedLayerUpdate); } m_compositor->updateDirectCompositingReasons(reflectionLayer); // FIXME: Why do we updateGraphicsLayerConfiguration here instead of in the GraphicsLayerUpdater? if (reflectionLayer->hasCompositedDeprecatedPaintLayerMapping()) reflectionLayer->compositedDeprecatedPaintLayerMapping()->updateGraphicsLayerConfiguration(); }