| Index: Source/platform/graphics/paint/DisplayItemList.cpp
|
| diff --git a/Source/platform/graphics/paint/DisplayItemList.cpp b/Source/platform/graphics/paint/DisplayItemList.cpp
|
| index 9c8fad763e60b0b3cbb4dbcea05602878a2bd54c..deb4b52840e4d7c1ab8bdfb835978cd4fb69692a 100644
|
| --- a/Source/platform/graphics/paint/DisplayItemList.cpp
|
| +++ b/Source/platform/graphics/paint/DisplayItemList.cpp
|
| @@ -73,7 +73,7 @@ void DisplayItemList::processNewItem(DisplayItem* displayItem)
|
| // Verify noop begin/end pairs have been removed.
|
| if (m_newDisplayItems.size() >= 2 && displayItem->isEnd()) {
|
| const auto& beginDisplayItem = m_newDisplayItems[m_newDisplayItems.size() - 2];
|
| - if (beginDisplayItem.isBegin() && !beginDisplayItem.drawsContent())
|
| + if (beginDisplayItem.isBegin() && beginDisplayItem.type() != DisplayItem::BeginSubsequence && !beginDisplayItem.drawsContent())
|
| ASSERT(!displayItem->isEndAndPairedWith(beginDisplayItem.type()));
|
| }
|
| #endif
|
| @@ -178,20 +178,20 @@ DisplayItems::iterator DisplayItemList::findOutOfOrderCachedItem(DisplayItems::i
|
| {
|
| ASSERT(clientCacheIsValid(id.client));
|
|
|
| - // Skip indexing of copied items.
|
| - if (currentIt - context.nextItemToIndex > 0)
|
| - context.nextItemToIndex = currentIt;
|
| -
|
| size_t foundIndex = findMatchingItemFromIndex(id, context.displayItemIndicesByClient, m_currentDisplayItems);
|
| if (foundIndex != kNotFound)
|
| return m_currentDisplayItems.begin() + foundIndex;
|
|
|
| - return findOutOfOrderCachedItemForward(id, context);
|
| + return findOutOfOrderCachedItemForward(currentIt, id, context);
|
| }
|
|
|
| // Find forward for the item and index all skipped indexable items.
|
| -DisplayItems::iterator DisplayItemList::findOutOfOrderCachedItemForward(const DisplayItem::Id& id, OutOfOrderIndexContext& context)
|
| +DisplayItems::iterator DisplayItemList::findOutOfOrderCachedItemForward(DisplayItems::iterator currentIt, const DisplayItem::Id& id, OutOfOrderIndexContext& context)
|
| {
|
| + // Items before currentIt should have been copied. Skip indexing of them.
|
| + if (currentIt - context.nextItemToIndex > 0)
|
| + context.nextItemToIndex = currentIt;
|
| +
|
| DisplayItems::iterator currentEnd = m_currentDisplayItems.end();
|
| for (; context.nextItemToIndex != currentEnd; ++context.nextItemToIndex) {
|
| const DisplayItem& item = *context.nextItemToIndex;
|
| @@ -206,30 +206,30 @@ DisplayItems::iterator DisplayItemList::findOutOfOrderCachedItemForward(const Di
|
| return currentEnd;
|
| }
|
|
|
| -void DisplayItemList::copyCachedSubtree(DisplayItems::iterator& currentIt, DisplayItems& updatedList)
|
| +void DisplayItemList::copyCachedSubsequence(DisplayItems::iterator& currentIt, DisplayItems& updatedList)
|
| {
|
| ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled());
|
| - ASSERT(currentIt->isBeginSubtree());
|
| + ASSERT(currentIt->type() == DisplayItem::BeginSubsequence);
|
| ASSERT(!currentIt->scope());
|
| - DisplayItem::Id endSubtreeId(currentIt->client(), DisplayItem::beginSubtreeTypeToEndSubtreeType(currentIt->type()), 0);
|
| + DisplayItem::Id endSubsequenceId(currentIt->client(), DisplayItem::EndSubsequence, 0);
|
| do {
|
| - // We should always find the EndSubtree display item.
|
| + // We should always find the EndSubsequence display item.
|
| ASSERT(currentIt != m_currentDisplayItems.end());
|
| updatedList.appendByMoving(*currentIt, currentIt->derivedSize());
|
| ++currentIt;
|
| - } while (!endSubtreeId.matches(updatedList.last()));
|
| + } while (!endSubsequenceId.matches(updatedList.last()));
|
| }
|
|
|
| // Update the existing display items by removing invalidated entries, updating
|
| // repainted ones, and appending new items.
|
| // - For CachedDisplayItem, copy the corresponding cached DrawingDisplayItem;
|
| -// - For SubtreeCachedDisplayItem, copy the cached display items between the
|
| -// corresponding BeginSubtreeDisplayItem and EndSubtreeDisplayItem (incl.);
|
| +// - For SubsequenceCachedDisplayItem, copy the cached display items between the
|
| +// corresponding BeginSubsequenceDisplayItem and EndSubsequenceDisplayItem (incl.);
|
| // - Otherwise, copy the new display item.
|
| //
|
| // The algorithm is O(|m_currentDisplayItems| + |m_newDisplayItems|).
|
| -// Coefficients are related to the ratio of out-of-order [Subtree]CachedDisplayItems
|
| -// and the average number of (Drawing|BeginSubtree)DisplayItems per client.
|
| +// Coefficients are related to the ratio of out-of-order [Subsequence]CachedDisplayItems
|
| +// and the average number of (Drawing|BeginSubsequence)DisplayItems per client.
|
| //
|
| // TODO(pdr): Implement the DisplayListDiff algorithm for SlimmingPaintV2.
|
| void DisplayItemList::commitNewDisplayItems(DisplayListDiff*)
|
| @@ -295,32 +295,28 @@ void DisplayItemList::commitNewDisplayItems(DisplayListDiff*)
|
| ASSERT(newDisplayItem.isCached());
|
| ASSERT(clientCacheIsValid(newDisplayItem.client()));
|
| if (!isSynchronized) {
|
| - DisplayItems::iterator foundIt = findOutOfOrderCachedItem(currentIt, newDisplayItemId, outOfOrderIndexContext);
|
| + currentIt = findOutOfOrderCachedItem(currentIt, newDisplayItemId, outOfOrderIndexContext);
|
|
|
| - if (foundIt == currentEnd) {
|
| + if (currentIt == currentEnd) {
|
| #ifndef NDEBUG
|
| showDebugData();
|
| WTFLogAlways("%s not found in m_currentDisplayItems\n", newDisplayItem.asDebugString().utf8().data());
|
| #endif
|
| ASSERT_NOT_REACHED();
|
| -
|
| - // If foundIt == currentEnd, it means that we did not find the cached display item. This should be impossible, but may occur
|
| - // if there is a bug in the system, such as under-invalidation, incorrect cache checking or duplicate display ids. In this case,
|
| - // attempt to recover rather than crashing or bailing on display of the rest of the display list.
|
| + // We did not find the cached display item. This should be impossible, but may occur if there is a bug
|
| + // in the system, such as under-invalidation, incorrect cache checking or duplicate display ids.
|
| + // In this case, attempt to recover rather than crashing or bailing on display of the rest of the display list.
|
| continue;
|
| }
|
| -
|
| - ASSERT(foundIt != currentIt); // because we are in 'if (!isSynchronized)'
|
| - currentIt = foundIt;
|
| }
|
|
|
| if (newDisplayItem.isCachedDrawing()) {
|
| updatedList.appendByMoving(*currentIt, currentIt->derivedSize());
|
| ++currentIt;
|
| } else {
|
| - ASSERT(newDisplayItem.isCachedSubtree());
|
| - copyCachedSubtree(currentIt, updatedList);
|
| - ASSERT(updatedList.last().isEndSubtree());
|
| + ASSERT(newDisplayItem.type() == DisplayItem::CachedSubsequence);
|
| + copyCachedSubsequence(currentIt, updatedList);
|
| + ASSERT(updatedList.last().type() == DisplayItem::EndSubsequence);
|
| }
|
| } else {
|
| #if ENABLE(ASSERT)
|
|
|