Changeset 245421 in webkit
- Timestamp:
- May 16, 2019, 4:27:33 PM (7 years ago)
- Location:
- branches/safari-608.1.24-branch/Source/WebCore
- Files:
-
- 4 edited
-
ChangeLog (modified) (1 diff)
-
rendering/RenderLayerBacking.cpp (modified) (4 diffs)
-
rendering/RenderLayerCompositor.cpp (modified) (11 diffs)
-
rendering/RenderLayerCompositor.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
branches/safari-608.1.24-branch/Source/WebCore/ChangeLog
r245420 r245421 1 2019-05-16 Kocsen Chung <kocsen_chung@apple.com> 2 3 Revert r245218. rdar://problem/50705506 4 1 5 2019-05-16 Kocsen Chung <kocsen_chung@apple.com> 2 6 -
branches/safari-608.1.24-branch/Source/WebCore/rendering/RenderLayerBacking.cpp
r245420 r245421 261 261 compositor().removeFromScrollCoordinatedLayers(m_owningLayer); 262 262 263 LOG(Compositing, "RenderLayer(backing) %p willBeDestroyed", &m_owningLayer); 264 263 265 clearBackingSharingLayers(); 264 266 } … … 281 283 void RenderLayerBacking::setBackingSharingLayers(Vector<WeakPtr<RenderLayer>>&& sharingLayers) 282 284 { 285 if (m_backingSharingLayers == sharingLayers) { 286 sharingLayers.clear(); 287 return; 288 } 289 283 290 clearBackingSharingLayerProviders(m_backingSharingLayers); 284 291 m_backingSharingLayers = WTFMove(sharingLayers); 285 286 292 for (auto& layerWeakPtr : m_backingSharingLayers) 287 293 layerWeakPtr->setBackingProviderLayer(&m_owningLayer); … … 290 296 void RenderLayerBacking::removeBackingSharingLayer(RenderLayer& layer) 291 297 { 298 LOG(Compositing, "RenderLayer %p removeBackingSharingLayer %p", &m_owningLayer, &layer); 299 292 300 layer.setBackingProviderLayer(nullptr); 293 301 m_backingSharingLayers.removeAll(&layer); … … 296 304 void RenderLayerBacking::clearBackingSharingLayers() 297 305 { 306 LOG(Compositing, "RenderLayer %p clearBackingSharingLayers", &m_owningLayer); 307 298 308 clearBackingSharingLayerProviders(m_backingSharingLayers); 299 309 m_backingSharingLayers.clear(); -
branches/safari-608.1.24-branch/Source/WebCore/rendering/RenderLayerCompositor.cpp
r245390 r245421 285 285 }; 286 286 287 class RenderLayerCompositor::BackingSharingState { 288 WTF_MAKE_NONCOPYABLE(BackingSharingState); 289 public: 290 BackingSharingState() = default; 291 292 RenderLayer* backingProviderCandidate() const { return m_backingProviderCandidate; }; 293 294 void appendSharingLayer(RenderLayer& layer) 287 struct RenderLayerCompositor::BackingSharingState { 288 RenderLayer* backingProviderCandidate { nullptr }; 289 RenderLayer* backingProviderStackingContext { nullptr }; 290 Vector<WeakPtr<RenderLayer>> backingSharingLayers; 291 292 void resetBackingProviderCandidate(RenderLayer* candidateLayer = nullptr, RenderLayer* candidateStackingContext = nullptr) 295 293 { 296 LOG_WITH_STREAM(Compositing, stream << &layer << " appendSharingLayer " << &layer << " for backing provider " << m_backingProviderCandidate); 297 m_backingSharingLayers.append(makeWeakPtr(layer)); 298 } 299 300 void updateBeforeDescendantTraversal(RenderLayer&, bool willBeComposited); 301 void updateAfterDescendantTraversal(RenderLayer&, RenderLayer* stackingContextAncestor); 302 303 private: 304 void layerWillBeComposited(RenderLayer&); 305 306 void startBackingSharingSequence(RenderLayer& candidateLayer, RenderLayer* candidateStackingContext); 307 void endBackingSharingSequence(); 308 309 RenderLayer* m_backingProviderCandidate { nullptr }; 310 RenderLayer* m_backingProviderStackingContext { nullptr }; 311 Vector<WeakPtr<RenderLayer>> m_backingSharingLayers; 294 if (!backingSharingLayers.isEmpty()) { 295 ASSERT(backingProviderCandidate); 296 backingProviderCandidate->backing()->setBackingSharingLayers(WTFMove(backingSharingLayers)); 297 } 298 backingProviderCandidate = candidateLayer; 299 backingProviderStackingContext = candidateLayer ? candidateStackingContext : nullptr; 300 } 312 301 }; 313 314 void RenderLayerCompositor::BackingSharingState::startBackingSharingSequence(RenderLayer& candidateLayer, RenderLayer* candidateStackingContext)315 {316 ASSERT(!m_backingProviderCandidate);317 ASSERT(m_backingSharingLayers.isEmpty());318 319 m_backingProviderCandidate = &candidateLayer;320 m_backingProviderStackingContext = candidateStackingContext;321 }322 323 void RenderLayerCompositor::BackingSharingState::endBackingSharingSequence()324 {325 if (m_backingProviderCandidate) {326 m_backingProviderCandidate->backing()->setBackingSharingLayers(WTFMove(m_backingSharingLayers));327 m_backingSharingLayers.clear();328 }329 330 m_backingProviderCandidate = nullptr;331 }332 333 void RenderLayerCompositor::BackingSharingState::updateBeforeDescendantTraversal(RenderLayer& layer, bool willBeComposited)334 {335 layer.setBackingProviderLayer(nullptr);336 337 // A layer that composites resets backing-sharing, since subsequent layers need to composite to overlap it.338 if (willBeComposited) {339 m_backingSharingLayers.removeAll(&layer);340 LOG_WITH_STREAM(Compositing, stream << "Pre-descendant compositing of " << &layer << ", ending sharing sequence for " << m_backingProviderCandidate << " with " << m_backingSharingLayers.size() << " sharing layers");341 endBackingSharingSequence();342 }343 }344 345 void RenderLayerCompositor::BackingSharingState::updateAfterDescendantTraversal(RenderLayer& layer, RenderLayer* stackingContextAncestor)346 {347 if (layer.isComposited()) {348 // If this layer is being composited, clean up sharing-related state.349 layer.disconnectFromBackingProviderLayer();350 m_backingSharingLayers.removeAll(&layer);351 }352 353 if (m_backingProviderCandidate && &layer == m_backingProviderStackingContext) {354 LOG_WITH_STREAM(Compositing, stream << "End of stacking context for backing provider " << m_backingProviderCandidate << ", ending sharing sequence with " << m_backingSharingLayers.size() << " sharing layers");355 endBackingSharingSequence();356 } else if (!m_backingProviderCandidate && layer.isComposited()) {357 LOG_WITH_STREAM(Compositing, stream << "Post-descendant compositing of " << &layer << ", ending sharing sequence for " << m_backingProviderCandidate << " with " << m_backingSharingLayers.size() << " sharing layers");358 endBackingSharingSequence();359 startBackingSharingSequence(layer, stackingContextAncestor);360 }361 362 if (&layer != m_backingProviderCandidate && layer.isComposited())363 layer.backing()->clearBackingSharingLayers();364 }365 302 366 303 struct RenderLayerCompositor::OverlapExtent { … … 944 881 945 882 #if ENABLE(TREE_DEBUGGING) 946 LOG(Compositing, "%*p %s computeCompositingRequirements (backing provider candidate %p)", 12 + compositingState.depth * 2, &layer, layer.isNormalFlowOnly() ? "n" : "s", backingSharingState.backingProviderCandidate ());883 LOG(Compositing, "%*p %s computeCompositingRequirements (backing provider candidate %p)", 12 + compositingState.depth * 2, &layer, layer.isNormalFlowOnly() ? "n" : "s", backingSharingState.backingProviderCandidate); 947 884 #endif 948 885 … … 955 892 956 893 layer.setHasCompositingDescendant(false); 894 layer.setBackingProviderLayer(nullptr); 957 895 958 896 // We updated compositing for direct reasons in layerStyleChanged(). Here, check for compositing that can only be evaluated after layout. … … 984 922 // If we're testing for overlap, we only need to composite if we overlap something that is already composited. 985 923 if (overlapMap.overlapsLayers(layerExtent.bounds)) { 986 if (backingSharingState.backingProviderCandidate () && canBeComposited(layer) && backingProviderLayerCanIncludeLayer(*backingSharingState.backingProviderCandidate(), layer)) {987 backingSharingState. appendSharingLayer(layer);988 LOG(Compositing, " layer %p can share with %p", &layer, backingSharingState.backingProviderCandidate ());924 if (backingSharingState.backingProviderCandidate && canBeComposited(layer) && backingProviderLayerCanIncludeLayer(*backingSharingState.backingProviderCandidate, layer)) { 925 backingSharingState.backingSharingLayers.append(makeWeakPtr(layer)); 926 LOG(Compositing, " layer %p can share with %p", &layer, backingSharingState.backingProviderCandidate); 989 927 compositingReason = RenderLayer::IndirectCompositingReason::None; 990 928 layerPaintsIntoProvidedBacking = true; … … 1030 968 childState.testingOverlap = true; 1031 969 willBeComposited = true; 970 1032 971 layerPaintsIntoProvidedBacking = false; 972 layer.disconnectFromBackingProviderLayer(); 973 backingSharingState.backingSharingLayers.removeAll(&layer); 1033 974 }; 1034 975 … … 1043 984 // Too hard to compute animated bounds if both us and some ancestor is animating transform. 1044 985 layerExtent.animationCausesExtentUncertainty |= layerExtent.hasTransformAnimation && compositingState.ancestorHasTransformAnimation; 986 987 // Compositing for any reason disables backing sharing. 988 LOG_WITH_STREAM(Compositing, stream << &layer << " is compositing - flushing sharing to " << backingSharingState.backingProviderCandidate << " with " << backingSharingState.backingSharingLayers.size() << " sharing layers"); 989 backingSharingState.resetBackingProviderCandidate(); 1045 990 } else if (layerPaintsIntoProvidedBacking) { 1046 991 childState.backingSharingAncestor = &layer; 1047 992 overlapMap.pushCompositingContainer(); 1048 993 } 1049 1050 backingSharingState.updateBeforeDescendantTraversal(layer, willBeComposited);1051 994 1052 995 #if !ASSERT_DISABLED … … 1158 1101 // The composited bounds of enclosing layers depends on which descendants are composited, so they need a geometry update. 1159 1102 layer.setNeedsCompositingGeometryUpdateOnAncestors(); 1160 } 1161 1162 backingSharingState.updateAfterDescendantTraversal(layer, compositingState.stackingContextAncestor); 1103 } else if (layer.isComposited()) 1104 layer.backing()->clearBackingSharingLayers(); 1105 1106 if (backingSharingState.backingProviderCandidate && &layer == backingSharingState.backingProviderStackingContext) { 1107 LOG_WITH_STREAM(Compositing, stream << &layer << " popping stacking context " << backingSharingState.backingProviderStackingContext << ", flushing candidate " << backingSharingState.backingProviderCandidate << " with " << backingSharingState.backingSharingLayers.size() << " sharing layers"); 1108 backingSharingState.resetBackingProviderCandidate(); 1109 } else if (!backingSharingState.backingProviderCandidate && layer.isComposited()) { 1110 LOG_WITH_STREAM(Compositing, stream << &layer << " compositing - sharing candidate " << backingSharingState.backingProviderCandidate << " with " << backingSharingState.backingSharingLayers.size() << " sharing layers"); 1111 // Flush out any earlier candidate in this stacking context. This layer becomes a candidate. 1112 backingSharingState.resetBackingProviderCandidate(&layer, compositingState.stackingContextAncestor); 1113 } 1163 1114 1164 1115 if (layer.reflectionLayer() && updateLayerCompositingState(*layer.reflectionLayer(), queryData, CompositingChangeRepaintNow)) … … 1174 1125 1175 1126 #if ENABLE(TREE_DEBUGGING) 1176 LOG(Compositing, "%*p computeCompositingRequirements - willBeComposited %d (backing provider candidate %p)", 12 + compositingState.depth * 2, &layer, willBeComposited, backingSharingState.backingProviderCandidate ());1127 LOG(Compositing, "%*p computeCompositingRequirements - willBeComposited %d (backing provider candidate %p)", 12 + compositingState.depth * 2, &layer, willBeComposited, backingSharingState.backingProviderCandidate); 1177 1128 #endif 1178 1129 … … 1210 1161 1211 1162 if (layer.paintsIntoProvidedBacking()) { 1212 ASSERT(backingSharingState.backingProviderCandidate ());1213 ASSERT(backingProviderLayerCanIncludeLayer(*backingSharingState.backingProviderCandidate (), layer));1214 backingSharingState. appendSharingLayer(layer);1163 ASSERT(backingSharingState.backingProviderCandidate); 1164 ASSERT(backingProviderLayerCanIncludeLayer(*backingSharingState.backingProviderCandidate, layer)); 1165 backingSharingState.backingSharingLayers.append(makeWeakPtr(layer)); 1215 1166 } 1216 1167 … … 1232 1183 // Too hard to compute animated bounds if both us and some ancestor is animating transform. 1233 1184 layerExtent.animationCausesExtentUncertainty |= layerExtent.hasTransformAnimation && compositingState.ancestorHasTransformAnimation; 1234 } 1235 1236 backingSharingState.updateBeforeDescendantTraversal(layer, layerIsComposited); 1185 1186 // Compositing for any reason disables backing sharing. 1187 LOG_WITH_STREAM(Compositing, stream << "tus: " << &layer << " is compositing - flushing sharing to " << backingSharingState.backingProviderCandidate << " with " << backingSharingState.backingSharingLayers.size() << " sharing layers"); 1188 backingSharingState.resetBackingProviderCandidate(); 1189 } 1237 1190 1238 1191 #if !ASSERT_DISABLED … … 1288 1241 overlapMap.popCompositingContainer(); 1289 1242 1290 backingSharingState.updateAfterDescendantTraversal(layer, compositingState.stackingContextAncestor); 1243 if (layer.isComposited()) 1244 layer.backing()->clearBackingSharingLayers(); 1245 1246 if (backingSharingState.backingProviderCandidate && &layer == backingSharingState.backingProviderStackingContext) { 1247 LOG_WITH_STREAM(Compositing, stream << &layer << " tus: popping stacking context " << backingSharingState.backingProviderStackingContext << ", flushing candidate " << backingSharingState.backingProviderCandidate << " with " << backingSharingState.backingSharingLayers.size() << " sharing layers"); 1248 backingSharingState.resetBackingProviderCandidate(); 1249 } else if (!backingSharingState.backingProviderCandidate && layer.isComposited()) { 1250 LOG_WITH_STREAM(Compositing, stream << &layer << " tus: compositing - sharing candidate " << backingSharingState.backingProviderCandidate << " with " << backingSharingState.backingSharingLayers.size() << " sharing layers"); 1251 // Flush out any earlier candidate in this stacking context. This layer becomes a candidate. 1252 backingSharingState.resetBackingProviderCandidate(&layer, compositingState.stackingContextAncestor); 1253 } 1291 1254 1292 1255 descendantHas3DTransform |= anyDescendantHas3DTransform || layer.has3DTransform(); -
branches/safari-608.1.24-branch/Source/WebCore/rendering/RenderLayerCompositor.h
r245390 r245421 368 368 369 369 private: 370 class BackingSharingState;371 370 class OverlapMap; 372 371 struct CompositingState; 372 struct BackingSharingState; 373 373 struct OverlapExtent; 374 374
Note:
See TracChangeset
for help on using the changeset viewer.