Index: Source/core/rendering/compositing/CompositingReasonFinder.cpp |
diff --git a/Source/core/rendering/compositing/CompositingReasonFinder.cpp b/Source/core/rendering/compositing/CompositingReasonFinder.cpp |
index cf8b0f69651c903864cb9ebd1f8e10a2ef66d88b..994676ef7a6fd823742a550c297442e89750dc65 100644 |
--- a/Source/core/rendering/compositing/CompositingReasonFinder.cpp |
+++ b/Source/core/rendering/compositing/CompositingReasonFinder.cpp |
@@ -89,10 +89,24 @@ bool CompositingReasonFinder::isMainFrame() const |
return !m_renderView.document().ownerElement(); |
} |
+CompositingReasons CompositingReasonFinder::suppressStyleDeterminedReasonsIfPossible(const RenderLayer* layer, CompositingReasons styleReasons) const |
abarth-chromium
2014/04/14 20:25:53
Can we give this function a more semantic name? S
ajuma
2014/04/15 19:11:34
Done.
|
+{ |
+ CompositingReasons adjustedReasons = styleReasons; |
+ adjustedReasons &= ~(CompositingReasonWillChangeCompositingHint | CompositingReasonWillChangeGpuRasterizationHint); |
+ |
+ // We can suppress layer creation for animations before animations start, but not |
+ // once they're already running on the compositor. |
+ if (!layer->renderer()->style()->isRunningAnimationOnCompositor()) |
+ adjustedReasons &= ~CompositingReasonActiveAnimation; |
+ |
+ return adjustedReasons; |
+} |
+ |
+ |
abarth-chromium
2014/04/14 20:25:53
Please remove this extra blank line.
ajuma
2014/04/15 19:11:34
Done.
|
CompositingReasons CompositingReasonFinder::directReasons(const RenderLayer* layer, bool* needToRecomputeCompositingRequirements) const |
{ |
CompositingReasons styleReasons = layer->styleDeterminedCompositingReasons(); |
- ASSERT(styleDeterminedReasons(layer->renderer()) == styleReasons); |
+ ASSERT(styleDeterminedReasons(layer) == styleReasons); |
return styleReasons | nonStyleDeterminedDirectReasons(layer, needToRecomputeCompositingRequirements); |
} |
@@ -111,9 +125,10 @@ bool CompositingReasonFinder::requiresCompositingForScrollableFrame() const |
return frameView->isScrollable(); |
} |
-CompositingReasons CompositingReasonFinder::styleDeterminedReasons(RenderObject* renderer) const |
+CompositingReasons CompositingReasonFinder::styleDeterminedReasons(const RenderLayer* layer) const |
{ |
CompositingReasons directReasons = CompositingReasonNone; |
+ RenderObject* renderer = layer->renderer(); |
if (requiresCompositingForTransform(renderer)) |
directReasons |= CompositingReason3DTransform; |
@@ -127,8 +142,14 @@ CompositingReasons CompositingReasonFinder::styleDeterminedReasons(RenderObject* |
if (requiresCompositingForFilters(renderer)) |
directReasons |= CompositingReasonFilters; |
- if (requiresCompositingForWillChange(renderer)) |
- directReasons |= CompositingReasonWillChange; |
+ if (requiresCompositingForWillChangeCompositingHint(renderer)) |
+ directReasons |= CompositingReasonWillChangeCompositingHint; |
+ |
+ if (requiresCompositingForWillChangeGpuRasterizationHint(renderer)) |
+ directReasons |= CompositingReasonWillChangeGpuRasterizationHint; |
+ |
+ if (layer->suppressingCompositedLayerCreation()) |
+ directReasons = suppressStyleDeterminedReasonsIfPossible(layer, directReasons); |
abarth-chromium
2014/04/14 20:29:53
Maybe it would be clearer to just inline this func
|
ASSERT(!(directReasons & ~CompositingReasonComboAllStyleDeterminedReasons)); |
return directReasons; |
@@ -160,11 +181,13 @@ bool CompositingReasonFinder::requiresCompositingForFilters(RenderObject* render |
return renderer->hasFilter(); |
} |
-bool CompositingReasonFinder::requiresCompositingForWillChange(const RenderObject* renderer) const |
+bool CompositingReasonFinder::requiresCompositingForWillChangeCompositingHint(const RenderObject* renderer) const |
{ |
- if (renderer->style()->hasWillChangeCompositingHint()) |
- return true; |
+ return renderer->style()->hasWillChangeCompositingHint(); |
+} |
+bool CompositingReasonFinder::requiresCompositingForWillChangeGpuRasterizationHint(const RenderObject* renderer) const |
+{ |
if (!(m_compositingTriggers & GPURasterizationTrigger)) |
return false; |