Chromium Code Reviews| Index: Source/platform/graphics/paint/SubtreeRecorder.cpp |
| diff --git a/Source/platform/graphics/paint/SubtreeRecorder.cpp b/Source/platform/graphics/paint/SubtreeRecorder.cpp |
| index 5cc1e8caf64f7784318d66d3480247c9ab8fd53c..f8a3163ace99a9dcf2db5648ec221bc43d1991c4 100644 |
| --- a/Source/platform/graphics/paint/SubtreeRecorder.cpp |
| +++ b/Source/platform/graphics/paint/SubtreeRecorder.cpp |
| @@ -13,46 +13,50 @@ |
| namespace blink { |
| +bool SubtreeRecorder::useCachedSubtreeIfPossible(GraphicsContext& context, const DisplayItemClientWrapper& client, int paintPhase) |
|
pdr.
2015/08/20 22:45:06
int paintPhase -> PaintPhase phase, or maybe unsig
|
| +{ |
| + // The conditions of returning false is not complete for a specific client. |
| + // The client must check additional conditions before calling this function. |
| + |
| + ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled()); |
| + ASSERT(context.displayItemList()); |
| + |
| + if (context.displayItemList()->displayItemConstructionIsDisabled() || RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEnabled()) |
| + return false; |
| + |
| + if (!context.displayItemList()->clientCacheIsValid(client.displayItemClient())) |
| + return false; |
| + |
| + // Append CachedSubtree display item only if we have cached the subtree. |
|
pdr.
2015/08/20 22:45:06
WDYT about disabling the empty pair optimization f
Xianzhu
2015/08/21 00:31:38
That will generate empty subtrees for paint phases
|
| + // Otherwise it means that we generated an empty subtree previously |
| + // (e.g in PaintPhaseOutline phase but there is no descendant has outline). |
| + if (context.displayItemList()->subtreeCacheIsValid(client.displayItemClient(), DisplayItem::paintPhaseToBeginSubtreeType(paintPhase))) |
| + context.displayItemList()->createAndAppend<CachedDisplayItem>(client, DisplayItem::paintPhaseToCachedSubtreeType(paintPhase)); |
| + return true; |
| +} |
| + |
| SubtreeRecorder::SubtreeRecorder(GraphicsContext& context, const DisplayItemClientWrapper& client, int paintPhase) |
| : m_displayItemList(context.displayItemList()) |
| , m_client(client) |
| , m_paintPhase(paintPhase) |
| - , m_canUseCache(false) |
| -#if ENABLE(ASSERT) |
| - , m_checkedCanUseCache(false) |
| -#endif |
| { |
| - if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled()) |
| - return; |
| - |
| + ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled()); |
| ASSERT(m_displayItemList); |
| - // TODO(wangxianzhu): Implement subtree caching. |
| + // Must check SubtreeRecorder::useCachedSubtreeIfPossible before creating the DrawingRecorder. |
| + // ASSERT(!useCachedSubtreeIfPossible(context, client, paintPhase)); |
| - if (!m_canUseCache) |
| - m_displayItemList->createAndAppend<BeginSubtreeDisplayItem>(m_client, DisplayItem::paintPhaseToBeginSubtreeType(paintPhase)); |
| + m_displayItemList->createAndAppend<BeginSubtreeDisplayItem>(client, DisplayItem::paintPhaseToBeginSubtreeType(paintPhase)); |
| } |
| SubtreeRecorder::~SubtreeRecorder() |
| { |
| - if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled()) |
| - return; |
| + ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled()); |
| - ASSERT(m_checkedCanUseCache); |
| - if (m_canUseCache) |
| - m_displayItemList->createAndAppend<CachedDisplayItem>(m_client, DisplayItem::paintPhaseToCachedSubtreeType(m_paintPhase)); |
| - else if (m_displayItemList->lastDisplayItemIsNoopBegin()) |
| + if (m_displayItemList->lastDisplayItemIsNoopBegin()) |
| m_displayItemList->removeLastDisplayItem(); |
| else |
| m_displayItemList->createAndAppend<EndSubtreeDisplayItem>(m_client, DisplayItem::paintPhaseToEndSubtreeType(m_paintPhase)); |
| } |
| -bool SubtreeRecorder::canUseCache() const |
| -{ |
| -#if ENABLE(ASSERT) |
| - m_checkedCanUseCache = true; |
| -#endif |
| - return m_canUseCache; |
| -} |
| - |
| } // namespace blink |