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

Side by Side Diff: src/gpu/GrResourceCache.h

Issue 88113002: Speed up GrResourceCache lookup by inlining GrBinHashKey comparisons (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: address review comments (capitalized statics) Created 7 years 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 | Annotate | Revision Log
« no previous file with comments | « src/gpu/GrBinHashKey.h ('k') | src/gpu/GrTHashTable.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2011 Google Inc. 3 * Copyright 2011 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 10
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 /** Creates a key for resource */ 47 /** Creates a key for resource */
48 GrResourceKey(const GrCacheID& id, ResourceType type, ResourceFlags flags) { 48 GrResourceKey(const GrCacheID& id, ResourceType type, ResourceFlags flags) {
49 this->init(id.getDomain(), id.getKey(), type, flags); 49 this->init(id.getDomain(), id.getKey(), type, flags);
50 }; 50 };
51 51
52 GrResourceKey(const GrResourceKey& src) { 52 GrResourceKey(const GrResourceKey& src) {
53 fKey = src.fKey; 53 fKey = src.fKey;
54 } 54 }
55 55
56 GrResourceKey() { 56 GrResourceKey() {
57 fKey.fHashedKey.reset(); 57 fKey.reset();
58 } 58 }
59 59
60 void reset(const GrCacheID& id, ResourceType type, ResourceFlags flags) { 60 void reset(const GrCacheID& id, ResourceType type, ResourceFlags flags) {
61 this->init(id.getDomain(), id.getKey(), type, flags); 61 this->init(id.getDomain(), id.getKey(), type, flags);
62 } 62 }
63 63
64 //!< returns hash value [0..kHashMask] for the key 64 //!< returns hash value [0..kHashMask] for the key
65 int getHash() const { 65 int getHash() const {
66 return fKey.fHashedKey.getHash() & kHashMask; 66 return fKey.getHash() & kHashMask;
67 } 67 }
68 68
69 bool isScratch() const { 69 bool isScratch() const {
70 return ScratchDomain() == 70 return ScratchDomain() ==
71 *reinterpret_cast<const GrCacheID::Domain*>(fKey.fHashedKey.getData( ) + 71 *reinterpret_cast<const GrCacheID::Domain*>(fKey.getData() +
72 kCacheIDDomainOffset); 72 kCacheIDDomainOffset);
73 } 73 }
74 74
75 ResourceType getResourceType() const { 75 ResourceType getResourceType() const {
76 return *reinterpret_cast<const ResourceType*>(fKey.fHashedKey.getData() + 76 return *reinterpret_cast<const ResourceType*>(fKey.getData() +
77 kResourceTypeOffset); 77 kResourceTypeOffset);
78 } 78 }
79 79
80 ResourceFlags getResourceFlags() const { 80 ResourceFlags getResourceFlags() const {
81 return *reinterpret_cast<const ResourceFlags*>(fKey.fHashedKey.getData() + 81 return *reinterpret_cast<const ResourceFlags*>(fKey.getData() +
82 kResourceFlagsOffset); 82 kResourceFlagsOffset);
83 } 83 }
84 84
85 int compare(const GrResourceKey& other) const { 85 bool operator==(const GrResourceKey& other) const { return fKey == other.fKe y; }
86 return fKey.fHashedKey.compare(other.fKey.fHashedKey); 86 bool operator<(const GrResourceKey& other) const { return fKey < other.fKey; }
87 }
88 87
89 static bool LT(const GrResourceKey& a, const GrResourceKey& b) { 88 static bool LessThan(const GrResourceEntry& entry, const GrResourceKey& key) ;
90 return a.compare(b) < 0; 89 static bool Equals(const GrResourceEntry& entry, const GrResourceKey& key);
91 } 90 #ifdef SK_DEBUG
92 91 static bool LessThan(const GrResourceEntry& a, const GrResourceEntry& b);
93 static bool EQ(const GrResourceKey& a, const GrResourceKey& b) { 92 static bool Equals(const GrResourceEntry& a, const GrResourceEntry& b);
94 return 0 == a.compare(b); 93 #endif
95 }
96
97 inline static bool LT(const GrResourceEntry& entry, const GrResourceKey& key );
98 inline static bool EQ(const GrResourceEntry& entry, const GrResourceKey& key );
99 inline static bool LT(const GrResourceEntry& a, const GrResourceEntry& b);
100 inline static bool EQ(const GrResourceEntry& a, const GrResourceEntry& b);
101 94
102 private: 95 private:
103 enum { 96 enum {
104 kCacheIDKeyOffset = 0, 97 kCacheIDKeyOffset = 0,
105 kCacheIDDomainOffset = kCacheIDKeyOffset + sizeof(GrCacheID::Key), 98 kCacheIDDomainOffset = kCacheIDKeyOffset + sizeof(GrCacheID::Key),
106 kResourceTypeOffset = kCacheIDDomainOffset + sizeof(GrCacheID::Domain), 99 kResourceTypeOffset = kCacheIDDomainOffset + sizeof(GrCacheID::Domain),
107 kResourceFlagsOffset = kResourceTypeOffset + sizeof(ResourceType), 100 kResourceFlagsOffset = kResourceTypeOffset + sizeof(ResourceType),
108 kPadOffset = kResourceFlagsOffset + sizeof(ResourceFlags), 101 kPadOffset = kResourceFlagsOffset + sizeof(ResourceFlags),
109 kKeySize = SkAlign4(kPadOffset), 102 kKeySize = SkAlign4(kPadOffset),
110 kPadSize = kKeySize - kPadOffset 103 kPadSize = kKeySize - kPadOffset
111 }; 104 };
112 105
113 void init(const GrCacheID::Domain domain, 106 void init(const GrCacheID::Domain domain,
114 const GrCacheID::Key& key, 107 const GrCacheID::Key& key,
115 ResourceType type, 108 ResourceType type,
116 ResourceFlags flags) { 109 ResourceFlags flags) {
117 union { 110 union {
118 uint8_t fKey8[kKeySize]; 111 uint8_t fKey8[kKeySize];
119 uint32_t fKey32[kKeySize / 4]; 112 uint32_t fKey32[kKeySize / 4];
120 } keyData; 113 } keyData;
121 114
122 uint8_t* k = keyData.fKey8; 115 uint8_t* k = keyData.fKey8;
123 memcpy(k + kCacheIDKeyOffset, key.fData8, sizeof(GrCacheID::Key)); 116 memcpy(k + kCacheIDKeyOffset, key.fData8, sizeof(GrCacheID::Key));
124 memcpy(k + kCacheIDDomainOffset, &domain, sizeof(GrCacheID::Domain)); 117 memcpy(k + kCacheIDDomainOffset, &domain, sizeof(GrCacheID::Domain));
125 memcpy(k + kResourceTypeOffset, &type, sizeof(ResourceType)); 118 memcpy(k + kResourceTypeOffset, &type, sizeof(ResourceType));
126 memcpy(k + kResourceFlagsOffset, &flags, sizeof(ResourceFlags)); 119 memcpy(k + kResourceFlagsOffset, &flags, sizeof(ResourceFlags));
127 memset(k + kPadOffset, 0, kPadSize); 120 memset(k + kPadOffset, 0, kPadSize);
128 fKey.fHashedKey.setKeyData(keyData.fKey32); 121 fKey.setKeyData(keyData.fKey32);
129 } 122 }
130 123 GrBinHashKey<kKeySize> fKey;
131 struct Key;
132 typedef GrTBinHashKey<Key, kKeySize> HashedKey;
133
134 struct Key {
135 int compare(const HashedKey& hashedKey) const {
136 return fHashedKey.compare(hashedKey);
137 }
138
139 HashedKey fHashedKey;
140 };
141
142 Key fKey;
143 }; 124 };
144 125
145 // The cache listens for these messages to purge junk resources proactively. 126 // The cache listens for these messages to purge junk resources proactively.
146 struct GrResourceInvalidatedMessage { 127 struct GrResourceInvalidatedMessage {
147 GrResourceKey key; 128 GrResourceKey key;
148 }; 129 };
149 130
150 /////////////////////////////////////////////////////////////////////////////// 131 ///////////////////////////////////////////////////////////////////////////////
151 132
152 class GrResourceEntry { 133 class GrResourceEntry {
(...skipping 14 matching lines...) Expand all
167 GrResourceKey fKey; 148 GrResourceKey fKey;
168 GrResource* fResource; 149 GrResource* fResource;
169 150
170 // we're a linked list 151 // we're a linked list
171 SK_DECLARE_INTERNAL_LLIST_INTERFACE(GrResourceEntry); 152 SK_DECLARE_INTERNAL_LLIST_INTERFACE(GrResourceEntry);
172 153
173 friend class GrResourceCache; 154 friend class GrResourceCache;
174 friend class GrDLinkedList; 155 friend class GrDLinkedList;
175 }; 156 };
176 157
177 bool GrResourceKey::LT(const GrResourceEntry& entry, const GrResourceKey& key) { 158 inline bool GrResourceKey::LessThan(const GrResourceEntry& entry, const GrResour ceKey& key) {
178 return LT(entry.key(), key); 159 return entry.key() < key;
179 } 160 }
180 161
181 bool GrResourceKey::EQ(const GrResourceEntry& entry, const GrResourceKey& key) { 162 inline bool GrResourceKey::Equals(const GrResourceEntry& entry, const GrResource Key& key) {
182 return EQ(entry.key(), key); 163 return entry.key() == key;
183 } 164 }
184 165
185 bool GrResourceKey::LT(const GrResourceEntry& a, const GrResourceEntry& b) { 166 #ifdef SK_DEBUG
186 return LT(a.key(), b.key()); 167 inline bool GrResourceKey::LessThan(const GrResourceEntry& a, const GrResourceEn try& b) {
168 return a.key() < b.key();
187 } 169 }
188 170
189 bool GrResourceKey::EQ(const GrResourceEntry& a, const GrResourceEntry& b) { 171 inline bool GrResourceKey::Equals(const GrResourceEntry& a, const GrResourceEntr y& b) {
190 return EQ(a.key(), b.key()); 172 return a.key() == b.key();
191 } 173 }
174 #endif
192 175
193 /////////////////////////////////////////////////////////////////////////////// 176 ///////////////////////////////////////////////////////////////////////////////
194 177
195 /** 178 /**
196 * Cache of GrResource objects. 179 * Cache of GrResource objects.
197 * 180 *
198 * These have a corresponding GrResourceKey, built from 128bits identifying the 181 * These have a corresponding GrResourceKey, built from 128bits identifying the
199 * resource. 182 * resource.
200 * 183 *
201 * The cache stores the entries in a double-linked list, which is its LRU. 184 * The cache stores the entries in a double-linked list, which is its LRU.
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
425 GrResourceCache* fCache; 408 GrResourceCache* fCache;
426 }; 409 };
427 #else 410 #else
428 class GrAutoResourceCacheValidate { 411 class GrAutoResourceCacheValidate {
429 public: 412 public:
430 GrAutoResourceCacheValidate(GrResourceCache*) {} 413 GrAutoResourceCacheValidate(GrResourceCache*) {}
431 }; 414 };
432 #endif 415 #endif
433 416
434 #endif 417 #endif
OLDNEW
« no previous file with comments | « src/gpu/GrBinHashKey.h ('k') | src/gpu/GrTHashTable.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698