Index: Source/platform/graphics/paint/DisplayItemList.cpp |
diff --git a/Source/platform/graphics/paint/DisplayItemList.cpp b/Source/platform/graphics/paint/DisplayItemList.cpp |
index 8a66d0c723c1491684403b72ab143d992878312c..72054a59f70cfa4b1268a28629a46333fc3ff898 100644 |
--- a/Source/platform/graphics/paint/DisplayItemList.cpp |
+++ b/Source/platform/graphics/paint/DisplayItemList.cpp |
@@ -149,8 +149,8 @@ size_t DisplayItemList::findMatchingItemFromIndex(const DisplayItem::Id& id, con |
for (size_t index : indices) { |
// TODO(pdr): elementAt is not cheap so this should be refactored (See crbug.com/505965). |
const DisplayItem& existingItem = list[index]; |
- ASSERT(existingItem.ignoreFromDisplayList() || existingItem.client() == id.client); |
- if (!existingItem.ignoreFromDisplayList() && id.matches(existingItem)) |
+ ASSERT(!existingItem.isValid() || existingItem.client() == id.client); |
+ if (existingItem.isValid() && id.matches(existingItem)) |
return index; |
} |
@@ -168,7 +168,7 @@ void DisplayItemList::addItemToIndexIfNeeded(const DisplayItem& displayItem, siz |
indices.append(index); |
} |
-DisplayItems::iterator DisplayItemList::findOutOfOrderCachedItem(DisplayItems::iterator currentIt, const DisplayItem::Id& id, DisplayItemIndicesByClientMap& displayItemIndicesByClient) |
+DisplayItems::iterator DisplayItemList::findOutOfOrderCachedItem(DisplayItems::iterator& nextItemToIndexIt, const DisplayItem::Id& id, DisplayItemIndicesByClientMap& displayItemIndicesByClient) |
{ |
ASSERT(clientCacheIsValid(id.client)); |
@@ -176,22 +176,21 @@ DisplayItems::iterator DisplayItemList::findOutOfOrderCachedItem(DisplayItems::i |
if (foundIndex != kNotFound) |
return m_currentDisplayItems.begin() + foundIndex; |
- return findOutOfOrderCachedItemForward(currentIt, id, displayItemIndicesByClient); |
+ return findOutOfOrderCachedItemForward(nextItemToIndexIt, id, displayItemIndicesByClient); |
} |
// Find forward for the item and index all skipped indexable items. |
-DisplayItems::iterator DisplayItemList::findOutOfOrderCachedItemForward(DisplayItems::iterator currentIt, const DisplayItem::Id& id, DisplayItemIndicesByClientMap& displayItemIndicesByClient) |
+DisplayItems::iterator DisplayItemList::findOutOfOrderCachedItemForward(DisplayItems::iterator& nextItemToIndexIt, const DisplayItem::Id& id, DisplayItemIndicesByClientMap& displayItemIndicesByClient) |
{ |
DisplayItems::iterator currentEnd = m_currentDisplayItems.end(); |
- for (; currentIt != currentEnd; ++currentIt) { |
- const DisplayItem& item = *currentIt; |
- if (!item.ignoreFromDisplayList() |
- && item.isCacheable() |
- && m_validlyCachedClients.contains(item.client())) { |
+ for (; nextItemToIndexIt != currentEnd; ++nextItemToIndexIt) { |
+ const DisplayItem& item = *nextItemToIndexIt; |
+ ASSERT(item.isValid()); |
+ if (item.isCacheable() && clientCacheIsValid(item.client())) { |
if (id.matches(item)) |
- return currentIt; |
+ return nextItemToIndexIt++; |
- addItemToIndexIfNeeded(item, currentIt - m_currentDisplayItems.begin(), displayItemIndicesByClient); |
+ addItemToIndexIfNeeded(item, nextItemToIndexIt - m_currentDisplayItems.begin(), displayItemIndicesByClient); |
} |
} |
return currentEnd; |
@@ -203,14 +202,12 @@ void DisplayItemList::copyCachedSubtree(DisplayItems::iterator& currentIt, Displ |
ASSERT(currentIt->isBeginSubtree()); |
ASSERT(!currentIt->scope()); |
DisplayItem::Id endSubtreeId(currentIt->client(), DisplayItem::beginSubtreeTypeToEndSubtreeType(currentIt->type()), 0); |
- while (true) { |
- updatedList.appendByMoving(*currentIt, currentIt->derivedSize()); |
- if (endSubtreeId.matches(updatedList.last())) |
- break; |
- ++currentIt; |
+ do { |
// We should always find the EndSubtree display item. |
ASSERT(currentIt != m_currentDisplayItems.end()); |
- } |
+ updatedList.appendByMoving(*currentIt, currentIt->derivedSize()); |
+ ++currentIt; |
+ } while (!endSubtreeId.matches(updatedList.last())); |
} |
// Update the existing display items by removing invalidated entries, updating |
@@ -276,22 +273,23 @@ void DisplayItemList::commitNewDisplayItems(DisplayListDiff*) |
std::max(m_currentDisplayItems.usedCapacityInBytes(), m_newDisplayItems.usedCapacityInBytes())); |
DisplayItems::iterator currentIt = m_currentDisplayItems.begin(); |
DisplayItems::iterator currentEnd = m_currentDisplayItems.end(); |
+ DisplayItems::iterator nextItemToIndexIt = currentIt; |
for (DisplayItems::iterator newIt = m_newDisplayItems.begin(); newIt != m_newDisplayItems.end(); ++newIt) { |
const DisplayItem& newDisplayItem = *newIt; |
const DisplayItem::Id newDisplayItemId = newDisplayItem.nonCachedId(); |
bool newDisplayItemHasCachedType = newDisplayItem.type() != newDisplayItemId.type; |
- bool isSynchronized = currentIt != currentEnd |
- && !currentIt->ignoreFromDisplayList() |
- && newDisplayItemId.matches(*currentIt); |
+ bool isSynchronized = currentIt != currentEnd && newDisplayItemId.matches(*currentIt); |
if (newDisplayItemHasCachedType) { |
ASSERT(!RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEnabled()); |
ASSERT(newDisplayItem.isCached()); |
ASSERT(clientCacheIsValid(newDisplayItem.client())); |
if (!isSynchronized) { |
- DisplayItems::iterator foundIt = findOutOfOrderCachedItem(currentIt, newDisplayItemId, displayItemIndicesByClient); |
- ASSERT(foundIt != currentIt); |
+ // Skip indexing of copied items. |
+ if (currentIt - nextItemToIndexIt > 0) |
+ nextItemToIndexIt = currentIt; |
+ DisplayItems::iterator foundIt = findOutOfOrderCachedItem(nextItemToIndexIt, newDisplayItemId, displayItemIndicesByClient); |
if (foundIt == currentEnd) { |
#ifndef NDEBUG |
@@ -305,11 +303,14 @@ void DisplayItemList::commitNewDisplayItems(DisplayListDiff*) |
// attempt to recover rather than crashing or bailing on display of the rest of the display list. |
continue; |
} |
+ |
+ ASSERT(foundIt != currentIt); // otherwise isSynchronized should be true. |
pdr.
2015/08/17 23:28:50
ASSERT(isSynchronized)?
Xianzhu
2015/08/17 23:46:59
The comment above seems confusing.
Changed to:
|
currentIt = foundIt; |
} |
if (newDisplayItem.isCachedDrawing()) { |
updatedList.appendByMoving(*currentIt, currentIt->derivedSize()); |
+ ++currentIt; |
} else { |
ASSERT(newDisplayItem.isCachedSubtree()); |
copyCachedSubtree(currentIt, updatedList); |
@@ -323,10 +324,10 @@ void DisplayItemList::commitNewDisplayItems(DisplayListDiff*) |
ASSERT(!newDisplayItem.isDrawing() || newDisplayItem.skippedCache() || !clientCacheIsValid(newDisplayItem.client())); |
#endif // ENABLE(ASSERT) |
updatedList.appendByMoving(*newIt, newIt->derivedSize()); |
- } |
- if (isSynchronized) |
- ++currentIt; |
+ if (isSynchronized) |
+ ++currentIt; |
+ } |
} |
#if ENABLE(ASSERT) |
@@ -440,8 +441,8 @@ void DisplayItemList::checkCachedDisplayItemIsUnchanged(const DisplayItem& displ |
DisplayItems::iterator foundItem = m_currentDisplayItems.begin() + index; |
RefPtr<const SkPicture> newPicture = static_cast<const DrawingDisplayItem&>(displayItem).picture(); |
RefPtr<const SkPicture> oldPicture = static_cast<const DrawingDisplayItem&>(*foundItem).picture(); |
- // Mark the display item as ignored so that we can check if there are any remaining cached display items after merging. |
- foundItem->setIgnoredFromDisplayList(); |
+ // Invalidate the display item so that we can check if there are any remaining cached display items after merging. |
+ foundItem->invalidate(); |
if (!newPicture && !oldPicture) |
return; |
@@ -497,7 +498,7 @@ void DisplayItemList::checkNoRemainingCachedDisplayItems() |
ASSERT(RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEnabled()); |
for (const auto& displayItem : m_currentDisplayItems) { |
- if (displayItem.ignoreFromDisplayList() || !displayItem.isDrawing() || !clientCacheIsValid(displayItem.client())) |
+ if (!displayItem.isValid() || !displayItem.isDrawing() || !clientCacheIsValid(displayItem.client())) |
continue; |
showUnderInvalidationError("May be under-invalidation: no new display item", displayItem); |
} |
@@ -515,7 +516,7 @@ WTF::String DisplayItemList::displayItemsAsDebugString(const DisplayItems& list) |
const DisplayItem& displayItem = *it; |
if (i) |
stringBuilder.append(",\n"); |
- if (displayItem.ignoreFromDisplayList()) { |
+ if (!displayItem.isValid()) { |
stringBuilder.append("null"); |
continue; |
} |