Changeset 245502 in webkit
- Timestamp:
- May 19, 2019 7:01:15 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r245500 r245502 1 2019-05-19 Simon Fraser <simon.fraser@apple.com> 2 3 Layers painting into shared backing need to contribute to overlap 4 https://bugs.webkit.org/show_bug.cgi?id=198021 5 6 Reviewed by Zalan Bujtas. 7 8 * compositing/shared-backing/sharing-child-contributes-to-overlap-expected.html: Added. 9 * compositing/shared-backing/sharing-child-contributes-to-overlap.html: Added. 10 1 11 2019-05-18 Jiewen Tan <jiewen_tan@apple.com> 2 12 -
trunk/Source/WebCore/ChangeLog
r245494 r245502 1 2019-05-19 Simon Fraser <simon.fraser@apple.com> 2 3 Layers painting into shared backing need to contribute to overlap 4 https://bugs.webkit.org/show_bug.cgi?id=198021 5 6 Reviewed by Zalan Bujtas. 7 8 Layers that paint into a composited (non-root) layer get added to the overlap map so 9 that later layers correct overlap them; this is done via the test against currentState.compositingAncestor. 10 11 We need the same logic for layers that paint into shared backing; they need to behave 12 the same way in terms of how they contribute to overlap. We already had currentState.backingSharingAncestor 13 which was unused, but now use it for this, and correctly null it out when a layer composites. 14 15 Bug was noticed during testing, and not known to affect any websites (though it probably does). 16 17 Also move the overlap container popping into updateOverlapMap() so the two callers can 18 share the code, and more explicitly track whether a container was pushed. 19 20 Test: compositing/shared-backing/sharing-child-contributes-to-overlap.html 21 22 * rendering/RenderLayerCompositor.cpp: 23 (WebCore::RenderLayerCompositor::computeCompositingRequirements): 24 (WebCore::RenderLayerCompositor::traverseUnchangedSubtree): 25 (WebCore::RenderLayerCompositor::updateOverlapMap const): 26 * rendering/RenderLayerCompositor.h: 27 1 28 2019-05-17 Joonghun Park <pjh0718@gmail.com> 2 29 -
trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp
r245490 r245502 880 880 IndirectCompositingReason compositingReason = compositingState.subtreeIsCompositing ? IndirectCompositingReason::Stacking : IndirectCompositingReason::None; 881 881 bool layerPaintsIntoProvidedBacking = false; 882 bool didPushOverlapContainer = false; 882 883 883 884 // If we know for sure the layer is going to be composited, don't bother looking it up in the overlap map … … 928 929 // This layer now acts as the ancestor for kids. 929 930 currentState.compositingAncestor = &layer; 930 931 // Compositing turns off backing sharing. 932 currentState.backingSharingAncestor = nullptr; 933 931 934 if (layerPaintsIntoProvidedBacking) { 932 935 layerPaintsIntoProvidedBacking = false; … … 934 937 // no longer share, put this this indirect reason back on the layer so that requiresOwnBackingStore() sees it. 935 938 layer.setIndirectCompositingReason(IndirectCompositingReason::Overlap); 936 LOG_WITH_STREAM(Compositing Overlap, stream << "layer " << &layer << " was sharing now will composite");939 LOG_WITH_STREAM(Compositing, stream << "layer " << &layer << " was sharing now will composite"); 937 940 } else { 938 941 overlapMap.pushCompositingContainer(); 942 didPushOverlapContainer = true; 939 943 LOG_WITH_STREAM(CompositingOverlap, stream << "layer " << &layer << " will composite, pushed container " << overlapMap); 940 944 } … … 959 963 currentState.backingSharingAncestor = &layer; 960 964 overlapMap.pushCompositingContainer(); 965 didPushOverlapContainer = true; 961 966 LOG_WITH_STREAM(CompositingOverlap, stream << "layer " << &layer << " will share, pushed container " << overlapMap); 962 967 } … … 1065 1070 descendantHas3DTransform |= anyDescendantHas3DTransform || layer.has3DTransform(); 1066 1071 compositingState.updateWithDescendantStateAndLayer(currentState, layer, layerExtent); 1067 1068 bool layerContributesToOverlap = currentState.compositingAncestor && !currentState.compositingAncestor->isRenderViewLayer();1069 updateOverlapMap(overlapMap, layer, layerExtent, layerContributesToOverlap, becameCompositedAfterDescendantTraversal && !descendantsAddedToOverlap);1070 1071 // Pop backing/overlap sharing state.1072 if ((willBeComposited && !layer.isRenderViewLayer()) || currentState.backingSharingAncestor == &layer) {1073 overlapMap.popCompositingContainer();1074 LOG_WITH_STREAM(CompositingOverlap, stream << "layer " << &layer << " is composited, popped container " << overlapMap);1075 }1076 1077 1072 backingSharingState.updateAfterDescendantTraversal(layer, compositingState.stackingContextAncestor); 1073 1074 bool layerContributesToOverlap = (currentState.compositingAncestor && !currentState.compositingAncestor->isRenderViewLayer()) || currentState.backingSharingAncestor; 1075 updateOverlapMap(overlapMap, layer, layerExtent, didPushOverlapContainer, layerContributesToOverlap, becameCompositedAfterDescendantTraversal && !descendantsAddedToOverlap); 1076 1078 1077 overlapMap.geometryMap().popMappingsToAncestor(ancestorLayer); 1079 1078 … … 1094 1093 1095 1094 bool layerIsComposited = layer.isComposited(); 1095 bool layerPaintsIntoProvidedBacking = false; 1096 bool didPushOverlapContainer = false; 1096 1097 1097 1098 OverlapExtent layerExtent; … … 1110 1111 ASSERT(backingProviderLayerCanIncludeLayer(*backingSharingState.backingProviderCandidate(), layer)); 1111 1112 backingSharingState.appendSharingLayer(layer); 1113 layerPaintsIntoProvidedBacking = true; 1112 1114 } 1113 1115 … … 1120 1122 // This layer now acts as the ancestor for kids. 1121 1123 currentState.compositingAncestor = &layer; 1124 currentState.backingSharingAncestor = nullptr; 1122 1125 overlapMap.pushCompositingContainer(); 1126 didPushOverlapContainer = true; 1123 1127 LOG_WITH_STREAM(CompositingOverlap, stream << "unchangedSubtree: layer " << &layer << " will composite, pushed container " << overlapMap); 1124 1128 … … 1127 1131 // Too hard to compute animated bounds if both us and some ancestor is animating transform. 1128 1132 layerExtent.animationCausesExtentUncertainty |= layerExtent.hasTransformAnimation && compositingState.ancestorHasTransformAnimation; 1133 } else if (layerPaintsIntoProvidedBacking) { 1134 overlapMap.pushCompositingContainer(); 1135 currentState.backingSharingAncestor = &layer; 1136 didPushOverlapContainer = true; 1137 LOG_WITH_STREAM(CompositingOverlap, stream << "unchangedSubtree: layer " << &layer << " will share, pushed container " << overlapMap); 1129 1138 } 1130 1139 … … 1157 1166 ASSERT(!currentState.fullPaintOrderTraversalRequired); 1158 1167 compositingState.updateWithDescendantStateAndLayer(currentState, layer, layerExtent, true); 1159 1160 bool layerContributesToOverlap = currentState.compositingAncestor && !currentState.compositingAncestor->isRenderViewLayer();1161 updateOverlapMap(overlapMap, layer, layerExtent, layerContributesToOverlap);1162 1163 if ((layerIsComposited && !layer.isRenderViewLayer()) || currentState.backingSharingAncestor == &layer) {1164 overlapMap.popCompositingContainer();1165 LOG_WITH_STREAM(CompositingOverlap, stream << "unchangedSubtree: layer " << &layer << " is composited, popped container " << overlapMap);1166 }1167 1168 1168 backingSharingState.updateAfterDescendantTraversal(layer, compositingState.stackingContextAncestor); 1169 1170 bool layerContributesToOverlap = (currentState.compositingAncestor && !currentState.compositingAncestor->isRenderViewLayer()) || currentState.backingSharingAncestor; 1171 updateOverlapMap(overlapMap, layer, layerExtent, didPushOverlapContainer, layerContributesToOverlap); 1172 1169 1173 overlapMap.geometryMap().popMappingsToAncestor(ancestorLayer); 1170 1174 … … 1841 1845 } 1842 1846 1843 void RenderLayerCompositor::updateOverlapMap(LayerOverlapMap& overlapMap, const RenderLayer& layer, OverlapExtent& layerExtent, bool layerContributesToOverlap, bool addDescendantsToOverlap) const 1844 { 1845 ASSERT_IMPLIES(addDescendantsToOverlap, layerContributesToOverlap); 1846 1847 // All layers (even ones that aren't being composited) need to get added to 1848 // the overlap map. Layers that do not composite will draw into their 1849 // compositing ancestor's backing, and so are still considered for overlap. 1850 // FIXME: When layerExtent has taken animation bounds into account, we also know that the bounds 1851 // include descendants, so we don't need to add them all to the overlap map. 1852 if (layerContributesToOverlap) { 1847 void RenderLayerCompositor::updateOverlapMap(LayerOverlapMap& overlapMap, const RenderLayer& layer, OverlapExtent& layerExtent, bool didPushContainer, bool addLayerToOverlap, bool addDescendantsToOverlap) const 1848 { 1849 if (addLayerToOverlap) { 1853 1850 addToOverlapMap(overlapMap, layer, layerExtent); 1854 1851 LOG_WITH_STREAM(CompositingOverlap, stream << "layer " << &layer << " contributes to overlap, added to map " << overlapMap); … … 1859 1856 addDescendantsToOverlapMapRecursive(overlapMap, layer); 1860 1857 LOG_WITH_STREAM(CompositingOverlap, stream << "layer " << &layer << " composited post descendant traversal, added recursive " << overlapMap); 1858 } 1859 1860 if (didPushContainer) { 1861 overlapMap.popCompositingContainer(); 1862 LOG_WITH_STREAM(CompositingOverlap, stream << "layer " << &layer << " is composited or shared, popped container " << overlapMap); 1861 1863 } 1862 1864 } -
trunk/Source/WebCore/rendering/RenderLayerCompositor.h
r245490 r245502 409 409 void addToOverlapMap(LayerOverlapMap&, const RenderLayer&, OverlapExtent&) const; 410 410 void addDescendantsToOverlapMapRecursive(LayerOverlapMap&, const RenderLayer&, const RenderLayer* ancestorLayer = nullptr) const; 411 void updateOverlapMap(LayerOverlapMap&, const RenderLayer&, OverlapExtent&, bool layerContributesToOverlap, bool addDescendantsToOverlap = false) const;411 void updateOverlapMap(LayerOverlapMap&, const RenderLayer&, OverlapExtent&, bool didPushContainer, bool addLayerToOverlap, bool addDescendantsToOverlap = false) const; 412 412 413 413 void updateCompositingLayersTimerFired();
Note: See TracChangeset
for help on using the changeset viewer.