Changeset 181247 in webkit
- Timestamp:
- Mar 8, 2015 4:39:16 PM (9 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r181245 r181247 1 2015-03-08 Simon Fraser <simon.fraser@apple.com> 2 3 Don't call RenderLayerCompositor::needsToBeComposited() so many times 4 https://bugs.webkit.org/show_bug.cgi?id=142441 5 6 Reviewed by Brent Fulgham. 7 8 Save one call to needsToBeComposited() per RenderLayer while rebuilding compositing 9 layers, and a call to isRunningAcceleratedTransformAnimation() in some cases. 10 11 computeCompositingRequirements() already knows if the layer will be composited, so 12 pass that to updateBacking() in the form of a "yes/no/don't" know enum. However, 13 since updateBacking() no longer calls needsToBeComposited(), we need to call 14 requiresCompositingForPosition() to get the viewportConstrainedNotCompositedReason flags. 15 16 isRunningAcceleratedTransformAnimation() will only be true for a layer which has a 17 direct compositing reason, so only call isRunningAcceleratedTransformAnimation() 18 in that case. 19 20 * rendering/RenderLayerCompositor.cpp: 21 (WebCore::rendererForCompositingTests): 22 (WebCore::RenderLayerCompositor::updateBacking): 23 (WebCore::RenderLayerCompositor::computeCompositingRequirements): 24 (WebCore::RenderLayerCompositor::requiresCompositingLayer): Use references. 25 (WebCore::RenderLayerCompositor::reasonsForCompositing): Use references. 26 * rendering/RenderLayerCompositor.h: 27 1 28 2015-03-08 Simon Fraser <simon.fraser@apple.com> 2 29 -
trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp
r181245 r181247 944 944 } 945 945 946 bool RenderLayerCompositor::updateBacking(RenderLayer& layer, CompositingChangeRepaint shouldRepaint) 946 static RenderLayerModelObject& rendererForCompositingTests(const RenderLayer& layer) 947 { 948 RenderLayerModelObject* renderer = &layer.renderer(); 949 950 // The compositing state of a reflection should match that of its reflected layer. 951 if (layer.isReflection()) 952 renderer = downcast<RenderLayerModelObject>(renderer->parent()); // The RenderReplica's parent is the object being reflected. 953 954 return *renderer; 955 } 956 957 bool RenderLayerCompositor::updateBacking(RenderLayer& layer, CompositingChangeRepaint shouldRepaint, BackingRequired backingRequired) 947 958 { 948 959 bool layerChanged = false; 949 960 RenderLayer::ViewportConstrainedNotCompositedReason viewportConstrainedNotCompositedReason = RenderLayer::NoNotCompositedReason; 950 961 951 if (needsToBeComposited(layer, &viewportConstrainedNotCompositedReason)) { 962 if (backingRequired == BackingRequired::Unknown) 963 backingRequired = needsToBeComposited(layer, &viewportConstrainedNotCompositedReason) ? BackingRequired::Yes : BackingRequired::No; 964 else { 965 // Need to fetch viewportConstrainedNotCompositedReason, but without doing all the work that needsToBeComposited does. 966 requiresCompositingForPosition(rendererForCompositingTests(layer), layer, &viewportConstrainedNotCompositedReason); 967 } 968 969 if (backingRequired == BackingRequired::Yes) { 952 970 enableCompositingMode(); 953 971 … … 1244 1262 layer.setIndirectCompositingReason(RenderLayer::IndirectCompositingReason::None); 1245 1263 1246 // Check if the layer needs to be composited for non-indirect reasons (ex. 3D transform).1247 // We use this value to avoid checking the overlap -map, if we know for sure the layer1264 // Check if the layer needs to be composited for direct reasons (e.g. 3D transform). 1265 // We use this value to avoid checking the overlap map, if we know for sure the layer 1248 1266 // is already going to be composited for other reasons. 1249 1267 bool willBeComposited = needsToBeComposited(layer); 1268 bool mayHaveAnimatedTransform = willBeComposited && !layer.isRootLayer(); 1250 1269 1251 1270 RenderLayer::IndirectCompositingReason compositingReason = compositingState.subtreeIsCompositing ? RenderLayer::IndirectCompositingReason::Stacking : RenderLayer::IndirectCompositingReason::None; … … 1397 1416 // Note that if the layer clips its descendants, there's no reason to propagate the child animation to the parent layers. That's because 1398 1417 // we know for sure the animation is contained inside the clipping rectangle, which is already added to the overlap map. 1399 if ((!childState.testingOverlap && !isCompositedClippingLayer) || isRunningAcceleratedTransformAnimation(layer.renderer()))1418 if ((!childState.testingOverlap && !isCompositedClippingLayer) || (mayHaveAnimatedTransform && isRunningAcceleratedTransformAnimation(layer.renderer()))) 1400 1419 compositingState.testingOverlap = false; 1401 1420 … … 1435 1454 1436 1455 // Update backing now, so that we can use isComposited() reliably during tree traversal in rebuildCompositingLayerTree(). 1437 if (updateBacking(layer, CompositingChangeRepaintNow ))1456 if (updateBacking(layer, CompositingChangeRepaintNow, willBeComposited ? BackingRequired::Yes : BackingRequired::No)) 1438 1457 layersChanged = true; 1439 1458 … … 2137 2156 bool RenderLayerCompositor::requiresCompositingLayer(const RenderLayer& layer, RenderLayer::ViewportConstrainedNotCompositedReason* viewportConstrainedNotCompositedReason) const 2138 2157 { 2139 auto* renderer = &layer.renderer(); 2140 2141 // The compositing state of a reflection should match that of its reflected layer. 2142 if (layer.isReflection()) 2143 renderer = downcast<RenderLayerModelObject>(renderer->parent()); // The RenderReplica's parent is the object being reflected. 2158 auto& renderer = rendererForCompositingTests(layer); 2144 2159 2145 2160 // The root layer always has a compositing layer, but it may not have backing. 2146 return requiresCompositingForTransform( *renderer)2147 || requiresCompositingForVideo( *renderer)2148 || requiresCompositingForCanvas( *renderer)2149 || requiresCompositingForPlugin( *renderer)2150 || requiresCompositingForFrame( *renderer)2151 || requiresCompositingForBackfaceVisibility( *renderer)2152 || clipsCompositingDescendants(*renderer ->layer())2153 || requiresCompositingForAnimation( *renderer)2154 || requiresCompositingForFilters( *renderer)2155 || requiresCompositingForPosition( *renderer, *renderer->layer(), viewportConstrainedNotCompositedReason)2161 return requiresCompositingForTransform(renderer) 2162 || requiresCompositingForVideo(renderer) 2163 || requiresCompositingForCanvas(renderer) 2164 || requiresCompositingForPlugin(renderer) 2165 || requiresCompositingForFrame(renderer) 2166 || requiresCompositingForBackfaceVisibility(renderer) 2167 || clipsCompositingDescendants(*renderer.layer()) 2168 || requiresCompositingForAnimation(renderer) 2169 || requiresCompositingForFilters(renderer) 2170 || requiresCompositingForPosition(renderer, *renderer.layer(), viewportConstrainedNotCompositedReason) 2156 2171 #if PLATFORM(IOS) 2157 || requiresCompositingForScrolling(*renderer ->layer())2158 #endif 2159 || requiresCompositingForOverflowScrolling(*renderer ->layer());2172 || requiresCompositingForScrolling(*renderer.layer()) 2173 #endif 2174 || requiresCompositingForOverflowScrolling(*renderer.layer()); 2160 2175 } 2161 2176 … … 2230 2245 return reasons; 2231 2246 2232 auto* renderer = &layer.renderer(); 2233 if (layer.isReflection()) 2234 renderer = downcast<RenderLayerModelObject>(renderer->parent()); 2235 2236 if (requiresCompositingForTransform(*renderer)) 2247 auto& renderer = rendererForCompositingTests(layer); 2248 2249 if (requiresCompositingForTransform(renderer)) 2237 2250 reasons |= CompositingReason3DTransform; 2238 2251 2239 if (requiresCompositingForVideo( *renderer))2252 if (requiresCompositingForVideo(renderer)) 2240 2253 reasons |= CompositingReasonVideo; 2241 else if (requiresCompositingForCanvas( *renderer))2254 else if (requiresCompositingForCanvas(renderer)) 2242 2255 reasons |= CompositingReasonCanvas; 2243 else if (requiresCompositingForPlugin( *renderer))2256 else if (requiresCompositingForPlugin(renderer)) 2244 2257 reasons |= CompositingReasonPlugin; 2245 else if (requiresCompositingForFrame( *renderer))2258 else if (requiresCompositingForFrame(renderer)) 2246 2259 reasons |= CompositingReasonIFrame; 2247 2260 2248 if ((canRender3DTransforms() && renderer ->style().backfaceVisibility() == BackfaceVisibilityHidden))2261 if ((canRender3DTransforms() && renderer.style().backfaceVisibility() == BackfaceVisibilityHidden)) 2249 2262 reasons |= CompositingReasonBackfaceVisibilityHidden; 2250 2263 2251 if (clipsCompositingDescendants(*renderer ->layer()))2264 if (clipsCompositingDescendants(*renderer.layer())) 2252 2265 reasons |= CompositingReasonClipsCompositingDescendants; 2253 2266 2254 if (requiresCompositingForAnimation( *renderer))2267 if (requiresCompositingForAnimation(renderer)) 2255 2268 reasons |= CompositingReasonAnimation; 2256 2269 2257 if (requiresCompositingForFilters( *renderer))2270 if (requiresCompositingForFilters(renderer)) 2258 2271 reasons |= CompositingReasonFilters; 2259 2272 2260 if (requiresCompositingForPosition( *renderer, *renderer->layer()))2261 reasons |= renderer ->style().position() == FixedPosition ? CompositingReasonPositionFixed : CompositingReasonPositionSticky;2273 if (requiresCompositingForPosition(renderer, *renderer.layer())) 2274 reasons |= renderer.style().position() == FixedPosition ? CompositingReasonPositionFixed : CompositingReasonPositionSticky; 2262 2275 2263 2276 #if PLATFORM(IOS) 2264 if (requiresCompositingForScrolling(*renderer ->layer()))2277 if (requiresCompositingForScrolling(*renderer.layer())) 2265 2278 reasons |= CompositingReasonOverflowScrollingTouch; 2266 2279 #endif 2267 2280 2268 if (requiresCompositingForOverflowScrolling(*renderer ->layer()))2281 if (requiresCompositingForOverflowScrolling(*renderer.layer())) 2269 2282 reasons |= CompositingReasonOverflowScrollingTouch; 2270 2283 2271 switch (renderer ->layer()->indirectCompositingReason()) {2284 switch (renderer.layer()->indirectCompositingReason()) { 2272 2285 case RenderLayer::IndirectCompositingReason::None: 2273 2286 break; … … 2282 2295 break; 2283 2296 case RenderLayer::IndirectCompositingReason::GraphicalEffect: 2284 if (renderer ->hasTransform())2297 if (renderer.hasTransform()) 2285 2298 reasons |= CompositingReasonTransformWithCompositedDescendants; 2286 2299 2287 if (renderer ->isTransparent())2300 if (renderer.isTransparent()) 2288 2301 reasons |= CompositingReasonOpacityWithCompositedDescendants; 2289 2302 2290 if (renderer ->hasMask())2303 if (renderer.hasMask()) 2291 2304 reasons |= CompositingReasonMaskWithCompositedDescendants; 2292 2305 2293 if (renderer ->hasReflection())2306 if (renderer.hasReflection()) 2294 2307 reasons |= CompositingReasonReflectionWithCompositedDescendants; 2295 2308 2296 if (renderer ->hasFilter() || renderer->hasBackdropFilter())2309 if (renderer.hasFilter() || renderer.hasBackdropFilter()) 2297 2310 reasons |= CompositingReasonFilterWithCompositedDescendants; 2298 2311 … … 2313 2326 } 2314 2327 2315 if (inCompositingMode() && renderer ->layer()->isRootLayer())2328 if (inCompositingMode() && renderer.layer()->isRootLayer()) 2316 2329 reasons |= CompositingReasonRoot; 2317 2330 -
trunk/Source/WebCore/rendering/RenderLayerCompositor.h
r181245 r181247 294 294 void setShouldReevaluateCompositingAfterLayout() { m_reevaluateCompositingAfterLayout = true; } 295 295 296 bool viewHasTransparentBackground(Color* backgroundColor = 0) const;296 bool viewHasTransparentBackground(Color* backgroundColor = nullptr) const; 297 297 298 298 bool hasNonMainLayersWithTiledBacking() const { return m_layersWithTiledBackingCount; } … … 323 323 324 324 // Whether the given RL needs a compositing layer. 325 bool needsToBeComposited(const RenderLayer&, RenderLayer::ViewportConstrainedNotCompositedReason* = 0) const;325 bool needsToBeComposited(const RenderLayer&, RenderLayer::ViewportConstrainedNotCompositedReason* = nullptr) const; 326 326 // Whether the layer has an intrinsic need for compositing layer. 327 bool requiresCompositingLayer(const RenderLayer&, RenderLayer::ViewportConstrainedNotCompositedReason* = 0) const;327 bool requiresCompositingLayer(const RenderLayer&, RenderLayer::ViewportConstrainedNotCompositedReason* = nullptr) const; 328 328 // Whether the layer could ever be composited. 329 329 bool canBeComposited(const RenderLayer&) const; 330 330 331 331 // Make or destroy the backing for this layer; returns true if backing changed. 332 bool updateBacking(RenderLayer&, CompositingChangeRepaint shouldRepaint); 332 enum class BackingRequired { No, Yes, Unknown }; 333 bool updateBacking(RenderLayer&, CompositingChangeRepaint shouldRepaint, BackingRequired = BackingRequired::Unknown); 333 334 334 335 void clearBackingForLayerIncludingDescendants(RenderLayer&); … … 411 412 bool requiresCompositingForFilters(RenderLayerModelObject&) const; 412 413 bool requiresCompositingForScrollableFrame() const; 413 bool requiresCompositingForPosition(RenderLayerModelObject&, const RenderLayer&, RenderLayer::ViewportConstrainedNotCompositedReason* = 0) const;414 bool requiresCompositingForPosition(RenderLayerModelObject&, const RenderLayer&, RenderLayer::ViewportConstrainedNotCompositedReason* = nullptr) const; 414 415 bool requiresCompositingForOverflowScrolling(const RenderLayer&) const; 415 416 bool requiresCompositingForIndirectReason(RenderLayerModelObject&, bool hasCompositedDescendants, bool has3DTransformedDescendants, RenderLayer::IndirectCompositingReason&) const;
Note: See TracChangeset
for help on using the changeset viewer.