Remove SkGpuDevice::fTexture, use new pixel ref class name

Review URL: https://codereview.appspot.com/6474068/


git-svn-id: http://skia.googlecode.com/svn/trunk@5307 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index 5566086..8d43f70 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -189,28 +189,23 @@
     fContext->ref();
 
     fCached = false;
-    fTexture = NULL;
     fRenderTarget = NULL;
     fNeedClear = false;
 
     GrAssert(NULL != renderTarget);
     fRenderTarget = renderTarget;
     fRenderTarget->ref();
-    // if this RT is also a texture, hold a ref on it
-    fTexture = fRenderTarget->asTexture();
-    SkSafeRef(fTexture);
 
-    // Create a pixel ref for the underlying SkBitmap. We prefer a texture pixel
-    // ref to a render target pixel reft. The pixel ref may get ref'ed outside
-    // the device via accessBitmap. This external ref may outlive the device.
-    // Since textures own their render targets (but not vice-versa) we
-    // are ensuring that both objects will live as long as the pixel ref.
-    SkPixelRef* pr;
-    if (fTexture) {
-        pr = SkNEW_ARGS(SkGrTexturePixelRef, (fTexture));
-    } else {
-        pr = SkNEW_ARGS(SkGrRenderTargetPixelRef, (fRenderTarget));
+    // Hold onto to the texture in the pixel ref (if there is one) because the texture holds a ref
+    // on the RT but not vice-versa.
+    // TODO: Remove this trickery once we figure out how to make SkGrPixelRef do this without
+    // busting chrome (for a currently unknown reason).
+    GrSurface* surface = fRenderTarget->asTexture();
+    if (NULL == surface) {
+        surface = fRenderTarget;
     }
+    SkPixelRef* pr = SkNEW_ARGS(SkGrPixelRef, (surface));
+
     this->setPixelRef(pr, 0)->unref();
 }
 
@@ -227,7 +222,6 @@
     fContext->ref();
 
     fCached = false;
-    fTexture = NULL;
     fRenderTarget = NULL;
     fNeedClear = false;
 
@@ -243,16 +237,16 @@
     desc.fHeight = height;
     desc.fConfig = SkBitmapConfig2GrPixelConfig(bm.config());
 
-    fTexture = fContext->createUncachedTexture(desc, NULL, 0);
+    SkAutoTUnref<GrTexture> texture(fContext->createUncachedTexture(desc, NULL, 0));
 
-    if (NULL != fTexture) {
-        fRenderTarget = fTexture->asRenderTarget();
+    if (NULL != texture) {
+        fRenderTarget = texture->asRenderTarget();
         fRenderTarget->ref();
 
         GrAssert(NULL != fRenderTarget);
 
         // wrap the bitmap with a pixelref to expose our texture
-        SkGrTexturePixelRef* pr = SkNEW_ARGS(SkGrTexturePixelRef, (fTexture));
+        SkGrPixelRef* pr = SkNEW_ARGS(SkGrPixelRef, (texture));
         this->setPixelRef(pr, 0)->unref();
     } else {
         GrPrintf("--- failed to create gpu-offscreen [%d %d]\n",
@@ -270,12 +264,11 @@
     // This call gives the context a chance to relinquish it
     fContext->setRenderTarget(NULL);
 
-    SkSafeUnref(fTexture);
-    SkSafeUnref(fRenderTarget);
-    if (NULL != fTexture && fCached) {
-        GrAssert(fRenderTarget == fTexture->asRenderTarget());
-        fContext->unlockTexture(fTexture);
+    GrTexture* texture = fRenderTarget->asTexture();
+    if (NULL != texture && fCached) {
+        fContext->unlockTexture(texture);
     }
+    SkSafeUnref(fRenderTarget);
     fContext->unref();
 }
 
@@ -485,9 +478,10 @@
 }
 
 bool SkGpuDevice::bindDeviceAsTexture(GrPaint* paint) {
-    if (NULL != fTexture) {
+    GrTexture* texture = fRenderTarget->asTexture();
+    if (NULL != texture) {
         paint->textureSampler(kBitmapTextureIdx)->setCustomStage(
-            SkNEW_ARGS(GrSingleTextureEffect, (fTexture)))->unref();
+            SkNEW_ARGS(GrSingleTextureEffect, (texture)))->unref();
         return true;
     }
     return false;