diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/core/paint/compositing/compositing_inputs_updater.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/core/paint/compositing/compositing_inputs_updater.cc | 71 |
1 files changed, 60 insertions, 11 deletions
diff --git a/chromium/third_party/blink/renderer/core/paint/compositing/compositing_inputs_updater.cc b/chromium/third_party/blink/renderer/core/paint/compositing/compositing_inputs_updater.cc index d393de8bede..f7e9bdc5724 100644 --- a/chromium/third_party/blink/renderer/core/paint/compositing/compositing_inputs_updater.cc +++ b/chromium/third_party/blink/renderer/core/paint/compositing/compositing_inputs_updater.cc @@ -12,6 +12,7 @@ #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" #include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" +#include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h" namespace blink { @@ -23,8 +24,12 @@ static const LayoutBoxModelObject* ClippingContainerFromClipChainParent( : clip_chain_parent->ClippingContainer(); } -CompositingInputsUpdater::CompositingInputsUpdater(PaintLayer* root_layer) - : geometry_map_(kUseTransforms), root_layer_(root_layer) {} +CompositingInputsUpdater::CompositingInputsUpdater( + PaintLayer* root_layer, + CompositingReasonFinder& compositing_reason_finder) + : geometry_map_(kUseTransforms), + root_layer_(root_layer), + compositing_reason_finder_(compositing_reason_finder) {} CompositingInputsUpdater::~CompositingInputsUpdater() = default; @@ -36,10 +41,6 @@ void CompositingInputsUpdater::Update() { void CompositingInputsUpdater::UpdateRecursive(PaintLayer* layer, UpdateType update_type, AncestorInfo info) { - if (!layer->ChildNeedsCompositingInputsUpdate() && - update_type != kForceUpdate) - return; - LayoutBoxModelObject& layout_object = layer->GetLayoutObject(); const ComputedStyle& style = layout_object.StyleRef(); @@ -165,7 +166,7 @@ void CompositingInputsUpdater::UpdateRecursive(PaintLayer* layer, ? info.clip_chain_parent_for_fixed : nullptr; // Workaround crbug.com/817175 - // We can't escape clip to a layer that paints after us, because in SPv1* + // We can't escape clip to a layer that paints after us, because in SPv1 // cc needs to reverse engineer clip tree from the layer tree, and we // can't refer to a clip node that hasn't been built yet. // This will result in wrong clip in some rare cases, for example: @@ -189,11 +190,59 @@ void CompositingInputsUpdater::UpdateRecursive(PaintLayer* layer, info.needs_reparent_scroll_for_fixed = false; } + PaintLayerCompositor* compositor = + layer->GetLayoutObject().View()->Compositor(); + + // The sequence of updates to compositing triggers goes like this: + // 1. Apply all triggers from kComboAllDirectNonStyleDeterminedReasons for + // |layer|. This may depend on ancestor composited scrolling (i.e. step + // 2 for an ancestor PaintLayer). + // 2. Put |layer| in composited scrolling mode if needed. + // 3. Reset DescendantHasDirectCompositingReason to false for |layer|. + // 4. Recurse into child PaintLayers. + // 5. Set DescendantHasDirectCompositingReason to true if it was for any + // child. + // 6. If |layer| is the root, composite if + // DescendantHasDirectCompositingReason is true for |layer|. + bool ignore_lcd_text = + (layer->AncestorScrollingLayer() && + !layer->AncestorScrollingLayer()->IsRootLayer() && + layer->AncestorScrollingLayer()->NeedsCompositedScrolling()); + + layer->SetPotentialCompositingReasonsFromNonStyle( + compositing_reason_finder_.NonStyleDeterminedDirectReasons( + layer, ignore_lcd_text)); + + if (layer->GetScrollableArea()) { + layer->GetScrollableArea()->UpdateNeedsCompositedScrolling( + compositor->CanBeComposited(layer) && + layer->DirectCompositingReasons()); + } + + bool should_recurse = + layer->ChildNeedsCompositingInputsUpdate() || update_type == kForceUpdate; + + layer->SetDescendantHasDirectOrScrollingCompositingReason(false); + bool descendant_has_direct_compositing_reason = false; for (PaintLayer* child = layer->FirstChild(); child; - child = child->NextSibling()) - UpdateRecursive(child, update_type, info); + child = child->NextSibling()) { + if (should_recurse) + UpdateRecursive(child, update_type, info); + descendant_has_direct_compositing_reason |= + child->DescendantHasDirectOrScrollingCompositingReason() || + child->NeedsCompositedScrolling() || + (compositor->CanBeComposited(child) && + child->DirectCompositingReasons()); + } + layer->SetDescendantHasDirectOrScrollingCompositingReason( + descendant_has_direct_compositing_reason); + + if (layer->IsRootLayer() && layer->ScrollsOverflow() && + layer->DescendantHasDirectOrScrollingCompositingReason() && + !layer->NeedsCompositedScrolling()) + layer->GetScrollableArea()->UpdateNeedsCompositedScrolling(true); - layer->DidUpdateCompositingInputs(); + layer->ClearChildNeedsCompositingInputsUpdate(); geometry_map_.PopMappingsToAncestor(layer->Parent()); @@ -288,7 +337,7 @@ void CompositingInputsUpdater::UpdateAncestorDependentCompositingInputs( properties.clip_parent = info.escape_clip_to; properties.ancestor_scrolling_layer = info.scrolling_ancestor; - if (info.needs_reparent_scroll && layer->StackingNode()->IsStacked()) + if (info.needs_reparent_scroll && layout_object.StyleRef().IsStacked()) properties.scroll_parent = info.scrolling_ancestor; layer->UpdateAncestorDependentCompositingInputs(properties); |