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

Reply via email to