| 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 }; | 156 }; |
| 157 | 157 |
| 158 class CompositingRequirementsUpdater::RecursionData { | 158 class CompositingRequirementsUpdater::RecursionData { |
| 159 public: | 159 public: |
| 160 RecursionData(RenderLayer* compAncestor, RenderLayer* mostRecentCompositedLa
yer, bool testOverlap) | 160 RecursionData(RenderLayer* compAncestor, RenderLayer* mostRecentCompositedLa
yer, bool testOverlap) |
| 161 : m_compositingAncestor(compAncestor) | 161 : m_compositingAncestor(compAncestor) |
| 162 , m_mostRecentCompositedLayer(mostRecentCompositedLayer) | 162 , m_mostRecentCompositedLayer(mostRecentCompositedLayer) |
| 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) |
| 166 #ifndef NDEBUG | 167 #ifndef NDEBUG |
| 167 , m_depth(0) | 168 , m_depth(0) |
| 168 #endif | 169 #endif |
| 169 { | 170 { |
| 170 } | 171 } |
| 171 | 172 |
| 172 RecursionData(const RecursionData& other) | 173 RecursionData(const RecursionData& other) |
| 173 : m_compositingAncestor(other.m_compositingAncestor) | 174 : m_compositingAncestor(other.m_compositingAncestor) |
| 174 , m_mostRecentCompositedLayer(other.m_mostRecentCompositedLayer) | 175 , m_mostRecentCompositedLayer(other.m_mostRecentCompositedLayer) |
| 175 , m_subtreeIsCompositing(other.m_subtreeIsCompositing) | 176 , m_subtreeIsCompositing(other.m_subtreeIsCompositing) |
| 176 , m_hasUnisolatedCompositedBlendingDescendant(other.m_hasUnisolatedCompo
sitedBlendingDescendant) | 177 , m_hasUnisolatedCompositedBlendingDescendant(other.m_hasUnisolatedCompo
sitedBlendingDescendant) |
| 177 , m_testingOverlap(other.m_testingOverlap) | 178 , m_testingOverlap(other.m_testingOverlap) |
| 179 , m_suppressLayerCreation(other.m_suppressLayerCreation) |
| 178 #ifndef NDEBUG | 180 #ifndef NDEBUG |
| 179 , m_depth(other.m_depth + 1) | 181 , m_depth(other.m_depth + 1) |
| 180 #endif | 182 #endif |
| 181 { | 183 { |
| 182 } | 184 } |
| 183 | 185 |
| 184 RenderLayer* m_compositingAncestor; | 186 RenderLayer* m_compositingAncestor; |
| 185 RenderLayer* m_mostRecentCompositedLayer; // in paint order regardless of hi
erarchy. | 187 RenderLayer* m_mostRecentCompositedLayer; // in paint order regardless of hi
erarchy. |
| 186 bool m_subtreeIsCompositing; | 188 bool m_subtreeIsCompositing; |
| 187 bool m_hasUnisolatedCompositedBlendingDescendant; | 189 bool m_hasUnisolatedCompositedBlendingDescendant; |
| 188 bool m_testingOverlap; | 190 bool m_testingOverlap; |
| 191 bool m_suppressLayerCreation; |
| 189 #ifndef NDEBUG | 192 #ifndef NDEBUG |
| 190 int m_depth; | 193 int m_depth; |
| 191 #endif | 194 #endif |
| 192 }; | 195 }; |
| 193 | 196 |
| 194 static bool requiresCompositingOrSquashing(CompositingReasons reasons) | 197 static bool requiresCompositingOrSquashing(CompositingReasons reasons) |
| 195 { | 198 { |
| 196 #ifndef NDEBUG | 199 #ifndef NDEBUG |
| 197 bool fastAnswer = reasons != CompositingReasonNone; | 200 bool fastAnswer = reasons != CompositingReasonNone; |
| 198 bool slowAnswer = requiresCompositing(reasons) || requiresSquashing(reasons)
; | 201 bool slowAnswer = requiresCompositing(reasons) || requiresSquashing(reasons)
; |
| 199 ASSERT(fastAnswer == slowAnswer); | 202 ASSERT(fastAnswer == slowAnswer); |
| 200 #endif | 203 #endif |
| 201 return reasons != CompositingReasonNone; | 204 return reasons != CompositingReasonNone; |
| 202 } | 205 } |
| 203 | 206 |
| 207 static bool shouldMakeDescendantsSuppressCompositedLayerCreation(CompositingReas
ons reasons) |
| 208 { |
| 209 return reasons & CompositingReasonWillChangeGpuRasterizationHint; |
| 210 } |
| 211 |
| 204 static CompositingReasons subtreeReasonsForCompositing(RenderObject* renderer, b
ool hasCompositedDescendants, bool has3DTransformedDescendants) | 212 static CompositingReasons subtreeReasonsForCompositing(RenderObject* renderer, b
ool hasCompositedDescendants, bool has3DTransformedDescendants) |
| 205 { | 213 { |
| 206 CompositingReasons subtreeReasons = CompositingReasonNone; | 214 CompositingReasons subtreeReasons = CompositingReasonNone; |
| 207 | 215 |
| 208 // 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. | 216 // 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. |
| 209 RenderLayer* layer = toRenderBoxModelObject(renderer)->layer(); | 217 RenderLayer* layer = toRenderBoxModelObject(renderer)->layer(); |
| 210 | 218 |
| 211 // When a layer has composited descendants, some effects, like 2d transforms
, filters, masks etc must be implemented | 219 // When a layer has composited descendants, some effects, like 2d transforms
, filters, masks etc must be implemented |
| 212 // via compositing so that they also apply to those composited descdendants. | 220 // via compositing so that they also apply to those composited descdendants. |
| 213 if (hasCompositedDescendants) { | 221 if (hasCompositedDescendants) { |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 layer->stackingNode()->updateLayerListsIfNeeded(); | 295 layer->stackingNode()->updateLayerListsIfNeeded(); |
| 288 | 296 |
| 289 // Clear the flag | 297 // Clear the flag |
| 290 layer->setHasCompositingDescendant(false); | 298 layer->setHasCompositingDescendant(false); |
| 291 | 299 |
| 292 // Start by assuming this layer will not need to composite. | 300 // Start by assuming this layer will not need to composite. |
| 293 CompositingReasons reasonsToComposite = CompositingReasonNone; | 301 CompositingReasons reasonsToComposite = CompositingReasonNone; |
| 294 | 302 |
| 295 // First accumulate the straightforward compositing reasons. | 303 // First accumulate the straightforward compositing reasons. |
| 296 CompositingReasons directReasons = m_compositingReasonFinder.directReasons(l
ayer, m_needsToRecomputeCompositingRequirements); | 304 CompositingReasons directReasons = m_compositingReasonFinder.directReasons(l
ayer, m_needsToRecomputeCompositingRequirements); |
| 305 layer->setSuppressingCompositedLayerCreation(currentRecursionData.m_suppress
LayerCreation); |
| 306 if (layer->suppressingCompositedLayerCreation()) |
| 307 directReasons = m_compositingReasonFinder.suppressWillChangeAndAnimation
ForGpuRasterization(layer, directReasons); |
| 297 | 308 |
| 298 // Video is special. It's the only RenderLayer type that can both have | 309 // Video is special. It's the only RenderLayer type that can both have |
| 299 // RenderLayer children and whose children can't use its backing to render | 310 // RenderLayer children and whose children can't use its backing to render |
| 300 // into. These children (the controls) always need to be promoted into their | 311 // into. These children (the controls) always need to be promoted into their |
| 301 // own layers to draw on top of the accelerated video. | 312 // own layers to draw on top of the accelerated video. |
| 302 if (currentRecursionData.m_compositingAncestor && currentRecursionData.m_com
positingAncestor->renderer()->isVideo()) | 313 if (currentRecursionData.m_compositingAncestor && currentRecursionData.m_com
positingAncestor->renderer()->isVideo()) |
| 303 directReasons |= CompositingReasonVideoOverlay; | 314 directReasons |= CompositingReasonVideoOverlay; |
| 304 | 315 |
| 305 if (compositor->canBeComposited(layer)) | 316 if (compositor->canBeComposited(layer)) |
| 306 reasonsToComposite |= directReasons; | 317 reasonsToComposite |= directReasons; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 341 if (currentRecursionData.m_testingOverlap && !requiresCompositingOrSquashing
(directReasons)) | 352 if (currentRecursionData.m_testingOverlap && !requiresCompositingOrSquashing
(directReasons)) |
| 342 overlapCompositingReason = overlapMap.overlapsLayers(absBounds) ? Compos
itingReasonOverlap : CompositingReasonNone; | 353 overlapCompositingReason = overlapMap.overlapsLayers(absBounds) ? Compos
itingReasonOverlap : CompositingReasonNone; |
| 343 | 354 |
| 344 reasonsToComposite |= overlapCompositingReason; | 355 reasonsToComposite |= overlapCompositingReason; |
| 345 | 356 |
| 346 // The children of this layer don't need to composite, unless there is | 357 // The children of this layer don't need to composite, unless there is |
| 347 // a compositing layer among them, so start by inheriting the compositing | 358 // a compositing layer among them, so start by inheriting the compositing |
| 348 // ancestor with m_subtreeIsCompositing set to false. | 359 // ancestor with m_subtreeIsCompositing set to false. |
| 349 RecursionData childRecursionData(currentRecursionData); | 360 RecursionData childRecursionData(currentRecursionData); |
| 350 childRecursionData.m_subtreeIsCompositing = false; | 361 childRecursionData.m_subtreeIsCompositing = false; |
| 362 childRecursionData.m_suppressLayerCreation = layer->suppressingCompositedLay
erCreation() || shouldMakeDescendantsSuppressCompositedLayerCreation(directReaso
ns); |
| 351 | 363 |
| 352 bool willBeCompositedOrSquashed = compositor->canBeComposited(layer) && requ
iresCompositingOrSquashing(reasonsToComposite); | 364 bool willBeCompositedOrSquashed = compositor->canBeComposited(layer) && requ
iresCompositingOrSquashing(reasonsToComposite); |
| 353 if (willBeCompositedOrSquashed) { | 365 if (willBeCompositedOrSquashed) { |
| 354 // Tell the parent it has compositing descendants. | 366 // Tell the parent it has compositing descendants. |
| 355 currentRecursionData.m_subtreeIsCompositing = true; | 367 currentRecursionData.m_subtreeIsCompositing = true; |
| 356 // This layer now acts as the ancestor for kids. | 368 // This layer now acts as the ancestor for kids. |
| 357 childRecursionData.m_compositingAncestor = layer; | 369 childRecursionData.m_compositingAncestor = layer; |
| 358 | 370 |
| 359 // Here we know that all children and the layer's own contents can blind
ly paint into | 371 // Here we know that all children and the layer's own contents can blind
ly paint into |
| 360 // this layer's backing, until a descendant is composited. So, we don't
need to check | 372 // this layer's backing, until a descendant is composited. So, we don't
need to check |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 515 } | 527 } |
| 516 | 528 |
| 517 bool CompositingRequirementsUpdater::isRunningAcceleratedTransformAnimation(Rend
erObject* renderer) const | 529 bool CompositingRequirementsUpdater::isRunningAcceleratedTransformAnimation(Rend
erObject* renderer) const |
| 518 { | 530 { |
| 519 if (!m_compositingReasonFinder.hasAnimationTrigger()) | 531 if (!m_compositingReasonFinder.hasAnimationTrigger()) |
| 520 return false; | 532 return false; |
| 521 return renderer->style()->hasCurrentTransformAnimation(); | 533 return renderer->style()->hasCurrentTransformAnimation(); |
| 522 } | 534 } |
| 523 | 535 |
| 524 } // namespace WebCore | 536 } // namespace WebCore |
| OLD | NEW |