| 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/PaintController.h" | 6 #include "platform/graphics/paint/PaintController.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" |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 return lastDisplayItem.isBegin() && !lastDisplayItem.drawsContent(); | 34 return lastDisplayItem.isBegin() && !lastDisplayItem.drawsContent(); |
| 35 } | 35 } |
| 36 | 36 |
| 37 void PaintController::removeLastDisplayItem() | 37 void PaintController::removeLastDisplayItem() |
| 38 { | 38 { |
| 39 if (m_newDisplayItemList.isEmpty()) | 39 if (m_newDisplayItemList.isEmpty()) |
| 40 return; | 40 return; |
| 41 | 41 |
| 42 #if ENABLE(ASSERT) | 42 #if ENABLE(ASSERT) |
| 43 // Also remove the index pointing to the removed display item. | 43 // Also remove the index pointing to the removed display item. |
| 44 DisplayItemIndicesByClientMap::iterator it = m_newDisplayItemIndicesByClient
.find(m_newDisplayItemList.last().client()); | 44 DisplayItemIndicesByClientMap::iterator it = m_newDisplayItemIndicesByClient
.find(&m_newDisplayItemList.last().client()); |
| 45 if (it != m_newDisplayItemIndicesByClient.end()) { | 45 if (it != m_newDisplayItemIndicesByClient.end()) { |
| 46 Vector<size_t>& indices = it->value; | 46 Vector<size_t>& indices = it->value; |
| 47 if (!indices.isEmpty() && indices.last() == (m_newDisplayItemList.size()
- 1)) | 47 if (!indices.isEmpty() && indices.last() == (m_newDisplayItemList.size()
- 1)) |
| 48 indices.removeLast(); | 48 indices.removeLast(); |
| 49 } | 49 } |
| 50 #endif | 50 #endif |
| 51 m_newDisplayItemList.removeLast(); | 51 m_newDisplayItemList.removeLast(); |
| 52 | 52 |
| 53 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) | 53 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) |
| 54 m_newPaintChunks.decrementDisplayItemIndex(); | 54 m_newPaintChunks.decrementDisplayItemIndex(); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 110 m_scopeStack.append(m_nextScope++); | 110 m_scopeStack.append(m_nextScope++); |
| 111 beginSkippingCache(); | 111 beginSkippingCache(); |
| 112 } | 112 } |
| 113 | 113 |
| 114 void PaintController::endScope() | 114 void PaintController::endScope() |
| 115 { | 115 { |
| 116 m_scopeStack.removeLast(); | 116 m_scopeStack.removeLast(); |
| 117 endSkippingCache(); | 117 endSkippingCache(); |
| 118 } | 118 } |
| 119 | 119 |
| 120 void PaintController::invalidate(const DisplayItemClientWrapper& client, PaintIn
validationReason paintInvalidationReason, const IntRect* visualRect) | 120 void PaintController::invalidate(const DisplayItemClient& client, PaintInvalidat
ionReason paintInvalidationReason, const IntRect* visualRect) |
| 121 { | 121 { |
| 122 invalidateClient(client); | 122 invalidateClient(client); |
| 123 | 123 |
| 124 if (visualRect) { | 124 if (visualRect) { |
| 125 // TODO(wkorman): cache visualRect for the client. | 125 // TODO(wkorman): cache visualRect for the client. |
| 126 } | 126 } |
| 127 } | 127 } |
| 128 | 128 |
| 129 void PaintController::invalidateClient(const DisplayItemClientWrapper& client) | 129 void PaintController::invalidateClient(const DisplayItemClient& client) |
| 130 { | 130 { |
| 131 #if ENABLE(ASSERT) | 131 #if ENABLE(ASSERT) |
| 132 // Slimming paint v1 CompositedLayerMapping may invalidate client on extra l
ayers. | 132 // Slimming paint v1 CompositedLayerMapping may invalidate client on extra l
ayers. |
| 133 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled() || clientCacheIsValid(c
lient.displayItemClient())) | 133 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled() || clientCacheIsValid(c
lient)) |
| 134 m_invalidations.append(client.debugName()); | 134 m_invalidations.append(client.debugName()); |
| 135 #endif | 135 #endif |
| 136 | 136 |
| 137 invalidateUntracked(client.displayItemClient()); | 137 invalidateUntracked(client); |
| 138 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled() && m_trackedPaintInvali
dationObjects) | 138 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled() && m_trackedPaintInvali
dationObjects) |
| 139 m_trackedPaintInvalidationObjects->append(client.debugName()); | 139 m_trackedPaintInvalidationObjects->append(client.debugName()); |
| 140 } | 140 } |
| 141 | 141 |
| 142 void PaintController::invalidateUntracked(DisplayItemClient client) | 142 void PaintController::invalidateUntracked(const DisplayItemClient& client) |
| 143 { | 143 { |
| 144 // This can be called during painting, but we can't invalidate already paint
ed clients. | 144 // This can be called during painting, but we can't invalidate already paint
ed clients. |
| 145 ASSERT(!m_newDisplayItemIndicesByClient.contains(client)); | 145 ASSERT(!m_newDisplayItemIndicesByClient.contains(&client)); |
| 146 updateValidlyCachedClientsIfNeeded(); | 146 updateValidlyCachedClientsIfNeeded(); |
| 147 m_validlyCachedClients.remove(client); | 147 m_validlyCachedClients.remove(&client); |
| 148 } | 148 } |
| 149 | 149 |
| 150 void PaintController::invalidateAll() | 150 void PaintController::invalidateAll() |
| 151 { | 151 { |
| 152 // Can only be called during layout/paintInvalidation, not during painting. | 152 // Can only be called during layout/paintInvalidation, not during painting. |
| 153 ASSERT(m_newDisplayItemList.isEmpty()); | 153 ASSERT(m_newDisplayItemList.isEmpty()); |
| 154 m_currentPaintArtifact.reset(); | 154 m_currentPaintArtifact.reset(); |
| 155 m_validlyCachedClients.clear(); | 155 m_validlyCachedClients.clear(); |
| 156 m_validlyCachedClientsDirty = false; | 156 m_validlyCachedClientsDirty = false; |
| 157 | 157 |
| 158 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled() && m_trackedPaintInvali
dationObjects) | 158 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled() && m_trackedPaintInvali
dationObjects) |
| 159 m_trackedPaintInvalidationObjects->append("##ALL##"); | 159 m_trackedPaintInvalidationObjects->append("##ALL##"); |
| 160 } | 160 } |
| 161 | 161 |
| 162 bool PaintController::clientCacheIsValid(DisplayItemClient client) const | 162 bool PaintController::clientCacheIsValid(const DisplayItemClient& client) const |
| 163 { | 163 { |
| 164 if (skippingCache()) | 164 if (skippingCache()) |
| 165 return false; | 165 return false; |
| 166 updateValidlyCachedClientsIfNeeded(); | 166 updateValidlyCachedClientsIfNeeded(); |
| 167 return m_validlyCachedClients.contains(client); | 167 return m_validlyCachedClients.contains(&client); |
| 168 } | 168 } |
| 169 | 169 |
| 170 void PaintController::invalidatePaintOffset(const DisplayItemClientWrapper& clie
nt) | 170 void PaintController::invalidatePaintOffset(const DisplayItemClient& client) |
| 171 { | 171 { |
| 172 ASSERT(RuntimeEnabledFeatures::slimmingPaintOffsetCachingEnabled()); | 172 ASSERT(RuntimeEnabledFeatures::slimmingPaintOffsetCachingEnabled()); |
| 173 invalidateClient(client); | 173 invalidateClient(client); |
| 174 | 174 |
| 175 #if ENABLE(ASSERT) | 175 #if ENABLE(ASSERT) |
| 176 ASSERT(!paintOffsetWasInvalidated(client.displayItemClient())); | 176 ASSERT(!paintOffsetWasInvalidated(client)); |
| 177 m_clientsWithPaintOffsetInvalidations.add(client.displayItemClient()); | 177 m_clientsWithPaintOffsetInvalidations.add(&client); |
| 178 #endif | 178 #endif |
| 179 } | 179 } |
| 180 | 180 |
| 181 #if ENABLE(ASSERT) | 181 #if ENABLE(ASSERT) |
| 182 bool PaintController::paintOffsetWasInvalidated(DisplayItemClient client) const | 182 bool PaintController::paintOffsetWasInvalidated(const DisplayItemClient& client)
const |
| 183 { | 183 { |
| 184 ASSERT(RuntimeEnabledFeatures::slimmingPaintOffsetCachingEnabled()); | 184 ASSERT(RuntimeEnabledFeatures::slimmingPaintOffsetCachingEnabled()); |
| 185 return m_clientsWithPaintOffsetInvalidations.contains(client); | 185 return m_clientsWithPaintOffsetInvalidations.contains(&client); |
| 186 } | 186 } |
| 187 #endif | 187 #endif |
| 188 | 188 |
| 189 size_t PaintController::findMatchingItemFromIndex(const DisplayItem::Id& id, con
st DisplayItemIndicesByClientMap& displayItemIndicesByClient, const DisplayItemL
ist& list) | 189 size_t PaintController::findMatchingItemFromIndex(const DisplayItem::Id& id, con
st DisplayItemIndicesByClientMap& displayItemIndicesByClient, const DisplayItemL
ist& list) |
| 190 { | 190 { |
| 191 DisplayItemIndicesByClientMap::const_iterator it = displayItemIndicesByClien
t.find(id.client); | 191 DisplayItemIndicesByClientMap::const_iterator it = displayItemIndicesByClien
t.find(&id.client); |
| 192 if (it == displayItemIndicesByClient.end()) | 192 if (it == displayItemIndicesByClient.end()) |
| 193 return kNotFound; | 193 return kNotFound; |
| 194 | 194 |
| 195 const Vector<size_t>& indices = it->value; | 195 const Vector<size_t>& indices = it->value; |
| 196 for (size_t index : indices) { | 196 for (size_t index : indices) { |
| 197 const DisplayItem& existingItem = list[index]; | 197 const DisplayItem& existingItem = list[index]; |
| 198 ASSERT(!existingItem.isValid() || existingItem.client() == id.client); | 198 ASSERT(!existingItem.isValid() || existingItem.client() == id.client); |
| 199 if (existingItem.isValid() && id.matches(existingItem)) | 199 if (existingItem.isValid() && id.matches(existingItem)) |
| 200 return index; | 200 return index; |
| 201 } | 201 } |
| 202 | 202 |
| 203 return kNotFound; | 203 return kNotFound; |
| 204 } | 204 } |
| 205 | 205 |
| 206 void PaintController::addItemToIndexIfNeeded(const DisplayItem& displayItem, siz
e_t index, DisplayItemIndicesByClientMap& displayItemIndicesByClient) | 206 void PaintController::addItemToIndexIfNeeded(const DisplayItem& displayItem, siz
e_t index, DisplayItemIndicesByClientMap& displayItemIndicesByClient) |
| 207 { | 207 { |
| 208 if (!displayItem.isCacheable()) | 208 if (!displayItem.isCacheable()) |
| 209 return; | 209 return; |
| 210 | 210 |
| 211 DisplayItemIndicesByClientMap::iterator it = displayItemIndicesByClient.find
(displayItem.client()); | 211 DisplayItemIndicesByClientMap::iterator it = displayItemIndicesByClient.find
(&displayItem.client()); |
| 212 Vector<size_t>& indices = it == displayItemIndicesByClient.end() ? | 212 Vector<size_t>& indices = it == displayItemIndicesByClient.end() ? |
| 213 displayItemIndicesByClient.add(displayItem.client(), Vector<size_t>()).s
toredValue->value : it->value; | 213 displayItemIndicesByClient.add(&displayItem.client(), Vector<size_t>()).
storedValue->value : it->value; |
| 214 indices.append(index); | 214 indices.append(index); |
| 215 } | 215 } |
| 216 | 216 |
| 217 struct PaintController::OutOfOrderIndexContext { | 217 struct PaintController::OutOfOrderIndexContext { |
| 218 STACK_ALLOCATED(); | 218 STACK_ALLOCATED(); |
| 219 OutOfOrderIndexContext(DisplayItemList::iterator begin) : nextItemToIndex(be
gin) { } | 219 OutOfOrderIndexContext(DisplayItemList::iterator begin) : nextItemToIndex(be
gin) { } |
| 220 | 220 |
| 221 DisplayItemList::iterator nextItemToIndex; | 221 DisplayItemList::iterator nextItemToIndex; |
| 222 DisplayItemIndicesByClientMap displayItemIndicesByClient; | 222 DisplayItemIndicesByClientMap displayItemIndicesByClient; |
| 223 }; | 223 }; |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 428 } | 428 } |
| 429 | 429 |
| 430 void PaintController::updateValidlyCachedClientsIfNeeded() const | 430 void PaintController::updateValidlyCachedClientsIfNeeded() const |
| 431 { | 431 { |
| 432 if (!m_validlyCachedClientsDirty) | 432 if (!m_validlyCachedClientsDirty) |
| 433 return; | 433 return; |
| 434 | 434 |
| 435 m_validlyCachedClients.clear(); | 435 m_validlyCachedClients.clear(); |
| 436 m_validlyCachedClientsDirty = false; | 436 m_validlyCachedClientsDirty = false; |
| 437 | 437 |
| 438 DisplayItemClient lastAddedClient = nullptr; | 438 const DisplayItemClient* lastAddedClient = nullptr; |
| 439 for (const DisplayItem& displayItem : m_currentPaintArtifact.displayItemList
()) { | 439 for (const DisplayItem& displayItem : m_currentPaintArtifact.displayItemList
()) { |
| 440 if (displayItem.client() == lastAddedClient) | 440 if (&displayItem.client() == lastAddedClient) |
| 441 continue; | 441 continue; |
| 442 if (displayItem.isCacheable()) { | 442 if (displayItem.isCacheable()) { |
| 443 lastAddedClient = displayItem.client(); | 443 lastAddedClient = &displayItem.client(); |
| 444 m_validlyCachedClients.add(lastAddedClient); | 444 m_validlyCachedClients.add(lastAddedClient); |
| 445 } | 445 } |
| 446 } | 446 } |
| 447 } | 447 } |
| 448 | 448 |
| 449 #if ENABLE(ASSERT) | 449 #if ENABLE(ASSERT) |
| 450 | 450 |
| 451 void PaintController::checkUnderInvalidation(DisplayItemList::iterator& newIt, D
isplayItemList::iterator& currentIt) | 451 void PaintController::checkUnderInvalidation(DisplayItemList::iterator& newIt, D
isplayItemList::iterator& currentIt) |
| 452 { | 452 { |
| 453 ASSERT(RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEnabled
()); | 453 ASSERT(RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEnabled
()); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 502 { | 502 { |
| 503 ASSERT(RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEnabled
()); | 503 ASSERT(RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEnabled
()); |
| 504 ASSERT(!newItem.isCached()); | 504 ASSERT(!newItem.isCached()); |
| 505 ASSERT(!oldItem.isCached()); | 505 ASSERT(!oldItem.isCached()); |
| 506 | 506 |
| 507 if (newItem.skippedCache()) { | 507 if (newItem.skippedCache()) { |
| 508 showUnderInvalidationError(messagePrefix, "ERROR: under-invalidation: sk
ipped-cache in cached subsequence", &newItem, &oldItem); | 508 showUnderInvalidationError(messagePrefix, "ERROR: under-invalidation: sk
ipped-cache in cached subsequence", &newItem, &oldItem); |
| 509 ASSERT_NOT_REACHED(); | 509 ASSERT_NOT_REACHED(); |
| 510 } | 510 } |
| 511 | 511 |
| 512 if (newItem.isCacheable() && !m_validlyCachedClients.contains(newItem.client
())) { | 512 if (newItem.isCacheable() && !m_validlyCachedClients.contains(&newItem.clien
t())) { |
| 513 showUnderInvalidationError(messagePrefix, "ERROR: under-invalidation: in
validated in cached subsequence", &newItem, &oldItem); | 513 showUnderInvalidationError(messagePrefix, "ERROR: under-invalidation: in
validated in cached subsequence", &newItem, &oldItem); |
| 514 ASSERT_NOT_REACHED(); | 514 ASSERT_NOT_REACHED(); |
| 515 } | 515 } |
| 516 | 516 |
| 517 if (newItem.equals(oldItem)) | 517 if (newItem.equals(oldItem)) |
| 518 return; | 518 return; |
| 519 | 519 |
| 520 showUnderInvalidationError(messagePrefix, "ERROR: under-invalidation: displa
y item changed", &newItem, &oldItem); | 520 showUnderInvalidationError(messagePrefix, "ERROR: under-invalidation: displa
y item changed", &newItem, &oldItem); |
| 521 | 521 |
| 522 #ifndef NDEBUG | 522 #ifndef NDEBUG |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 569 | 569 |
| 570 void PaintController::showDebugData() const | 570 void PaintController::showDebugData() const |
| 571 { | 571 { |
| 572 WTFLogAlways("current display item list: [%s]\n", displayItemListAsDebugStri
ng(m_currentPaintArtifact.displayItemList()).utf8().data()); | 572 WTFLogAlways("current display item list: [%s]\n", displayItemListAsDebugStri
ng(m_currentPaintArtifact.displayItemList()).utf8().data()); |
| 573 WTFLogAlways("new display item list: [%s]\n", displayItemListAsDebugString(m
_newDisplayItemList).utf8().data()); | 573 WTFLogAlways("new display item list: [%s]\n", displayItemListAsDebugString(m
_newDisplayItemList).utf8().data()); |
| 574 } | 574 } |
| 575 | 575 |
| 576 #endif // ifndef NDEBUG | 576 #endif // ifndef NDEBUG |
| 577 | 577 |
| 578 } // namespace blink | 578 } // namespace blink |
| OLD | NEW |