void CompositingLayerAssigner::assignLayersToBackingsInternal(DeprecatedPaintLayer* layer, SquashingState& squashingState, Vector<DeprecatedPaintLayer*>& layersNeedingPaintInvalidation) { if (requiresSquashing(layer->compositingReasons())) { CompositingReasons reasonsPreventingSquashing = getReasonsPreventingSquashing(layer, squashingState); if (reasonsPreventingSquashing) layer->setCompositingReasons(layer->compositingReasons() | reasonsPreventingSquashing); } CompositingStateTransitionType compositedLayerUpdate = computeCompositedLayerUpdate(layer); if (m_compositor->allocateOrClearCompositedDeprecatedPaintLayerMapping(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()) { DeprecatedPaintLayerStackingNodeIterator iterator(*layer->stackingNode(), NegativeZOrderChildren); while (DeprecatedPaintLayerStackingNode* 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->compositedDeprecatedPaintLayerMapping(), layer->hasCompositedDeprecatedPaintLayerMapping()); } if (layer->scrollParent()) layer->scrollParent()->scrollableArea()->setTopmostScrollChild(layer); if (layer->needsCompositedScrolling()) layer->scrollableArea()->setTopmostScrollChild(nullptr); DeprecatedPaintLayerStackingNodeIterator iterator(*layer->stackingNode(), NormalFlowChildren | PositiveZOrderChildren); while (DeprecatedPaintLayerStackingNode* curNode = iterator.next()) assignLayersToBackingsInternal(curNode->layer(), squashingState, layersNeedingPaintInvalidation); if (squashingState.hasMostRecentMapping && &squashingState.mostRecentMapping->owningLayer() == layer) squashingState.haveAssignedBackingsToEntireSquashingLayerSubtree = true; }
void CompositingLayerAssigner::assignLayersToBackingsInternal(RenderLayer* layer, SquashingState& squashingState, bool& layersChanged, Vector<RenderLayer*>& layersNeedingRepaint) { if (m_layerSquashingEnabled && 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)) { layersNeedingRepaint.append(layer); layersChanged = true; } // FIXME: special-casing reflection layers here is not right. if (layer->reflectionInfo()) assignLayersToBackingsForReflectionLayer(layer->reflectionInfo()->reflectionLayer(), layersChanged, layersNeedingRepaint); // Add this layer to a squashing backing if needed. if (m_layerSquashingEnabled) { if (updateSquashingAssignment(layer, squashingState, compositedLayerUpdate, layersNeedingRepaint)) layersChanged = true; const bool layerIsSquashed = compositedLayerUpdate == PutInSquashingLayer || (compositedLayerUpdate == NoCompositingStateChange && layer->groupedMapping()); if (layerIsSquashed) { squashingState.nextSquashedLayerIndex++; IntRect layerBounds = layer->compositingInputs().clippedAbsoluteBoundingBox; squashingState.totalAreaOfSquashedRects += layerBounds.size().area(); squashingState.boundingRect.unite(layerBounds); } } if (layer->stackingNode()->isStackingContext()) { RenderLayerStackingNodeIterator iterator(*layer->stackingNode(), NegativeZOrderChildren); while (RenderLayerStackingNode* curNode = iterator.next()) assignLayersToBackingsInternal(curNode->layer(), squashingState, layersChanged, layersNeedingRepaint); } if (m_layerSquashingEnabled) { // 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 || layer->compositingState() == HasOwnBackingButPaintsIntoAncestor) { ASSERT(!requiresSquashing(layer->compositingReasons())); squashingState.updateSquashingStateForNewMapping(layer->compositedLayerMapping(), layer->hasCompositedLayerMapping()); } } RenderLayerStackingNodeIterator iterator(*layer->stackingNode(), NormalFlowChildren | PositiveZOrderChildren); while (RenderLayerStackingNode* curNode = iterator.next()) assignLayersToBackingsInternal(curNode->layer(), squashingState, layersChanged, layersNeedingRepaint); if (squashingState.hasMostRecentMapping && &squashingState.mostRecentMapping->owningLayer() == layer) squashingState.haveAssignedBackingsToEntireSquashingLayerSubtree = true; }
static bool requiresCompositingOrSquashing(CompositingReasons reasons) { #if ENABLE(ASSERT) bool fastAnswer = reasons != CompositingReasonNone; bool slowAnswer = requiresCompositing(reasons) || requiresSquashing(reasons); ASSERT(fastAnswer == slowAnswer); #endif return reasons != CompositingReasonNone; }
bool CompositingLayerAssigner::needsOwnBacking(const RenderLayer* layer) const { if (!m_compositor->canBeComposited(layer)) return false; // If squashing is disabled, then layers that would have been squashed should just be separately composited. bool needsOwnBackingForDisabledSquashing = !m_layerSquashingEnabled && requiresSquashing(layer->compositingReasons()); return requiresCompositing(layer->compositingReasons()) || needsOwnBackingForDisabledSquashing || (m_compositor->staleInCompositingMode() && layer->isRootLayer()); }
CompositingStateTransitionType CompositingLayerAssigner::computeCompositedLayerUpdate(DeprecatedPaintLayer* layer) { CompositingStateTransitionType update = NoCompositingStateChange; if (needsOwnBacking(layer)) { if (!layer->hasCompositedDeprecatedPaintLayerMapping()) { update = AllocateOwnCompositedDeprecatedPaintLayerMapping; } } else { if (layer->hasCompositedDeprecatedPaintLayerMapping()) update = RemoveOwnCompositedDeprecatedPaintLayerMapping; if (!layer->subtreeIsInvisible() && m_compositor->canBeComposited(layer) && requiresSquashing(layer->compositingReasons())) { // We can't compute at this time whether the squashing layer update is a no-op, // since that requires walking the paint layer tree. update = PutInSquashingLayer; } else if (layer->groupedMapping() || layer->lostGroupedMapping()) { update = RemoveFromSquashingLayer; } } return update; }