Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(734)

Unified Diff: third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp

Issue 1508223005: Client side display item cache flag (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@ScrollbarTheme
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp
diff --git a/third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp b/third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp
index 2bd50f9f069be0fbb67935efaa0307b0bfae05d1..8efce90b767e63221abde10ce89019e21e04cf55 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp
+++ b/third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp
@@ -141,9 +141,8 @@ void PaintController::invalidateClient(const DisplayItemClient& client)
void PaintController::invalidateUntracked(const DisplayItemClient& client)
{
// This can be called during painting, but we can't invalidate already painted clients.
+ client.setDisplayItemsCached(DisplayItemClient::kInvalidCacheGeneration);
ASSERT(!m_newDisplayItemIndicesByClient.contains(&client));
- updateValidlyCachedClientsIfNeeded();
- m_validlyCachedClients.remove(&client);
}
void PaintController::invalidateAll()
@@ -151,8 +150,7 @@ void PaintController::invalidateAll()
// Can only be called during layout/paintInvalidation, not during painting.
ASSERT(m_newDisplayItemList.isEmpty());
m_currentPaintArtifact.reset();
- m_validlyCachedClients.clear();
- m_validlyCachedClientsDirty = false;
+ m_currentCacheGeneration = DisplayItemClient::kInvalidCacheGeneration;
if (RuntimeEnabledFeatures::slimmingPaintV2Enabled() && m_trackedPaintInvalidationObjects)
m_trackedPaintInvalidationObjects->append("##ALL##");
@@ -160,10 +158,10 @@ void PaintController::invalidateAll()
bool PaintController::clientCacheIsValid(const DisplayItemClient& client) const
{
- if (skippingCache())
+ ASSERT(DisplayItemClient::isAlive(client));
+ if (!canUseClientCacheStatus() || skippingCache())
return false;
- updateValidlyCachedClientsIfNeeded();
- return m_validlyCachedClients.contains(&client);
+ return client.displayItemsAreCached(m_currentCacheGeneration);
}
void PaintController::invalidatePaintOffset(const DisplayItemClient& client)
@@ -239,12 +237,10 @@ DisplayItemList::iterator PaintController::findOutOfOrderCachedItemForward(const
for (; context.nextItemToIndex != currentEnd; ++context.nextItemToIndex) {
const DisplayItem& item = *context.nextItemToIndex;
ASSERT(item.hasValidClient());
- if (item.isCacheable() && clientCacheIsValid(item.client())) {
- if (id.matches(item))
- return context.nextItemToIndex++;
-
+ if (id.matches(item))
+ return context.nextItemToIndex++;
+ if (item.isCacheable())
addItemToIndexIfNeeded(item, context.nextItemToIndex - m_currentPaintArtifact.displayItemList().begin(), context.displayItemIndicesByClient);
- }
}
return currentEnd;
}
@@ -292,9 +288,6 @@ void PaintController::commitNewDisplayItemsInternal()
"num_non_cached_new_items", (int)m_newDisplayItemList.size() - m_numCachedNewItems);
m_numCachedNewItems = 0;
- if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
- m_clientsCheckedPaintInvalidation.clear();
-
// These data structures are used during painting only.
ASSERT(m_scopeStack.isEmpty());
m_scopeStack.clear();
@@ -313,12 +306,10 @@ void PaintController::commitNewDisplayItemsInternal()
#endif
m_currentPaintArtifact.displayItemList().swap(m_newDisplayItemList);
m_currentPaintArtifact.paintChunks() = m_newPaintChunks.releasePaintChunks();
- m_validlyCachedClientsDirty = true;
+ updateCacheGeneration();
return;
}
- updateValidlyCachedClientsIfNeeded();
-
// Stores indices to valid DrawingDisplayItems in m_currentDisplayItems that have not been matched
// by CachedDisplayItems during synchronized matching. The indexed items will be matched
// by later out-of-order CachedDisplayItems in m_newDisplayItemList. This ensures that when
@@ -340,7 +331,7 @@ void PaintController::commitNewDisplayItemsInternal()
if (newDisplayItemHasCachedType) {
ASSERT(newDisplayItem.isCached());
- ASSERT(clientCacheIsValid(newDisplayItem.client()) || (RuntimeEnabledFeatures::slimmingPaintOffsetCachingEnabled() && !paintOffsetWasInvalidated(newDisplayItem.client())));
+ // ASSERT(clientCacheIsValid(newDisplayItem.client()) || (RuntimeEnabledFeatures::slimmingPaintOffsetCachingEnabled() && !paintOffsetWasInvalidated(newDisplayItem.client())));
pdr. 2016/01/04 21:19:30 Drive by: did you forget this?
if (!isSynchronized) {
currentIt = findOutOfOrderCachedItem(newDisplayItemId, outOfOrderIndexContext);
@@ -371,11 +362,11 @@ void PaintController::commitNewDisplayItemsInternal()
ASSERT(updatedList.last().type() == DisplayItem::EndSubsequence);
}
} else {
- ASSERT(!newDisplayItem.isDrawing()
+ /*ASSERT(!newDisplayItem.isDrawing()
pdr. 2016/01/04 21:19:30 Drive by: did you forget this?
|| newDisplayItem.skippedCache()
|| !clientCacheIsValid(newDisplayItem.client())
|| (RuntimeEnabledFeatures::slimmingPaintOffsetCachingEnabled() && paintOffsetWasInvalidated(newDisplayItem.client())));
-
+ */
updatedList.appendByMoving(*newIt);
if (isSynchronized)
@@ -397,7 +388,7 @@ void PaintController::commitNewDisplayItemsInternal()
m_currentPaintArtifact.paintChunks() = m_newPaintChunks.releasePaintChunks();
m_newDisplayItemList.clear();
- m_validlyCachedClientsDirty = true;
+ updateCacheGeneration();
}
size_t PaintController::approximateUnsharedMemoryUsage() const
@@ -425,22 +416,27 @@ size_t PaintController::approximateUnsharedMemoryUsage() const
return memoryUsage;
}
-void PaintController::updateValidlyCachedClientsIfNeeded() const
+unsigned PaintController::nextCacheGeneration()
{
- if (!m_validlyCachedClientsDirty)
- return;
+ static unsigned cacheGeneration = DisplayItemClient::kInvalidCacheGeneration;
+ ++cacheGeneration;
+ if (cacheGeneration == DisplayItemClient::kInvalidCacheGeneration) {
+ // TODO(wangxianzhu): We'll reuse an old cache generation. Should invalidate all
+ // clients that are still using the old generation.
+ ++cacheGeneration;
+ }
+ return cacheGeneration;
+}
- m_validlyCachedClients.clear();
- m_validlyCachedClientsDirty = false;
+void PaintController::updateCacheGeneration()
+{
+ if (!canUseClientCacheStatus())
+ return;
- const DisplayItemClient* lastAddedClient = nullptr;
- for (const DisplayItem& displayItem : m_currentPaintArtifact.displayItemList()) {
- if (&displayItem.client() == lastAddedClient)
- continue;
- if (displayItem.isCacheable()) {
- lastAddedClient = &displayItem.client();
- m_validlyCachedClients.add(lastAddedClient);
- }
+ m_currentCacheGeneration = nextCacheGeneration();
+ for (const auto& item : displayItemList()) {
+ if (item.isCacheable())
+ item.client().setDisplayItemsCached(m_currentCacheGeneration);
}
}
@@ -507,7 +503,7 @@ void PaintController::checkCachedDisplayItemIsUnchanged(const char* messagePrefi
ASSERT_NOT_REACHED();
}
- if (newItem.isCacheable() && !m_validlyCachedClients.contains(&newItem.client())) {
+ if (newItem.isCacheable()) { /////// EEE && !m_validlyCachedClients.contains(&newItem.client())) {
pdr. 2016/01/04 21:19:30 Drive by: did you forget this?
showUnderInvalidationError(messagePrefix, "ERROR: under-invalidation: invalidated in cached subsequence", &newItem, &oldItem);
ASSERT_NOT_REACHED();
}
@@ -556,8 +552,10 @@ WTF::String PaintController::displayItemListAsDebugString(const DisplayItemList&
stringBuilder.append(",\n");
stringBuilder.append(String::format("{index: %d, ", (int)i));
displayItem.dumpPropertiesAsDebugString(stringBuilder);
- stringBuilder.append(", cacheIsValid: ");
- stringBuilder.append(clientCacheIsValid(displayItem.client()) ? "true" : "false");
+ if (displayItem.hasValidClient()) {
+ stringBuilder.append(", cacheIsValid: ");
+ stringBuilder.append(clientCacheIsValid(displayItem.client()) ? "true" : "false");
+ }
stringBuilder.append('}');
}
return stringBuilder.toString();

Powered by Google App Engine
This is Rietveld 408576698