Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(60)

Side by Side Diff: Source/core/rendering/compositing/CompositingLayerAssigner.cpp

Issue 714933002: Set relayoutChildren to 'true' only if size change happens in Table (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: wrong patch Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009, 2010 Apple Inc. All rights reserved. 2 * Copyright (C) 2009, 2010 Apple Inc. All rights reserved.
3 * Copyright (C) 2014 Google Inc. All rights reserved. 3 * Copyright (C) 2014 Google Inc. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 void CompositingLayerAssigner::assign(RenderLayer* updateRoot, Vector<RenderLaye r*>& layersNeedingPaintInvalidation) 51 void CompositingLayerAssigner::assign(RenderLayer* updateRoot, Vector<RenderLaye r*>& layersNeedingPaintInvalidation)
52 { 52 {
53 TRACE_EVENT0("blink", "CompositingLayerAssigner::assign"); 53 TRACE_EVENT0("blink", "CompositingLayerAssigner::assign");
54 54
55 SquashingState squashingState; 55 SquashingState squashingState;
56 assignLayersToBackingsInternal(updateRoot, squashingState, layersNeedingPain tInvalidation); 56 assignLayersToBackingsInternal(updateRoot, squashingState, layersNeedingPain tInvalidation);
57 if (squashingState.hasMostRecentMapping) 57 if (squashingState.hasMostRecentMapping)
58 squashingState.mostRecentMapping->finishAccumulatingSquashingLayers(squa shingState.nextSquashedLayerIndex); 58 squashingState.mostRecentMapping->finishAccumulatingSquashingLayers(squa shingState.nextSquashedLayerIndex);
59 } 59 }
60 60
61 void CompositingLayerAssigner::SquashingState::updateSquashingStateForNewMapping (CompositedLayerMapping* newCompositedLayerMapping, bool hasNewCompositedLayerMa pping) 61 void CompositingLayerAssigner::SquashingState::updateSquashingStateForNewMapping (CompositedLayerMapping* newCompositedLayerMapping)
62 { 62 {
63 // The most recent backing is done accumulating any more squashing layers. 63 // The most recent backing is done accumulating any more squashing layers.
64 if (hasMostRecentMapping) 64 if (hasMostRecentMapping)
65 mostRecentMapping->finishAccumulatingSquashingLayers(nextSquashedLayerIn dex); 65 mostRecentMapping->finishAccumulatingSquashingLayers(nextSquashedLayerIn dex);
66 66
67 nextSquashedLayerIndex = 0; 67 nextSquashedLayerIndex = 0;
68 boundingRect = IntRect(); 68 boundingRect = IntRect();
69 mostRecentMapping = newCompositedLayerMapping; 69 mostRecentMapping = newCompositedLayerMapping;
70 hasMostRecentMapping = hasNewCompositedLayerMapping; 70 hasMostRecentMapping = newCompositedLayerMapping;
71 haveAssignedBackingsToEntireSquashingLayerSubtree = false; 71 haveAssignedBackingsToEntireSquashingLayerSubtree = false;
72 } 72 }
73 73
74 bool CompositingLayerAssigner::squashingWouldExceedSparsityTolerance(const Rende rLayer* candidate, const CompositingLayerAssigner::SquashingState& squashingStat e) 74 bool CompositingLayerAssigner::squashingWouldExceedSparsityTolerance(const Rende rLayer* candidate, const CompositingLayerAssigner::SquashingState& squashingStat e)
75 { 75 {
76 IntRect bounds = candidate->clippedAbsoluteBoundingBox(); 76 IntRect bounds = candidate->clippedAbsoluteBoundingBox();
77 IntRect newBoundingRect = squashingState.boundingRect; 77 IntRect newBoundingRect = squashingState.boundingRect;
78 newBoundingRect.unite(bounds); 78 newBoundingRect.unite(bounds);
79 const uint64_t newBoundingRectArea = newBoundingRect.size().area(); 79 const uint64_t newBoundingRectArea = newBoundingRect.size().area();
80 const uint64_t newSquashedArea = squashingState.totalAreaOfSquashedRects + b ounds.size().area(); 80 const uint64_t newSquashedArea = squashingState.totalAreaOfSquashedRects + b ounds.size().area();
81 return newBoundingRectArea > gSquashingSparsityTolerance * newSquashedArea; 81 return newBoundingRectArea > gSquashingSparsityTolerance * newSquashedArea;
82 } 82 }
83 83
84 bool CompositingLayerAssigner::needsOwnBacking(const RenderLayer* layer) const 84 bool CompositingLayerAssigner::needsOwnBacking(const RenderLayer* layer) const
85 { 85 {
86 if (!m_compositor->canBeComposited(layer)) 86 if (!m_compositor->canBeComposited(layer))
87 return false; 87 return false;
88 88
89 // If squashing is disabled, then layers that would have been squashed shoul d just be separately composited. 89 // If squashing is disabled, then layers that would have been squashed shoul d just be separately composited.
90 bool needsOwnBackingForDisabledSquashing = !m_layerSquashingEnabled && requi resSquashing(layer->compositingReasons()); 90 bool needsOwnBackingForDisabledSquashing = !m_layerSquashingEnabled && requi resSquashing(layer->compositingReasons());
91 91
92 return requiresCompositing(layer->compositingReasons()) || needsOwnBackingFo rDisabledSquashing || (m_compositor->staleInCompositingMode() && layer->isRootLa yer()); 92 return requiresCompositing(layer->compositingReasons()) || needsOwnBackingFo rDisabledSquashing || (m_compositor->staleInCompositingMode() && layer->isRootLa yer());
93 } 93 }
94 94
95 CompositingStateTransitionType CompositingLayerAssigner::computeCompositedLayerU pdate(RenderLayer* layer) 95 CompositingStateTransitionType CompositingLayerAssigner::computeCompositedLayerU pdate(RenderLayer* layer)
96 { 96 {
97 CompositingStateTransitionType update = NoCompositingStateChange; 97 CompositingStateTransitionType update = NoCompositingStateChange;
98 CompositedLayerMapping* compositedLayerMapping = layer->compositedLayerMappi ng();
98 if (needsOwnBacking(layer)) { 99 if (needsOwnBacking(layer)) {
99 if (!layer->hasCompositedLayerMapping()) { 100 if (!compositedLayerMapping) {
100 update = AllocateOwnCompositedLayerMapping; 101 update = AllocateOwnCompositedLayerMapping;
101 } 102 }
102 } else { 103 } else {
103 if (layer->hasCompositedLayerMapping()) 104 if (compositedLayerMapping)
104 update = RemoveOwnCompositedLayerMapping; 105 update = RemoveOwnCompositedLayerMapping;
105 106
106 if (m_layerSquashingEnabled) { 107 if (m_layerSquashingEnabled) {
107 if (!layer->subtreeIsInvisible() && requiresSquashing(layer->composi tingReasons())) { 108 if (!layer->subtreeIsInvisible() && requiresSquashing(layer->composi tingReasons())) {
108 // We can't compute at this time whether the squashing layer upd ate is a no-op, 109 // We can't compute at this time whether the squashing layer upd ate is a no-op,
109 // since that requires walking the render layer tree. 110 // since that requires walking the render layer tree.
110 update = PutInSquashingLayer; 111 update = PutInSquashingLayer;
111 } else if (layer->groupedMapping() || layer->lostGroupedMapping()) { 112 } else if (layer->groupedMapping() || layer->lostGroupedMapping()) {
112 update = RemoveFromSquashingLayer; 113 update = RemoveFromSquashingLayer;
113 } 114 }
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 178
178 void CompositingLayerAssigner::updateSquashingAssignment(RenderLayer* layer, Squ ashingState& squashingState, const CompositingStateTransitionType compositedLaye rUpdate, 179 void CompositingLayerAssigner::updateSquashingAssignment(RenderLayer* layer, Squ ashingState& squashingState, const CompositingStateTransitionType compositedLaye rUpdate,
179 Vector<RenderLayer*>& layersNeedingPaintInvalidation) 180 Vector<RenderLayer*>& layersNeedingPaintInvalidation)
180 { 181 {
181 // NOTE: In the future as we generalize this, the background of this layer m ay need to be assigned to a different backing than 182 // NOTE: In the future as we generalize this, the background of this layer m ay need to be assigned to a different backing than
182 // the squashed RenderLayer's own primary contents. This would happen when w e have a composited negative z-index element that needs 183 // the squashed RenderLayer's own primary contents. This would happen when w e have a composited negative z-index element that needs
183 // to paint on top of the background, but below the layer's main contents. F or now, because we always composite layers 184 // to paint on top of the background, but below the layer's main contents. F or now, because we always composite layers
184 // when they have a composited negative z-index child, such layers will neve r need squashing so it is not yet an issue. 185 // when they have a composited negative z-index child, such layers will neve r need squashing so it is not yet an issue.
185 if (compositedLayerUpdate == PutInSquashingLayer) { 186 if (compositedLayerUpdate == PutInSquashingLayer) {
186 // A layer that is squashed with other layers cannot have its own Compos itedLayerMapping. 187 // A layer that is squashed with other layers cannot have its own Compos itedLayerMapping.
187 ASSERT(!layer->hasCompositedLayerMapping()); 188 ASSERT(!layer->compositedLayerMapping());
188 ASSERT(squashingState.hasMostRecentMapping); 189 ASSERT(squashingState.hasMostRecentMapping);
189 190
190 bool changedSquashingLayer = 191 bool changedSquashingLayer =
191 squashingState.mostRecentMapping->updateSquashingLayerAssignment(lay er, squashingState.mostRecentMapping->owningLayer(), squashingState.nextSquashed LayerIndex); 192 squashingState.mostRecentMapping->updateSquashingLayerAssignment(lay er, squashingState.mostRecentMapping->owningLayer(), squashingState.nextSquashed LayerIndex);
192 if (!changedSquashingLayer) 193 if (!changedSquashingLayer)
193 return; 194 return;
194 195
195 // If we've modified the collection of squashed layers, we must update 196 // If we've modified the collection of squashed layers, we must update
196 // the graphics layer geometry. 197 // the graphics layer geometry.
197 squashingState.mostRecentMapping->setNeedsGraphicsLayerUpdate(GraphicsLa yerUpdateSubtree); 198 squashingState.mostRecentMapping->setNeedsGraphicsLayerUpdate(GraphicsLa yerUpdateSubtree);
(...skipping 26 matching lines...) Expand all
224 CompositingStateTransitionType compositedLayerUpdate = computeCompositedLaye rUpdate(reflectionLayer); 225 CompositingStateTransitionType compositedLayerUpdate = computeCompositedLaye rUpdate(reflectionLayer);
225 if (compositedLayerUpdate != NoCompositingStateChange) { 226 if (compositedLayerUpdate != NoCompositingStateChange) {
226 TRACE_LAYER_INVALIDATION(reflectionLayer, InspectorLayerInvalidationTrac kingEvent::ReflectionLayerChanged); 227 TRACE_LAYER_INVALIDATION(reflectionLayer, InspectorLayerInvalidationTrac kingEvent::ReflectionLayerChanged);
227 layersNeedingPaintInvalidation.append(reflectionLayer); 228 layersNeedingPaintInvalidation.append(reflectionLayer);
228 m_layersChanged = true; 229 m_layersChanged = true;
229 m_compositor->allocateOrClearCompositedLayerMapping(reflectionLayer, com positedLayerUpdate); 230 m_compositor->allocateOrClearCompositedLayerMapping(reflectionLayer, com positedLayerUpdate);
230 } 231 }
231 m_compositor->updateDirectCompositingReasons(reflectionLayer); 232 m_compositor->updateDirectCompositingReasons(reflectionLayer);
232 233
233 // FIXME: Why do we updateGraphicsLayerConfiguration here instead of in the GraphicsLayerUpdater? 234 // FIXME: Why do we updateGraphicsLayerConfiguration here instead of in the GraphicsLayerUpdater?
234 if (reflectionLayer->hasCompositedLayerMapping()) 235 if (CompositedLayerMapping* compositedLayerMapping = reflectionLayer->compos itedLayerMapping())
235 reflectionLayer->compositedLayerMapping()->updateGraphicsLayerConfigurat ion(); 236 compositedLayerMapping->updateGraphicsLayerConfiguration();
236 } 237 }
237 238
238 void CompositingLayerAssigner::assignLayersToBackingsInternal(RenderLayer* layer , SquashingState& squashingState, Vector<RenderLayer*>& layersNeedingPaintInvali dation) 239 void CompositingLayerAssigner::assignLayersToBackingsInternal(RenderLayer* layer , SquashingState& squashingState, Vector<RenderLayer*>& layersNeedingPaintInvali dation)
239 { 240 {
240 if (m_layerSquashingEnabled && requiresSquashing(layer->compositingReasons() )) { 241 if (m_layerSquashingEnabled && requiresSquashing(layer->compositingReasons() )) {
241 CompositingReasons reasonsPreventingSquashing = getReasonsPreventingSqua shing(layer, squashingState); 242 CompositingReasons reasonsPreventingSquashing = getReasonsPreventingSqua shing(layer, squashingState);
242 if (reasonsPreventingSquashing) 243 if (reasonsPreventingSquashing)
243 layer->setCompositingReasons(layer->compositingReasons() | reasonsPr eventingSquashing); 244 layer->setCompositingReasons(layer->compositingReasons() | reasonsPr eventingSquashing);
244 } 245 }
245 246
(...skipping 25 matching lines...) Expand all
271 if (layer->stackingNode()->isStackingContext()) { 272 if (layer->stackingNode()->isStackingContext()) {
272 RenderLayerStackingNodeIterator iterator(*layer->stackingNode(), Negativ eZOrderChildren); 273 RenderLayerStackingNodeIterator iterator(*layer->stackingNode(), Negativ eZOrderChildren);
273 while (RenderLayerStackingNode* curNode = iterator.next()) 274 while (RenderLayerStackingNode* curNode = iterator.next())
274 assignLayersToBackingsInternal(curNode->layer(), squashingState, lay ersNeedingPaintInvalidation); 275 assignLayersToBackingsInternal(curNode->layer(), squashingState, lay ersNeedingPaintInvalidation);
275 } 276 }
276 277
277 if (m_layerSquashingEnabled) { 278 if (m_layerSquashingEnabled) {
278 // At this point, if the layer is to be separately composited, then its backing becomes the most recent in paint-order. 279 // At this point, if the layer is to be separately composited, then its backing becomes the most recent in paint-order.
279 if (layer->compositingState() == PaintsIntoOwnBacking) { 280 if (layer->compositingState() == PaintsIntoOwnBacking) {
280 ASSERT(!requiresSquashing(layer->compositingReasons())); 281 ASSERT(!requiresSquashing(layer->compositingReasons()));
281 squashingState.updateSquashingStateForNewMapping(layer->compositedLa yerMapping(), layer->hasCompositedLayerMapping()); 282 squashingState.updateSquashingStateForNewMapping(layer->compositedLa yerMapping());
282 } 283 }
283 } 284 }
284 285
285 if (layer->scrollParent()) 286 if (layer->scrollParent())
286 layer->scrollParent()->scrollableArea()->setTopmostScrollChild(layer); 287 layer->scrollParent()->scrollableArea()->setTopmostScrollChild(layer);
287 288
288 if (layer->needsCompositedScrolling()) 289 if (layer->needsCompositedScrolling())
289 layer->scrollableArea()->setTopmostScrollChild(0); 290 layer->scrollableArea()->setTopmostScrollChild(0);
290 291
291 RenderLayerStackingNodeIterator iterator(*layer->stackingNode(), NormalFlowC hildren | PositiveZOrderChildren); 292 RenderLayerStackingNodeIterator iterator(*layer->stackingNode(), NormalFlowC hildren | PositiveZOrderChildren);
292 while (RenderLayerStackingNode* curNode = iterator.next()) 293 while (RenderLayerStackingNode* curNode = iterator.next())
293 assignLayersToBackingsInternal(curNode->layer(), squashingState, layersN eedingPaintInvalidation); 294 assignLayersToBackingsInternal(curNode->layer(), squashingState, layersN eedingPaintInvalidation);
294 295
295 if (squashingState.hasMostRecentMapping && &squashingState.mostRecentMapping ->owningLayer() == layer) 296 if (squashingState.hasMostRecentMapping && &squashingState.mostRecentMapping ->owningLayer() == layer)
296 squashingState.haveAssignedBackingsToEntireSquashingLayerSubtree = true; 297 squashingState.haveAssignedBackingsToEntireSquashingLayerSubtree = true;
297 } 298 }
298 299
299 } 300 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698