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

Unified Diff: third_party/WebKit/Source/platform/graphics/paint/ClipPaintPropertyNode.cpp

Issue 2729243002: Improve performance of GeometryMapper cache. (Closed)
Patch Set: none Created 3 years, 9 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/platform/graphics/paint/ClipPaintPropertyNode.cpp
diff --git a/third_party/WebKit/Source/platform/graphics/paint/ClipPaintPropertyNode.cpp b/third_party/WebKit/Source/platform/graphics/paint/ClipPaintPropertyNode.cpp
index 0a718c46c57d4c9b666cbfe9bc246b3a99e812fe..7b7ce34a41c2f11fa22f4c7fd5606f99d02016bf 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/ClipPaintPropertyNode.cpp
+++ b/third_party/WebKit/Source/platform/graphics/paint/ClipPaintPropertyNode.cpp
@@ -9,6 +9,22 @@
namespace blink {
+// All clip caches invalidate themselves by tracking a local cache generation,
+// and invalidating their cache if their cache generation disagrees with
+// s_clipCacheGeneration.
+static unsigned s_clipCacheGeneration = 0;
+
+ClipPaintPropertyNode::ClipPaintPropertyNode(
+ PassRefPtr<const ClipPaintPropertyNode> parent,
+ PassRefPtr<const TransformPaintPropertyNode> localTransformSpace,
+ const FloatRoundedRect& clipRect,
+ CompositingReasons directCompositingReasons)
+ : m_parent(parent),
+ m_localTransformSpace(localTransformSpace),
+ m_clipRect(clipRect),
+ m_directCompositingReasons(directCompositingReasons),
+ m_cacheGeneration(s_clipCacheGeneration) {}
+
ClipPaintPropertyNode* ClipPaintPropertyNode::root() {
DEFINE_STATIC_REF(ClipPaintPropertyNode, root,
(ClipPaintPropertyNode::create(
@@ -34,4 +50,45 @@ String ClipPaintPropertyNode::toTreeString() const {
#endif
+void ClipPaintPropertyNode::clearCache() {
+ s_clipCacheGeneration++;
+}
+
+Vector<ClipPaintPropertyNode::ClipCacheEntry>*
+ClipPaintPropertyNode::getClipCacheEntries() {
+ if (m_cacheGeneration != s_clipCacheGeneration || !m_clipCache) {
+ m_clipCache.reset(new Vector<ClipCacheEntry>);
+ m_cacheGeneration = s_clipCacheGeneration;
+ }
+
+ return m_clipCache.get();
+}
+
+const FloatClipRect* ClipPaintPropertyNode::getCachedClip(
+ const ClipAndTransform& clipAndTransform) const {
+ auto* clipCacheEntries =
+ const_cast<ClipPaintPropertyNode*>(this)->getClipCacheEntries();
+ for (const auto& entry : *clipCacheEntries) {
+ if (entry.clipAndTransform == clipAndTransform) {
+ return &entry.clipRect;
+ }
+ }
+ return nullptr;
+}
+
+void ClipPaintPropertyNode::setCachedClip(
+ const ClipAndTransform& clipAndTransform,
+ const FloatClipRect& clip) const {
+ auto* clipCacheEntries =
+ const_cast<ClipPaintPropertyNode*>(this)->getClipCacheEntries();
+#if DCHECK_IS_ON
+ for (const auto& entry : clipCachEntries) {
+ if (entry.clipAndTransform == clipAndTransform)
+ DCHECK(false); // There should be no existing entry.
+ }
+#endif
+ clipCacheEntries->push_back(ClipCacheEntry(clipAndTransform, clip));
+ CHECK(getCachedClip(clipAndTransform));
Xianzhu 2017/03/07 23:19:06 Should this be DCHECK?
chrishtr 2017/03/07 23:21:25 Oh good catch! Actually deleted this, it was duri
+}
+
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698