OLD | NEW |
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 #include "GrContext.h" | 10 #include "GrContext.h" |
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
440 GrTexture* GrContext::lockAndRefScratchTexture(const GrTextureDesc& inDesc, Scra
tchTexMatch match) { | 440 GrTexture* GrContext::lockAndRefScratchTexture(const GrTextureDesc& inDesc, Scra
tchTexMatch match) { |
441 | 441 |
442 SkASSERT((inDesc.fFlags & kRenderTarget_GrTextureFlagBit) || | 442 SkASSERT((inDesc.fFlags & kRenderTarget_GrTextureFlagBit) || |
443 !(inDesc.fFlags & kNoStencil_GrTextureFlagBit)); | 443 !(inDesc.fFlags & kNoStencil_GrTextureFlagBit)); |
444 | 444 |
445 // Renderable A8 targets are not universally supported (e.g., not on ANGLE) | 445 // Renderable A8 targets are not universally supported (e.g., not on ANGLE) |
446 SkASSERT(this->isConfigRenderable(kAlpha_8_GrPixelConfig, inDesc.fSampleCnt
> 0) || | 446 SkASSERT(this->isConfigRenderable(kAlpha_8_GrPixelConfig, inDesc.fSampleCnt
> 0) || |
447 !(inDesc.fFlags & kRenderTarget_GrTextureFlagBit) || | 447 !(inDesc.fFlags & kRenderTarget_GrTextureFlagBit) || |
448 (inDesc.fConfig != kAlpha_8_GrPixelConfig)); | 448 (inDesc.fConfig != kAlpha_8_GrPixelConfig)); |
449 | 449 |
450 if (!fGpu->caps()->reuseScratchTextures()) { | 450 if (!fGpu->caps()->reuseScratchTextures() && |
451 // If we're never recycling scratch textures we can | 451 !(inDesc.fFlags & kRenderTarget_GrTextureFlagBit)) { |
452 // always make them the right size | 452 // If we're never recycling this texture we can always make it the right
size |
453 return create_scratch_texture(fGpu, fTextureCache, inDesc); | 453 return create_scratch_texture(fGpu, fTextureCache, inDesc); |
454 } | 454 } |
455 | 455 |
456 GrTextureDesc desc = inDesc; | 456 GrTextureDesc desc = inDesc; |
457 | 457 |
458 if (kApprox_ScratchTexMatch == match) { | 458 if (kApprox_ScratchTexMatch == match) { |
459 // bin by pow2 with a reasonable min | 459 // bin by pow2 with a reasonable min |
460 static const int MIN_SIZE = 16; | 460 static const int MIN_SIZE = 16; |
461 desc.fWidth = GrMax(MIN_SIZE, GrNextPow2(desc.fWidth)); | 461 desc.fWidth = GrMax(MIN_SIZE, GrNextPow2(desc.fWidth)); |
462 desc.fHeight = GrMax(MIN_SIZE, GrNextPow2(desc.fHeight)); | 462 desc.fHeight = GrMax(MIN_SIZE, GrNextPow2(desc.fHeight)); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
507 } | 507 } |
508 | 508 |
509 // This texture should already have a cache entry since it was once | 509 // This texture should already have a cache entry since it was once |
510 // attached | 510 // attached |
511 SkASSERT(NULL != texture->getCacheEntry()); | 511 SkASSERT(NULL != texture->getCacheEntry()); |
512 | 512 |
513 // Conceptually, the cache entry is going to assume responsibility | 513 // Conceptually, the cache entry is going to assume responsibility |
514 // for the creation ref. Assert refcnt == 1. | 514 // for the creation ref. Assert refcnt == 1. |
515 SkASSERT(texture->unique()); | 515 SkASSERT(texture->unique()); |
516 | 516 |
517 if (fGpu->caps()->reuseScratchTextures()) { | 517 if (fGpu->caps()->reuseScratchTextures() || NULL != texture->asRenderTarget(
)) { |
518 // Since this texture came from an AutoScratchTexture it should | 518 // Since this texture came from an AutoScratchTexture it should |
519 // still be in the exclusive pile. Recycle it. | 519 // still be in the exclusive pile. Recycle it. |
520 fTextureCache->makeNonExclusive(texture->getCacheEntry()); | 520 fTextureCache->makeNonExclusive(texture->getCacheEntry()); |
521 this->purgeCache(); | 521 this->purgeCache(); |
522 } else if (texture->getDeferredRefCount() <= 0) { | 522 } else if (texture->getDeferredRefCount() <= 0) { |
523 // When we aren't reusing textures we know this scratch texture | 523 // When we aren't reusing textures we know this scratch texture |
524 // will never be reused and would be just wasting time in the cache | 524 // will never be reused and would be just wasting time in the cache |
525 fTextureCache->makeNonExclusive(texture->getCacheEntry()); | 525 fTextureCache->makeNonExclusive(texture->getCacheEntry()); |
526 fTextureCache->deleteResource(texture->getCacheEntry()); | 526 fTextureCache->deleteResource(texture->getCacheEntry()); |
527 } else { | 527 } else { |
528 // In this case (fDeferredRefCount > 0) but the cache is the only | 528 // In this case (fDeferredRefCount > 0) but the cache is the only |
529 // one holding a real ref. Mark the object so when the deferred | 529 // one holding a real ref. Mark the object so when the deferred |
530 // ref count goes to 0 the texture will be deleted (remember | 530 // ref count goes to 0 the texture will be deleted (remember |
531 // in this code path scratch textures aren't getting reused). | 531 // in this code path scratch textures aren't getting reused). |
532 texture->setNeedsDeferredUnref(); | 532 texture->setNeedsDeferredUnref(); |
533 } | 533 } |
534 } | 534 } |
535 | 535 |
536 | 536 |
537 void GrContext::unlockScratchTexture(GrTexture* texture) { | 537 void GrContext::unlockScratchTexture(GrTexture* texture) { |
538 ASSERT_OWNED_RESOURCE(texture); | 538 ASSERT_OWNED_RESOURCE(texture); |
539 SkASSERT(NULL != texture->getCacheEntry()); | 539 SkASSERT(NULL != texture->getCacheEntry()); |
540 | 540 |
541 // If this is a scratch texture we detached it from the cache | 541 // If this is a scratch texture we detached it from the cache |
542 // while it was locked (to avoid two callers simultaneously getting | 542 // while it was locked (to avoid two callers simultaneously getting |
543 // the same texture). | 543 // the same texture). |
544 if (texture->getCacheEntry()->key().isScratch()) { | 544 if (texture->getCacheEntry()->key().isScratch()) { |
545 if (fGpu->caps()->reuseScratchTextures()) { | 545 if (fGpu->caps()->reuseScratchTextures() || NULL != texture->asRenderTar
get()) { |
546 fTextureCache->makeNonExclusive(texture->getCacheEntry()); | 546 fTextureCache->makeNonExclusive(texture->getCacheEntry()); |
547 this->purgeCache(); | 547 this->purgeCache(); |
548 } else if (texture->unique() && texture->getDeferredRefCount() <= 0) { | 548 } else if (texture->unique() && texture->getDeferredRefCount() <= 0) { |
549 // Only the cache now knows about this texture. Since we're never | 549 // Only the cache now knows about this texture. Since we're never |
550 // reusing scratch textures (in this code path) it would just be | 550 // reusing scratch textures (in this code path) it would just be |
551 // wasting time sitting in the cache. | 551 // wasting time sitting in the cache. |
552 fTextureCache->makeNonExclusive(texture->getCacheEntry()); | 552 fTextureCache->makeNonExclusive(texture->getCacheEntry()); |
553 fTextureCache->deleteResource(texture->getCacheEntry()); | 553 fTextureCache->deleteResource(texture->getCacheEntry()); |
554 } else { | 554 } else { |
555 // In this case (fRefCnt > 1 || defRefCnt > 0) but we don't really | 555 // In this case (fRefCnt > 1 || defRefCnt > 0) but we don't really |
(...skipping 1253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1809 return NULL; | 1809 return NULL; |
1810 } | 1810 } |
1811 } | 1811 } |
1812 | 1812 |
1813 /////////////////////////////////////////////////////////////////////////////// | 1813 /////////////////////////////////////////////////////////////////////////////// |
1814 #if GR_CACHE_STATS | 1814 #if GR_CACHE_STATS |
1815 void GrContext::printCacheStats() const { | 1815 void GrContext::printCacheStats() const { |
1816 fTextureCache->printStats(); | 1816 fTextureCache->printStats(); |
1817 } | 1817 } |
1818 #endif | 1818 #endif |
OLD | NEW |