Index: include/gpu/GrContext.h |
diff --git a/include/gpu/GrContext.h b/include/gpu/GrContext.h |
index d2f3729f15190a93c708ee0055636dbc303d05c9..e1af73ccb2497c9cbea64b248aa5b9b6bf5c1c2f 100644 |
--- a/include/gpu/GrContext.h |
+++ b/include/gpu/GrContext.h |
@@ -295,6 +295,12 @@ |
GrTexture* lockAndRefScratchTexture(const GrTextureDesc&, ScratchTexMatch match); |
/** |
+ * When done with an entry, call unlockScratchTexture(entry) on it, which returns |
+ * it to the cache, where it may be purged. This does not unref the texture. |
+ */ |
+ void unlockScratchTexture(GrTexture* texture); |
+ |
+ /** |
* Creates a texture that is outside the cache. Does not count against |
* cache's budget. |
*/ |
@@ -1045,7 +1051,15 @@ |
size_t rowBytes, |
bool filter); |
- bool createNewScratchTexture(const GrTextureDesc& desc); |
+ // Needed so GrTexture's returnToCache helper function can call |
+ // addExistingTextureToCache |
+ friend class GrTexture; |
+ friend class GrStencilAndCoverPathRenderer; |
+ friend class GrStencilAndCoverTextContext; |
+ |
+ // Add an existing texture to the texture cache. This is intended solely |
+ // for use with textures released from an GrAutoScratchTexture. |
+ void addExistingTextureToCache(GrTexture* texture); |
/** |
* These functions create premul <-> unpremul effects if it is possible to generate a pair |
@@ -1065,7 +1079,8 @@ |
}; |
/** |
- * This is deprecated. Don't use it. |
+ * Gets and locks a scratch texture from a descriptor using either exact or approximate criteria. |
+ * Unlocks texture in the destructor. |
*/ |
class GrAutoScratchTexture : public ::SkNoncopyable { |
public: |
@@ -1088,16 +1103,25 @@ |
void reset() { |
if (fContext && fTexture) { |
+ fContext->unlockScratchTexture(fTexture); |
fTexture->unref(); |
fTexture = NULL; |
} |
} |
- GrTexture* detach() { |
- GrTexture* texture = fTexture; |
- fTexture = NULL; |
- return texture; |
- } |
+ /* |
+ * When detaching a texture we do not unlock it in the texture cache but |
+ * we do set the returnToCache flag. In this way the texture remains |
+ * "locked" in the texture cache until it is freed and recycled in |
+ * GrTexture::internal_dispose. In reality, the texture has been removed |
+ * from the cache (because this is in AutoScratchTexture) and by not |
+ * calling unlockScratchTexture we simply don't re-add it. It will be |
+ * reattached in GrTexture::internal_dispose. |
+ * |
+ * Note that the caller is assumed to accept and manage the ref to the |
+ * returned texture. |
+ */ |
+ GrTexture* detach(); |
GrTexture* set(GrContext* context, |
const GrTextureDesc& desc, |