OLD | NEW |
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/TraceEvent.h" | 9 #include "platform/TraceEvent.h" |
10 #include "platform/graphics/GraphicsLayer.h" | 10 #include "platform/graphics/GraphicsLayer.h" |
11 #include "platform/graphics/paint/DrawingDisplayItem.h" | 11 #include "platform/graphics/paint/DrawingDisplayItem.h" |
12 | 12 |
13 #ifndef NDEBUG | 13 #ifndef NDEBUG |
14 #include "platform/graphics/LoggingCanvas.h" | 14 #include "platform/graphics/LoggingCanvas.h" |
15 #include "wtf/text/StringBuilder.h" | 15 #include "wtf/text/StringBuilder.h" |
16 #include <stdio.h> | 16 #include <stdio.h> |
17 #endif | 17 #endif |
18 | 18 |
19 namespace blink { | 19 namespace blink { |
20 | 20 |
21 const DisplayItems& DisplayItemList::displayItems() const | 21 const DisplayItems& DisplayItemList::displayItems() const |
22 { | 22 { |
23 ASSERT(m_newDisplayItems.isEmpty()); | 23 ASSERT(m_newDisplayItems.isEmpty()); |
24 return m_currentDisplayItems; | 24 return m_currentDisplayItems; |
25 } | 25 } |
26 | 26 |
| 27 const Vector<PaintChunk>& DisplayItemList::paintChunks() const |
| 28 { |
| 29 ASSERT(m_newPaintChunks.isInInitialState()); |
| 30 return m_currentPaintChunks; |
| 31 } |
| 32 |
27 bool DisplayItemList::lastDisplayItemIsNoopBegin() const | 33 bool DisplayItemList::lastDisplayItemIsNoopBegin() const |
28 { | 34 { |
29 if (m_newDisplayItems.isEmpty()) | 35 if (m_newDisplayItems.isEmpty()) |
30 return false; | 36 return false; |
31 | 37 |
32 const auto& lastDisplayItem = m_newDisplayItems.last(); | 38 const auto& lastDisplayItem = m_newDisplayItems.last(); |
33 return lastDisplayItem.isBegin() && !lastDisplayItem.drawsContent(); | 39 return lastDisplayItem.isBegin() && !lastDisplayItem.drawsContent(); |
34 } | 40 } |
35 | 41 |
36 void DisplayItemList::removeLastDisplayItem() | 42 void DisplayItemList::removeLastDisplayItem() |
37 { | 43 { |
38 if (m_newDisplayItems.isEmpty()) | 44 if (m_newDisplayItems.isEmpty()) |
39 return; | 45 return; |
40 | 46 |
41 #if ENABLE(ASSERT) | 47 #if ENABLE(ASSERT) |
42 // Also remove the index pointing to the removed display item. | 48 // Also remove the index pointing to the removed display item. |
43 DisplayItemIndicesByClientMap::iterator it = m_newDisplayItemIndicesByClient
.find(m_newDisplayItems.last().client()); | 49 DisplayItemIndicesByClientMap::iterator it = m_newDisplayItemIndicesByClient
.find(m_newDisplayItems.last().client()); |
44 if (it != m_newDisplayItemIndicesByClient.end()) { | 50 if (it != m_newDisplayItemIndicesByClient.end()) { |
45 Vector<size_t>& indices = it->value; | 51 Vector<size_t>& indices = it->value; |
46 if (!indices.isEmpty() && indices.last() == (m_newDisplayItems.size() -
1)) | 52 if (!indices.isEmpty() && indices.last() == (m_newDisplayItems.size() -
1)) |
47 indices.removeLast(); | 53 indices.removeLast(); |
48 } | 54 } |
49 #endif | 55 #endif |
50 m_newDisplayItems.removeLast(); | 56 m_newDisplayItems.removeLast(); |
| 57 |
| 58 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) |
| 59 m_newPaintChunks.decrementDisplayItemIndex(); |
51 } | 60 } |
52 | 61 |
53 void DisplayItemList::processNewItem(DisplayItem& displayItem) | 62 void DisplayItemList::processNewItem(DisplayItem& displayItem) |
54 { | 63 { |
55 ASSERT(!m_constructionDisabled); | 64 ASSERT(!m_constructionDisabled); |
56 ASSERT(!skippingCache() || !displayItem.isCached()); | 65 ASSERT(!skippingCache() || !displayItem.isCached()); |
57 | 66 |
58 if (displayItem.isCached()) | 67 if (displayItem.isCached()) |
59 ++m_numCachedItems; | 68 ++m_numCachedItems; |
60 | 69 |
(...skipping 17 matching lines...) Expand all Loading... |
78 WTFLogAlways("DisplayItem %s has duplicated id with previous %s (index=%
d)\n", | 87 WTFLogAlways("DisplayItem %s has duplicated id with previous %s (index=%
d)\n", |
79 displayItem.asDebugString().utf8().data(), m_newDisplayItems[index].
asDebugString().utf8().data(), static_cast<int>(index)); | 88 displayItem.asDebugString().utf8().data(), m_newDisplayItems[index].
asDebugString().utf8().data(), static_cast<int>(index)); |
80 #endif | 89 #endif |
81 ASSERT_NOT_REACHED(); | 90 ASSERT_NOT_REACHED(); |
82 } | 91 } |
83 addItemToIndexIfNeeded(displayItem, m_newDisplayItems.size() - 1, m_newDispl
ayItemIndicesByClient); | 92 addItemToIndexIfNeeded(displayItem, m_newDisplayItems.size() - 1, m_newDispl
ayItemIndicesByClient); |
84 #endif // ENABLE(ASSERT) | 93 #endif // ENABLE(ASSERT) |
85 | 94 |
86 if (skippingCache()) | 95 if (skippingCache()) |
87 displayItem.setSkippedCache(); | 96 displayItem.setSkippedCache(); |
| 97 |
| 98 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) |
| 99 m_newPaintChunks.incrementDisplayItemIndex(); |
| 100 } |
| 101 |
| 102 void DisplayItemList::updateCurrentPaintProperties(const PaintProperties& newPai
ntProperties) |
| 103 { |
| 104 m_newPaintChunks.updateCurrentPaintProperties(newPaintProperties); |
88 } | 105 } |
89 | 106 |
90 void DisplayItemList::beginScope() | 107 void DisplayItemList::beginScope() |
91 { | 108 { |
92 ASSERT_WITH_SECURITY_IMPLICATION(m_nextScope < UINT_MAX); | 109 ASSERT_WITH_SECURITY_IMPLICATION(m_nextScope < UINT_MAX); |
93 m_scopeStack.append(m_nextScope++); | 110 m_scopeStack.append(m_nextScope++); |
94 beginSkippingCache(); | 111 beginSkippingCache(); |
95 } | 112 } |
96 | 113 |
97 void DisplayItemList::endScope() | 114 void DisplayItemList::endScope() |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 #if ENABLE(ASSERT) | 297 #if ENABLE(ASSERT) |
281 m_newDisplayItemIndicesByClient.clear(); | 298 m_newDisplayItemIndicesByClient.clear(); |
282 #endif | 299 #endif |
283 | 300 |
284 if (m_currentDisplayItems.isEmpty()) { | 301 if (m_currentDisplayItems.isEmpty()) { |
285 #if ENABLE(ASSERT) | 302 #if ENABLE(ASSERT) |
286 for (const auto& item : m_newDisplayItems) | 303 for (const auto& item : m_newDisplayItems) |
287 ASSERT(!item.isCached()); | 304 ASSERT(!item.isCached()); |
288 #endif | 305 #endif |
289 m_currentDisplayItems.swap(m_newDisplayItems); | 306 m_currentDisplayItems.swap(m_newDisplayItems); |
| 307 m_currentPaintChunks = m_newPaintChunks.releasePaintChunks(); |
290 m_validlyCachedClientsDirty = true; | 308 m_validlyCachedClientsDirty = true; |
291 m_numCachedItems = 0; | 309 m_numCachedItems = 0; |
292 return; | 310 return; |
293 } | 311 } |
294 | 312 |
295 updateValidlyCachedClientsIfNeeded(); | 313 updateValidlyCachedClientsIfNeeded(); |
296 | 314 |
297 // Stores indices to valid DrawingDisplayItems in m_currentDisplayItems that
have not been matched | 315 // Stores indices to valid DrawingDisplayItems in m_currentDisplayItems that
have not been matched |
298 // by CachedDisplayItems during synchronized matching. The indexed items wil
l be matched | 316 // by CachedDisplayItems during synchronized matching. The indexed items wil
l be matched |
299 // by later out-of-order CachedDisplayItems in m_newDisplayItems. This ensur
es that when | 317 // by later out-of-order CachedDisplayItems in m_newDisplayItems. This ensur
es that when |
300 // out-of-order CachedDisplayItems occur, we only traverse at most once over
m_currentDisplayItems | 318 // out-of-order CachedDisplayItems occur, we only traverse at most once over
m_currentDisplayItems |
301 // looking for potential matches. Thus we can ensure that the algorithm runs
in linear time. | 319 // looking for potential matches. Thus we can ensure that the algorithm runs
in linear time. |
302 OutOfOrderIndexContext outOfOrderIndexContext(m_currentDisplayItems.begin())
; | 320 OutOfOrderIndexContext outOfOrderIndexContext(m_currentDisplayItems.begin())
; |
303 | 321 |
304 // TODO(jbroman): Consider revisiting this heuristic. | 322 // TODO(jbroman): Consider revisiting this heuristic. |
305 DisplayItems updatedList(std::max(m_currentDisplayItems.usedCapacityInBytes(
), m_newDisplayItems.usedCapacityInBytes())); | 323 DisplayItems updatedList(std::max(m_currentDisplayItems.usedCapacityInBytes(
), m_newDisplayItems.usedCapacityInBytes())); |
| 324 Vector<PaintChunk> updatedPaintChunks; |
306 DisplayItems::iterator currentIt = m_currentDisplayItems.begin(); | 325 DisplayItems::iterator currentIt = m_currentDisplayItems.begin(); |
307 DisplayItems::iterator currentEnd = m_currentDisplayItems.end(); | 326 DisplayItems::iterator currentEnd = m_currentDisplayItems.end(); |
308 for (DisplayItems::iterator newIt = m_newDisplayItems.begin(); newIt != m_ne
wDisplayItems.end(); ++newIt) { | 327 for (DisplayItems::iterator newIt = m_newDisplayItems.begin(); newIt != m_ne
wDisplayItems.end(); ++newIt) { |
309 const DisplayItem& newDisplayItem = *newIt; | 328 const DisplayItem& newDisplayItem = *newIt; |
310 const DisplayItem::Id newDisplayItemId = newDisplayItem.nonCachedId(); | 329 const DisplayItem::Id newDisplayItemId = newDisplayItem.nonCachedId(); |
311 bool newDisplayItemHasCachedType = newDisplayItem.type() != newDisplayIt
emId.type; | 330 bool newDisplayItemHasCachedType = newDisplayItem.type() != newDisplayIt
emId.type; |
312 | 331 |
313 bool isSynchronized = currentIt != currentEnd && newDisplayItemId.matche
s(*currentIt); | 332 bool isSynchronized = currentIt != currentEnd && newDisplayItemId.matche
s(*currentIt); |
314 | 333 |
315 if (newDisplayItemHasCachedType) { | 334 if (newDisplayItemHasCachedType) { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
358 // Items before currentIt should have been copied so we don't need to in
dex them. | 377 // Items before currentIt should have been copied so we don't need to in
dex them. |
359 if (currentIt - outOfOrderIndexContext.nextItemToIndex > 0) | 378 if (currentIt - outOfOrderIndexContext.nextItemToIndex > 0) |
360 outOfOrderIndexContext.nextItemToIndex = currentIt; | 379 outOfOrderIndexContext.nextItemToIndex = currentIt; |
361 } | 380 } |
362 | 381 |
363 #if ENABLE(ASSERT) | 382 #if ENABLE(ASSERT) |
364 if (RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEnabled()) | 383 if (RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEnabled()) |
365 checkNoRemainingCachedDisplayItems(); | 384 checkNoRemainingCachedDisplayItems(); |
366 #endif // ENABLE(ASSERT) | 385 #endif // ENABLE(ASSERT) |
367 | 386 |
| 387 // TODO(jbroman): When subsequence caching applies to SPv2, we'll need to |
| 388 // merge the paint chunks as well. |
| 389 m_currentPaintChunks = m_newPaintChunks.releasePaintChunks(); |
| 390 |
368 m_newDisplayItems.clear(); | 391 m_newDisplayItems.clear(); |
369 m_validlyCachedClientsDirty = true; | 392 m_validlyCachedClientsDirty = true; |
370 m_currentDisplayItems.swap(updatedList); | 393 m_currentDisplayItems.swap(updatedList); |
371 m_numCachedItems = 0; | 394 m_numCachedItems = 0; |
372 | 395 |
373 #if ENABLE(ASSERT) | 396 #if ENABLE(ASSERT) |
374 m_clientsWithPaintOffsetInvalidations.clear(); | 397 m_clientsWithPaintOffsetInvalidations.clear(); |
375 #endif | 398 #endif |
376 } | 399 } |
377 | 400 |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
562 | 585 |
563 void DisplayItemList::replay(GraphicsContext& context) | 586 void DisplayItemList::replay(GraphicsContext& context) |
564 { | 587 { |
565 TRACE_EVENT0("blink,benchmark", "DisplayItemList::replay"); | 588 TRACE_EVENT0("blink,benchmark", "DisplayItemList::replay"); |
566 ASSERT(m_newDisplayItems.isEmpty()); | 589 ASSERT(m_newDisplayItems.isEmpty()); |
567 for (DisplayItem& displayItem : m_currentDisplayItems) | 590 for (DisplayItem& displayItem : m_currentDisplayItems) |
568 displayItem.replay(context); | 591 displayItem.replay(context); |
569 } | 592 } |
570 | 593 |
571 } // namespace blink | 594 } // namespace blink |
OLD | NEW |