Index: Source/core/rendering/compositing/CompositedLayerMapping.cpp |
diff --git a/Source/core/rendering/compositing/CompositedLayerMapping.cpp b/Source/core/rendering/compositing/CompositedLayerMapping.cpp |
index 3ce4290754caaf99725c2b7979cdb3f2ffe5c226..c4b925762ab4a9360faa4d603027796c39291d98 100644 |
--- a/Source/core/rendering/compositing/CompositedLayerMapping.cpp |
+++ b/Source/core/rendering/compositing/CompositedLayerMapping.cpp |
@@ -421,7 +421,7 @@ void CompositedLayerMapping::updateAfterLayout(UpdateAfterLayoutFlags flags) |
layerCompositor->updateCompositingDescendantGeometry(m_owningLayer->stackingNode(), m_owningLayer, flags & CompositingChildrenOnly); |
if (flags & IsUpdateRoot) { |
- updateGraphicsLayerGeometry(); |
+ updateGraphicsLayerGeometry(GraphicsLayerUpdater::ForceUpdate); |
layerCompositor->updateRootLayerPosition(); |
RenderLayerStackingNode* stackingContainer = m_owningLayer->stackingNode()->enclosingStackingContainerNode(); |
if (!layerCompositor->compositingLayersNeedRebuild() && stackingContainer && (stackingContainer != m_owningLayer->stackingNode())) |
@@ -617,11 +617,17 @@ void CompositedLayerMapping::updateSquashingLayerGeometry(const IntPoint& delta) |
} |
} |
-void CompositedLayerMapping::updateGraphicsLayerGeometry() |
+GraphicsLayerUpdater::UpdateType CompositedLayerMapping::updateGraphicsLayerGeometry(GraphicsLayerUpdater::UpdateType updateType) |
{ |
// If we haven't built z-order lists yet, wait until later. |
if (m_owningLayer->stackingNode()->isStackingContainer() && m_owningLayer->stackingNode()->zOrderListsDirty()) |
- return; |
+ return updateType; |
+ |
+ if (!m_needToUpdateGeometry && updateType != GraphicsLayerUpdater::ForceUpdate) |
+ return updateType; |
+ m_needToUpdateGeometry = false; |
+ if (m_needToUpdateGeometryOfAllDecendants) |
+ updateType = GraphicsLayerUpdater::ForceUpdate; |
// Set transform property, if it is not animating. We have to do this here because the transform |
// is affected by the layer dimensions. |
@@ -783,7 +789,7 @@ void CompositedLayerMapping::updateGraphicsLayerGeometry() |
if (m_owningLayer->reflectionInfo() && m_owningLayer->reflectionInfo()->reflectionLayer()->hasCompositedLayerMapping()) { |
CompositedLayerMappingPtr reflectionCompositedLayerMapping = m_owningLayer->reflectionInfo()->reflectionLayer()->compositedLayerMapping(); |
- reflectionCompositedLayerMapping->updateGraphicsLayerGeometry(); |
+ reflectionCompositedLayerMapping->updateGraphicsLayerGeometry(GraphicsLayerUpdater::ForceUpdate); |
// The reflection layer has the bounds of m_owningLayer->reflectionLayer(), |
// but the reflected layer is the bounds of this layer, so we need to position it appropriately. |
@@ -862,6 +868,8 @@ void CompositedLayerMapping::updateGraphicsLayerGeometry() |
registerScrollingLayers(); |
updateCompositingReasons(); |
+ |
+ return updateType; |
} |
void CompositedLayerMapping::registerScrollingLayers() |
@@ -1849,6 +1857,28 @@ void CompositedLayerMapping::setBlendMode(blink::WebBlendMode blendMode) |
} |
} |
+void CompositedLayerMapping::setNeedsGeometryUpdate() |
+{ |
+ m_needToUpdateGeometryOfAllDecendants = true; |
+ |
+ for (RenderLayer* current = m_owningLayer; current; current = current->ancestorCompositingLayer()) { |
+ // FIXME: We should be able to return early from this function once we |
+ // find a CompositedLayerMapping that has m_needToUpdateGeometry set. |
+ // However, we can't do that until we remove the incremental compositing |
+ // updates because they can clear m_needToUpdateGeometry without walking |
+ // the whole tree. |
+ ASSERT(current->hasCompositedLayerMapping()); |
+ CompositedLayerMappingPtr mapping = current->compositedLayerMapping(); |
+ mapping->m_needToUpdateGeometry = true; |
+ } |
+} |
+ |
+void CompositedLayerMapping::clearNeedsGeometryUpdate() |
+{ |
+ m_needToUpdateGeometry = false; |
+ m_needToUpdateGeometryOfAllDecendants = false; |
+} |
+ |
struct SetContentsNeedsDisplayFunctor { |
void operator() (GraphicsLayer* layer) const |
{ |