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 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 Vector<OverlapMapContainer> m_overlapStack; | 156 Vector<OverlapMapContainer> m_overlapStack; |
157 }; | 157 }; |
158 | 158 |
159 class CompositingRequirementsUpdater::RecursionData { | 159 class CompositingRequirementsUpdater::RecursionData { |
160 public: | 160 public: |
161 RecursionData(RenderLayer* compAncestor, bool testOverlap) | 161 RecursionData(RenderLayer* compAncestor, bool testOverlap) |
162 : m_compositingAncestor(compAncestor) | 162 : m_compositingAncestor(compAncestor) |
163 , m_subtreeIsCompositing(false) | 163 , m_subtreeIsCompositing(false) |
164 , m_hasUnisolatedCompositedBlendingDescendant(false) | 164 , m_hasUnisolatedCompositedBlendingDescendant(false) |
165 , m_testingOverlap(testOverlap) | 165 , m_testingOverlap(testOverlap) |
166 , m_suppressLayerCreation(false) | |
167 #ifndef NDEBUG | 166 #ifndef NDEBUG |
168 , m_depth(0) | 167 , m_depth(0) |
169 #endif | 168 #endif |
170 { | 169 { |
171 } | 170 } |
172 | 171 |
173 RecursionData(const RecursionData& other) | 172 RecursionData(const RecursionData& other) |
174 : m_compositingAncestor(other.m_compositingAncestor) | 173 : m_compositingAncestor(other.m_compositingAncestor) |
175 , m_subtreeIsCompositing(other.m_subtreeIsCompositing) | 174 , m_subtreeIsCompositing(other.m_subtreeIsCompositing) |
176 , m_hasUnisolatedCompositedBlendingDescendant(other.m_hasUnisolatedCompo
sitedBlendingDescendant) | 175 , m_hasUnisolatedCompositedBlendingDescendant(other.m_hasUnisolatedCompo
sitedBlendingDescendant) |
177 , m_testingOverlap(other.m_testingOverlap) | 176 , m_testingOverlap(other.m_testingOverlap) |
178 , m_suppressLayerCreation(other.m_suppressLayerCreation) | |
179 #ifndef NDEBUG | 177 #ifndef NDEBUG |
180 , m_depth(other.m_depth + 1) | 178 , m_depth(other.m_depth + 1) |
181 #endif | 179 #endif |
182 { | 180 { |
183 } | 181 } |
184 | 182 |
185 RenderLayer* m_compositingAncestor; | 183 RenderLayer* m_compositingAncestor; |
186 bool m_subtreeIsCompositing; | 184 bool m_subtreeIsCompositing; |
187 bool m_hasUnisolatedCompositedBlendingDescendant; | 185 bool m_hasUnisolatedCompositedBlendingDescendant; |
188 bool m_testingOverlap; | 186 bool m_testingOverlap; |
189 bool m_suppressLayerCreation; | |
190 #ifndef NDEBUG | 187 #ifndef NDEBUG |
191 int m_depth; | 188 int m_depth; |
192 #endif | 189 #endif |
193 }; | 190 }; |
194 | 191 |
195 static bool requiresCompositingOrSquashing(CompositingReasons reasons) | 192 static bool requiresCompositingOrSquashing(CompositingReasons reasons) |
196 { | 193 { |
197 #ifndef NDEBUG | 194 #ifndef NDEBUG |
198 bool fastAnswer = reasons != CompositingReasonNone; | 195 bool fastAnswer = reasons != CompositingReasonNone; |
199 bool slowAnswer = requiresCompositing(reasons) || requiresSquashing(reasons)
; | 196 bool slowAnswer = requiresCompositing(reasons) || requiresSquashing(reasons)
; |
200 ASSERT(fastAnswer == slowAnswer); | 197 ASSERT(fastAnswer == slowAnswer); |
201 #endif | 198 #endif |
202 return reasons != CompositingReasonNone; | 199 return reasons != CompositingReasonNone; |
203 } | 200 } |
204 | 201 |
205 static bool shouldMakeDescendantsSuppressCompositedLayerCreation(CompositingReas
ons reasons) | |
206 { | |
207 return reasons & CompositingReasonWillChangeGpuRasterizationHint; | |
208 } | |
209 | |
210 static CompositingReasons subtreeReasonsForCompositing(RenderObject* renderer, b
ool hasCompositedDescendants, bool has3DTransformedDescendants) | 202 static CompositingReasons subtreeReasonsForCompositing(RenderObject* renderer, b
ool hasCompositedDescendants, bool has3DTransformedDescendants) |
211 { | 203 { |
212 CompositingReasons subtreeReasons = CompositingReasonNone; | 204 CompositingReasons subtreeReasons = CompositingReasonNone; |
213 | 205 |
214 // FIXME: this seems to be a potentially different layer than the layer for
which this was called. May not be an error, but is very confusing. | 206 // FIXME: this seems to be a potentially different layer than the layer for
which this was called. May not be an error, but is very confusing. |
215 RenderLayer* layer = toRenderBoxModelObject(renderer)->layer(); | 207 RenderLayer* layer = toRenderBoxModelObject(renderer)->layer(); |
216 | 208 |
217 // When a layer has composited descendants, some effects, like 2d transforms
, filters, masks etc must be implemented | 209 // When a layer has composited descendants, some effects, like 2d transforms
, filters, masks etc must be implemented |
218 // via compositing so that they also apply to those composited descdendants. | 210 // via compositing so that they also apply to those composited descdendants. |
219 if (hasCompositedDescendants) { | 211 if (hasCompositedDescendants) { |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 layer->stackingNode()->updateLayerListsIfNeeded(); | 284 layer->stackingNode()->updateLayerListsIfNeeded(); |
293 | 285 |
294 // Clear the flag | 286 // Clear the flag |
295 layer->setHasCompositingDescendant(false); | 287 layer->setHasCompositingDescendant(false); |
296 | 288 |
297 // Start by assuming this layer will not need to composite. | 289 // Start by assuming this layer will not need to composite. |
298 CompositingReasons reasonsToComposite = CompositingReasonNone; | 290 CompositingReasons reasonsToComposite = CompositingReasonNone; |
299 | 291 |
300 // First accumulate the straightforward compositing reasons. | 292 // First accumulate the straightforward compositing reasons. |
301 CompositingReasons directReasons = m_compositingReasonFinder.directReasons(l
ayer); | 293 CompositingReasons directReasons = m_compositingReasonFinder.directReasons(l
ayer); |
302 layer->setSuppressingCompositedLayerCreation(currentRecursionData.m_suppress
LayerCreation); | |
303 if (layer->suppressingCompositedLayerCreation()) | |
304 directReasons = m_compositingReasonFinder.suppressWillChangeAndAnimation
ForGpuRasterization(layer, directReasons); | |
305 | 294 |
306 // Video is special. It's the only RenderLayer type that can both have | 295 // Video is special. It's the only RenderLayer type that can both have |
307 // RenderLayer children and whose children can't use its backing to render | 296 // RenderLayer children and whose children can't use its backing to render |
308 // into. These children (the controls) always need to be promoted into their | 297 // into. These children (the controls) always need to be promoted into their |
309 // own layers to draw on top of the accelerated video. | 298 // own layers to draw on top of the accelerated video. |
310 if (currentRecursionData.m_compositingAncestor && currentRecursionData.m_com
positingAncestor->renderer()->isVideo()) | 299 if (currentRecursionData.m_compositingAncestor && currentRecursionData.m_com
positingAncestor->renderer()->isVideo()) |
311 directReasons |= CompositingReasonVideoOverlay; | 300 directReasons |= CompositingReasonVideoOverlay; |
312 | 301 |
313 if (compositor->canBeComposited(layer)) | 302 if (compositor->canBeComposited(layer)) |
314 reasonsToComposite |= directReasons; | 303 reasonsToComposite |= directReasons; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
349 if (currentRecursionData.m_testingOverlap && !requiresCompositingOrSquashing
(directReasons)) | 338 if (currentRecursionData.m_testingOverlap && !requiresCompositingOrSquashing
(directReasons)) |
350 overlapCompositingReason = overlapMap.overlapsLayers(absBounds) ? Compos
itingReasonOverlap : CompositingReasonNone; | 339 overlapCompositingReason = overlapMap.overlapsLayers(absBounds) ? Compos
itingReasonOverlap : CompositingReasonNone; |
351 | 340 |
352 reasonsToComposite |= overlapCompositingReason; | 341 reasonsToComposite |= overlapCompositingReason; |
353 | 342 |
354 // The children of this layer don't need to composite, unless there is | 343 // The children of this layer don't need to composite, unless there is |
355 // a compositing layer among them, so start by inheriting the compositing | 344 // a compositing layer among them, so start by inheriting the compositing |
356 // ancestor with m_subtreeIsCompositing set to false. | 345 // ancestor with m_subtreeIsCompositing set to false. |
357 RecursionData childRecursionData(currentRecursionData); | 346 RecursionData childRecursionData(currentRecursionData); |
358 childRecursionData.m_subtreeIsCompositing = false; | 347 childRecursionData.m_subtreeIsCompositing = false; |
359 childRecursionData.m_suppressLayerCreation = layer->suppressingCompositedLay
erCreation() || shouldMakeDescendantsSuppressCompositedLayerCreation(directReaso
ns); | |
360 | 348 |
361 bool willBeCompositedOrSquashed = compositor->canBeComposited(layer) && requ
iresCompositingOrSquashing(reasonsToComposite); | 349 bool willBeCompositedOrSquashed = compositor->canBeComposited(layer) && requ
iresCompositingOrSquashing(reasonsToComposite); |
362 if (willBeCompositedOrSquashed) { | 350 if (willBeCompositedOrSquashed) { |
363 // Tell the parent it has compositing descendants. | 351 // Tell the parent it has compositing descendants. |
364 currentRecursionData.m_subtreeIsCompositing = true; | 352 currentRecursionData.m_subtreeIsCompositing = true; |
365 // This layer now acts as the ancestor for kids. | 353 // This layer now acts as the ancestor for kids. |
366 childRecursionData.m_compositingAncestor = layer; | 354 childRecursionData.m_compositingAncestor = layer; |
367 | 355 |
368 // Here we know that all children and the layer's own contents can blind
ly paint into | 356 // Here we know that all children and the layer's own contents can blind
ly paint into |
369 // this layer's backing, until a descendant is composited. So, we don't
need to check | 357 // this layer's backing, until a descendant is composited. So, we don't
need to check |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 layer->setCompositingReasons(reasonsToComposite); | 492 layer->setCompositingReasons(reasonsToComposite); |
505 | 493 |
506 } | 494 } |
507 | 495 |
508 bool CompositingRequirementsUpdater::isRunningAcceleratedTransformAnimation(Rend
erObject* renderer) const | 496 bool CompositingRequirementsUpdater::isRunningAcceleratedTransformAnimation(Rend
erObject* renderer) const |
509 { | 497 { |
510 return renderer->style()->hasCurrentTransformAnimation(); | 498 return renderer->style()->hasCurrentTransformAnimation(); |
511 } | 499 } |
512 | 500 |
513 } // namespace WebCore | 501 } // namespace WebCore |
OLD | NEW |