OLD | NEW |
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 27 matching lines...) Expand all Loading... |
38 CompositingLayerAssigner::CompositingLayerAssigner(RenderLayerCompositor* compos
itor) | 38 CompositingLayerAssigner::CompositingLayerAssigner(RenderLayerCompositor* compos
itor) |
39 : m_compositor(compositor) | 39 : m_compositor(compositor) |
40 , m_layerSquashingEnabled(compositor->layerSquashingEnabled()) | 40 , m_layerSquashingEnabled(compositor->layerSquashingEnabled()) |
41 { | 41 { |
42 } | 42 } |
43 | 43 |
44 CompositingLayerAssigner::~CompositingLayerAssigner() | 44 CompositingLayerAssigner::~CompositingLayerAssigner() |
45 { | 45 { |
46 } | 46 } |
47 | 47 |
48 void CompositingLayerAssigner::assign(RenderLayer* updateRoot, bool& layersChang
ed) | 48 void CompositingLayerAssigner::assign(RenderLayer* updateRoot, bool& layersChang
ed, Vector<RenderLayer*>& layersNeedingRepaint) |
49 { | 49 { |
50 SquashingState squashingState; | 50 SquashingState squashingState; |
51 assignLayersToBackingsInternal(updateRoot, squashingState, layersChanged); | 51 assignLayersToBackingsInternal(updateRoot, squashingState, layersChanged, la
yersNeedingRepaint); |
52 if (squashingState.hasMostRecentMapping) | 52 if (squashingState.hasMostRecentMapping) |
53 squashingState.mostRecentMapping->finishAccumulatingSquashingLayers(squa
shingState.nextSquashedLayerIndex); | 53 squashingState.mostRecentMapping->finishAccumulatingSquashingLayers(squa
shingState.nextSquashedLayerIndex); |
54 } | 54 } |
55 | 55 |
56 void CompositingLayerAssigner::SquashingState::updateSquashingStateForNewMapping
(CompositedLayerMappingPtr newCompositedLayerMapping, bool hasNewCompositedLayer
Mapping) | 56 void CompositingLayerAssigner::SquashingState::updateSquashingStateForNewMapping
(CompositedLayerMappingPtr newCompositedLayerMapping, bool hasNewCompositedLayer
Mapping) |
57 { | 57 { |
58 // The most recent backing is done accumulating any more squashing layers. | 58 // The most recent backing is done accumulating any more squashing layers. |
59 if (hasMostRecentMapping) | 59 if (hasMostRecentMapping) |
60 mostRecentMapping->finishAccumulatingSquashingLayers(nextSquashedLayerIn
dex); | 60 mostRecentMapping->finishAccumulatingSquashingLayers(nextSquashedLayerIn
dex); |
61 | 61 |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 | 154 |
155 if (ancestorDependentProperties.transformAncestor != squashingLayerAncestorD
ependentProperties.transformAncestor) | 155 if (ancestorDependentProperties.transformAncestor != squashingLayerAncestorD
ependentProperties.transformAncestor) |
156 return false; | 156 return false; |
157 | 157 |
158 if (ancestorDependentProperties.filterAncestor != squashingLayerAncestorDepe
ndentProperties.filterAncestor) | 158 if (ancestorDependentProperties.filterAncestor != squashingLayerAncestorDepe
ndentProperties.filterAncestor) |
159 return false; | 159 return false; |
160 | 160 |
161 return true; | 161 return true; |
162 } | 162 } |
163 | 163 |
164 bool CompositingLayerAssigner::updateSquashingAssignment(RenderLayer* layer, Squ
ashingState& squashingState, const CompositingStateTransitionType compositedLaye
rUpdate) | 164 bool CompositingLayerAssigner::updateSquashingAssignment(RenderLayer* layer, Squ
ashingState& squashingState, const CompositingStateTransitionType compositedLaye
rUpdate, |
| 165 Vector<RenderLayer*>& layersNeedingRepaint) |
165 { | 166 { |
166 // NOTE: In the future as we generalize this, the background of this layer m
ay need to be assigned to a different backing than | 167 // NOTE: In the future as we generalize this, the background of this layer m
ay need to be assigned to a different backing than |
167 // the squashed RenderLayer's own primary contents. This would happen when w
e have a composited negative z-index element that needs | 168 // the squashed RenderLayer's own primary contents. This would happen when w
e have a composited negative z-index element that needs |
168 // to paint on top of the background, but below the layer's main contents. F
or now, because we always composite layers | 169 // to paint on top of the background, but below the layer's main contents. F
or now, because we always composite layers |
169 // when they have a composited negative z-index child, such layers will neve
r need squashing so it is not yet an issue. | 170 // when they have a composited negative z-index child, such layers will neve
r need squashing so it is not yet an issue. |
170 if (compositedLayerUpdate == PutInSquashingLayer) { | 171 if (compositedLayerUpdate == PutInSquashingLayer) { |
171 // A layer that is squashed with other layers cannot have its own Compos
itedLayerMapping. | 172 // A layer that is squashed with other layers cannot have its own Compos
itedLayerMapping. |
172 ASSERT(!layer->hasCompositedLayerMapping()); | 173 ASSERT(!layer->hasCompositedLayerMapping()); |
173 ASSERT(squashingState.hasMostRecentMapping); | 174 ASSERT(squashingState.hasMostRecentMapping); |
174 | 175 |
175 bool changedSquashingLayer = | 176 bool changedSquashingLayer = |
176 squashingState.mostRecentMapping->updateSquashingLayerAssignment(lay
er, squashingState.mostRecentMapping->owningLayer(), squashingState.nextSquashed
LayerIndex); | 177 squashingState.mostRecentMapping->updateSquashingLayerAssignment(lay
er, squashingState.mostRecentMapping->owningLayer(), squashingState.nextSquashed
LayerIndex); |
177 if (!changedSquashingLayer) | 178 if (!changedSquashingLayer) |
178 return true; | 179 return true; |
179 | 180 |
180 // If we've modified the collection of squashed layers, we must update | 181 // If we've modified the collection of squashed layers, we must update |
181 // the graphics layer geometry. | 182 // the graphics layer geometry. |
182 squashingState.mostRecentMapping->setNeedsGraphicsLayerUpdate(); | 183 squashingState.mostRecentMapping->setNeedsGraphicsLayerUpdate(); |
183 | 184 |
184 layer->clipper().clearClipRectsIncludingDescendants(); | 185 layer->clipper().clearClipRectsIncludingDescendants(); |
185 | 186 |
186 // FIXME: it seems premature to compute this before all compositing stat
e has been updated? | |
187 // This layer and all of its descendants have cached repaints rects that
are relative to | |
188 // the repaint container, so change when compositing changes; we need to
update them here. | |
189 | |
190 // FIXME: what's up with parent()? | |
191 if (layer->parent()) | |
192 layer->repainter().computeRepaintRectsIncludingDescendants(); | |
193 | |
194 // Issue a repaint, since |layer| may have been added to an already-exis
ting squashing layer. | 187 // Issue a repaint, since |layer| may have been added to an already-exis
ting squashing layer. |
195 m_compositor->repaintOnCompositingChange(layer); | 188 layersNeedingRepaint.append(layer); |
196 | 189 |
197 return true; | 190 return true; |
198 } | 191 } |
199 if (compositedLayerUpdate == RemoveFromSquashingLayer) { | 192 if (compositedLayerUpdate == RemoveFromSquashingLayer) { |
200 if (layer->groupedMapping()) { | 193 if (layer->groupedMapping()) { |
201 // Before removing |layer| from an already-existing squashing layer
that may have other content, issue a repaint. | 194 // Before removing |layer| from an already-existing squashing layer
that may have other content, issue a repaint. |
202 m_compositor->repaintOnCompositingChange(layer); | 195 m_compositor->repaintOnCompositingChange(layer); |
203 layer->groupedMapping()->setNeedsGraphicsLayerUpdate(); | 196 layer->groupedMapping()->setNeedsGraphicsLayerUpdate(); |
204 layer->setGroupedMapping(0); | 197 layer->setGroupedMapping(0); |
205 } | 198 } |
206 | 199 |
207 // This layer and all of its descendants have cached repaints rects that
are relative to | |
208 // the repaint container, so change when compositing changes; we need to
update them here. | |
209 layer->repainter().computeRepaintRectsIncludingDescendants(); | |
210 | |
211 // If we need to repaint, do so now that we've removed it from a squashe
d layer. | 200 // If we need to repaint, do so now that we've removed it from a squashe
d layer. |
212 m_compositor->repaintOnCompositingChange(layer); | 201 layersNeedingRepaint.append(layer); |
213 | 202 |
214 layer->setLostGroupedMapping(false); | 203 layer->setLostGroupedMapping(false); |
215 return true; | 204 return true; |
216 } | 205 } |
217 | 206 |
218 return false; | 207 return false; |
219 } | 208 } |
220 | 209 |
221 void CompositingLayerAssigner::assignLayersToBackingsForReflectionLayer(RenderLa
yer* reflectionLayer, bool& layersChanged) | 210 void CompositingLayerAssigner::assignLayersToBackingsForReflectionLayer(RenderLa
yer* reflectionLayer, bool& layersChanged, Vector<RenderLayer*>& layersNeedingRe
paint) |
222 { | 211 { |
223 CompositingStateTransitionType compositedLayerUpdate = computeCompositedLaye
rUpdate(reflectionLayer); | 212 CompositingStateTransitionType compositedLayerUpdate = computeCompositedLaye
rUpdate(reflectionLayer); |
224 if (compositedLayerUpdate != NoCompositingStateChange) { | 213 if (compositedLayerUpdate != NoCompositingStateChange) { |
| 214 layersNeedingRepaint.append(reflectionLayer); |
225 layersChanged = true; | 215 layersChanged = true; |
226 m_compositor->allocateOrClearCompositedLayerMapping(reflectionLayer, com
positedLayerUpdate); | 216 m_compositor->allocateOrClearCompositedLayerMapping(reflectionLayer, com
positedLayerUpdate); |
227 } | 217 } |
228 m_compositor->updateDirectCompositingReasons(reflectionLayer); | 218 m_compositor->updateDirectCompositingReasons(reflectionLayer); |
229 if (reflectionLayer->hasCompositedLayerMapping()) | 219 if (reflectionLayer->hasCompositedLayerMapping()) |
230 reflectionLayer->compositedLayerMapping()->updateGraphicsLayerConfigurat
ion(GraphicsLayerUpdater::ForceUpdate); | 220 reflectionLayer->compositedLayerMapping()->updateGraphicsLayerConfigurat
ion(GraphicsLayerUpdater::ForceUpdate); |
231 } | 221 } |
232 | 222 |
233 void CompositingLayerAssigner::assignLayersToBackingsInternal(RenderLayer* layer
, SquashingState& squashingState, bool& layersChanged) | 223 void CompositingLayerAssigner::assignLayersToBackingsInternal(RenderLayer* layer
, SquashingState& squashingState, bool& layersChanged, Vector<RenderLayer*>& lay
ersNeedingRepaint) |
234 { | 224 { |
235 if (m_layerSquashingEnabled && requiresSquashing(layer->compositingReasons()
) && !canSquashIntoCurrentSquashingOwner(layer, squashingState)) | 225 if (m_layerSquashingEnabled && requiresSquashing(layer->compositingReasons()
) && !canSquashIntoCurrentSquashingOwner(layer, squashingState)) |
236 layer->setCompositingReasons(layer->compositingReasons() | CompositingRe
asonNoSquashingTargetFound); | 226 layer->setCompositingReasons(layer->compositingReasons() | CompositingRe
asonNoSquashingTargetFound); |
237 | 227 |
238 CompositingStateTransitionType compositedLayerUpdate = computeCompositedLaye
rUpdate(layer); | 228 CompositingStateTransitionType compositedLayerUpdate = computeCompositedLaye
rUpdate(layer); |
239 | 229 |
240 if (m_compositor->allocateOrClearCompositedLayerMapping(layer, compositedLay
erUpdate)) | 230 if (m_compositor->allocateOrClearCompositedLayerMapping(layer, compositedLay
erUpdate)) { |
| 231 layersNeedingRepaint.append(layer); |
241 layersChanged = true; | 232 layersChanged = true; |
| 233 } |
242 | 234 |
243 // FIXME: special-casing reflection layers here is not right. | 235 // FIXME: special-casing reflection layers here is not right. |
244 if (layer->reflectionInfo()) | 236 if (layer->reflectionInfo()) |
245 assignLayersToBackingsForReflectionLayer(layer->reflectionInfo()->reflec
tionLayer(), layersChanged); | 237 assignLayersToBackingsForReflectionLayer(layer->reflectionInfo()->reflec
tionLayer(), layersChanged, layersNeedingRepaint); |
246 | 238 |
247 // Add this layer to a squashing backing if needed. | 239 // Add this layer to a squashing backing if needed. |
248 if (m_layerSquashingEnabled) { | 240 if (m_layerSquashingEnabled) { |
249 if (updateSquashingAssignment(layer, squashingState, compositedLayerUpda
te)) | 241 if (updateSquashingAssignment(layer, squashingState, compositedLayerUpda
te, layersNeedingRepaint)) |
250 layersChanged = true; | 242 layersChanged = true; |
251 | 243 |
252 const bool layerIsSquashed = compositedLayerUpdate == PutInSquashingLaye
r || (compositedLayerUpdate == NoCompositingStateChange && layer->groupedMapping
()); | 244 const bool layerIsSquashed = compositedLayerUpdate == PutInSquashingLaye
r || (compositedLayerUpdate == NoCompositingStateChange && layer->groupedMapping
()); |
253 if (layerIsSquashed) { | 245 if (layerIsSquashed) { |
254 squashingState.nextSquashedLayerIndex++; | 246 squashingState.nextSquashedLayerIndex++; |
255 IntRect layerBounds = layer->ancestorDependentProperties().clippedAb
soluteBoundingBox; | 247 IntRect layerBounds = layer->ancestorDependentProperties().clippedAb
soluteBoundingBox; |
256 squashingState.totalAreaOfSquashedRects += layerBounds.size().area()
; | 248 squashingState.totalAreaOfSquashedRects += layerBounds.size().area()
; |
257 squashingState.boundingRect.unite(layerBounds); | 249 squashingState.boundingRect.unite(layerBounds); |
258 } | 250 } |
259 } | 251 } |
260 | 252 |
261 if (layer->stackingNode()->isStackingContext()) { | 253 if (layer->stackingNode()->isStackingContext()) { |
262 RenderLayerStackingNodeIterator iterator(*layer->stackingNode(), Negativ
eZOrderChildren); | 254 RenderLayerStackingNodeIterator iterator(*layer->stackingNode(), Negativ
eZOrderChildren); |
263 while (RenderLayerStackingNode* curNode = iterator.next()) | 255 while (RenderLayerStackingNode* curNode = iterator.next()) |
264 assignLayersToBackingsInternal(curNode->layer(), squashingState, lay
ersChanged); | 256 assignLayersToBackingsInternal(curNode->layer(), squashingState, lay
ersChanged, layersNeedingRepaint); |
265 } | 257 } |
266 | 258 |
267 if (m_layerSquashingEnabled) { | 259 if (m_layerSquashingEnabled) { |
268 // At this point, if the layer is to be "separately" composited, then it
s backing becomes the most recent in paint-order. | 260 // At this point, if the layer is to be "separately" composited, then it
s backing becomes the most recent in paint-order. |
269 if (layer->compositingState() == PaintsIntoOwnBacking || layer->composit
ingState() == HasOwnBackingButPaintsIntoAncestor) { | 261 if (layer->compositingState() == PaintsIntoOwnBacking || layer->composit
ingState() == HasOwnBackingButPaintsIntoAncestor) { |
270 ASSERT(!requiresSquashing(layer->compositingReasons())); | 262 ASSERT(!requiresSquashing(layer->compositingReasons())); |
271 squashingState.updateSquashingStateForNewMapping(layer->compositedLa
yerMapping(), layer->hasCompositedLayerMapping()); | 263 squashingState.updateSquashingStateForNewMapping(layer->compositedLa
yerMapping(), layer->hasCompositedLayerMapping()); |
272 } | 264 } |
273 } | 265 } |
274 | 266 |
275 RenderLayerStackingNodeIterator iterator(*layer->stackingNode(), NormalFlowC
hildren | PositiveZOrderChildren); | 267 RenderLayerStackingNodeIterator iterator(*layer->stackingNode(), NormalFlowC
hildren | PositiveZOrderChildren); |
276 while (RenderLayerStackingNode* curNode = iterator.next()) | 268 while (RenderLayerStackingNode* curNode = iterator.next()) |
277 assignLayersToBackingsInternal(curNode->layer(), squashingState, layersC
hanged); | 269 assignLayersToBackingsInternal(curNode->layer(), squashingState, layersC
hanged, layersNeedingRepaint); |
278 | 270 |
279 if (squashingState.hasMostRecentMapping && &squashingState.mostRecentMapping
->owningLayer() == layer) | 271 if (squashingState.hasMostRecentMapping && &squashingState.mostRecentMapping
->owningLayer() == layer) |
280 squashingState.haveAssignedBackingsToEntireSquashingLayerSubtree = true; | 272 squashingState.haveAssignedBackingsToEntireSquashingLayerSubtree = true; |
281 } | 273 } |
282 | 274 |
283 } | 275 } |
OLD | NEW |