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

Side by Side Diff: third_party/WebKit/Source/platform/graphics/paint/DisplayItemClient.h

Issue 1508223005: Client side display item cache flag (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@ScrollbarTheme
Patch Set: Created 4 years, 7 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 DisplayItemClient_h 5 #ifndef DisplayItemClient_h
6 #define DisplayItemClient_h 6 #define DisplayItemClient_h
7 7
8 #include "platform/PlatformExport.h" 8 #include "platform/PlatformExport.h"
9 #include "platform/geometry/LayoutRect.h" 9 #include "platform/geometry/LayoutRect.h"
10 #include "wtf/text/WTFString.h" 10 #include "wtf/text/WTFString.h"
11 11
12 namespace blink { 12 namespace blink {
13 13
14 // Holds a unique cache generation id of display items and paint controllers.
15 //
16 // A paint controller sets its cache generation to DisplayItemCacheGeneration::n ext()
17 // at the end of each commitNewDisplayItems, and updates the cache generation of each
18 // client with cached drawings by calling DisplayItemClient::setDisplayItemsCach ed().
19 // A display item is treated as validly cached in a paint controller if its cach e generation
20 // matches the paint controller's cache generation.
21 //
22 // SPv1 only: If a display item is painted on multiple paint controllers, becaus e cache
23 // generations are unique, the client's cache generation matches the last paint controller
24 // only. The client will be treated as invalid on other paint controllers regard less if
25 // it's validly cached by these paint controllers. The situation is very rare (a bout 0.07%
26 // clients were painted on multiple paint controllers) so the performance penalt y is trivial.
27 class PLATFORM_EXPORT DisplayItemCacheGeneration {
28 DISALLOW_NEW();
29 public:
30 DisplayItemCacheGeneration() : m_value(kInvalidGeneration) { }
31
32 void invalidate() { m_value = kInvalidGeneration; }
33 static DisplayItemCacheGeneration next() { return DisplayItemCacheGeneration (s_nextGeneration++); }
34 bool matches(const DisplayItemCacheGeneration& other)
35 {
36 return m_value != kInvalidGeneration && other.m_value != kInvalidGenerat ion && m_value == other.m_value;
37 }
38
39 private:
40 typedef uint32_t Generation;
41 DisplayItemCacheGeneration(Generation value) : m_value(value) { }
42
43 static const Generation kInvalidGeneration = 0;
44 static Generation s_nextGeneration;
45 Generation m_value;
46 };
47
14 // The interface for objects that can be associated with display items. 48 // The interface for objects that can be associated with display items.
15 // A DisplayItemClient object should live at least longer than the document cycl e 49 // A DisplayItemClient object should live at least longer than the document cycl e
16 // in which its display items are created during painting. 50 // in which its display items are created during painting.
17 // After the document cycle, a pointer/reference to DisplayItemClient should be 51 // After the document cycle, a pointer/reference to DisplayItemClient should be
18 // no longer dereferenced unless we can make sure the client is still valid. 52 // no longer dereferenced unless we can make sure the client is still valid.
19 class PLATFORM_EXPORT DisplayItemClient { 53 class PLATFORM_EXPORT DisplayItemClient {
20 public: 54 public:
21 #if ENABLE(ASSERT) 55 #if ENABLE(ASSERT)
22 DisplayItemClient(); 56 DisplayItemClient();
23 virtual ~DisplayItemClient(); 57 virtual ~DisplayItemClient();
24 #else 58 #else
25 virtual ~DisplayItemClient() { } 59 virtual ~DisplayItemClient() { }
26 #endif 60 #endif
27 61
28 virtual String debugName() const = 0; 62 virtual String debugName() const = 0;
29 63
30 // The visual rect of this DisplayItemClient, in object space of the object that owns the GraphicsLayer, i.e. 64 // The visual rect of this DisplayItemClient, in object space of the object that owns the GraphicsLayer, i.e.
31 // offset by offsetFromLayoutObjectWithSubpixelAccumulation(). 65 // offset by offsetFromLayoutObjectWithSubpixelAccumulation().
32 virtual LayoutRect visualRect() const = 0; 66 virtual LayoutRect visualRect() const = 0;
33 67
68 // The default implementation is uncacheable.
69 // Use DISPLAY_ITEM_CACHE_STATUS_IMPLEMENTATION for cacheable implementation .
chrishtr 2016/04/29 15:55:17 I think it would be better to do the opposite, so
Xianzhu 2016/04/29 16:37:11 Agreed. Done.
70 virtual bool displayItemsAreCached(DisplayItemCacheGeneration) const { retur n false; }
71 virtual void setDisplayItemsCached(DisplayItemCacheGeneration) const { }
72 virtual void setDisplayItemsUncached() const { }
73
34 #if ENABLE(ASSERT) 74 #if ENABLE(ASSERT)
35 // Tests if a DisplayItemClient object has been created and has not been del eted yet. 75 // Tests if a DisplayItemClient object has been created and has not been del eted yet.
36 static bool isAlive(const DisplayItemClient&); 76 static bool isAlive(const DisplayItemClient&);
37 #endif 77 #endif
78
79 protected:
38 }; 80 };
39 81
82 #define DISPLAY_ITEM_CACHE_STATUS_IMPLEMENTATION \
83 bool displayItemsAreCached(DisplayItemCacheGeneration cacheGeneration) const final { return m_cacheGeneration.matches(cacheGeneration); } \
84 void setDisplayItemsCached(DisplayItemCacheGeneration cacheGeneration) const final { m_cacheGeneration = cacheGeneration; } \
85 void setDisplayItemsUncached() const final { m_cacheGeneration.invalidate(); } \
86 mutable DisplayItemCacheGeneration m_cacheGeneration;
87
40 inline bool operator==(const DisplayItemClient& client1, const DisplayItemClient & client2) { return &client1 == &client2; } 88 inline bool operator==(const DisplayItemClient& client1, const DisplayItemClient & client2) { return &client1 == &client2; }
41 inline bool operator!=(const DisplayItemClient& client1, const DisplayItemClient & client2) { return &client1 != &client2; } 89 inline bool operator!=(const DisplayItemClient& client1, const DisplayItemClient & client2) { return &client1 != &client2; }
42 90
43 } // namespace blink 91 } // namespace blink
44 92
45 #endif // DisplayItemClient_h 93 #endif // DisplayItemClient_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698