WebKit Bugzilla
Attachment 370860 Details for
Bug 198340
: Do layer backing store sharing detection before testing for overlap
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-198340-20190529102222.patch (text/plain), 12.80 KB, created by
Simon Fraser (smfr)
on 2019-05-29 10:22:23 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Simon Fraser (smfr)
Created:
2019-05-29 10:22:23 PDT
Size:
12.80 KB
patch
obsolete
>Subversion Revision: 245838 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 2f0b8ffa352952db36c7daf514ffd9321c23000d..e06875d12591fa8c0c24873d562691dc52583f67 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,16 @@ >+2019-05-29 Simon Fraser <simon.fraser@apple.com> >+ >+ Do layer backing store sharing detection before testing for overlap >+ https://bugs.webkit.org/show_bug.cgi?id=198340 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Tests: compositing/layer-creation/clipping-scope/no-compositing-inside-stacking-context-scroller.html >+ compositing/layer-creation/clipping-scope/sharing-prevented-layers-in-scroller.html >+ >+ * rendering/RenderLayerCompositor.cpp: >+ (WebCore::RenderLayerCompositor::computeCompositingRequirements): >+ > 2019-05-28 Myles C. Maxfield <mmaxfield@apple.com> > > Move idempotent text autosizing to StyleTreeResolver >diff --git a/Source/WebCore/rendering/RenderLayerCompositor.cpp b/Source/WebCore/rendering/RenderLayerCompositor.cpp >index 663362abc6071cb3a69b523ab86c8c60d2c5a566..50bed65d99eae971fa60af8127d18c8eed361042 100644 >--- a/Source/WebCore/rendering/RenderLayerCompositor.cpp >+++ b/Source/WebCore/rendering/RenderLayerCompositor.cpp >@@ -859,12 +859,21 @@ void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestor > RequiresCompositingData queryData; > bool willBeComposited = layer.isComposited(); > bool becameCompositedAfterDescendantTraversal = false; >+ IndirectCompositingReason compositingReason = compositingState.subtreeIsCompositing ? IndirectCompositingReason::Stacking : IndirectCompositingReason::None; > > if (layer.needsPostLayoutCompositingUpdate() || compositingState.fullPaintOrderTraversalRequired || compositingState.descendantsRequireCompositingUpdate) { > layer.setIndirectCompositingReason(IndirectCompositingReason::None); > willBeComposited = needsToBeComposited(layer, queryData); > } > >+ bool layerPaintsIntoProvidedBacking = false; >+ if (!willBeComposited && compositingState.subtreeIsCompositing && backingSharingState.backingProviderCandidate() && canBeComposited(layer) && backingProviderLayerCanIncludeLayer(*backingSharingState.backingProviderCandidate(), layer)) { >+ backingSharingState.appendSharingLayer(layer); >+ LOG(Compositing, " layer %p can share with %p", &layer, backingSharingState.backingProviderCandidate()); >+ compositingReason = IndirectCompositingReason::None; >+ layerPaintsIntoProvidedBacking = true; >+ } >+ > compositingState.fullPaintOrderTraversalRequired |= layer.subsequentLayersNeedCompositingRequirementsTraversal(); > > OverlapExtent layerExtent; >@@ -876,20 +885,18 @@ void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestor > bool respectTransforms = !layerExtent.hasTransformAnimation; > overlapMap.geometryMap().pushMappingsToAncestor(&layer, ancestorLayer, respectTransforms); > >- IndirectCompositingReason compositingReason = compositingState.subtreeIsCompositing ? IndirectCompositingReason::Stacking : IndirectCompositingReason::None; >- bool layerPaintsIntoProvidedBacking = false; > bool didPushOverlapContainer = false; > > // If we know for sure the layer is going to be composited, don't bother looking it up in the overlap map >- if (!willBeComposited && !overlapMap.isEmpty() && compositingState.testingOverlap) { >+ if (!willBeComposited && !layerPaintsIntoProvidedBacking && !overlapMap.isEmpty() && compositingState.testingOverlap) { > // If we're testing for overlap, we only need to composite if we overlap something that is already composited. > if (layerOverlaps(overlapMap, layer, layerExtent)) { >- if (backingSharingState.backingProviderCandidate() && canBeComposited(layer) && backingProviderLayerCanIncludeLayer(*backingSharingState.backingProviderCandidate(), layer)) { >- backingSharingState.appendSharingLayer(layer); >- LOG(Compositing, " layer %p can share with %p", &layer, backingSharingState.backingProviderCandidate()); >- compositingReason = IndirectCompositingReason::None; >- layerPaintsIntoProvidedBacking = true; >- } else >+// if (backingSharingState.backingProviderCandidate() && canBeComposited(layer) && backingProviderLayerCanIncludeLayer(*backingSharingState.backingProviderCandidate(), layer)) { >+// backingSharingState.appendSharingLayer(layer); >+// LOG(Compositing, " layer %p can share with %p", &layer, backingSharingState.backingProviderCandidate()); >+// compositingReason = IndirectCompositingReason::None; >+// layerPaintsIntoProvidedBacking = true; >+// } else > compositingReason = IndirectCompositingReason::Overlap; > } else > compositingReason = IndirectCompositingReason::None; >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index 6fb21f5a9fbbf98e2e98383f3de924d90fd90357..76576abd48e9cc12b264d04c15ef413fdfaf6489 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,15 @@ >+2019-05-29 Simon Fraser <simon.fraser@apple.com> >+ >+ Do layer backing store sharing detection before testing for overlap >+ https://bugs.webkit.org/show_bug.cgi?id=198340 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * compositing/layer-creation/clipping-scope/no-compositing-inside-stacking-context-scroller-expected.txt: Added. >+ * compositing/layer-creation/clipping-scope/no-compositing-inside-stacking-context-scroller.html: Added. >+ * compositing/layer-creation/clipping-scope/sharing-prevented-layers-in-scroller-expected.txt: Added. >+ * compositing/layer-creation/clipping-scope/sharing-prevented-layers-in-scroller.html: Added. >+ > 2019-05-28 Myles C. Maxfield <mmaxfield@apple.com> > > Move idempotent text autosizing to StyleTreeResolver >diff --git a/LayoutTests/compositing/layer-creation/clipping-scope/no-compositing-inside-stacking-context-scroller-expected.txt b/LayoutTests/compositing/layer-creation/clipping-scope/no-compositing-inside-stacking-context-scroller-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..cf052f8348c462de425829588f711b8efaa7c8c7 >--- /dev/null >+++ b/LayoutTests/compositing/layer-creation/clipping-scope/no-compositing-inside-stacking-context-scroller-expected.txt >@@ -0,0 +1,33 @@ >+(GraphicsLayer >+ (anchor 0.00 0.00) >+ (bounds 800.00 600.00) >+ (children 1 >+ (GraphicsLayer >+ (bounds 800.00 600.00) >+ (contentsOpaque 1) >+ (children 1 >+ (GraphicsLayer >+ (position 8.00 8.00) >+ (bounds 302.00 302.00) >+ (drawsContent 1) >+ (children 1 >+ (GraphicsLayer >+ (offsetFromRenderer width=1 height=1) >+ (position 1.00 1.00) >+ (bounds 285.00 300.00) >+ (children 1 >+ (GraphicsLayer >+ (offsetFromRenderer width=1 height=1) >+ (anchor 0.00 0.00) >+ (bounds 285.00 500.00) >+ (drawsContent 1) >+ ) >+ ) >+ ) >+ ) >+ ) >+ ) >+ ) >+ ) >+) >+ >diff --git a/LayoutTests/compositing/layer-creation/clipping-scope/no-compositing-inside-stacking-context-scroller.html b/LayoutTests/compositing/layer-creation/clipping-scope/no-compositing-inside-stacking-context-scroller.html >new file mode 100644 >index 0000000000000000000000000000000000000000..34defbe19c37e8522be6bc4f56083b05dff094a2 >--- /dev/null >+++ b/LayoutTests/compositing/layer-creation/clipping-scope/no-compositing-inside-stacking-context-scroller.html >@@ -0,0 +1,54 @@ >+<!DOCTYPE html> <!-- webkit-test-runner [ internal:AsyncOverflowScrollingEnabled=true ] --> >+<html> >+<head> >+ <style> >+ .scroller { >+ position: relative; >+ z-index: 0; >+ overflow-y: scroll; >+ width: 300px; >+ height: 300px; >+ border: 1px solid black; >+ } >+ >+ .box { >+ position: relative; >+ margin: 20px; >+ width: 100px; >+ height: 100px; >+ background-color: green; >+ } >+ >+ .inside { >+ left: 20px; >+ } >+ >+ .outside { >+ position: relative; >+ margin: 20px; >+ width: 100px; >+ height: 100px; >+ background-color: silver; >+ } >+ </style> >+ <script> >+ if (window.testRunner) >+ testRunner.dumpAsText(); >+ >+ window.addEventListener('load', () => { >+ if (window.testRunner) >+ document.getElementById('layers').innerText = window.internals.layerTreeAsText(document); >+ }, false); >+ </script> >+</head> >+<body> >+ <div class="scroller"> >+ <div class="inside box"></div> >+ <div class="inside box"></div> >+ <div class="inside box"></div> >+ <div class="inside box"></div> >+ </div> >+ <div class="outside"></div> >+<pre id="layers">Layer tree goes here</pre> >+</body> >+</html> >diff --git a/LayoutTests/compositing/layer-creation/clipping-scope/sharing-prevented-layers-in-scroller-expected.txt b/LayoutTests/compositing/layer-creation/clipping-scope/sharing-prevented-layers-in-scroller-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..48d63df7c4a5fce81517643cb85e9b64c052bebf >--- /dev/null >+++ b/LayoutTests/compositing/layer-creation/clipping-scope/sharing-prevented-layers-in-scroller-expected.txt >@@ -0,0 +1,70 @@ >+asdf >+(GraphicsLayer >+ (anchor 0.00 0.00) >+ (bounds 800.00 600.00) >+ (children 1 >+ (GraphicsLayer >+ (bounds 800.00 600.00) >+ (contentsOpaque 1) >+ (children 4 >+ (GraphicsLayer >+ (position 8.00 8.00) >+ (bounds 302.00 302.00) >+ (drawsContent 1) >+ (children 1 >+ (GraphicsLayer >+ (offsetFromRenderer width=1 height=1) >+ (position 1.00 1.00) >+ (bounds 285.00 300.00) >+ (children 1 >+ (GraphicsLayer >+ (offsetFromRenderer width=1 height=1) >+ (anchor 0.00 0.00) >+ (bounds 285.00 690.00) >+ ) >+ ) >+ ) >+ ) >+ ) >+ (GraphicsLayer >+ (offsetFromRenderer width=-20 height=-20) >+ (position 9.00 9.00) >+ (bounds 285.00 300.00) >+ (children 1 >+ (GraphicsLayer >+ (position 20.00 20.00) >+ (bounds 100.00 50.00) >+ (contentsOpaque 1) >+ (drawsContent 1) >+ ) >+ ) >+ ) >+ (GraphicsLayer >+ (offsetFromRenderer width=-20 height=-90) >+ (position 9.00 9.00) >+ (bounds 285.00 300.00) >+ (children 1 >+ (GraphicsLayer >+ (position 20.00 90.00) >+ (bounds 100.00 100.00) >+ (contentsOpaque 1) >+ ) >+ ) >+ ) >+ (GraphicsLayer >+ (offsetFromRenderer width=-20 height=-210) >+ (position 9.00 9.00) >+ (bounds 285.00 300.00) >+ (children 1 >+ (GraphicsLayer >+ (position 20.00 210.00) >+ (bounds 100.00 100.00) >+ (contentsOpaque 1) >+ ) >+ ) >+ ) >+ ) >+ ) >+ ) >+) >+ >diff --git a/LayoutTests/compositing/layer-creation/clipping-scope/sharing-prevented-layers-in-scroller.html b/LayoutTests/compositing/layer-creation/clipping-scope/sharing-prevented-layers-in-scroller.html >new file mode 100644 >index 0000000000000000000000000000000000000000..04a7548b20cdf3781f170f90aee436ab5f68efce >--- /dev/null >+++ b/LayoutTests/compositing/layer-creation/clipping-scope/sharing-prevented-layers-in-scroller.html >@@ -0,0 +1,65 @@ >+<!DOCTYPE html> <!-- webkit-test-runner [ internal:AsyncOverflowScrollingEnabled=true ] --> >+<html> >+<head> >+ <style> >+ .scroller { >+ overflow-y: scroll; >+ width: 300px; >+ height: 300px; >+ border: 1px solid black; >+ } >+ >+ .box { >+ position: relative; >+ margin: 20px; >+ width: 100px; >+ height: 100px; >+ background-color: green; >+ } >+ >+ .spacer { >+ height: 200px; >+ width: 10px; >+ background-color: silver; >+ } >+ >+ .outside { >+ display: none; >+ position: relative; >+ top: -30px; >+ left: 50px; >+ background-color: gray; >+ } >+ >+ .sharing-preventer { >+ transform: translateZ(0); >+ background-color: orange; >+ height: 50px; >+ } >+ >+ </style> >+ <script> >+ if (window.testRunner) >+ testRunner.dumpAsText(); >+ >+ window.addEventListener('load', () => { >+ if (window.testRunner) >+ document.getElementById('layers').innerText = window.internals.layerTreeAsText(document); >+ }, false); >+ </script> >+</head> >+<body> >+ <div class="scroller"> >+ <div class="sharing-preventer box"> >+ asdf >+ </div> >+ <div class="box"></div> >+ <div class="box"></div> >+ <div class="box"></div> >+ <div class="box"></div> >+ <div class="box"></div> >+ </div> >+ <div class="outside box"></div> >+<pre id="layers">Layer tree goes here</pre> >+</body> >+</html>
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
ews-watchlist
:
commit-queue-
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 198340
: 370860 |
370868
|
370869
|
370876
|
370905