Add GrRenderTexture cons for gpu dev. Remove factory from gpu device.

Review URL: http://codereview.appspot.com/4631046/


git-svn-id: http://skia.googlecode.com/svn/trunk@1634 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index cda10d2..5f08847 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -140,9 +140,18 @@
     return bitmap;
 }
 
+SkGpuDevice::SkGpuDevice(GrContext* context, GrTexture* texture)
+: SkDevice(make_bitmap(context, texture->asRenderTarget())) {
+    this->initFromRenderTarget(context, texture->asRenderTarget());
+}
+
 SkGpuDevice::SkGpuDevice(GrContext* context, GrRenderTarget* renderTarget)
 : SkDevice(make_bitmap(context, renderTarget)) {
-    
+    this->initFromRenderTarget(context, renderTarget);
+}
+
+void SkGpuDevice::initFromRenderTarget(GrContext* context, 
+                                       GrRenderTarget* renderTarget) {
     fNeedPrepareRenderTarget = false;
     fDrawProcs = NULL;
     
@@ -157,8 +166,12 @@
     if (Current3DApiRenderTarget() == renderTarget) {
         fRenderTarget = fContext->createRenderTargetFrom3DApiState();
     } else {
+        GrAssert(NULL != renderTarget);
         fRenderTarget = renderTarget;
         fRenderTarget->ref();
+        // if this RT is also a texture, hold a ref on it
+        fTexture = fRenderTarget->asTexture();
+        SkSafeRef(fTexture);
     }
 
     SkGrRenderTargetPixelRef* pr = new SkGrRenderTargetPixelRef(fRenderTarget);
@@ -194,6 +207,9 @@
     if (fCache) {
         SkASSERT(NULL != fTexture);
         SkASSERT(NULL != fTexture->asRenderTarget());
+        // hold a ref directly on fTexture (even though fCache has one) to match
+        // other constructor paths. Simplifies cleanup.
+        fTexture->ref();
     }
 #else
     const GrTextureDesc desc = {
@@ -208,6 +224,7 @@
 #endif
     if (NULL != fTexture) {
         fRenderTarget = fTexture->asRenderTarget();
+        fRenderTarget->ref();
 
         GrAssert(NULL != fRenderTarget);
 
@@ -229,17 +246,13 @@
         delete fDrawProcs;
     }
 
+    SkSafeUnref(fTexture);
+    SkSafeUnref(fRenderTarget);
     if (fCache) {
         GrAssert(NULL != fTexture);
         GrAssert(fRenderTarget == fTexture->asRenderTarget());
         fContext->unlockTexture((GrTextureEntry*)fCache);
-    } else if (NULL != fTexture) {
-        GrAssert(!CACHE_LAYER_TEXTURES);
-        GrAssert(fRenderTarget == fTexture->asRenderTarget());
-        fTexture->unref();
-    } else if (NULL != fRenderTarget) {
-        fRenderTarget->unref();
-    }
+    } 
     fContext->unref();
 }
 
@@ -251,10 +264,6 @@
     }
 }
 
-SkDeviceFactory* SkGpuDevice::onNewDeviceFactory() {
-    return SkNEW_ARGS(SkGpuDeviceFactory, (fContext, fRenderTarget));
-}
-
 ///////////////////////////////////////////////////////////////////////////////
 
 void SkGpuDevice::makeRenderTargetCurrent() {