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

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

Issue 2804883006: Revert of Remove begin/end subseq. display items, and store on PaintController instead. (Closed)
Patch Set: Created 3 years, 8 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 "platform/graphics/paint/PaintController.h" 5 #include "platform/graphics/paint/PaintController.h"
6 6
7 #include "platform/graphics/GraphicsLayer.h" 7 #include "platform/graphics/GraphicsLayer.h"
8 #include "platform/graphics/paint/DrawingDisplayItem.h" 8 #include "platform/graphics/paint/DrawingDisplayItem.h"
9 #include "platform/instrumentation/tracing/TraceEvent.h" 9 #include "platform/instrumentation/tracing/TraceEvent.h"
10 #include "platform/wtf/AutoReset.h" 10 #include "platform/wtf/AutoReset.h"
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 92
93 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled() && 93 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled() &&
94 isCheckingUnderInvalidation()) { 94 isCheckingUnderInvalidation()) {
95 // We are checking under-invalidation of an ancestor subsequence enclosing 95 // We are checking under-invalidation of an ancestor subsequence enclosing
96 // this one. The ancestor subsequence is supposed to have already "copied", 96 // this one. The ancestor subsequence is supposed to have already "copied",
97 // so we should let the client continue to actually paint the descendant 97 // so we should let the client continue to actually paint the descendant
98 // subsequences without "copying". 98 // subsequences without "copying".
99 return false; 99 return false;
100 } 100 }
101 101
102 SubsequenceMarkers* markers = getSubsequenceMarkers(client); 102 size_t cachedItem =
103 if (!markers) { 103 findCachedItem(DisplayItem::Id(client, DisplayItem::kSubsequence));
104 if (cachedItem == kNotFound) {
105 NOTREACHED();
104 return false; 106 return false;
105 } 107 }
106 108
107 // |cachedItem| will point to the first item after the subsequence or end of 109 // |cachedItem| will point to the first item after the subsequence or end of
108 // the current list. 110 // the current list.
109 ensureNewDisplayItemListInitialCapacity(); 111 ensureNewDisplayItemListInitialCapacity();
112 copyCachedSubsequence(cachedItem);
110 113
111 size_t sizeBeforeCopy = m_newDisplayItemList.size(); 114 m_nextItemToMatch = cachedItem;
112 copyCachedSubsequence(markers->start, markers->end); 115 // Items before |cachedItem| have been copied so we don't need to index them.
113 116 if (cachedItem > m_nextItemToIndex)
114 if (!RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) { 117 m_nextItemToIndex = cachedItem;
115 addCachedSubsequence(client, sizeBeforeCopy,
116 m_newDisplayItemList.size() - 1);
117 }
118
119 m_nextItemToMatch = markers->end + 1;
120 // Items before |m_nextItemToMatch| have been copied so we don't need to index
121 // them.
122 if (m_nextItemToMatch > m_nextItemToIndex)
123 m_nextItemToIndex = m_nextItemToMatch;
124 118
125 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) { 119 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) {
126 // Return false to let the painter actually paint. We will check if the new 120 // Return false to let the painter actually paint. We will check if the new
127 // painting is the same as the cached one. 121 // painting is the same as the cached one.
128 return false; 122 return false;
129 } 123 }
130 124
131 return true; 125 return true;
132 } 126 }
133 127
134 PaintController::SubsequenceMarkers* PaintController::getSubsequenceMarkers(
135 const DisplayItemClient& client) {
136 auto result = m_currentCachedSubsequences.find(&client);
137 if (result == m_currentCachedSubsequences.end())
138 return nullptr;
139 return &result->value;
140 }
141
142 void PaintController::addCachedSubsequence(const DisplayItemClient& client,
143 unsigned start,
144 unsigned end) {
145 DCHECK(start <= end);
146 DCHECK(end < m_newDisplayItemList.size());
147 if (isCheckingUnderInvalidation()) {
148 SubsequenceMarkers* markers = getSubsequenceMarkers(client);
149 if (!markers) {
150 showSequenceUnderInvalidationError(
151 "under-invalidation : unexpected subsequence", client, start, end);
152 DCHECK(false);
153 }
154 if (markers->end - markers->start != end - start) {
155 showSequenceUnderInvalidationError(
156 "under-invalidation: new subsequence wrong length", client, start,
157 end);
158 DCHECK(false);
159 }
160 }
161
162 DCHECK(m_newCachedSubsequences.find(&client) ==
163 m_newCachedSubsequences.end());
164
165 m_newCachedSubsequences.insert(&client, SubsequenceMarkers(start, end));
166 }
167
168 bool PaintController::lastDisplayItemIsNoopBegin() const { 128 bool PaintController::lastDisplayItemIsNoopBegin() const {
169 if (m_newDisplayItemList.isEmpty()) 129 if (m_newDisplayItemList.isEmpty())
170 return false; 130 return false;
171 131
172 const auto& lastDisplayItem = m_newDisplayItemList.last(); 132 const auto& lastDisplayItem = m_newDisplayItemList.last();
173 return lastDisplayItem.isBegin() && !lastDisplayItem.drawsContent(); 133 return lastDisplayItem.isBegin() && !lastDisplayItem.drawsContent();
174 } 134 }
175 135
176 void PaintController::removeLastDisplayItem() { 136 void PaintController::removeLastDisplayItem() {
177 if (m_newDisplayItemList.isEmpty()) 137 if (m_newDisplayItemList.isEmpty())
(...skipping 25 matching lines...) Expand all
203 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) 163 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
204 m_newPaintChunks.decrementDisplayItemIndex(); 164 m_newPaintChunks.decrementDisplayItemIndex();
205 } 165 }
206 166
207 const DisplayItem* PaintController::lastDisplayItem(unsigned offset) { 167 const DisplayItem* PaintController::lastDisplayItem(unsigned offset) {
208 if (offset < m_newDisplayItemList.size()) 168 if (offset < m_newDisplayItemList.size())
209 return &m_newDisplayItemList[m_newDisplayItemList.size() - offset - 1]; 169 return &m_newDisplayItemList[m_newDisplayItemList.size() - offset - 1];
210 return nullptr; 170 return nullptr;
211 } 171 }
212 172
213 #if CHECK_DISPLAY_ITEM_CLIENT_ALIVENESS
214 void PaintController::beginShouldKeepAlive(const DisplayItemClient& client) {
215 if (!isSkippingCache()) {
216 // Mark the client shouldKeepAlive under this PaintController.
217 // The status will end after the new display items are committed.
218 client.beginShouldKeepAlive(this);
219
220 if (!m_currentSubsequenceClients.isEmpty()) {
221 // Mark the client shouldKeepAlive under the current subsequence.
222 // The status will end when the subsequence owner is invalidated or
223 // deleted.
224 client.beginShouldKeepAlive(m_currentSubsequenceClients.back());
225 }
226 }
227 }
228 #endif
229
230 void PaintController::processNewItem(DisplayItem& displayItem) { 173 void PaintController::processNewItem(DisplayItem& displayItem) {
231 DCHECK(!m_constructionDisabled); 174 DCHECK(!m_constructionDisabled);
232 175
233 #if CHECK_DISPLAY_ITEM_CLIENT_ALIVENESS 176 #if CHECK_DISPLAY_ITEM_CLIENT_ALIVENESS
234 if (displayItem.isCacheable()) { 177 if (!isSkippingCache()) {
235 beginShouldKeepAlive(displayItem.client()); 178 if (displayItem.isCacheable()) {
179 // Mark the client shouldKeepAlive under this PaintController.
180 // The status will end after the new display items are committed.
181 displayItem.client().beginShouldKeepAlive(this);
182
183 if (!m_currentSubsequenceClients.isEmpty()) {
184 // Mark the client shouldKeepAlive under the current subsequence.
185 // The status will end when the subsequence owner is invalidated or
186 // deleted.
187 displayItem.client().beginShouldKeepAlive(
188 m_currentSubsequenceClients.back());
189 }
190 }
191
192 if (displayItem.getType() == DisplayItem::kSubsequence) {
193 m_currentSubsequenceClients.push_back(&displayItem.client());
194 } else if (displayItem.getType() == DisplayItem::kEndSubsequence) {
195 CHECK(m_currentSubsequenceClients.back() == &displayItem.client());
196 m_currentSubsequenceClients.pop_back();
197 }
236 } 198 }
237 #endif 199 #endif
238 200
239 if (isSkippingCache()) 201 if (isSkippingCache())
240 displayItem.setSkippedCache(); 202 displayItem.setSkippedCache();
241 203
242 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { 204 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
243 size_t lastChunkIndex = m_newPaintChunks.lastChunkIndex(); 205 size_t lastChunkIndex = m_newPaintChunks.lastChunkIndex();
244 if (m_newPaintChunks.incrementDisplayItemIndex(displayItem)) { 206 if (m_newPaintChunks.incrementDisplayItemIndex(displayItem)) {
245 DCHECK(lastChunkIndex != m_newPaintChunks.lastChunkIndex()); 207 DCHECK(lastChunkIndex != m_newPaintChunks.lastChunkIndex());
246 if (lastChunkIndex != kNotFound) 208 if (lastChunkIndex != kNotFound)
247 generateChunkRasterInvalidationRects( 209 generateChunkRasterInvalidationRects(
248 m_newPaintChunks.paintChunkAt(lastChunkIndex)); 210 m_newPaintChunks.paintChunkAt(lastChunkIndex));
249 } 211 }
250 } 212 }
251 213
252 #if DCHECK_IS_ON() 214 #if DCHECK_IS_ON()
253 // Verify noop begin/end pairs have been removed. 215 // Verify noop begin/end pairs have been removed.
254 if (m_newDisplayItemList.size() >= 2 && displayItem.isEnd()) { 216 if (m_newDisplayItemList.size() >= 2 && displayItem.isEnd()) {
255 const auto& beginDisplayItem = 217 const auto& beginDisplayItem =
256 m_newDisplayItemList[m_newDisplayItemList.size() - 2]; 218 m_newDisplayItemList[m_newDisplayItemList.size() - 2];
257 if (beginDisplayItem.isBegin() && 219 if (beginDisplayItem.isBegin() &&
220 beginDisplayItem.getType() != DisplayItem::kSubsequence &&
258 !beginDisplayItem.drawsContent()) 221 !beginDisplayItem.drawsContent())
259 DCHECK(!displayItem.isEndAndPairedWith(beginDisplayItem.getType())); 222 DCHECK(!displayItem.isEndAndPairedWith(beginDisplayItem.getType()));
260 } 223 }
261 224
262 size_t index = findMatchingItemFromIndex(displayItem.getId(), 225 size_t index = findMatchingItemFromIndex(displayItem.getId(),
263 m_newDisplayItemIndicesByClient, 226 m_newDisplayItemIndicesByClient,
264 m_newDisplayItemList); 227 m_newDisplayItemList);
265 if (index != kNotFound) { 228 if (index != kNotFound) {
266 #ifndef NDEBUG 229 #ifndef NDEBUG
267 showDebugData(); 230 showDebugData();
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
423 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) 386 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled())
424 CHECK(false) << "Can't find cached display item"; 387 CHECK(false) << "Can't find cached display item";
425 388
426 // We did not find the cached display item. This should be impossible, but may 389 // We did not find the cached display item. This should be impossible, but may
427 // occur if there is a bug in the system, such as under-invalidation, 390 // occur if there is a bug in the system, such as under-invalidation,
428 // incorrect cache checking or duplicate display ids. In this case, the caller 391 // incorrect cache checking or duplicate display ids. In this case, the caller
429 // should fall back to repaint the display item. 392 // should fall back to repaint the display item.
430 return kNotFound; 393 return kNotFound;
431 } 394 }
432 395
433 // Copies a cached subsequence from current list to the new list. 396 // Copies a cached subsequence from current list to the new list. On return,
434 // When paintUnderInvaldiationCheckingEnabled() we'll not actually 397 // |cachedItemIndex| points to the item after the EndSubsequence item of the
398 // subsequence. When paintUnderInvaldiationCheckingEnabled() we'll not actually
435 // copy the subsequence, but mark the begin and end of the subsequence for 399 // copy the subsequence, but mark the begin and end of the subsequence for
436 // under-invalidation checking. 400 // under-invalidation checking.
437 void PaintController::copyCachedSubsequence(size_t beginIndex, 401 void PaintController::copyCachedSubsequence(size_t& cachedItemIndex) {
438 size_t endIndex) {
439 AutoReset<size_t> subsequenceBeginIndex( 402 AutoReset<size_t> subsequenceBeginIndex(
440 &m_currentCachedSubsequenceBeginIndexInNewList, 403 &m_currentCachedSubsequenceBeginIndexInNewList,
441 m_newDisplayItemList.size()); 404 m_newDisplayItemList.size());
442 DisplayItem* cachedItem = 405 DisplayItem* cachedItem =
443 &m_currentPaintArtifact.getDisplayItemList()[beginIndex]; 406 &m_currentPaintArtifact.getDisplayItemList()[cachedItemIndex];
407 DCHECK(cachedItem->getType() == DisplayItem::kSubsequence);
444 408
445 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) { 409 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) {
446 DCHECK(!isCheckingUnderInvalidation()); 410 DCHECK(!isCheckingUnderInvalidation());
447 m_underInvalidationCheckingBegin = beginIndex; 411 m_underInvalidationCheckingBegin = cachedItemIndex;
448 m_underInvalidationMessagePrefix = 412 m_underInvalidationMessagePrefix =
449 "(In cached subsequence of " + cachedItem->client().debugName() + ")"; 413 "(In cached subsequence of " + cachedItem->client().debugName() + ")";
450 } 414 }
451 415
416 DisplayItem::Id endSubsequenceId(cachedItem->client(),
417 DisplayItem::kEndSubsequence);
452 Vector<PaintChunk>::const_iterator cachedChunk; 418 Vector<PaintChunk>::const_iterator cachedChunk;
453 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { 419 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
454 cachedChunk = 420 cachedChunk =
455 m_currentPaintArtifact.findChunkByDisplayItemIndex(beginIndex); 421 m_currentPaintArtifact.findChunkByDisplayItemIndex(cachedItemIndex);
456 DCHECK(cachedChunk != m_currentPaintArtifact.paintChunks().end()); 422 DCHECK(cachedChunk != m_currentPaintArtifact.paintChunks().end());
457 updateCurrentPaintChunkProperties( 423 updateCurrentPaintChunkProperties(
458 cachedChunk->id ? &*cachedChunk->id : nullptr, cachedChunk->properties); 424 cachedChunk->id ? &*cachedChunk->id : nullptr, cachedChunk->properties);
459 } else { 425 } else {
460 // Avoid uninitialized variable error on Windows. 426 // Avoid uninitialized variable error on Windows.
461 cachedChunk = m_currentPaintArtifact.paintChunks().begin(); 427 cachedChunk = m_currentPaintArtifact.paintChunks().begin();
462 } 428 }
463 429
464 for (size_t currentIndex = beginIndex; currentIndex <= endIndex; 430 while (true) {
465 ++currentIndex) {
466 cachedItem = &m_currentPaintArtifact.getDisplayItemList()[currentIndex];
467 DCHECK(cachedItem->hasValidClient()); 431 DCHECK(cachedItem->hasValidClient());
468 #if CHECK_DISPLAY_ITEM_CLIENT_ALIVENESS 432 #if CHECK_DISPLAY_ITEM_CLIENT_ALIVENESS
469 CHECK(cachedItem->client().isAlive()); 433 CHECK(cachedItem->client().isAlive());
470 #endif 434 #endif
471 ++m_numCachedNewItems; 435 ++m_numCachedNewItems;
436 bool metEndSubsequence = cachedItem->getId() == endSubsequenceId;
472 if (!RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) { 437 if (!RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) {
473 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled() && 438 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled() &&
474 currentIndex == cachedChunk->endIndex) { 439 cachedItemIndex == cachedChunk->endIndex) {
475 ++cachedChunk; 440 ++cachedChunk;
476 DCHECK(cachedChunk != m_currentPaintArtifact.paintChunks().end()); 441 DCHECK(cachedChunk != m_currentPaintArtifact.paintChunks().end());
477 updateCurrentPaintChunkProperties( 442 updateCurrentPaintChunkProperties(
478 cachedChunk->id ? &*cachedChunk->id : nullptr, 443 cachedChunk->id ? &*cachedChunk->id : nullptr,
479 cachedChunk->properties); 444 cachedChunk->properties);
480 } 445 }
481 processNewItem(moveItemFromCurrentListToNewList(currentIndex)); 446 processNewItem(moveItemFromCurrentListToNewList(cachedItemIndex));
482 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) 447 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
483 DCHECK((!m_newPaintChunks.lastChunk().id && !cachedChunk->id) || 448 DCHECK((!m_newPaintChunks.lastChunk().id && !cachedChunk->id) ||
484 m_newPaintChunks.lastChunk().matches(*cachedChunk)); 449 m_newPaintChunks.lastChunk().matches(*cachedChunk));
485 } 450 }
451
452 ++cachedItemIndex;
453 if (metEndSubsequence)
454 break;
455
456 // We should always be able to find the EndSubsequence display item.
457 DCHECK(cachedItemIndex <
458 m_currentPaintArtifact.getDisplayItemList().size());
459 cachedItem = &m_currentPaintArtifact.getDisplayItemList()[cachedItemIndex];
486 } 460 }
487 461
488 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) { 462 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) {
489 m_underInvalidationCheckingEnd = endIndex + 1; 463 m_underInvalidationCheckingEnd = cachedItemIndex;
490 DCHECK(isCheckingUnderInvalidation()); 464 DCHECK(isCheckingUnderInvalidation());
491 } 465 }
492 } 466 }
493 467
494 DISABLE_CFI_PERF 468 DISABLE_CFI_PERF
495 static IntRect visualRectForDisplayItem( 469 static IntRect visualRectForDisplayItem(
496 const DisplayItem& displayItem, 470 const DisplayItem& displayItem,
497 const LayoutSize& offsetFromLayoutObject) { 471 const LayoutSize& offsetFromLayoutObject) {
498 LayoutRect visualRect = displayItem.client().visualRect(); 472 LayoutRect visualRect = displayItem.client().visualRect();
499 visualRect.move(-offsetFromLayoutObject); 473 visualRect.move(-offsetFromLayoutObject);
(...skipping 11 matching lines...) Expand all
511 485
512 DISABLE_CFI_PERF 486 DISABLE_CFI_PERF
513 void PaintController::commitNewDisplayItems( 487 void PaintController::commitNewDisplayItems(
514 const LayoutSize& offsetFromLayoutObject) { 488 const LayoutSize& offsetFromLayoutObject) {
515 TRACE_EVENT2("blink,benchmark", "PaintController::commitNewDisplayItems", 489 TRACE_EVENT2("blink,benchmark", "PaintController::commitNewDisplayItems",
516 "current_display_list_size", 490 "current_display_list_size",
517 (int)m_currentPaintArtifact.getDisplayItemList().size(), 491 (int)m_currentPaintArtifact.getDisplayItemList().size(),
518 "num_non_cached_new_items", 492 "num_non_cached_new_items",
519 (int)m_newDisplayItemList.size() - m_numCachedNewItems); 493 (int)m_newDisplayItemList.size() - m_numCachedNewItems);
520 m_numCachedNewItems = 0; 494 m_numCachedNewItems = 0;
495
521 // These data structures are used during painting only. 496 // These data structures are used during painting only.
522 DCHECK(!isSkippingCache()); 497 DCHECK(!isSkippingCache());
523 #if DCHECK_IS_ON() 498 #if DCHECK_IS_ON()
524 m_newDisplayItemIndicesByClient.clear(); 499 m_newDisplayItemIndicesByClient.clear();
525 #endif 500 #endif
526 501
527 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled() && 502 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled() &&
528 !m_newDisplayItemList.isEmpty()) 503 !m_newDisplayItemList.isEmpty())
529 generateChunkRasterInvalidationRects(m_newPaintChunks.lastChunk()); 504 generateChunkRasterInvalidationRects(m_newPaintChunks.lastChunk());
530 505
531 SkPictureGpuAnalyzer gpuAnalyzer; 506 SkPictureGpuAnalyzer gpuAnalyzer;
532 507
533 m_currentCacheGeneration = 508 m_currentCacheGeneration =
534 DisplayItemClient::CacheGenerationOrInvalidationReason::next(); 509 DisplayItemClient::CacheGenerationOrInvalidationReason::next();
535
536 m_newCachedSubsequences.swap(m_currentCachedSubsequences);
537 m_newCachedSubsequences.clear();
538 for (auto& item : m_currentCachedSubsequences) {
539 item.key->setDisplayItemsCached(m_currentCacheGeneration);
540 #if CHECK_DISPLAY_ITEM_CLIENT_ALIVENESS
541 DisplayItemClient::endShouldKeepAliveAllClients(item.key);
542 #endif
543 }
544
545 Vector<const DisplayItemClient*> skippedCacheClients; 510 Vector<const DisplayItemClient*> skippedCacheClients;
546 for (const auto& item : m_newDisplayItemList) { 511 for (const auto& item : m_newDisplayItemList) {
547 // No reason to continue the analysis once we have a veto. 512 // No reason to continue the analysis once we have a veto.
548 if (gpuAnalyzer.suitableForGpuRasterization()) 513 if (gpuAnalyzer.suitableForGpuRasterization())
549 item.analyzeForGpuRasterization(gpuAnalyzer); 514 item.analyzeForGpuRasterization(gpuAnalyzer);
550 515
551 // TODO(wkorman): Only compute and append visual rect for drawings. 516 // TODO(wkorman): Only compute and append visual rect for drawings.
552 m_newDisplayItemList.appendVisualRect( 517 m_newDisplayItemList.appendVisualRect(
553 visualRectForDisplayItem(item, offsetFromLayoutObject)); 518 visualRectForDisplayItem(item, offsetFromLayoutObject));
554 519
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
594 for (const auto& chunk : m_currentPaintArtifact.paintChunks()) { 559 for (const auto& chunk : m_currentPaintArtifact.paintChunks()) {
595 if (chunk.id && chunk.id->client.isJustCreated()) 560 if (chunk.id && chunk.id->client.isJustCreated())
596 chunk.id->client.clearIsJustCreated(); 561 chunk.id->client.clearIsJustCreated();
597 } 562 }
598 } 563 }
599 564
600 // We'll allocate the initial buffer when we start the next paint. 565 // We'll allocate the initial buffer when we start the next paint.
601 m_newDisplayItemList = DisplayItemList(0); 566 m_newDisplayItemList = DisplayItemList(0);
602 567
603 #if CHECK_DISPLAY_ITEM_CLIENT_ALIVENESS 568 #if CHECK_DISPLAY_ITEM_CLIENT_ALIVENESS
569 CHECK(m_currentSubsequenceClients.isEmpty());
604 DisplayItemClient::endShouldKeepAliveAllClients(this); 570 DisplayItemClient::endShouldKeepAliveAllClients(this);
605 #endif 571 #endif
606 572
607 #ifndef NDEBUG 573 #ifndef NDEBUG
608 m_numSequentialMatches = 0; 574 m_numSequentialMatches = 0;
609 m_numOutOfOrderMatches = 0; 575 m_numOutOfOrderMatches = 0;
610 m_numIndexedItems = 0; 576 m_numIndexedItems = 0;
611 #endif 577 #endif
612 } 578 }
613 579
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
812 } 778 }
813 LOG(INFO) << "new record:\n" 779 LOG(INFO) << "new record:\n"
814 << (newRecord ? recordAsDebugString(newRecord) : "None"); 780 << (newRecord ? recordAsDebugString(newRecord) : "None");
815 LOG(INFO) << "old record:\n" 781 LOG(INFO) << "old record:\n"
816 << (oldRecord ? recordAsDebugString(oldRecord) : "None"); 782 << (oldRecord ? recordAsDebugString(oldRecord) : "None");
817 783
818 showDebugData(); 784 showDebugData();
819 #endif // NDEBUG 785 #endif // NDEBUG
820 } 786 }
821 787
822 void PaintController::showSequenceUnderInvalidationError(
823 const char* reason,
824 const DisplayItemClient& client,
825 int start,
826 int end) {
827 LOG(ERROR) << m_underInvalidationMessagePrefix << " " << reason;
828 LOG(ERROR) << "Subsequence client: " << client.debugName();
829 #ifndef NDEBUG
830 // showDebugData();
831 #else
832 LOG(ERROR) << "Run debug build to get more details.";
833 #endif
834 LOG(ERROR) << "See http://crbug.com/619103.";
835 }
836
837 void PaintController::checkUnderInvalidation() { 788 void PaintController::checkUnderInvalidation() {
838 DCHECK(RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()); 789 DCHECK(RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled());
839 790
840 if (!isCheckingUnderInvalidation()) 791 if (!isCheckingUnderInvalidation())
841 return; 792 return;
842 793
843 const DisplayItem& newItem = m_newDisplayItemList.last(); 794 const DisplayItem& newItem = m_newDisplayItemList.last();
844 size_t oldItemIndex = m_underInvalidationCheckingBegin + 795 size_t oldItemIndex = m_underInvalidationCheckingBegin +
845 m_skippedProbableUnderInvalidationCount; 796 m_skippedProbableUnderInvalidationCount;
846 DisplayItem* oldItem = 797 DisplayItem* oldItem =
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
912 showPaintRecords 863 showPaintRecords
913 ? (DisplayItemList::JsonOptions::ShowPaintRecords | 864 ? (DisplayItemList::JsonOptions::ShowPaintRecords |
914 DisplayItemList::JsonOptions::ShowClientDebugName) 865 DisplayItemList::JsonOptions::ShowClientDebugName)
915 : DisplayItemList::JsonOptions::ShowClientDebugName) 866 : DisplayItemList::JsonOptions::ShowClientDebugName)
916 ->toPrettyJSONString() 867 ->toPrettyJSONString()
917 .utf8() 868 .utf8()
918 .data()); 869 .data());
919 } 870 }
920 871
921 } // namespace blink 872 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698