| 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 #ifndef PaintController_h | 5 #ifndef PaintController_h |
| 6 #define PaintController_h | 6 #define PaintController_h |
| 7 | 7 |
| 8 #include "platform/PlatformExport.h" | 8 #include "platform/PlatformExport.h" |
| 9 #include "platform/RuntimeEnabledFeatures.h" | 9 #include "platform/RuntimeEnabledFeatures.h" |
| 10 #include "platform/geometry/IntRect.h" | 10 #include "platform/geometry/IntRect.h" |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 class PLATFORM_EXPORT PaintController { | 43 class PLATFORM_EXPORT PaintController { |
| 44 WTF_MAKE_NONCOPYABLE(PaintController); | 44 WTF_MAKE_NONCOPYABLE(PaintController); |
| 45 USING_FAST_MALLOC(PaintController); | 45 USING_FAST_MALLOC(PaintController); |
| 46 | 46 |
| 47 public: | 47 public: |
| 48 static std::unique_ptr<PaintController> create() { | 48 static std::unique_ptr<PaintController> create() { |
| 49 return wrapUnique(new PaintController()); | 49 return wrapUnique(new PaintController()); |
| 50 } | 50 } |
| 51 | 51 |
| 52 ~PaintController() { | 52 ~PaintController() { |
| 53 // New display items should be committed before PaintController is destructe
d. | 53 // New display items should be committed before PaintController is |
| 54 // destructed. |
| 54 DCHECK(m_newDisplayItemList.isEmpty()); | 55 DCHECK(m_newDisplayItemList.isEmpty()); |
| 55 #if CHECK_DISPLAY_ITEM_CLIENT_ALIVENESS | 56 #if CHECK_DISPLAY_ITEM_CLIENT_ALIVENESS |
| 56 DisplayItemClient::endShouldKeepAliveAllClients(this); | 57 DisplayItemClient::endShouldKeepAliveAllClients(this); |
| 57 #endif | 58 #endif |
| 58 } | 59 } |
| 59 | 60 |
| 60 void invalidateAll(); | 61 void invalidateAll(); |
| 61 | 62 |
| 62 // These methods are called during painting. | 63 // These methods are called during painting. |
| 63 | 64 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 template <typename DisplayItemClass, typename... Args> | 96 template <typename DisplayItemClass, typename... Args> |
| 96 void endItem(Args&&... args) { | 97 void endItem(Args&&... args) { |
| 97 if (displayItemConstructionIsDisabled()) | 98 if (displayItemConstructionIsDisabled()) |
| 98 return; | 99 return; |
| 99 if (lastDisplayItemIsNoopBegin()) | 100 if (lastDisplayItemIsNoopBegin()) |
| 100 removeLastDisplayItem(); | 101 removeLastDisplayItem(); |
| 101 else | 102 else |
| 102 createAndAppend<DisplayItemClass>(std::forward<Args>(args)...); | 103 createAndAppend<DisplayItemClass>(std::forward<Args>(args)...); |
| 103 } | 104 } |
| 104 | 105 |
| 105 // Tries to find the cached drawing display item corresponding to the given pa
rameters. If found, | 106 // Tries to find the cached drawing display item corresponding to the given |
| 106 // appends the cached display item to the new display list and returns true. O
therwise returns false. | 107 // parameters. If found, appends the cached display item to the new display |
| 108 // list and returns true. Otherwise returns false. |
| 107 bool useCachedDrawingIfPossible(const DisplayItemClient&, DisplayItem::Type); | 109 bool useCachedDrawingIfPossible(const DisplayItemClient&, DisplayItem::Type); |
| 108 | 110 |
| 109 // Tries to find the cached subsequence corresponding to the given parameters.
If found, copies the | 111 // Tries to find the cached subsequence corresponding to the given parameters. |
| 110 // cache subsequence to the new display list and returns true. Otherwise retur
ns false. | 112 // If found, copies the cache subsequence to the new display list and returns |
| 113 // true. Otherwise returns false. |
| 111 bool useCachedSubsequenceIfPossible(const DisplayItemClient&); | 114 bool useCachedSubsequenceIfPossible(const DisplayItemClient&); |
| 112 | 115 |
| 113 // True if the last display item is a begin that doesn't draw content. | 116 // True if the last display item is a begin that doesn't draw content. |
| 114 bool lastDisplayItemIsNoopBegin() const; | 117 bool lastDisplayItemIsNoopBegin() const; |
| 115 void removeLastDisplayItem(); | 118 void removeLastDisplayItem(); |
| 116 const DisplayItem* lastDisplayItem(unsigned offset); | 119 const DisplayItem* lastDisplayItem(unsigned offset); |
| 117 | 120 |
| 118 void beginSkippingCache() { ++m_skippingCacheCount; } | 121 void beginSkippingCache() { ++m_skippingCacheCount; } |
| 119 void endSkippingCache() { | 122 void endSkippingCache() { |
| 120 DCHECK(m_skippingCacheCount > 0); | 123 DCHECK(m_skippingCacheCount > 0); |
| 121 --m_skippingCacheCount; | 124 --m_skippingCacheCount; |
| 122 } | 125 } |
| 123 bool isSkippingCache() const { return m_skippingCacheCount; } | 126 bool isSkippingCache() const { return m_skippingCacheCount; } |
| 124 | 127 |
| 125 // Must be called when a painting is finished. | 128 // Must be called when a painting is finished. |offsetFromLayoutObject| is the |
| 126 // offsetFromLayoutObject is the offset between the space of the GraphicsLayer
which owns this | 129 // offset between the space of the GraphicsLayer which owns this |
| 127 // PaintController and the coordinate space of the owning LayoutObject. | 130 // PaintController and the coordinate space of the owning LayoutObject. |
| 128 void commitNewDisplayItems( | 131 void commitNewDisplayItems( |
| 129 const LayoutSize& offsetFromLayoutObject = LayoutSize()); | 132 const LayoutSize& offsetFromLayoutObject = LayoutSize()); |
| 130 | 133 |
| 131 // Returns the approximate memory usage, excluding memory likely to be | 134 // Returns the approximate memory usage, excluding memory likely to be |
| 132 // shared with the embedder after copying to WebPaintController. | 135 // shared with the embedder after copying to WebPaintController. |
| 133 // Should only be called right after commitNewDisplayItems. | 136 // Should only be called right after commitNewDisplayItems. |
| 134 size_t approximateUnsharedMemoryUsage() const; | 137 size_t approximateUnsharedMemoryUsage() const; |
| 135 | 138 |
| 136 // Get the artifact generated after the last commit. | 139 // Get the artifact generated after the last commit. |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 239 const IndicesByClientMap&, | 242 const IndicesByClientMap&, |
| 240 const DisplayItemList&); | 243 const DisplayItemList&); |
| 241 static void addItemToIndexIfNeeded(const DisplayItem&, | 244 static void addItemToIndexIfNeeded(const DisplayItem&, |
| 242 size_t index, | 245 size_t index, |
| 243 IndicesByClientMap&); | 246 IndicesByClientMap&); |
| 244 | 247 |
| 245 size_t findCachedItem(const DisplayItem::Id&); | 248 size_t findCachedItem(const DisplayItem::Id&); |
| 246 size_t findOutOfOrderCachedItemForward(const DisplayItem::Id&); | 249 size_t findOutOfOrderCachedItemForward(const DisplayItem::Id&); |
| 247 void copyCachedSubsequence(size_t&); | 250 void copyCachedSubsequence(size_t&); |
| 248 | 251 |
| 249 // Resets the indices (e.g. m_nextItemToMatch) of m_currentPaintArtifact.getDi
splayItemList() | 252 // Resets the indices (e.g. m_nextItemToMatch) of |
| 250 // to their initial values. This should be called when the DisplayItemList in
m_currentPaintArtifact | 253 // m_currentPaintArtifact.getDisplayItemList() to their initial values. This |
| 251 // is newly created, or is changed causing the previous indices to be invalid. | 254 // should be called when the DisplayItemList in m_currentPaintArtifact is |
| 255 // newly created, or is changed causing the previous indices to be invalid. |
| 252 void resetCurrentListIndices(); | 256 void resetCurrentListIndices(); |
| 253 | 257 |
| 254 void generateChunkRasterInvalidationRects(PaintChunk& newChunk); | 258 void generateChunkRasterInvalidationRects(PaintChunk& newChunk); |
| 255 void generateChunkRasterInvalidationRectsComparingOldChunk( | 259 void generateChunkRasterInvalidationRectsComparingOldChunk( |
| 256 PaintChunk& newChunk, | 260 PaintChunk& newChunk, |
| 257 const PaintChunk& oldChunk); | 261 const PaintChunk& oldChunk); |
| 258 void addRasterInvalidationInfo(const DisplayItemClient*, | 262 void addRasterInvalidationInfo(const DisplayItemClient*, |
| 259 PaintChunk&, | 263 PaintChunk&, |
| 260 const FloatRect&); | 264 const FloatRect&); |
| 261 | 265 |
| 262 // The following two methods are for checking under-invalidations | 266 // The following two methods are for checking under-invalidations |
| 263 // (when RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled). | 267 // (when RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled). |
| 264 void showUnderInvalidationError(const char* reason, | 268 void showUnderInvalidationError(const char* reason, |
| 265 const DisplayItem& newItem, | 269 const DisplayItem& newItem, |
| 266 const DisplayItem* oldItem) const; | 270 const DisplayItem* oldItem) const; |
| 267 void checkUnderInvalidation(); | 271 void checkUnderInvalidation(); |
| 268 bool isCheckingUnderInvalidation() const { | 272 bool isCheckingUnderInvalidation() const { |
| 269 return m_underInvalidationCheckingEnd - m_underInvalidationCheckingBegin > | 273 return m_underInvalidationCheckingEnd - m_underInvalidationCheckingBegin > |
| 270 0; | 274 0; |
| 271 } | 275 } |
| 272 | 276 |
| 273 // The last complete paint artifact. | 277 // The last complete paint artifact. |
| 274 // In SPv2, this includes paint chunks as well as display items. | 278 // In SPv2, this includes paint chunks as well as display items. |
| 275 PaintArtifact m_currentPaintArtifact; | 279 PaintArtifact m_currentPaintArtifact; |
| 276 | 280 |
| 277 // Data being used to build the next paint artifact. | 281 // Data being used to build the next paint artifact. |
| 278 DisplayItemList m_newDisplayItemList; | 282 DisplayItemList m_newDisplayItemList; |
| 279 PaintChunker m_newPaintChunks; | 283 PaintChunker m_newPaintChunks; |
| 280 | 284 |
| 281 // Stores indices into m_newDisplayItemList for display items that have been m
oved from | 285 // Stores indices into m_newDisplayItemList for display items that have been |
| 282 // m_currentPaintArtifact.getDisplayItemList(), indexed by the positions of th
e display | 286 // moved from m_currentPaintArtifact.getDisplayItemList(), indexed by the |
| 283 // items before move. The values are undefined for display items that are not
moved. | 287 // positions of the display items before the move. The values are undefined |
| 288 // for display items that are not moved. |
| 284 Vector<size_t> m_itemsMovedIntoNewList; | 289 Vector<size_t> m_itemsMovedIntoNewList; |
| 285 | 290 |
| 286 // Allow display item construction to be disabled to isolate the costs of cons
truction | 291 // Allows display item construction to be disabled to isolate the costs of |
| 287 // in performance metrics. | 292 // construction in performance metrics. |
| 288 bool m_constructionDisabled; | 293 bool m_constructionDisabled; |
| 289 | 294 |
| 290 // Allow subsequence caching to be disabled to test the cost of display item c
aching. | 295 // Allows subsequence caching to be disabled to test the cost of display item |
| 296 // caching. |
| 291 bool m_subsequenceCachingDisabled; | 297 bool m_subsequenceCachingDisabled; |
| 292 | 298 |
| 293 // Indicates this PaintController has ever had text. It is never reset to fals
e. | 299 // Indicates this PaintController has ever had text. It is never reset to |
| 300 // false. |
| 294 bool m_textPainted; | 301 bool m_textPainted; |
| 295 bool m_imagePainted; | 302 bool m_imagePainted; |
| 296 | 303 |
| 297 int m_skippingCacheCount; | 304 int m_skippingCacheCount; |
| 298 | 305 |
| 299 int m_numCachedNewItems; | 306 int m_numCachedNewItems; |
| 300 | 307 |
| 301 // Stores indices to valid cacheable display items in m_currentPaintArtifact.d
isplayItemList() | 308 // Stores indices to valid cacheable display items in |
| 302 // that have not been matched by requests of cached display items (using useCa
chedDrawingIfPossible() | 309 // m_currentPaintArtifact.displayItemList() that have not been matched by |
| 303 // and useCachedSubsequenceIfPossible()) during sequential matching . The inde
xed items will be | 310 // requests of cached display items (using useCachedDrawingIfPossible() and |
| 304 // matched by later out-of-order requests of cached display items. This ensure
s that when | 311 // useCachedSubsequenceIfPossible()) during sequential matching. The indexed |
| 305 // out-of-order cached display items are requested, we only traverse at most o
nce over | 312 // items will be matched by later out-of-order requests of cached display |
| 306 // the current display list looking for potential matches. Thus we can ensure
that the | 313 // items. This ensures that when out-of-order cached display items are |
| 307 // algorithm runs in linear time. | 314 // requested, we only traverse at most once over the current display list |
| 315 // looking for potential matches. Thus we can ensure that the algorithm runs |
| 316 // in linear time. |
| 308 IndicesByClientMap m_outOfOrderItemIndices; | 317 IndicesByClientMap m_outOfOrderItemIndices; |
| 309 | 318 |
| 310 // The next item in the current list for sequential match. | 319 // The next item in the current list for sequential match. |
| 311 size_t m_nextItemToMatch; | 320 size_t m_nextItemToMatch; |
| 312 | 321 |
| 313 // The next item in the current list to be indexed for out-of-order cache requ
ests. | 322 // The next item in the current list to be indexed for out-of-order cache |
| 323 // requests. |
| 314 size_t m_nextItemToIndex; | 324 size_t m_nextItemToIndex; |
| 315 | 325 |
| 316 // Similar to m_outOfOrderItemIndices but | 326 // Similar to m_outOfOrderItemIndices but |
| 317 // - the indices are chunk indices in m_currentPaintArtifacts.paintChunks(); | 327 // - the indices are chunk indices in m_currentPaintArtifacts.paintChunks(); |
| 318 // - chunks are matched not only for requests of cached display items, but als
o non-cached display items. | 328 // - chunks are matched not only for requests of cached display items, but |
| 329 // also non-cached display items. |
| 319 IndicesByClientMap m_outOfOrderChunkIndices; | 330 IndicesByClientMap m_outOfOrderChunkIndices; |
| 320 | 331 |
| 321 size_t m_currentCachedSubsequenceBeginIndexInNewList; | 332 size_t m_currentCachedSubsequenceBeginIndexInNewList; |
| 322 size_t m_nextChunkToMatch; | 333 size_t m_nextChunkToMatch; |
| 323 | 334 |
| 324 DisplayItemClient::CacheGenerationOrInvalidationReason | 335 DisplayItemClient::CacheGenerationOrInvalidationReason |
| 325 m_currentCacheGeneration; | 336 m_currentCacheGeneration; |
| 326 | 337 |
| 327 #ifndef NDEBUG | 338 #ifndef NDEBUG |
| 328 int m_numSequentialMatches; | 339 int m_numSequentialMatches; |
| 329 int m_numOutOfOrderMatches; | 340 int m_numOutOfOrderMatches; |
| 330 int m_numIndexedItems; | 341 int m_numIndexedItems; |
| 331 #endif | 342 #endif |
| 332 | 343 |
| 333 #if DCHECK_IS_ON() | 344 #if DCHECK_IS_ON() |
| 334 // This is used to check duplicated ids during createAndAppend(). | 345 // This is used to check duplicated ids during createAndAppend(). |
| 335 IndicesByClientMap m_newDisplayItemIndicesByClient; | 346 IndicesByClientMap m_newDisplayItemIndicesByClient; |
| 336 #endif | 347 #endif |
| 337 | 348 |
| 338 // These are set in useCachedDrawingIfPossible() and useCachedSubsequenceIfPos
sible() | 349 // These are set in useCachedDrawingIfPossible() and |
| 339 // when we could use cached drawing or subsequence and under-invalidation chec
king is on, | 350 // useCachedSubsequenceIfPossible() when we could use cached drawing or |
| 340 // indicating the begin and end of the cached drawing or subsequence in the cu
rrent list. | 351 // subsequence and under-invalidation checking is on, indicating the begin and |
| 341 // The functions return false to let the client do actual painting, and PaintC
ontroller | 352 // end of the cached drawing or subsequence in the current list. The functions |
| 342 // will check if the actual painting results are the same as the cached. | 353 // return false to let the client do actual painting, and PaintController will |
| 354 // check if the actual painting results are the same as the cached. |
| 343 size_t m_underInvalidationCheckingBegin; | 355 size_t m_underInvalidationCheckingBegin; |
| 344 size_t m_underInvalidationCheckingEnd; | 356 size_t m_underInvalidationCheckingEnd; |
| 345 // Number of probable under-invalidations that have been skipped temporarily b
ecause the | 357 |
| 346 // mismatching display items may be removed in the future because of no-op pai
rs or | 358 // Number of probable under-invalidations that have been skipped temporarily |
| 347 // compositing folding. | 359 // because the mismatching display items may be removed in the future because |
| 360 // of no-op pairs or compositing folding. |
| 348 int m_skippedProbableUnderInvalidationCount; | 361 int m_skippedProbableUnderInvalidationCount; |
| 349 String m_underInvalidationMessagePrefix; | 362 String m_underInvalidationMessagePrefix; |
| 350 | 363 |
| 351 std::unique_ptr<RasterInvalidationTrackingMap<const PaintChunk>> | 364 std::unique_ptr<RasterInvalidationTrackingMap<const PaintChunk>> |
| 352 m_paintChunksRasterInvalidationTrackingMap; | 365 m_paintChunksRasterInvalidationTrackingMap; |
| 353 | 366 |
| 354 #if CHECK_DISPLAY_ITEM_CLIENT_ALIVENESS | 367 #if CHECK_DISPLAY_ITEM_CLIENT_ALIVENESS |
| 355 // A stack recording subsequence clients that are currently painting. | 368 // A stack recording subsequence clients that are currently painting. |
| 356 Vector<const DisplayItemClient*> m_currentSubsequenceClients; | 369 Vector<const DisplayItemClient*> m_currentSubsequenceClients; |
| 357 #endif | 370 #endif |
| 358 }; | 371 }; |
| 359 | 372 |
| 360 } // namespace blink | 373 } // namespace blink |
| 361 | 374 |
| 362 #endif // PaintController_h | 375 #endif // PaintController_h |
| OLD | NEW |