Index: include/gpu/GrContext.h |
diff --git a/include/gpu/GrContext.h b/include/gpu/GrContext.h |
index e1af73ccb2497c9cbea64b248aa5b9b6bf5c1c2f..45cd599132d32843a5cc988b53228284d80e13ff 100644 |
--- a/include/gpu/GrContext.h |
+++ b/include/gpu/GrContext.h |
@@ -1121,7 +1121,24 @@ |
* Note that the caller is assumed to accept and manage the ref to the |
* returned texture. |
*/ |
- GrTexture* detach(); |
+ GrTexture* detach() { |
+ if (NULL == fTexture) { |
+ return NULL; |
+ } |
+ GrTexture* texture = fTexture; |
+ fTexture = NULL; |
+ |
+ // This GrAutoScratchTexture has a ref from lockAndRefScratchTexture, which we give up now. |
+ // The cache also has a ref which we are lending to the caller of detach(). When the caller |
+ // lets go of the ref and the ref count goes to 0 internal_dispose will see this flag is |
+ // set and re-ref the texture, thereby restoring the cache's ref. |
+ SkASSERT(!texture->unique()); |
+ texture->impl()->setFlag((GrTextureFlags) GrTextureImpl::kReturnToCache_FlagBit); |
+ texture->unref(); |
+ SkASSERT(texture->getCacheEntry()); |
+ |
+ return texture; |
+ } |
GrTexture* set(GrContext* context, |
const GrTextureDesc& desc, |