OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2010 Google Inc. | 3 * Copyright 2010 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 10 matching lines...) Expand all Loading... |
21 } | 21 } |
22 | 22 |
23 return static_cast<ResourceType>(type); | 23 return static_cast<ResourceType>(type); |
24 } | 24 } |
25 | 25 |
26 /////////////////////////////////////////////////////////////////////////////// | 26 /////////////////////////////////////////////////////////////////////////////// |
27 | 27 |
28 GrResourceEntry::GrResourceEntry(const GrResourceKey& key, GrResource* resource) | 28 GrResourceEntry::GrResourceEntry(const GrResourceKey& key, GrResource* resource) |
29 : fKey(key), fResource(resource) { | 29 : fKey(key), fResource(resource) { |
30 // we assume ownership of the resource, and will unref it when we die | 30 // we assume ownership of the resource, and will unref it when we die |
31 GrAssert(resource); | 31 SkASSERT(resource); |
32 resource->ref(); | 32 resource->ref(); |
33 } | 33 } |
34 | 34 |
35 GrResourceEntry::~GrResourceEntry() { | 35 GrResourceEntry::~GrResourceEntry() { |
36 fResource->setCacheEntry(NULL); | 36 fResource->setCacheEntry(NULL); |
37 fResource->unref(); | 37 fResource->unref(); |
38 } | 38 } |
39 | 39 |
40 #if GR_DEBUG | 40 #if GR_DEBUG |
41 void GrResourceEntry::validate() const { | 41 void GrResourceEntry::validate() const { |
42 GrAssert(fResource); | 42 SkASSERT(fResource); |
43 GrAssert(fResource->getCacheEntry() == this); | 43 SkASSERT(fResource->getCacheEntry() == this); |
44 fResource->validate(); | 44 fResource->validate(); |
45 } | 45 } |
46 #endif | 46 #endif |
47 | 47 |
48 /////////////////////////////////////////////////////////////////////////////// | 48 /////////////////////////////////////////////////////////////////////////////// |
49 | 49 |
50 GrResourceCache::GrResourceCache(int maxCount, size_t maxBytes) : | 50 GrResourceCache::GrResourceCache(int maxCount, size_t maxBytes) : |
51 fMaxCount(maxCount), | 51 fMaxCount(maxCount), |
52 fMaxBytes(maxBytes) { | 52 fMaxBytes(maxBytes) { |
53 #if GR_CACHE_STATS | 53 #if GR_CACHE_STATS |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 #if GR_CACHE_STATS | 119 #if GR_CACHE_STATS |
120 if (fHighWaterClientDetachedCount < fClientDetachedCount) { | 120 if (fHighWaterClientDetachedCount < fClientDetachedCount) { |
121 fHighWaterClientDetachedCount = fClientDetachedCount; | 121 fHighWaterClientDetachedCount = fClientDetachedCount; |
122 } | 122 } |
123 if (fHighWaterClientDetachedBytes < fClientDetachedBytes) { | 123 if (fHighWaterClientDetachedBytes < fClientDetachedBytes) { |
124 fHighWaterClientDetachedBytes = fClientDetachedBytes; | 124 fHighWaterClientDetachedBytes = fClientDetachedBytes; |
125 } | 125 } |
126 #endif | 126 #endif |
127 | 127 |
128 } else { | 128 } else { |
129 GrAssert(kAccountFor_BudgetBehavior == behavior); | 129 SkASSERT(kAccountFor_BudgetBehavior == behavior); |
130 | 130 |
131 fEntryCount -= 1; | 131 fEntryCount -= 1; |
132 fEntryBytes -= entry->resource()->sizeInBytes(); | 132 fEntryBytes -= entry->resource()->sizeInBytes(); |
133 } | 133 } |
134 } | 134 } |
135 | 135 |
136 void GrResourceCache::attachToHead(GrResourceEntry* entry, | 136 void GrResourceCache::attachToHead(GrResourceEntry* entry, |
137 BudgetBehaviors behavior) { | 137 BudgetBehaviors behavior) { |
138 fList.addToHead(entry); | 138 fList.addToHead(entry); |
139 | 139 |
140 // update our stats | 140 // update our stats |
141 if (kIgnore_BudgetBehavior == behavior) { | 141 if (kIgnore_BudgetBehavior == behavior) { |
142 fClientDetachedCount -= 1; | 142 fClientDetachedCount -= 1; |
143 fClientDetachedBytes -= entry->resource()->sizeInBytes(); | 143 fClientDetachedBytes -= entry->resource()->sizeInBytes(); |
144 } else { | 144 } else { |
145 GrAssert(kAccountFor_BudgetBehavior == behavior); | 145 SkASSERT(kAccountFor_BudgetBehavior == behavior); |
146 | 146 |
147 fEntryCount += 1; | 147 fEntryCount += 1; |
148 fEntryBytes += entry->resource()->sizeInBytes(); | 148 fEntryBytes += entry->resource()->sizeInBytes(); |
149 | 149 |
150 #if GR_CACHE_STATS | 150 #if GR_CACHE_STATS |
151 if (fHighWaterEntryCount < fEntryCount) { | 151 if (fHighWaterEntryCount < fEntryCount) { |
152 fHighWaterEntryCount = fEntryCount; | 152 fHighWaterEntryCount = fEntryCount; |
153 } | 153 } |
154 if (fHighWaterEntryBytes < fEntryBytes) { | 154 if (fHighWaterEntryBytes < fEntryBytes) { |
155 fHighWaterEntryBytes = fEntryBytes; | 155 fHighWaterEntryBytes = fEntryBytes; |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 this->internalDetach(entry); | 192 this->internalDetach(entry); |
193 this->attachToHead(entry); | 193 this->attachToHead(entry); |
194 } | 194 } |
195 | 195 |
196 return entry->fResource; | 196 return entry->fResource; |
197 } | 197 } |
198 | 198 |
199 void GrResourceCache::addResource(const GrResourceKey& key, | 199 void GrResourceCache::addResource(const GrResourceKey& key, |
200 GrResource* resource, | 200 GrResource* resource, |
201 uint32_t ownershipFlags) { | 201 uint32_t ownershipFlags) { |
202 GrAssert(NULL == resource->getCacheEntry()); | 202 SkASSERT(NULL == resource->getCacheEntry()); |
203 // we don't expect to create new resources during a purge. In theory | 203 // we don't expect to create new resources during a purge. In theory |
204 // this could cause purgeAsNeeded() into an infinite loop (e.g. | 204 // this could cause purgeAsNeeded() into an infinite loop (e.g. |
205 // each resource destroyed creates and locks 2 resources and | 205 // each resource destroyed creates and locks 2 resources and |
206 // unlocks 1 thereby causing a new purge). | 206 // unlocks 1 thereby causing a new purge). |
207 GrAssert(!fPurging); | 207 SkASSERT(!fPurging); |
208 GrAutoResourceCacheValidate atcv(this); | 208 GrAutoResourceCacheValidate atcv(this); |
209 | 209 |
210 GrResourceEntry* entry = SkNEW_ARGS(GrResourceEntry, (key, resource)); | 210 GrResourceEntry* entry = SkNEW_ARGS(GrResourceEntry, (key, resource)); |
211 resource->setCacheEntry(entry); | 211 resource->setCacheEntry(entry); |
212 | 212 |
213 this->attachToHead(entry); | 213 this->attachToHead(entry); |
214 fCache.insert(key, entry); | 214 fCache.insert(key, entry); |
215 | 215 |
216 if (ownershipFlags & kHide_OwnershipFlag) { | 216 if (ownershipFlags & kHide_OwnershipFlag) { |
217 this->makeExclusive(entry); | 217 this->makeExclusive(entry); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 // release some resources and purge again. | 292 // release some resources and purge again. |
293 if ((*fOverbudgetCB)(fOverbudgetData)) { | 293 if ((*fOverbudgetCB)(fOverbudgetData)) { |
294 this->internalPurge(extraCount, extraBytes); | 294 this->internalPurge(extraCount, extraBytes); |
295 } | 295 } |
296 } | 296 } |
297 | 297 |
298 fPurging = false; | 298 fPurging = false; |
299 } | 299 } |
300 | 300 |
301 void GrResourceCache::deleteResource(GrResourceEntry* entry) { | 301 void GrResourceCache::deleteResource(GrResourceEntry* entry) { |
302 GrAssert(1 == entry->fResource->getRefCnt()); | 302 SkASSERT(1 == entry->fResource->getRefCnt()); |
303 | 303 |
304 // remove from our cache | 304 // remove from our cache |
305 fCache.remove(entry->key(), entry); | 305 fCache.remove(entry->key(), entry); |
306 | 306 |
307 // remove from our llist | 307 // remove from our llist |
308 this->internalDetach(entry); | 308 this->internalDetach(entry); |
309 delete entry; | 309 delete entry; |
310 } | 310 } |
311 | 311 |
312 void GrResourceCache::internalPurge(int extraCount, size_t extraBytes) { | 312 void GrResourceCache::internalPurge(int extraCount, size_t extraBytes) { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
354 // so we don't want to just do a simple loop kicking each | 354 // so we don't want to just do a simple loop kicking each |
355 // entry out. Instead change the budget and purge. | 355 // entry out. Instead change the budget and purge. |
356 | 356 |
357 int savedMaxBytes = fMaxBytes; | 357 int savedMaxBytes = fMaxBytes; |
358 int savedMaxCount = fMaxCount; | 358 int savedMaxCount = fMaxCount; |
359 fMaxBytes = (size_t) -1; | 359 fMaxBytes = (size_t) -1; |
360 fMaxCount = 0; | 360 fMaxCount = 0; |
361 this->purgeAsNeeded(); | 361 this->purgeAsNeeded(); |
362 | 362 |
363 #if GR_DEBUG | 363 #if GR_DEBUG |
364 GrAssert(fExclusiveList.countEntries() == fClientDetachedCount); | 364 SkASSERT(fExclusiveList.countEntries() == fClientDetachedCount); |
365 GrAssert(countBytes(fExclusiveList) == fClientDetachedBytes); | 365 SkASSERT(countBytes(fExclusiveList) == fClientDetachedBytes); |
366 if (!fCache.count()) { | 366 if (!fCache.count()) { |
367 // Items may have been detached from the cache (such as the backing | 367 // Items may have been detached from the cache (such as the backing |
368 // texture for an SkGpuDevice). The above purge would not have removed | 368 // texture for an SkGpuDevice). The above purge would not have removed |
369 // them. | 369 // them. |
370 GrAssert(fEntryCount == fClientDetachedCount); | 370 SkASSERT(fEntryCount == fClientDetachedCount); |
371 GrAssert(fEntryBytes == fClientDetachedBytes); | 371 SkASSERT(fEntryBytes == fClientDetachedBytes); |
372 GrAssert(fList.isEmpty()); | 372 SkASSERT(fList.isEmpty()); |
373 } | 373 } |
374 #endif | 374 #endif |
375 | 375 |
376 fMaxBytes = savedMaxBytes; | 376 fMaxBytes = savedMaxBytes; |
377 fMaxCount = savedMaxCount; | 377 fMaxCount = savedMaxCount; |
378 } | 378 } |
379 | 379 |
380 /////////////////////////////////////////////////////////////////////////////// | 380 /////////////////////////////////////////////////////////////////////////////// |
381 | 381 |
382 #if GR_DEBUG | 382 #if GR_DEBUG |
(...skipping 11 matching lines...) Expand all Loading... |
394 return bytes; | 394 return bytes; |
395 } | 395 } |
396 | 396 |
397 static bool both_zero_or_nonzero(int count, size_t bytes) { | 397 static bool both_zero_or_nonzero(int count, size_t bytes) { |
398 return (count == 0 && bytes == 0) || (count > 0 && bytes > 0); | 398 return (count == 0 && bytes == 0) || (count > 0 && bytes > 0); |
399 } | 399 } |
400 | 400 |
401 void GrResourceCache::validate() const { | 401 void GrResourceCache::validate() const { |
402 fList.validate(); | 402 fList.validate(); |
403 fExclusiveList.validate(); | 403 fExclusiveList.validate(); |
404 GrAssert(both_zero_or_nonzero(fEntryCount, fEntryBytes)); | 404 SkASSERT(both_zero_or_nonzero(fEntryCount, fEntryBytes)); |
405 GrAssert(both_zero_or_nonzero(fClientDetachedCount, fClientDetachedBytes)); | 405 SkASSERT(both_zero_or_nonzero(fClientDetachedCount, fClientDetachedBytes)); |
406 GrAssert(fClientDetachedBytes <= fEntryBytes); | 406 SkASSERT(fClientDetachedBytes <= fEntryBytes); |
407 GrAssert(fClientDetachedCount <= fEntryCount); | 407 SkASSERT(fClientDetachedCount <= fEntryCount); |
408 GrAssert((fEntryCount - fClientDetachedCount) == fCache.count()); | 408 SkASSERT((fEntryCount - fClientDetachedCount) == fCache.count()); |
409 | 409 |
410 fCache.validate(); | 410 fCache.validate(); |
411 | 411 |
412 | 412 |
413 EntryList::Iter iter; | 413 EntryList::Iter iter; |
414 | 414 |
415 // check that the exclusively held entries are okay | 415 // check that the exclusively held entries are okay |
416 const GrResourceEntry* entry = iter.init(const_cast<EntryList&>(fExclusiveLi
st), | 416 const GrResourceEntry* entry = iter.init(const_cast<EntryList&>(fExclusiveLi
st), |
417 EntryList::Iter::kHead_IterStart); | 417 EntryList::Iter::kHead_IterStart); |
418 | 418 |
419 for ( ; NULL != entry; entry = iter.next()) { | 419 for ( ; NULL != entry; entry = iter.next()) { |
420 entry->validate(); | 420 entry->validate(); |
421 } | 421 } |
422 | 422 |
423 // check that the shareable entries are okay | 423 // check that the shareable entries are okay |
424 entry = iter.init(const_cast<EntryList&>(fList), EntryList::Iter::kHead_Iter
Start); | 424 entry = iter.init(const_cast<EntryList&>(fList), EntryList::Iter::kHead_Iter
Start); |
425 | 425 |
426 int count = 0; | 426 int count = 0; |
427 for ( ; NULL != entry; entry = iter.next()) { | 427 for ( ; NULL != entry; entry = iter.next()) { |
428 entry->validate(); | 428 entry->validate(); |
429 GrAssert(fCache.find(entry->key())); | 429 SkASSERT(fCache.find(entry->key())); |
430 count += 1; | 430 count += 1; |
431 } | 431 } |
432 GrAssert(count == fEntryCount - fClientDetachedCount); | 432 SkASSERT(count == fEntryCount - fClientDetachedCount); |
433 | 433 |
434 size_t bytes = countBytes(fList); | 434 size_t bytes = countBytes(fList); |
435 GrAssert(bytes == fEntryBytes - fClientDetachedBytes); | 435 SkASSERT(bytes == fEntryBytes - fClientDetachedBytes); |
436 | 436 |
437 bytes = countBytes(fExclusiveList); | 437 bytes = countBytes(fExclusiveList); |
438 GrAssert(bytes == fClientDetachedBytes); | 438 SkASSERT(bytes == fClientDetachedBytes); |
439 | 439 |
440 GrAssert(fList.countEntries() == fEntryCount - fClientDetachedCount); | 440 SkASSERT(fList.countEntries() == fEntryCount - fClientDetachedCount); |
441 | 441 |
442 GrAssert(fExclusiveList.countEntries() == fClientDetachedCount); | 442 SkASSERT(fExclusiveList.countEntries() == fClientDetachedCount); |
443 } | 443 } |
444 #endif // GR_DEBUG | 444 #endif // GR_DEBUG |
445 | 445 |
446 #if GR_CACHE_STATS | 446 #if GR_CACHE_STATS |
447 | 447 |
448 void GrResourceCache::printStats() { | 448 void GrResourceCache::printStats() { |
449 int locked = 0; | 449 int locked = 0; |
450 | 450 |
451 EntryList::Iter iter; | 451 EntryList::Iter iter; |
452 | 452 |
(...skipping 12 matching lines...) Expand all Loading... |
465 fEntryBytes, fHighWaterEntryBytes); | 465 fEntryBytes, fHighWaterEntryBytes); |
466 SkDebugf("\t\tDetached Entry Count: current %d high %d\n", | 466 SkDebugf("\t\tDetached Entry Count: current %d high %d\n", |
467 fClientDetachedCount, fHighWaterClientDetachedCount); | 467 fClientDetachedCount, fHighWaterClientDetachedCount); |
468 SkDebugf("\t\tDetached Bytes: current %d high %d\n", | 468 SkDebugf("\t\tDetached Bytes: current %d high %d\n", |
469 fClientDetachedBytes, fHighWaterClientDetachedBytes); | 469 fClientDetachedBytes, fHighWaterClientDetachedBytes); |
470 } | 470 } |
471 | 471 |
472 #endif | 472 #endif |
473 | 473 |
474 /////////////////////////////////////////////////////////////////////////////// | 474 /////////////////////////////////////////////////////////////////////////////// |
OLD | NEW |