Index: Source/core/rendering/compositing/RenderLayerCompositor.cpp |
diff --git a/Source/core/rendering/compositing/RenderLayerCompositor.cpp b/Source/core/rendering/compositing/RenderLayerCompositor.cpp |
index 4dc163ee1db39682f9c3fb41cfad7735eaae0f1b..3da95af9acf7cb4d5b1f9b28289a7db425d26f16 100644 |
--- a/Source/core/rendering/compositing/RenderLayerCompositor.cpp |
+++ b/Source/core/rendering/compositing/RenderLayerCompositor.cpp |
@@ -198,12 +198,11 @@ struct CompositingRecursionData { |
RenderLayerCompositor::RenderLayerCompositor(RenderView& renderView) |
: m_renderView(renderView) |
, m_compositingReasonFinder(renderView) |
+ , m_pendingUpdateType(CompositingUpdateNone) |
, m_hasAcceleratedCompositing(true) |
, m_showRepaintCounter(false) |
, m_needsToRecomputeCompositingRequirements(false) |
, m_needsToUpdateLayerTreeGeometry(false) |
- , m_pendingUpdateType(GraphicsLayerUpdater::DoNotForceUpdate) |
- , m_pendingPropertyUpdateType(CompositingPropertyUpdater::DoNotForceUpdate) |
, m_compositing(false) |
, m_compositingLayersNeedRebuild(false) |
, m_forceCompositingMode(false) |
@@ -344,6 +343,7 @@ void RenderLayerCompositor::finishCompositingUpdateForFrameTree(LocalFrame* fram |
void RenderLayerCompositor::setNeedsCompositingUpdate(CompositingUpdateType updateType) |
{ |
+ ASSERT(updateType != CompositingUpdateNone); |
// FIXME: this code was historically part of updateCompositingLayers, and |
// for now is kept totally equivalent to the previous implementation. We |
// should carefully clean up the awkward early-exit semantics, balancing between |
@@ -360,31 +360,24 @@ void RenderLayerCompositor::setNeedsCompositingUpdate(CompositingUpdateType upda |
if (!m_needsToRecomputeCompositingRequirements && !m_compositing) |
return; |
+ m_pendingUpdateType = std::max(m_pendingUpdateType, updateType); |
+ |
switch (updateType) { |
+ case CompositingUpdateNone: |
+ ASSERT_NOT_REACHED(); |
+ break; |
case CompositingUpdateAfterStyleChange: |
m_needsToRecomputeCompositingRequirements = true; |
break; |
case CompositingUpdateAfterLayout: |
m_needsToRecomputeCompositingRequirements = true; |
- // FIXME: Ideally we'd be smarter about tracking dirtiness and wouldn't need a ForceUpdate here. |
- m_pendingUpdateType = GraphicsLayerUpdater::ForceUpdate; |
- // FIXME: Ideally we'd be smarter about tracking dirtiness and wouldn't need a ForceUpdate here. |
- m_pendingPropertyUpdateType = CompositingPropertyUpdater::ForceUpdate; |
break; |
case CompositingUpdateOnScroll: |
m_needsToRecomputeCompositingRequirements = true; // Overlap can change with scrolling, so need to check for hierarchy updates. |
m_needsToUpdateLayerTreeGeometry = true; |
- // FIXME: Ideally we'd be smarter about tracking dirtiness and wouldn't need a ForceUpdate here. |
- m_pendingUpdateType = GraphicsLayerUpdater::ForceUpdate; |
- // FIXME: Ideally we'd be smarter about tracking dirtiness and wouldn't need a ForceUpdate here. |
- m_pendingPropertyUpdateType = CompositingPropertyUpdater::ForceUpdate; |
break; |
case CompositingUpdateOnCompositedScroll: |
m_needsToUpdateLayerTreeGeometry = true; |
- // FIXME: Ideally we'd be smarter about tracking dirtiness and wouldn't need a ForceUpdate here. |
- m_pendingUpdateType = GraphicsLayerUpdater::ForceUpdate; |
- // FIXME: Ideally we'd be smarter about tracking dirtiness and wouldn't need a ForceUpdate here. |
- m_pendingPropertyUpdateType = CompositingPropertyUpdater::ForceUpdate; |
break; |
case CompositingUpdateAfterCanvasContextChange: |
m_needsToUpdateLayerTreeGeometry = true; |
@@ -444,7 +437,7 @@ void RenderLayerCompositor::scheduleAnimationIfNeeded() |
bool RenderLayerCompositor::hasUnresolvedDirtyBits() |
{ |
- return m_needsToRecomputeCompositingRequirements || m_compositingLayersNeedRebuild || m_needsToUpdateLayerTreeGeometry || m_needsUpdateCompositingRequirementsState || m_pendingUpdateType != GraphicsLayerUpdater::DoNotForceUpdate; |
+ return m_needsToRecomputeCompositingRequirements || m_compositingLayersNeedRebuild || m_needsToUpdateLayerTreeGeometry || m_needsUpdateCompositingRequirementsState || m_pendingUpdateType > CompositingUpdateNone; |
} |
void RenderLayerCompositor::updateCompositingLayersInternal() |
@@ -458,6 +451,8 @@ void RenderLayerCompositor::updateCompositingLayersInternal() |
if (!m_needsToRecomputeCompositingRequirements && !m_compositing) |
return; |
+ CompositingUpdateType updateType = m_pendingUpdateType; |
+ |
bool needCompositingRequirementsUpdate = m_needsToRecomputeCompositingRequirements; |
bool needHierarchyAndGeometryUpdate = m_compositingLayersNeedRebuild; |
bool needGeometryUpdate = m_needsToUpdateLayerTreeGeometry; |
@@ -466,13 +461,21 @@ void RenderLayerCompositor::updateCompositingLayersInternal() |
if (!needCompositingRequirementsUpdate && !needHierarchyAndGeometryUpdate && !needGeometryUpdate && !needsToUpdateScrollingCoordinator) |
return; |
- GraphicsLayerUpdater::UpdateType updateType = m_pendingUpdateType; |
+ m_pendingUpdateType = CompositingUpdateNone; |
+ |
+ GraphicsLayerUpdater::UpdateType graphicsLayerUpdateType = GraphicsLayerUpdater::DoNotForceUpdate; |
+ CompositingPropertyUpdater::UpdateType compositingPropertyUpdateType = CompositingPropertyUpdater::DoNotForceUpdate; |
+ |
+ // FIXME: Teach non-style compositing updates how to do partial tree walks. |
+ if (updateType >= CompositingUpdateAfterLayout) { |
+ graphicsLayerUpdateType = GraphicsLayerUpdater::ForceUpdate; |
+ compositingPropertyUpdateType = CompositingPropertyUpdater::ForceUpdate; |
+ } |
// Only clear the flags if we're updating the entire hierarchy. |
m_compositingLayersNeedRebuild = false; |
m_needsToUpdateLayerTreeGeometry = false; |
m_needsToRecomputeCompositingRequirements = false; |
- m_pendingUpdateType = GraphicsLayerUpdater::DoNotForceUpdate; |
RenderLayer* updateRoot = rootRenderLayer(); |
@@ -485,8 +488,7 @@ void RenderLayerCompositor::updateCompositingLayersInternal() |
{ |
TRACE_EVENT0("blink_rendering", "CompositingPropertyUpdater::updateAncestorDependentProperties"); |
- CompositingPropertyUpdater(updateRoot).updateAncestorDependentProperties(updateRoot, m_pendingPropertyUpdateType, 0); |
- m_pendingPropertyUpdateType = CompositingPropertyUpdater::DoNotForceUpdate; |
+ CompositingPropertyUpdater(updateRoot).updateAncestorDependentProperties(updateRoot, compositingPropertyUpdateType, 0); |
#if !ASSERT_DISABLED |
CompositingPropertyUpdater::assertNeedsToUpdateAncestorDependantPropertiesBitsCleared(updateRoot); |
#endif |
@@ -525,7 +527,7 @@ void RenderLayerCompositor::updateCompositingLayersInternal() |
if (needGeometryUpdate || needHierarchyAndGeometryUpdate) { |
TRACE_EVENT0("blink_rendering", "GraphicsLayerUpdater::updateRecursive"); |
- GraphicsLayerUpdater().update(*updateRoot, updateType); |
+ GraphicsLayerUpdater().update(*updateRoot, graphicsLayerUpdateType); |
#if !ASSERT_DISABLED |
// FIXME: Move this check to the end of the compositing update. |
GraphicsLayerUpdater::assertNeedsToUpdateGraphicsLayerBitsCleared(*updateRoot); |