summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/paint/compositing/compositing_inputs_updater.cc
diff options
context:
space:
mode:
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.cc71
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);