| 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" |
| 11 #include "platform/geometry/LayoutPoint.h" | 11 #include "platform/geometry/LayoutPoint.h" |
| 12 #include "platform/graphics/ContiguousContainer.h" | 12 #include "platform/graphics/ContiguousContainer.h" |
| 13 #include "platform/graphics/paint/DisplayItem.h" | 13 #include "platform/graphics/paint/DisplayItem.h" |
| 14 #include "platform/graphics/paint/DisplayItemList.h" | 14 #include "platform/graphics/paint/DisplayItemList.h" |
| 15 #include "platform/graphics/paint/PaintArtifact.h" | 15 #include "platform/graphics/paint/PaintArtifact.h" |
| 16 #include "platform/graphics/paint/PaintChunk.h" | 16 #include "platform/graphics/paint/PaintChunk.h" |
| 17 #include "platform/graphics/paint/PaintChunker.h" | 17 #include "platform/graphics/paint/PaintChunker.h" |
| 18 #include "platform/graphics/paint/RasterInvalidationTracking.h" |
| 18 #include "platform/graphics/paint/Transform3DDisplayItem.h" | 19 #include "platform/graphics/paint/Transform3DDisplayItem.h" |
| 19 #include "third_party/skia/include/core/SkRefCnt.h" | 20 #include "third_party/skia/include/core/SkRefCnt.h" |
| 20 #include "wtf/Alignment.h" | 21 #include "wtf/Alignment.h" |
| 21 #include "wtf/Assertions.h" | 22 #include "wtf/Assertions.h" |
| 22 #include "wtf/HashMap.h" | 23 #include "wtf/HashMap.h" |
| 23 #include "wtf/HashSet.h" | 24 #include "wtf/HashSet.h" |
| 24 #include "wtf/PtrUtil.h" | 25 #include "wtf/PtrUtil.h" |
| 25 #include "wtf/Vector.h" | 26 #include "wtf/Vector.h" |
| 26 #include <memory> | 27 #include <memory> |
| 27 #include <utility> | 28 #include <utility> |
| 28 | 29 |
| 29 class SkPicture; | 30 class SkPicture; |
| 30 | 31 |
| 31 namespace blink { | 32 namespace blink { |
| 32 | 33 |
| 33 class GraphicsContext; | 34 class GraphicsContext; |
| 34 | 35 |
| 35 static const size_t kInitialDisplayItemListCapacityBytes = 512; | 36 static const size_t kInitialDisplayItemListCapacityBytes = 512; |
| 36 | 37 |
| 38 template class RasterInvalidationTrackingMap<const PaintChunk>; |
| 39 |
| 37 // Responsible for processing display items as they are produced, and producing | 40 // Responsible for processing display items as they are produced, and producing |
| 38 // a final paint artifact when complete. This class includes logic for caching, | 41 // a final paint artifact when complete. This class includes logic for caching, |
| 39 // cache invalidation, and merging. | 42 // cache invalidation, and merging. |
| 40 class PLATFORM_EXPORT PaintController { | 43 class PLATFORM_EXPORT PaintController { |
| 41 WTF_MAKE_NONCOPYABLE(PaintController); | 44 WTF_MAKE_NONCOPYABLE(PaintController); |
| 42 USING_FAST_MALLOC(PaintController); | 45 USING_FAST_MALLOC(PaintController); |
| 43 | 46 |
| 44 public: | 47 public: |
| 45 static std::unique_ptr<PaintController> create() { | 48 static std::unique_ptr<PaintController> create() { |
| 46 return wrapUnique(new PaintController()); | 49 return wrapUnique(new PaintController()); |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 | 174 |
| 172 void showDebugData() const { showDebugDataInternal(false); } | 175 void showDebugData() const { showDebugDataInternal(false); } |
| 173 #ifndef NDEBUG | 176 #ifndef NDEBUG |
| 174 void showDebugDataWithPictures() const { showDebugDataInternal(true); } | 177 void showDebugDataWithPictures() const { showDebugDataInternal(true); } |
| 175 #endif | 178 #endif |
| 176 | 179 |
| 177 #if DCHECK_IS_ON() | 180 #if DCHECK_IS_ON() |
| 178 void assertDisplayItemClientsAreLive(); | 181 void assertDisplayItemClientsAreLive(); |
| 179 #endif | 182 #endif |
| 180 | 183 |
| 184 void setTracksRasterInvalidations(bool value); |
| 185 RasterInvalidationTrackingMap<const PaintChunk>* |
| 186 paintChunksRasterInvalidationTrackingMap() { |
| 187 return m_paintChunksRasterInvalidationTrackingMap.get(); |
| 188 } |
| 189 |
| 181 protected: | 190 protected: |
| 182 PaintController() | 191 PaintController() |
| 183 : m_newDisplayItemList(0), | 192 : m_newDisplayItemList(0), |
| 184 m_constructionDisabled(false), | 193 m_constructionDisabled(false), |
| 185 m_subsequenceCachingDisabled(false), | 194 m_subsequenceCachingDisabled(false), |
| 186 m_textPainted(false), | 195 m_textPainted(false), |
| 187 m_imagePainted(false), | 196 m_imagePainted(false), |
| 188 m_skippingCacheCount(0), | 197 m_skippingCacheCount(0), |
| 189 m_numCachedNewItems(0), | 198 m_numCachedNewItems(0), |
| 190 m_currentCachedSubsequenceBeginIndexInNewList(kNotFound) | 199 m_currentCachedSubsequenceBeginIndexInNewList(kNotFound) |
| 191 #ifndef NDEBUG | 200 #ifndef NDEBUG |
| 192 , | 201 , |
| 193 m_numSequentialMatches(0), | 202 m_numSequentialMatches(0), |
| 194 m_numOutOfOrderMatches(0), | 203 m_numOutOfOrderMatches(0), |
| 195 m_numIndexedItems(0) | 204 m_numIndexedItems(0) |
| 196 #endif | 205 #endif |
| 197 { | 206 { |
| 198 resetCurrentListIndices(); | 207 resetCurrentListIndices(); |
| 208 setTracksRasterInvalidations( |
| 209 RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()); |
| 199 } | 210 } |
| 200 | 211 |
| 201 private: | 212 private: |
| 202 friend class PaintControllerTestBase; | 213 friend class PaintControllerTestBase; |
| 203 friend class PaintControllerPaintTestBase; | 214 friend class PaintControllerPaintTestBase; |
| 204 | 215 |
| 205 void ensureNewDisplayItemListInitialCapacity() { | 216 void ensureNewDisplayItemListInitialCapacity() { |
| 206 if (m_newDisplayItemList.isEmpty()) { | 217 if (m_newDisplayItemList.isEmpty()) { |
| 207 // TODO(wangxianzhu): Consider revisiting this heuristic. | 218 // TODO(wangxianzhu): Consider revisiting this heuristic. |
| 208 m_newDisplayItemList = | 219 m_newDisplayItemList = |
| (...skipping 28 matching lines...) Expand all Loading... |
| 237 | 248 |
| 238 // Resets the indices (e.g. m_nextItemToMatch) of m_currentPaintArtifact.getDi
splayItemList() | 249 // Resets the indices (e.g. m_nextItemToMatch) of m_currentPaintArtifact.getDi
splayItemList() |
| 239 // to their initial values. This should be called when the DisplayItemList in
m_currentPaintArtifact | 250 // to their initial values. This should be called when the DisplayItemList in
m_currentPaintArtifact |
| 240 // is newly created, or is changed causing the previous indices to be invalid. | 251 // is newly created, or is changed causing the previous indices to be invalid. |
| 241 void resetCurrentListIndices(); | 252 void resetCurrentListIndices(); |
| 242 | 253 |
| 243 void generateChunkRasterInvalidationRects(PaintChunk& newChunk); | 254 void generateChunkRasterInvalidationRects(PaintChunk& newChunk); |
| 244 void generateChunkRasterInvalidationRectsComparingOldChunk( | 255 void generateChunkRasterInvalidationRectsComparingOldChunk( |
| 245 PaintChunk& newChunk, | 256 PaintChunk& newChunk, |
| 246 const PaintChunk& oldChunk); | 257 const PaintChunk& oldChunk); |
| 258 void addRasterInvalidationInfo(const DisplayItemClient*, |
| 259 PaintChunk&, |
| 260 const FloatRect&); |
| 247 | 261 |
| 248 // The following two methods are for checking under-invalidations | 262 // The following two methods are for checking under-invalidations |
| 249 // (when RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled). | 263 // (when RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled). |
| 250 void showUnderInvalidationError(const char* reason, | 264 void showUnderInvalidationError(const char* reason, |
| 251 const DisplayItem& newItem, | 265 const DisplayItem& newItem, |
| 252 const DisplayItem* oldItem) const; | 266 const DisplayItem* oldItem) const; |
| 253 void checkUnderInvalidation(); | 267 void checkUnderInvalidation(); |
| 254 bool isCheckingUnderInvalidation() const { | 268 bool isCheckingUnderInvalidation() const { |
| 255 return m_underInvalidationCheckingEnd - m_underInvalidationCheckingBegin > | 269 return m_underInvalidationCheckingEnd - m_underInvalidationCheckingBegin > |
| 256 0; | 270 0; |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 327 // The functions return false to let the client do actual painting, and PaintC
ontroller | 341 // The functions return false to let the client do actual painting, and PaintC
ontroller |
| 328 // will check if the actual painting results are the same as the cached. | 342 // will check if the actual painting results are the same as the cached. |
| 329 size_t m_underInvalidationCheckingBegin; | 343 size_t m_underInvalidationCheckingBegin; |
| 330 size_t m_underInvalidationCheckingEnd; | 344 size_t m_underInvalidationCheckingEnd; |
| 331 // Number of probable under-invalidations that have been skipped temporarily b
ecause the | 345 // Number of probable under-invalidations that have been skipped temporarily b
ecause the |
| 332 // mismatching display items may be removed in the future because of no-op pai
rs or | 346 // mismatching display items may be removed in the future because of no-op pai
rs or |
| 333 // compositing folding. | 347 // compositing folding. |
| 334 int m_skippedProbableUnderInvalidationCount; | 348 int m_skippedProbableUnderInvalidationCount; |
| 335 String m_underInvalidationMessagePrefix; | 349 String m_underInvalidationMessagePrefix; |
| 336 | 350 |
| 351 std::unique_ptr<RasterInvalidationTrackingMap<const PaintChunk>> |
| 352 m_paintChunksRasterInvalidationTrackingMap; |
| 353 |
| 337 #if CHECK_DISPLAY_ITEM_CLIENT_ALIVENESS | 354 #if CHECK_DISPLAY_ITEM_CLIENT_ALIVENESS |
| 338 // A stack recording subsequence clients that are currently painting. | 355 // A stack recording subsequence clients that are currently painting. |
| 339 Vector<const DisplayItemClient*> m_currentSubsequenceClients; | 356 Vector<const DisplayItemClient*> m_currentSubsequenceClients; |
| 340 #endif | 357 #endif |
| 341 }; | 358 }; |
| 342 | 359 |
| 343 } // namespace blink | 360 } // namespace blink |
| 344 | 361 |
| 345 #endif // PaintController_h | 362 #endif // PaintController_h |
| OLD | NEW |