Reland of 8525 with fix for case when GrRT outlives GrTexture.
Review URL: https://codereview.chromium.org/13814015

git-svn-id: http://skia.googlecode.com/svn/trunk@8573 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/GrTexture.cpp b/src/gpu/GrTexture.cpp
index 44a1442..6452aae 100644
--- a/src/gpu/GrTexture.cpp
+++ b/src/gpu/GrTexture.cpp
@@ -17,6 +17,12 @@
 
 SK_DEFINE_INST_COUNT(GrTexture)
 
+GrTexture::~GrTexture() {
+    if (NULL != fRenderTarget.get()) {
+        fRenderTarget.get()->owningTextureDestroyed();
+    }
+}
+
 /**
  * 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.
@@ -67,33 +73,15 @@
                                 pixelOpsFlags);
 }
 
-void GrTexture::releaseRenderTarget() {
-    if (NULL != fRenderTarget) {
-        GrAssert(fRenderTarget->asTexture() == this);
-        GrAssert(fDesc.fFlags & kRenderTarget_GrTextureFlagBit);
-
-        fRenderTarget->onTextureReleaseRenderTarget();
-        fRenderTarget->unref();
-        fRenderTarget = NULL;
-
-        fDesc.fFlags = fDesc.fFlags &
-            ~(kRenderTarget_GrTextureFlagBit|kNoStencil_GrTextureFlagBit);
-        fDesc.fSampleCnt = 0;
-    }
-}
-
 void GrTexture::onRelease() {
     GrAssert(!this->isSetFlag((GrTextureFlags) kReturnToCache_FlagBit));
-    this->releaseRenderTarget();
-
     INHERITED::onRelease();
 }
 
 void GrTexture::onAbandon() {
-    if (NULL != fRenderTarget) {
+    if (NULL != fRenderTarget.get()) {
         fRenderTarget->abandon();
     }
-
     INHERITED::onAbandon();
 }