OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2014 Google Inc. | 3 * Copyright 2014 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 #ifndef GrResourceCache2_DEFINED | 9 #ifndef GrResourceCache2_DEFINED |
10 #define GrResourceCache2_DEFINED | 10 #define GrResourceCache2_DEFINED |
11 | 11 |
12 #include "GrGpuResource.h" | 12 #include "GrGpuResource.h" |
13 #include "GrGpuResourceCacheAccess.h" | 13 #include "GrGpuResourceCacheAccess.h" |
14 #include "GrResourceKey.h" | 14 #include "GrResourceKey.h" |
| 15 #include "SkMessageBus.h" |
15 #include "SkRefCnt.h" | 16 #include "SkRefCnt.h" |
| 17 #include "SkTArray.h" |
16 #include "SkTInternalLList.h" | 18 #include "SkTInternalLList.h" |
17 #include "SkTMultiMap.h" | 19 #include "SkTMultiMap.h" |
18 | 20 |
19 class SkString; | 21 class SkString; |
20 | 22 |
21 /** | 23 /** |
22 * Manages the lifetime of all GrGpuResource instances. | 24 * Manages the lifetime of all GrGpuResource instances. |
23 * | 25 * |
24 * Resources may have optionally have two types of keys: | 26 * Resources may have optionally have two types of keys: |
25 * 1) A scratch key. This is for resources whose allocations are cached but
not their contents. | 27 * 1) A scratch key. This is for resources whose allocations are cached but
not their contents. |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 return resource; | 123 return resource; |
122 } | 124 } |
123 | 125 |
124 /** | 126 /** |
125 * Query whether a content key exists in the cache. | 127 * Query whether a content key exists in the cache. |
126 */ | 128 */ |
127 bool hasContentKey(const GrContentKey& contentKey) const { | 129 bool hasContentKey(const GrContentKey& contentKey) const { |
128 return SkToBool(fContentHash.find(contentKey)); | 130 return SkToBool(fContentHash.find(contentKey)); |
129 } | 131 } |
130 | 132 |
| 133 /** Purges resources to become under budget and processes resources with inv
alidated content |
| 134 keys. */ |
| 135 void purgeAsNeeded() { |
| 136 SkTArray<GrContentKeyInvalidatedMessage> invalidKeyMsgs; |
| 137 fInvalidContentKeyInbox.poll(&invalidKeyMsgs); |
| 138 if (invalidKeyMsgs.count()) { |
| 139 this->processInvalidContentKeys(invalidKeyMsgs); |
| 140 } |
| 141 if (fPurging || (fBudgetedCount <= fMaxCount && fBudgetedBytes <= fMaxBy
tes)) { |
| 142 return; |
| 143 } |
| 144 this->internalPurgeAsNeeded(); |
| 145 } |
| 146 |
131 /** Purges all resources that don't have external owners. */ | 147 /** Purges all resources that don't have external owners. */ |
132 void purgeAllUnlocked(); | 148 void purgeAllUnlocked(); |
133 | 149 |
134 /** | 150 /** |
135 * The callback function used by the cache when it is still over budget afte
r a purge. The | 151 * The callback function used by the cache when it is still over budget afte
r a purge. The |
136 * passed in 'data' is the same 'data' handed to setOverbudgetCallback. | 152 * passed in 'data' is the same 'data' handed to setOverbudgetCallback. |
137 */ | 153 */ |
138 typedef void (*PFOverBudgetCB)(void* data); | 154 typedef void (*PFOverBudgetCB)(void* data); |
139 | 155 |
140 /** | 156 /** |
(...skipping 13 matching lines...) Expand all Loading... |
154 private: | 170 private: |
155 /////////////////////////////////////////////////////////////////////////// | 171 /////////////////////////////////////////////////////////////////////////// |
156 /// @name Methods accessible via ResourceAccess | 172 /// @name Methods accessible via ResourceAccess |
157 //// | 173 //// |
158 void insertResource(GrGpuResource*); | 174 void insertResource(GrGpuResource*); |
159 void removeResource(GrGpuResource*); | 175 void removeResource(GrGpuResource*); |
160 void notifyPurgeable(GrGpuResource*); | 176 void notifyPurgeable(GrGpuResource*); |
161 void didChangeGpuMemorySize(const GrGpuResource*, size_t oldSize); | 177 void didChangeGpuMemorySize(const GrGpuResource*, size_t oldSize); |
162 bool didSetContentKey(GrGpuResource*); | 178 bool didSetContentKey(GrGpuResource*); |
163 void willRemoveScratchKey(const GrGpuResource*); | 179 void willRemoveScratchKey(const GrGpuResource*); |
| 180 void willRemoveContentKey(const GrGpuResource*); |
164 void didChangeBudgetStatus(GrGpuResource*); | 181 void didChangeBudgetStatus(GrGpuResource*); |
165 void makeResourceMRU(GrGpuResource*); | 182 void makeResourceMRU(GrGpuResource*); |
166 /// @} | 183 /// @} |
167 | 184 |
168 void purgeAsNeeded() { | |
169 if (fPurging || (fBudgetedCount <= fMaxCount && fBudgetedBytes <= fMaxBy
tes)) { | |
170 return; | |
171 } | |
172 this->internalPurgeAsNeeded(); | |
173 } | |
174 | |
175 void internalPurgeAsNeeded(); | 185 void internalPurgeAsNeeded(); |
| 186 void processInvalidContentKeys(const SkTArray<GrContentKeyInvalidatedMessage
>&); |
176 | 187 |
177 #ifdef SK_DEBUG | 188 #ifdef SK_DEBUG |
178 bool isInCache(const GrGpuResource* r) const { return fResources.isInList(r)
; } | 189 bool isInCache(const GrGpuResource* r) const { return fResources.isInList(r)
; } |
179 void validate() const; | 190 void validate() const; |
180 #else | 191 #else |
181 void validate() const {} | 192 void validate() const {} |
182 #endif | 193 #endif |
183 | 194 |
184 class AutoValidate; | 195 class AutoValidate; |
185 | 196 |
(...skipping 12 matching lines...) Expand all Loading... |
198 static const GrContentKey& GetKey(const GrGpuResource& r) { | 209 static const GrContentKey& GetKey(const GrGpuResource& r) { |
199 return r.getContentKey(); | 210 return r.getContentKey(); |
200 } | 211 } |
201 | 212 |
202 static uint32_t Hash(const GrContentKey& key) { return key.hash(); } | 213 static uint32_t Hash(const GrContentKey& key) { return key.hash(); } |
203 }; | 214 }; |
204 typedef SkTDynamicHash<GrGpuResource, GrContentKey, ContentHashTraits> Conte
ntHash; | 215 typedef SkTDynamicHash<GrGpuResource, GrContentKey, ContentHashTraits> Conte
ntHash; |
205 | 216 |
206 typedef SkTInternalLList<GrGpuResource> ResourceList; | 217 typedef SkTInternalLList<GrGpuResource> ResourceList; |
207 | 218 |
| 219 typedef SkMessageBus<GrContentKeyInvalidatedMessage>::Inbox InvalidContentKe
yInbox; |
| 220 |
208 ResourceList fResources; | 221 ResourceList fResources; |
209 // This map holds all resources that can be used as scratch resources. | 222 // This map holds all resources that can be used as scratch resources. |
210 ScratchMap fScratchMap; | 223 ScratchMap fScratchMap; |
211 // This holds all resources that have content keys. | 224 // This holds all resources that have content keys. |
212 ContentHash fContentHash; | 225 ContentHash fContentHash; |
213 | 226 |
214 // our budget, used in purgeAsNeeded() | 227 // our budget, used in purgeAsNeeded() |
215 int fMaxCount; | 228 int fMaxCount; |
216 size_t fMaxBytes; | 229 size_t fMaxBytes; |
217 | 230 |
(...skipping 12 matching lines...) Expand all Loading... |
230 int fBudgetedCount; | 243 int fBudgetedCount; |
231 size_t fBudgetedBytes; | 244 size_t fBudgetedBytes; |
232 | 245 |
233 // prevents recursive purging | 246 // prevents recursive purging |
234 bool fPurging; | 247 bool fPurging; |
235 bool fNewlyPurgeableResourceWhilePurging; | 248 bool fNewlyPurgeableResourceWhilePurging; |
236 | 249 |
237 PFOverBudgetCB fOverBudgetCB; | 250 PFOverBudgetCB fOverBudgetCB; |
238 void* fOverBudgetData; | 251 void* fOverBudgetData; |
239 | 252 |
| 253 InvalidContentKeyInbox fInvalidContentKeyInbox; |
| 254 |
240 }; | 255 }; |
241 | 256 |
242 class GrResourceCache2::ResourceAccess { | 257 class GrResourceCache2::ResourceAccess { |
243 private: | 258 private: |
244 ResourceAccess(GrResourceCache2* cache) : fCache(cache) { } | 259 ResourceAccess(GrResourceCache2* cache) : fCache(cache) { } |
245 ResourceAccess(const ResourceAccess& that) : fCache(that.fCache) { } | 260 ResourceAccess(const ResourceAccess& that) : fCache(that.fCache) { } |
246 ResourceAccess& operator=(const ResourceAccess&); // unimpl | 261 ResourceAccess& operator=(const ResourceAccess&); // unimpl |
247 | 262 |
248 /** | 263 /** |
249 * Insert a resource into the cache. | 264 * Insert a resource into the cache. |
(...skipping 21 matching lines...) Expand all Loading... |
271 * Called by GrGpuResources when their content keys change. | 286 * Called by GrGpuResources when their content keys change. |
272 * | 287 * |
273 * This currently returns a bool and fails when an existing resource has a k
ey that collides | 288 * This currently returns a bool and fails when an existing resource has a k
ey that collides |
274 * with the new content key. In the future it will null out the content key
for the existing | 289 * with the new content key. In the future it will null out the content key
for the existing |
275 * resource. The failure is a temporary measure taken because duties are spl
it between two | 290 * resource. The failure is a temporary measure taken because duties are spl
it between two |
276 * cache objects currently. | 291 * cache objects currently. |
277 */ | 292 */ |
278 bool didSetContentKey(GrGpuResource* resource) { return fCache->didSetConten
tKey(resource); } | 293 bool didSetContentKey(GrGpuResource* resource) { return fCache->didSetConten
tKey(resource); } |
279 | 294 |
280 /** | 295 /** |
281 * Called by GrGpuResources when the remove their scratch key. | 296 * Called by a GrGpuResource when it removes its content key. |
| 297 */ |
| 298 void willRemoveContentKey(GrGpuResource* resource) { |
| 299 return fCache->willRemoveContentKey(resource); |
| 300 } |
| 301 |
| 302 /** |
| 303 * Called by a GrGpuResource when it removes its scratch key. |
282 */ | 304 */ |
283 void willRemoveScratchKey(const GrGpuResource* resource) { | 305 void willRemoveScratchKey(const GrGpuResource* resource) { |
284 fCache->willRemoveScratchKey(resource); | 306 fCache->willRemoveScratchKey(resource); |
285 } | 307 } |
286 | 308 |
287 /** | 309 /** |
288 * Called by GrGpuResources when they change from budgeted to unbudgeted or
vice versa. | 310 * Called by GrGpuResources when they change from budgeted to unbudgeted or
vice versa. |
289 */ | 311 */ |
290 void didChangeBudgetStatus(GrGpuResource* resource) { fCache->didChangeBudge
tStatus(resource); } | 312 void didChangeBudgetStatus(GrGpuResource* resource) { fCache->didChangeBudge
tStatus(resource); } |
291 | 313 |
292 // No taking addresses of this type. | 314 // No taking addresses of this type. |
293 const ResourceAccess* operator&() const; | 315 const ResourceAccess* operator&() const; |
294 ResourceAccess* operator&(); | 316 ResourceAccess* operator&(); |
295 | 317 |
296 GrResourceCache2* fCache; | 318 GrResourceCache2* fCache; |
297 | 319 |
298 friend class GrGpuResource; // To access all the proxy inline methods. | 320 friend class GrGpuResource; // To access all the proxy inline methods. |
299 friend class GrResourceCache2; // To create this type. | 321 friend class GrResourceCache2; // To create this type. |
300 }; | 322 }; |
301 | 323 |
302 inline GrResourceCache2::ResourceAccess GrResourceCache2::resourceAccess() { | 324 inline GrResourceCache2::ResourceAccess GrResourceCache2::resourceAccess() { |
303 return ResourceAccess(this); | 325 return ResourceAccess(this); |
304 } | 326 } |
305 | 327 |
306 #endif | 328 #endif |
OLD | NEW |