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

Side by Side Diff: Source/platform/graphics/paint/DisplayItemList.cpp

Issue 1315993004: Implement a paint offset cache for slimming paint v2 (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 3 months 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 #include "platform/graphics/paint/DisplayItemList.h" 6 #include "platform/graphics/paint/DisplayItemList.h"
7 7
8 #include "platform/NotImplemented.h" 8 #include "platform/NotImplemented.h"
9 #include "platform/RuntimeEnabledFeatures.h" 9 #include "platform/RuntimeEnabledFeatures.h"
10 #include "platform/TraceEvent.h" 10 #include "platform/TraceEvent.h"
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 } 132 }
133 133
134 bool DisplayItemList::clientCacheIsValid(DisplayItemClient client) const 134 bool DisplayItemList::clientCacheIsValid(DisplayItemClient client) const
135 { 135 {
136 if (skippingCache()) 136 if (skippingCache())
137 return false; 137 return false;
138 updateValidlyCachedClientsIfNeeded(); 138 updateValidlyCachedClientsIfNeeded();
139 return m_validlyCachedClients.contains(client); 139 return m_validlyCachedClients.contains(client);
140 } 140 }
141 141
142 void DisplayItemList::invalidatePaintOffset(DisplayItemClient client)
143 {
144 ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled());
145
146 m_validlyCachedClients.remove(client);
Stephen Chennney 2015/08/27 17:25:41 My understanding was that the SkPicture did not ne
pdr. 2015/08/28 03:31:41 You're thinking along the right lines for sure, th
147
148 #if ENABLE(ASSERT)
149 m_clientsWithPaintOffsetInvalidations.add(client);
150
151 // Ensure no phases slipped in using the old paint offset which would indica te
152 // different phases used different paint offsets, which should not happen.
153 for (const auto& item : m_newDisplayItems)
154 ASSERT(!item.isCached() || item.client() != client);
155 #endif
156 }
157
158 #if ENABLE(ASSERT)
159 bool DisplayItemList::paintOffsetWasInvalidated(DisplayItemClient client) const
160 {
161 ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled());
162 return m_clientsWithPaintOffsetInvalidations.contains(client);
163 }
164 #endif
165
142 size_t DisplayItemList::findMatchingItemFromIndex(const DisplayItem::Id& id, con st DisplayItemIndicesByClientMap& displayItemIndicesByClient, const DisplayItems & list) 166 size_t DisplayItemList::findMatchingItemFromIndex(const DisplayItem::Id& id, con st DisplayItemIndicesByClientMap& displayItemIndicesByClient, const DisplayItems & list)
143 { 167 {
144 DisplayItemIndicesByClientMap::const_iterator it = displayItemIndicesByClien t.find(id.client); 168 DisplayItemIndicesByClientMap::const_iterator it = displayItemIndicesByClien t.find(id.client);
145 if (it == displayItemIndicesByClient.end()) 169 if (it == displayItemIndicesByClient.end())
146 return kNotFound; 170 return kNotFound;
147 171
148 const Vector<size_t>& indices = it->value; 172 const Vector<size_t>& indices = it->value;
149 for (size_t index : indices) { 173 for (size_t index : indices) {
150 const DisplayItem& existingItem = list[index]; 174 const DisplayItem& existingItem = list[index];
151 ASSERT(!existingItem.isValid() || existingItem.client() == id.client); 175 ASSERT(!existingItem.isValid() || existingItem.client() == id.client);
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 const DisplayItem& newDisplayItem = *newIt; 311 const DisplayItem& newDisplayItem = *newIt;
288 const DisplayItem::Id newDisplayItemId = newDisplayItem.nonCachedId(); 312 const DisplayItem::Id newDisplayItemId = newDisplayItem.nonCachedId();
289 bool newDisplayItemHasCachedType = newDisplayItem.type() != newDisplayIt emId.type; 313 bool newDisplayItemHasCachedType = newDisplayItem.type() != newDisplayIt emId.type;
290 314
291 bool isSynchronized = currentIt != currentEnd && newDisplayItemId.matche s(*currentIt); 315 bool isSynchronized = currentIt != currentEnd && newDisplayItemId.matche s(*currentIt);
292 316
293 if (newDisplayItemHasCachedType) { 317 if (newDisplayItemHasCachedType) {
294 ASSERT(!RuntimeEnabledFeatures::slimmingPaintUnderInvalidationChecki ngEnabled()); 318 ASSERT(!RuntimeEnabledFeatures::slimmingPaintUnderInvalidationChecki ngEnabled());
295 ASSERT(newDisplayItem.isCached()); 319 ASSERT(newDisplayItem.isCached());
296 ASSERT(clientCacheIsValid(newDisplayItem.client())); 320 ASSERT(clientCacheIsValid(newDisplayItem.client()));
321 ASSERT(!RuntimeEnabledFeatures::slimmingPaintV2Enabled() || !paintOf fsetWasInvalidated(newDisplayItem.client()));
297 if (!isSynchronized) { 322 if (!isSynchronized) {
298 DisplayItems::iterator foundIt = findOutOfOrderCachedItem(curren tIt, newDisplayItemId, outOfOrderIndexContext); 323 DisplayItems::iterator foundIt = findOutOfOrderCachedItem(curren tIt, newDisplayItemId, outOfOrderIndexContext);
299 324
300 if (foundIt == currentEnd) { 325 if (foundIt == currentEnd) {
301 #ifndef NDEBUG 326 #ifndef NDEBUG
302 showDebugData(); 327 showDebugData();
303 WTFLogAlways("%s not found in m_currentDisplayItems\n", newD isplayItem.asDebugString().utf8().data()); 328 WTFLogAlways("%s not found in m_currentDisplayItems\n", newD isplayItem.asDebugString().utf8().data());
304 #endif 329 #endif
305 ASSERT_NOT_REACHED(); 330 ASSERT_NOT_REACHED();
306 331
(...skipping 10 matching lines...) Expand all
317 if (newDisplayItem.isCachedDrawing()) { 342 if (newDisplayItem.isCachedDrawing()) {
318 updatedList.appendByMoving(*currentIt, currentIt->derivedSize()) ; 343 updatedList.appendByMoving(*currentIt, currentIt->derivedSize()) ;
319 ++currentIt; 344 ++currentIt;
320 } else { 345 } else {
321 ASSERT(newDisplayItem.isCachedSubtree()); 346 ASSERT(newDisplayItem.isCachedSubtree());
322 copyCachedSubtree(currentIt, updatedList); 347 copyCachedSubtree(currentIt, updatedList);
323 ASSERT(updatedList.last().isEndSubtree()); 348 ASSERT(updatedList.last().isEndSubtree());
324 } 349 }
325 } else { 350 } else {
326 #if ENABLE(ASSERT) 351 #if ENABLE(ASSERT)
327 if (RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEn abled()) 352 if (RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEn abled()) {
328 checkCachedDisplayItemIsUnchanged(newDisplayItem, outOfOrderInde xContext.displayItemIndicesByClient); 353 checkCachedDisplayItemIsUnchanged(newDisplayItem, outOfOrderInde xContext.displayItemIndicesByClient);
329 else 354 } else {
330 ASSERT(!newDisplayItem.isDrawing() || newDisplayItem.skippedCach e() || !clientCacheIsValid(newDisplayItem.client())); 355 ASSERT(!newDisplayItem.isDrawing()
331 #endif // ENABLE(ASSERT) 356 || newDisplayItem.skippedCache()
357 || !clientCacheIsValid(newDisplayItem.client())
358 || (RuntimeEnabledFeatures::slimmingPaintV2Enabled() && pain tOffsetWasInvalidated(newDisplayItem.client())));
359 }
360 #endif
332 updatedList.appendByMoving(*newIt, newIt->derivedSize()); 361 updatedList.appendByMoving(*newIt, newIt->derivedSize());
333 362
334 if (isSynchronized) 363 if (isSynchronized)
335 ++currentIt; 364 ++currentIt;
336 } 365 }
337 } 366 }
338 367
339 #if ENABLE(ASSERT) 368 #if ENABLE(ASSERT)
340 if (RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEnabled()) 369 if (RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEnabled())
341 checkNoRemainingCachedDisplayItems(); 370 checkNoRemainingCachedDisplayItems();
342 #endif // ENABLE(ASSERT) 371 #endif // ENABLE(ASSERT)
343 372
344 m_newDisplayItems.clear(); 373 m_newDisplayItems.clear();
345 m_validlyCachedClientsDirty = true; 374 m_validlyCachedClientsDirty = true;
346 m_currentDisplayItems.swap(updatedList); 375 m_currentDisplayItems.swap(updatedList);
347 m_numCachedItems = 0; 376 m_numCachedItems = 0;
377
378 #if ENABLE(ASSERT)
379 m_clientsWithPaintOffsetInvalidations.clear();
380 #endif
348 } 381 }
349 382
350 size_t DisplayItemList::approximateUnsharedMemoryUsage() const 383 size_t DisplayItemList::approximateUnsharedMemoryUsage() const
351 { 384 {
352 size_t memoryUsage = sizeof(*this); 385 size_t memoryUsage = sizeof(*this);
353 386
354 // Memory outside this class due to m_currentDisplayItems. 387 // Memory outside this class due to m_currentDisplayItems.
355 memoryUsage += m_currentDisplayItems.memoryUsageInBytes(); 388 memoryUsage += m_currentDisplayItems.memoryUsageInBytes();
356 389
357 // TODO(jbroman): If display items begin to have significant external memory 390 // TODO(jbroman): If display items begin to have significant external memory
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
545 578
546 void DisplayItemList::replay(GraphicsContext& context) 579 void DisplayItemList::replay(GraphicsContext& context)
547 { 580 {
548 TRACE_EVENT0("blink,benchmark", "DisplayItemList::replay"); 581 TRACE_EVENT0("blink,benchmark", "DisplayItemList::replay");
549 ASSERT(m_newDisplayItems.isEmpty()); 582 ASSERT(m_newDisplayItems.isEmpty());
550 for (DisplayItem& displayItem : m_currentDisplayItems) 583 for (DisplayItem& displayItem : m_currentDisplayItems)
551 displayItem.replay(context); 584 displayItem.replay(context);
552 } 585 }
553 586
554 } // namespace blink 587 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698