AutoScratchTexture can now release its texture and it will return to the texture cache when freed
http://codereview.appspot.com/6262043/
git-svn-id: http://skia.googlecode.com/svn/trunk@4301 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/GrTexture.cpp b/src/gpu/GrTexture.cpp
index 67ce629..19dc322 100644
--- a/src/gpu/GrTexture.cpp
+++ b/src/gpu/GrTexture.cpp
@@ -16,6 +16,30 @@
SK_DEFINE_INST_COUNT(GrTexture)
+/**
+ * This method allows us to interrupt the normal deletion process and place
+ * textures back in the texture cache when their ref count goes to zero.
+ */
+void GrTexture::internal_dispose() const {
+
+ if (this->isSetFlag((GrTextureFlags) kReturnToCache_FlagBit) &&
+ NULL != this->INHERITED::getContext()) {
+ GrTexture* nonConstThis = const_cast<GrTexture *>(this);
+ this->fRefCnt = 1; // restore ref count to initial setting
+
+ nonConstThis->resetFlag((GrTextureFlags) kReturnToCache_FlagBit);
+ nonConstThis->INHERITED::getContext()->addExistingTextureToCache(nonConstThis);
+
+ // Note: this next assert is only correct for the texture cache's
+ // current single threaded usage. If we ever start accessing it via
+ // threads it isn't guaranteed to be correct.
+ GrAssert(1 == this->INHERITED::getRefCnt());
+ return;
+ }
+
+ this->INHERITED::internal_dispose();
+}
+
bool GrTexture::readPixels(int left, int top, int width, int height,
GrPixelConfig config, void* buffer,
size_t rowBytes) {
@@ -59,6 +83,11 @@
}
}
+void GrTexture::onRelease() {
+ GrAssert(!this->isSetFlag((GrTextureFlags) kReturnToCache_FlagBit));
+ this->releaseRenderTarget();
+}
+
void GrTexture::onAbandon() {
if (NULL != fRenderTarget) {
fRenderTarget->abandon();