Title: [267048] branches/safari-610-branch
- Revision
- 267048
- Author
- [email protected]
- Date
- 2020-09-14 15:17:30 -0700 (Mon, 14 Sep 2020)
Log Message
Cherry-pick r266901. rdar://problem/68881000
[Repaint] RenderLayerModelObject::styleWillChange may issue redundant repaint
https://bugs.webkit.org/show_bug.cgi?id=216374
<rdar://problem/68657490>
Reviewed by Simon Fraser.
Source/WebCore:
Move the repaintIncludingDescendants() calls to repaintBeforeStyleChange() to avoid redundant repaints on the same renderer.
* rendering/RenderElement.cpp:
(WebCore::RenderElement::repaintBeforeStyleChange):
* rendering/RenderLayerModelObject.cpp:
(WebCore::RenderLayerModelObject::styleWillChange):
LayoutTests:
* css3/blending/repaint/blend-mode-isolate-stacking-context-expected.txt:
* platform/ios/css3/blending/repaint/blend-mode-isolate-stacking-context-expected.txt:
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@266901 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Modified Paths
Diff
Modified: branches/safari-610-branch/LayoutTests/ChangeLog (267047 => 267048)
--- branches/safari-610-branch/LayoutTests/ChangeLog 2020-09-14 22:17:27 UTC (rev 267047)
+++ branches/safari-610-branch/LayoutTests/ChangeLog 2020-09-14 22:17:30 UTC (rev 267048)
@@ -1,5 +1,43 @@
2020-09-14 Alan Coon <[email protected]>
+ Cherry-pick r266901. rdar://problem/68881000
+
+ [Repaint] RenderLayerModelObject::styleWillChange may issue redundant repaint
+ https://bugs.webkit.org/show_bug.cgi?id=216374
+ <rdar://problem/68657490>
+
+ Reviewed by Simon Fraser.
+
+ Source/WebCore:
+
+ Move the repaintIncludingDescendants() calls to repaintBeforeStyleChange() to avoid redundant repaints on the same renderer.
+
+ * rendering/RenderElement.cpp:
+ (WebCore::RenderElement::repaintBeforeStyleChange):
+ * rendering/RenderLayerModelObject.cpp:
+ (WebCore::RenderLayerModelObject::styleWillChange):
+
+ LayoutTests:
+
+ * css3/blending/repaint/blend-mode-isolate-stacking-context-expected.txt:
+ * platform/ios/css3/blending/repaint/blend-mode-isolate-stacking-context-expected.txt:
+
+
+ git-svn-id: https://svn.webkit.org/repository/webkit/trunk@266901 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+ 2020-09-10 Zalan Bujtas <[email protected]>
+
+ [Repaint] RenderLayerModelObject::styleWillChange may issue redundant repaint
+ https://bugs.webkit.org/show_bug.cgi?id=216374
+ <rdar://problem/68657490>
+
+ Reviewed by Simon Fraser.
+
+ * css3/blending/repaint/blend-mode-isolate-stacking-context-expected.txt:
+ * platform/ios/css3/blending/repaint/blend-mode-isolate-stacking-context-expected.txt:
+
+2020-09-14 Alan Coon <[email protected]>
+
Cherry-pick r266818. rdar://problem/68881035
[Repaint] RenderElement::setStyle may issue redundant repaint
Modified: branches/safari-610-branch/LayoutTests/css3/blending/repaint/blend-mode-isolate-stacking-context-expected.txt (267047 => 267048)
--- branches/safari-610-branch/LayoutTests/css3/blending/repaint/blend-mode-isolate-stacking-context-expected.txt 2020-09-14 22:17:27 UTC (rev 267047)
+++ branches/safari-610-branch/LayoutTests/css3/blending/repaint/blend-mode-isolate-stacking-context-expected.txt 2020-09-14 22:17:30 UTC (rev 267048)
@@ -19,7 +19,6 @@
(rect 28 526 60 60)
(rect 48 526 60 60)
(rect 48 408 60 60)
- (rect 48 408 60 60)
(rect 48 644 60 60)
(rect 68 644 60 60)
(rect 48 644 60 60)
Modified: branches/safari-610-branch/LayoutTests/platform/ios/css3/blending/repaint/blend-mode-isolate-stacking-context-expected.txt (267047 => 267048)
--- branches/safari-610-branch/LayoutTests/platform/ios/css3/blending/repaint/blend-mode-isolate-stacking-context-expected.txt 2020-09-14 22:17:27 UTC (rev 267047)
+++ branches/safari-610-branch/LayoutTests/platform/ios/css3/blending/repaint/blend-mode-isolate-stacking-context-expected.txt 2020-09-14 22:17:30 UTC (rev 267048)
@@ -19,7 +19,6 @@
(rect 28 536 60 60)
(rect 48 536 60 60)
(rect 48 416 60 60)
- (rect 48 416 60 60)
(rect 48 656 60 60)
(rect 68 656 60 60)
(rect 48 656 60 60)
Modified: branches/safari-610-branch/Source/WebCore/ChangeLog (267047 => 267048)
--- branches/safari-610-branch/Source/WebCore/ChangeLog 2020-09-14 22:17:27 UTC (rev 267047)
+++ branches/safari-610-branch/Source/WebCore/ChangeLog 2020-09-14 22:17:30 UTC (rev 267048)
@@ -1,5 +1,47 @@
2020-09-14 Alan Coon <[email protected]>
+ Cherry-pick r266901. rdar://problem/68881000
+
+ [Repaint] RenderLayerModelObject::styleWillChange may issue redundant repaint
+ https://bugs.webkit.org/show_bug.cgi?id=216374
+ <rdar://problem/68657490>
+
+ Reviewed by Simon Fraser.
+
+ Source/WebCore:
+
+ Move the repaintIncludingDescendants() calls to repaintBeforeStyleChange() to avoid redundant repaints on the same renderer.
+
+ * rendering/RenderElement.cpp:
+ (WebCore::RenderElement::repaintBeforeStyleChange):
+ * rendering/RenderLayerModelObject.cpp:
+ (WebCore::RenderLayerModelObject::styleWillChange):
+
+ LayoutTests:
+
+ * css3/blending/repaint/blend-mode-isolate-stacking-context-expected.txt:
+ * platform/ios/css3/blending/repaint/blend-mode-isolate-stacking-context-expected.txt:
+
+
+ git-svn-id: https://svn.webkit.org/repository/webkit/trunk@266901 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+ 2020-09-10 Zalan Bujtas <[email protected]>
+
+ [Repaint] RenderLayerModelObject::styleWillChange may issue redundant repaint
+ https://bugs.webkit.org/show_bug.cgi?id=216374
+ <rdar://problem/68657490>
+
+ Reviewed by Simon Fraser.
+
+ Move the repaintIncludingDescendants() calls to repaintBeforeStyleChange() to avoid redundant repaints on the same renderer.
+
+ * rendering/RenderElement.cpp:
+ (WebCore::RenderElement::repaintBeforeStyleChange):
+ * rendering/RenderLayerModelObject.cpp:
+ (WebCore::RenderLayerModelObject::styleWillChange):
+
+2020-09-14 Alan Coon <[email protected]>
+
Cherry-pick r266844. rdar://problem/68880990
[Cocoa] PERF: Don't instantiate AVPlayer-based audio decoders or renderers if an element is initially muted.
Modified: branches/safari-610-branch/Source/WebCore/rendering/RenderElement.cpp (267047 => 267048)
--- branches/safari-610-branch/Source/WebCore/rendering/RenderElement.cpp 2020-09-14 22:17:27 UTC (rev 267047)
+++ branches/safari-610-branch/Source/WebCore/rendering/RenderElement.cpp 2020-09-14 22:17:30 UTC (rev 267048)
@@ -386,36 +386,59 @@
// Repaint on hidden renderer is a no-op.
return false;
}
- auto shouldRepaintBeforeStyleChange = [&] {
+ enum class RequiredRepaint { None, RendererOnly, RendererAndDescendantsRenderersWithLayers };
+ auto shouldRepaintBeforeStyleChange = [&]() -> RequiredRepaint {
if (!parent()) {
// Can't resolve absolute coordinates.
- return false;
+ return RequiredRepaint::None;
}
+ if (is<RenderLayerModelObject>(this) && hasLayer()) {
+ if (diff == StyleDifference::RepaintLayer)
+ return RequiredRepaint::RendererAndDescendantsRenderersWithLayers;
+ if (diff == StyleDifference::Layout || diff == StyleDifference::SimplifiedLayout) {
+ // Certain style changes require layer repaint, since the layer could end up being destroyed.
+ auto layerMayGetDestroyed = oldStyle.position() != newStyle.position()
+ || oldStyle.usedZIndex() != newStyle.usedZIndex()
+ || oldStyle.hasAutoUsedZIndex() != newStyle.hasAutoUsedZIndex()
+ || oldStyle.clip() != newStyle.clip()
+ || oldStyle.hasClip() != newStyle.hasClip()
+ || oldStyle.opacity() != newStyle.opacity()
+ || oldStyle.transform() != newStyle.transform()
+ || oldStyle.filter() != newStyle.filter();
+ if (layerMayGetDestroyed)
+ return RequiredRepaint::RendererAndDescendantsRenderersWithLayers;
+ }
+ }
if (shouldRepaintForStyleDifference(diff))
- return true;
+ return RequiredRepaint::RendererOnly;
if (newStyle.outlineSize() < oldStyle.outlineSize())
- return true;
+ return RequiredRepaint::RendererOnly;
if (is<RenderLayerModelObject>(*this)) {
// If we don't have a layer yet, but we are going to get one because of transform or opacity, then we need to repaint the old position of the object.
bool hasLayer = downcast<RenderLayerModelObject>(*this).hasLayer();
bool willHaveLayer = newStyle.hasTransform() || newStyle.opacity() < 1 || newStyle.hasFilter() || newStyle.hasBackdropFilter();
if (!hasLayer && willHaveLayer)
- return true;
+ return RequiredRepaint::RendererOnly;
}
if (is<RenderBox>(*this)) {
if (diff == StyleDifference::Layout && oldStyle.position() != newStyle.position() && oldStyle.position() == PositionType::Static)
- return true;
+ return RequiredRepaint::RendererOnly;
}
if (diff > StyleDifference::RepaintLayer && oldStyle.visibility() != newStyle.visibility()) {
if (auto* enclosingLayer = this->enclosingLayer()) {
auto rendererWillBeHidden = newStyle.visibility() != Visibility::Visible;
if (rendererWillBeHidden && enclosingLayer->hasVisibleContent() && (this == &enclosingLayer->renderer() || enclosingLayer->renderer().style().visibility() != Visibility::Visible))
- return true;
+ return RequiredRepaint::RendererOnly;
}
}
- return false;
+ return RequiredRepaint::None;
}();
- if (shouldRepaintBeforeStyleChange) {
+ if (shouldRepaintBeforeStyleChange == RequiredRepaint::RendererAndDescendantsRenderersWithLayers) {
+ ASSERT(hasLayer());
+ downcast<RenderLayerModelObject>(*this).layer()->repaintIncludingDescendants();
+ return true;
+ }
+ if (shouldRepaintBeforeStyleChange == RequiredRepaint::RendererOnly) {
repaint();
return true;
}
Modified: branches/safari-610-branch/Source/WebCore/rendering/RenderLayerModelObject.cpp (267047 => 267048)
--- branches/safari-610-branch/Source/WebCore/rendering/RenderLayerModelObject.cpp 2020-09-14 22:17:27 UTC (rev 267047)
+++ branches/safari-610-branch/Source/WebCore/rendering/RenderLayerModelObject.cpp 2020-09-14 22:17:30 UTC (rev 267048)
@@ -113,37 +113,9 @@
if (s_hadLayer)
s_layerWasSelfPainting = layer()->isSelfPaintingLayer();
- // If our z-index changes value or our visibility changes,
- // we need to dirty our stacking context's z-order list.
- const RenderStyle* oldStyle = hasInitializedStyle() ? &style() : nullptr;
- if (oldStyle) {
- if (parent()) {
- // Do a repaint with the old style first, e.g., for example if we go from
- // having an outline to not having an outline.
- if (diff == StyleDifference::RepaintLayer) {
- layer()->repaintIncludingDescendants();
- if (!(oldStyle->clip() == newStyle.clip()))
- layer()->clearClipRectsIncludingDescendants();
- }
- }
-
- if (diff == StyleDifference::Layout || diff == StyleDifference::SimplifiedLayout) {
- // When a layout hint happens, we do a repaint of the layer, since the layer could end up being destroyed.
- if (hasLayer()) {
- if (oldStyle->position() != newStyle.position()
- || oldStyle->usedZIndex() != newStyle.usedZIndex()
- || oldStyle->hasAutoUsedZIndex() != newStyle.hasAutoUsedZIndex()
- || !(oldStyle->clip() == newStyle.clip())
- || oldStyle->hasClip() != newStyle.hasClip()
- || oldStyle->opacity() != newStyle.opacity()
- || oldStyle->transform() != newStyle.transform()
- || oldStyle->filter() != newStyle.filter()
- )
- layer()->repaintIncludingDescendants();
- }
- }
- }
-
+ auto* oldStyle = hasInitializedStyle() ? &style() : nullptr;
+ if (diff == StyleDifference::RepaintLayer && parent() && oldStyle && oldStyle->clip() != newStyle.clip())
+ layer()->clearClipRectsIncludingDescendants();
RenderElement::styleWillChange(diff, newStyle);
}
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes