Changeset 245490 in webkit
- Timestamp:
- May 17, 2019, 6:32:03 PM (6 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r245483 r245490 33 33 34 34 * platform/ios/TestExpectations: Skipping in iOS 35 36 2019-05-17 Simon Fraser <simon.fraser@apple.com> 37 38 REGRESSION (r245170): gmail.com inbox table header flickers 39 https://bugs.webkit.org/show_bug.cgi?id=198005 40 <rdar://problem/50907718> 41 42 Reviewed by Antti Koivisto. 43 44 * compositing/shared-backing/overlap-after-end-sharing-expected.html: Added. 45 * compositing/shared-backing/overlap-after-end-sharing.html: Added. 35 46 36 47 2019-05-17 Simon Fraser <simon.fraser@apple.com> -
trunk/Source/WebCore/ChangeLog
r245488 r245490 147 147 * platform/ios/UserAgentIOS.mm: 148 148 (WebCore::standardUserAgentWithApplicationName): 149 150 2019-05-17 Simon Fraser <simon.fraser@apple.com> 151 152 REGRESSION (r245170): gmail.com inbox table header flickers 153 https://bugs.webkit.org/show_bug.cgi?id=198005 154 <rdar://problem/50907718> 155 156 Reviewed by Antti Koivisto. 157 158 When a layer started as painting into shared backing, but then became independently 159 composited (e.g. by having to clip composited children), it wouldn't have the "overlap" 160 indirect compositing reason. This allowed requiresOwnBackingStore() to say that it 161 could paint into some ancestor, but this breaks overlap. So in this code path, 162 put IndirectCompositingReason::Overlap back on the layer which restores the previous 163 behavior. 164 165 Make some logging changes to help diagnose things like this. 166 167 Test: compositing/shared-backing/overlap-after-end-sharing.html 168 169 * rendering/RenderLayer.cpp: 170 (WebCore::RenderLayer::calculateClipRects const): 171 (WebCore::outputPaintOrderTreeLegend): 172 (WebCore::outputPaintOrderTreeRecursive): 173 * rendering/RenderLayer.h: 174 * rendering/RenderLayerCompositor.cpp: 175 (WebCore::RenderLayerCompositor::computeCompositingRequirements): 176 (WebCore::RenderLayerCompositor::updateBacking): 177 (WebCore::RenderLayerCompositor::requiresOwnBackingStore const): 178 (WebCore::RenderLayerCompositor::reasonsForCompositing const): 179 (WebCore::RenderLayerCompositor::requiresCompositingForIndirectReason const): 180 * rendering/RenderLayerCompositor.h: 149 181 150 182 2019-05-17 Simon Fraser <simon.fraser@apple.com> -
trunk/Source/WebCore/rendering/RenderLayer.cpp
r245336 r245490 6888 6888 } 6889 6889 6890 TextStream& operator<<(TextStream& ts, IndirectCompositingReason reason) 6891 { 6892 switch (reason) { 6893 case IndirectCompositingReason::None: ts << "none"; break; 6894 case IndirectCompositingReason::Stacking: ts << "stacking"; break; 6895 case IndirectCompositingReason::OverflowScrollPositioning: ts << "overflow positioning"; break; 6896 case IndirectCompositingReason::Overlap: ts << "overlap"; break; 6897 case IndirectCompositingReason::BackgroundLayer: ts << "background layer"; break; 6898 case IndirectCompositingReason::GraphicalEffect: ts << "graphical effect"; break; 6899 case IndirectCompositingReason::Perspective: ts << "perspective"; break; 6900 case IndirectCompositingReason::Preserve3D: ts << "preserve-3d"; break; 6901 } 6902 6903 return ts; 6904 } 6905 6890 6906 } // namespace WebCore 6891 6907 … … 6922 6938 { 6923 6939 stream.nextLine(); 6924 stream << "(S)tacking Context/(F)orced SC/O(P)portunistic SC, (N)ormal flow only, (O)verflow clip, (A)lpha (opacity or mask), has (B)lend mode, (I)solates blending, (T)ransform-ish, (F)ilter, Fi(X)ed position, (C)omposited, (P)rovides backing/uses (p)rovided backing , (c)omposited descendant, (s)scrolling ancestor\n"6940 stream << "(S)tacking Context/(F)orced SC/O(P)portunistic SC, (N)ormal flow only, (O)verflow clip, (A)lpha (opacity or mask), has (B)lend mode, (I)solates blending, (T)ransform-ish, (F)ilter, Fi(X)ed position, (C)omposited, (P)rovides backing/uses (p)rovided backing/paints to (a)ncestor, (c)omposited descendant, (s)scrolling ancestor\n" 6925 6941 "Dirty (z)-lists, Dirty (n)ormal flow lists\n" 6926 6942 "Traversal needs: requirements (t)raversal on descendants, (b)acking or hierarchy traversal on descendants, (r)equirements traversal on all descendants, requirements traversal on all (s)ubsequent layers, (h)ierarchy traversal on all descendants, update of paint (o)rder children\n" … … 6948 6964 stream << (layer.renderer().isFixedPositioned() ? "X" : "-"); 6949 6965 stream << (layer.isComposited() ? "C" : "-"); 6950 stream << ((layer.isComposited() && layer.backing()->hasBackingSharingLayers()) ? "P" : (layer.paintsIntoProvidedBacking() ? "p" : "-")); 6966 6967 auto compositedPaintingDestinationString = [&layer]() { 6968 if (layer.paintsIntoProvidedBacking()) 6969 return "p"; 6970 6971 if (!layer.isComposited()) 6972 return "-"; 6973 6974 if (layer.backing()->hasBackingSharingLayers()) 6975 return "P"; 6976 6977 if (layer.backing()->paintsIntoCompositedAncestor()) 6978 return "a"; 6979 6980 return "-"; 6981 }; 6982 6983 stream << compositedPaintingDestinationString(); 6951 6984 stream << (layer.hasCompositingDescendant() ? "c" : "-"); 6952 6985 stream << (layer.hasCompositedScrollingAncestor() ? "s" : "-"); … … 6987 7020 auto& backing = *layer.backing(); 6988 7021 stream << " (layerID " << backing.graphicsLayer()->primaryLayerID() << ")"; 7022 7023 if (layer.indirectCompositingReason() != WebCore::IndirectCompositingReason::None) 7024 stream << " " << layer.indirectCompositingReason(); 6989 7025 6990 7026 auto scrollingNodeID = backing.scrollingNodeIDForRole(WebCore::ScrollCoordinationRole::Scrolling); -
trunk/Source/WebCore/rendering/RenderLayer.h
r245293 r245490 118 118 }; 119 119 120 enum class IndirectCompositingReason { 121 None, 122 Stacking, 123 OverflowScrollPositioning, 124 Overlap, 125 BackgroundLayer, 126 GraphicalEffect, // opacity, mask, filter, transform etc. 127 Perspective, 128 Preserve3D 129 }; 130 120 131 struct ScrollRectToVisibleOptions { 121 132 SelectionRevealMode revealMode { SelectionRevealMode::Reveal }; … … 871 882 void setViewportConstrainedNotCompositedReason(ViewportConstrainedNotCompositedReason reason) { m_viewportConstrainedNotCompositedReason = reason; } 872 883 ViewportConstrainedNotCompositedReason viewportConstrainedNotCompositedReason() const { return static_cast<ViewportConstrainedNotCompositedReason>(m_viewportConstrainedNotCompositedReason); } 873 884 885 IndirectCompositingReason indirectCompositingReason() const { return static_cast<IndirectCompositingReason>(m_indirectCompositingReason); } 886 874 887 bool isRenderFragmentedFlow() const { return renderer().isRenderFragmentedFlow(); } 875 888 bool isOutOfFlowRenderFragmentedFlow() const { return renderer().isOutOfFlowRenderFragmentedFlow(); } … … 1158 1171 void setHasCompositingDescendant(bool b) { m_hasCompositingDescendant = b; } 1159 1172 1160 enum class IndirectCompositingReason {1161 None,1162 Stacking,1163 OverflowScrollPositioning,1164 Overlap,1165 BackgroundLayer,1166 GraphicalEffect, // opacity, mask, filter, transform etc.1167 Perspective,1168 Preserve3D1169 };1170 1171 1173 void setIndirectCompositingReason(IndirectCompositingReason reason) { m_indirectCompositingReason = static_cast<unsigned>(reason); } 1172 IndirectCompositingReason indirectCompositingReason() const { return static_cast<IndirectCompositingReason>(m_indirectCompositingReason); }1173 1174 bool mustCompositeForIndirectReasons() const { return m_indirectCompositingReason; } 1174 1175 … … 1388 1389 WTF::TextStream& operator<<(WTF::TextStream&, const RenderLayer&); 1389 1390 WTF::TextStream& operator<<(WTF::TextStream&, const RenderLayer::ClipRectsContext&); 1391 WTF::TextStream& operator<<(WTF::TextStream&, IndirectCompositingReason); 1390 1392 1391 1393 } // namespace WebCore -
trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp
r245471 r245490 863 863 864 864 if (layer.needsPostLayoutCompositingUpdate() || compositingState.fullPaintOrderTraversalRequired || compositingState.descendantsRequireCompositingUpdate) { 865 layer.setIndirectCompositingReason( RenderLayer::IndirectCompositingReason::None);865 layer.setIndirectCompositingReason(IndirectCompositingReason::None); 866 866 willBeComposited = needsToBeComposited(layer, queryData); 867 867 } … … 878 878 overlapMap.geometryMap().pushMappingsToAncestor(&layer, ancestorLayer, respectTransforms); 879 879 880 RenderLayer::IndirectCompositingReason compositingReason = compositingState.subtreeIsCompositing ? RenderLayer::IndirectCompositingReason::Stacking : RenderLayer::IndirectCompositingReason::None;880 IndirectCompositingReason compositingReason = compositingState.subtreeIsCompositing ? IndirectCompositingReason::Stacking : IndirectCompositingReason::None; 881 881 bool layerPaintsIntoProvidedBacking = false; 882 882 … … 890 890 backingSharingState.appendSharingLayer(layer); 891 891 LOG(Compositing, " layer %p can share with %p", &layer, backingSharingState.backingProviderCandidate()); 892 compositingReason = RenderLayer::IndirectCompositingReason::None;892 compositingReason = IndirectCompositingReason::None; 893 893 layerPaintsIntoProvidedBacking = true; 894 894 } else 895 compositingReason = RenderLayer::IndirectCompositingReason::Overlap;895 compositingReason = IndirectCompositingReason::Overlap; 896 896 } else 897 compositingReason = RenderLayer::IndirectCompositingReason::None;897 compositingReason = IndirectCompositingReason::None; 898 898 } 899 899 … … 904 904 // own layers to draw on top of the accelerated video. 905 905 if (compositingState.compositingAncestor && compositingState.compositingAncestor->renderer().isVideo()) 906 compositingReason = RenderLayer::IndirectCompositingReason::Overlap;907 #endif 908 909 if (compositingReason != RenderLayer::IndirectCompositingReason::None)906 compositingReason = IndirectCompositingReason::Overlap; 907 #endif 908 909 if (compositingReason != IndirectCompositingReason::None) 910 910 layer.setIndirectCompositingReason(compositingReason); 911 911 912 912 // Check if the computed indirect reason will force the layer to become composited. 913 913 if (!willBeComposited && layer.mustCompositeForIndirectReasons() && canBeComposited(layer)) { 914 LOG_WITH_STREAM(Compositing, stream << "layer " << &layer << " compositing for indirect reason " << layer.indirectCompositingReason() << " (was sharing: " << layerPaintsIntoProvidedBacking << ")"); 914 915 willBeComposited = true; 915 916 layerPaintsIntoProvidedBacking = false; … … 928 929 currentState.compositingAncestor = &layer; 929 930 930 if (!layerPaintsIntoProvidedBacking) { 931 if (layerPaintsIntoProvidedBacking) { 932 layerPaintsIntoProvidedBacking = false; 933 // layerPaintsIntoProvidedBacking was only true for layers that would otherwise composite because of overlap. If we can 934 // no longer share, put this this indirect reason back on the layer so that requiresOwnBackingStore() sees it. 935 layer.setIndirectCompositingReason(IndirectCompositingReason::Overlap); 936 LOG_WITH_STREAM(CompositingOverlap, stream << "layer " << &layer << " was sharing now will composite"); 937 } else { 931 938 overlapMap.pushCompositingContainer(); 932 939 LOG_WITH_STREAM(CompositingOverlap, stream << "layer " << &layer << " will composite, pushed container " << overlapMap); … … 934 941 935 942 willBeComposited = true; 936 layerPaintsIntoProvidedBacking = false;937 943 }; 938 944 … … 972 978 if (!willBeComposited && currentState.subtreeIsCompositing) { 973 979 // make layer compositing 974 layer.setIndirectCompositingReason( RenderLayer::IndirectCompositingReason::BackgroundLayer);980 layer.setIndirectCompositingReason(IndirectCompositingReason::BackgroundLayer); 975 981 layerWillComposite(); 976 982 } … … 1000 1006 #endif 1001 1007 // Now check for reasons to become composited that depend on the state of descendant layers. 1002 RenderLayer::IndirectCompositingReason indirectCompositingReason;1008 IndirectCompositingReason indirectCompositingReason; 1003 1009 if (!willBeComposited && canBeComposited(layer) 1004 1010 && requiresCompositingForIndirectReason(layer, compositingState.compositingAncestor, currentState.subtreeIsCompositing, anyDescendantHas3DTransform, layerPaintsIntoProvidedBacking, indirectCompositingReason)) { … … 1009 1015 if (layer.reflectionLayer()) { 1010 1016 // FIXME: Shouldn't we call computeCompositingRequirements to handle a reflection overlapping with another renderer? 1011 layer.reflectionLayer()->setIndirectCompositingReason(willBeComposited ? RenderLayer::IndirectCompositingReason::Stacking : RenderLayer::IndirectCompositingReason::None);1017 layer.reflectionLayer()->setIndirectCompositingReason(willBeComposited ? IndirectCompositingReason::Stacking : IndirectCompositingReason::None); 1012 1018 } 1013 1019 … … 1584 1590 // If we need to repaint, do so before making backing 1585 1591 if (shouldRepaint == CompositingChangeRepaintNow) 1586 repaintOnCompositingChange(layer); 1592 repaintOnCompositingChange(layer); // wrong backing 1587 1593 1588 1594 layer.ensureBacking(); … … 2283 2289 2284 2290 if (layer.mustCompositeForIndirectReasons()) { 2285 RenderLayer::IndirectCompositingReason reason = layer.indirectCompositingReason();2286 return reason == RenderLayer::IndirectCompositingReason::Overlap2287 || reason == RenderLayer::IndirectCompositingReason::OverflowScrollPositioning2288 || reason == RenderLayer::IndirectCompositingReason::Stacking2289 || reason == RenderLayer::IndirectCompositingReason::BackgroundLayer2290 || reason == RenderLayer::IndirectCompositingReason::GraphicalEffect2291 || reason == RenderLayer::IndirectCompositingReason::Preserve3D; // preserve-3d has to create backing store to ensure that 3d-transformed elements intersect.2291 IndirectCompositingReason reason = layer.indirectCompositingReason(); 2292 return reason == IndirectCompositingReason::Overlap 2293 || reason == IndirectCompositingReason::OverflowScrollPositioning 2294 || reason == IndirectCompositingReason::Stacking 2295 || reason == IndirectCompositingReason::BackgroundLayer 2296 || reason == IndirectCompositingReason::GraphicalEffect 2297 || reason == IndirectCompositingReason::Preserve3D; // preserve-3d has to create backing store to ensure that 3d-transformed elements intersect. 2292 2298 } 2293 2299 … … 2348 2354 2349 2355 switch (renderer.layer()->indirectCompositingReason()) { 2350 case RenderLayer::IndirectCompositingReason::None:2356 case IndirectCompositingReason::None: 2351 2357 break; 2352 case RenderLayer::IndirectCompositingReason::Stacking:2358 case IndirectCompositingReason::Stacking: 2353 2359 reasons.add(CompositingReason::Stacking); 2354 2360 break; 2355 case RenderLayer::IndirectCompositingReason::OverflowScrollPositioning:2361 case IndirectCompositingReason::OverflowScrollPositioning: 2356 2362 reasons.add(CompositingReason::OverflowScrollPositioning); 2357 2363 break; 2358 case RenderLayer::IndirectCompositingReason::Overlap:2364 case IndirectCompositingReason::Overlap: 2359 2365 reasons.add(CompositingReason::Overlap); 2360 2366 break; 2361 case RenderLayer::IndirectCompositingReason::BackgroundLayer:2367 case IndirectCompositingReason::BackgroundLayer: 2362 2368 reasons.add(CompositingReason::NegativeZIndexChildren); 2363 2369 break; 2364 case RenderLayer::IndirectCompositingReason::GraphicalEffect:2370 case IndirectCompositingReason::GraphicalEffect: 2365 2371 if (renderer.hasTransform()) 2366 2372 reasons.add(CompositingReason::TransformWithCompositedDescendants); … … 2386 2392 #endif 2387 2393 break; 2388 case RenderLayer::IndirectCompositingReason::Perspective:2394 case IndirectCompositingReason::Perspective: 2389 2395 reasons.add(CompositingReason::Perspective); 2390 2396 break; 2391 case RenderLayer::IndirectCompositingReason::Preserve3D:2397 case IndirectCompositingReason::Preserve3D: 2392 2398 reasons.add(CompositingReason::Preserve3D); 2393 2399 break; … … 2830 2836 2831 2837 // FIXME: why doesn't this handle the clipping cases? 2832 bool RenderLayerCompositor::requiresCompositingForIndirectReason(const RenderLayer& layer, const RenderLayer* compositingAncestor, bool hasCompositedDescendants, bool has3DTransformedDescendants, bool paintsIntoProvidedBacking, RenderLayer::IndirectCompositingReason& reason) const2838 bool RenderLayerCompositor::requiresCompositingForIndirectReason(const RenderLayer& layer, const RenderLayer* compositingAncestor, bool hasCompositedDescendants, bool has3DTransformedDescendants, bool paintsIntoProvidedBacking, IndirectCompositingReason& reason) const 2833 2839 { 2834 2840 // When a layer has composited descendants, some effects, like 2d transforms, filters, masks etc must be implemented … … 2836 2842 auto& renderer = layer.renderer(); 2837 2843 if (hasCompositedDescendants && (layer.isolatesCompositedBlending() || layer.transform() || renderer.createsGroup() || renderer.hasReflection())) { 2838 reason = RenderLayer::IndirectCompositingReason::GraphicalEffect;2844 reason = IndirectCompositingReason::GraphicalEffect; 2839 2845 return true; 2840 2846 } … … 2844 2850 if (has3DTransformedDescendants) { 2845 2851 if (renderer.style().transformStyle3D() == TransformStyle3D::Preserve3D) { 2846 reason = RenderLayer::IndirectCompositingReason::Preserve3D;2852 reason = IndirectCompositingReason::Preserve3D; 2847 2853 return true; 2848 2854 } 2849 2855 2850 2856 if (renderer.style().hasPerspective()) { 2851 reason = RenderLayer::IndirectCompositingReason::Perspective;2857 reason = IndirectCompositingReason::Perspective; 2852 2858 return true; 2853 2859 } … … 2856 2862 if (!paintsIntoProvidedBacking && renderer.isAbsolutelyPositioned() && compositingAncestor && layer.hasCompositedScrollingAncestor()) { 2857 2863 if (layerContainingBlockCrossesCoordinatedScrollingBoundary(layer, *compositingAncestor)) { 2858 reason = RenderLayer::IndirectCompositingReason::OverflowScrollPositioning;2864 reason = IndirectCompositingReason::OverflowScrollPositioning; 2859 2865 return true; 2860 2866 } 2861 2867 } 2862 2868 2863 reason = RenderLayer::IndirectCompositingReason::None;2869 reason = IndirectCompositingReason::None; 2864 2870 return false; 2865 2871 } -
trunk/Source/WebCore/rendering/RenderLayerCompositor.h
r245373 r245490 479 479 bool requiresCompositingForOverflowScrolling(const RenderLayer&, RequiresCompositingData&) const; 480 480 bool requiresCompositingForEditableImage(RenderLayerModelObject&) const; 481 bool requiresCompositingForIndirectReason(const RenderLayer&, const RenderLayer* compositingAncestor, bool hasCompositedDescendants, bool has3DTransformedDescendants, bool paintsIntoProvidedBacking, RenderLayer::IndirectCompositingReason&) const;481 bool requiresCompositingForIndirectReason(const RenderLayer&, const RenderLayer* compositingAncestor, bool hasCompositedDescendants, bool has3DTransformedDescendants, bool paintsIntoProvidedBacking, IndirectCompositingReason&) const; 482 482 483 483 static bool layerContainingBlockCrossesCoordinatedScrollingBoundary(const RenderLayer&, const RenderLayer& compositedAncestor);
Note:
See TracChangeset
for help on using the changeset viewer.