Make GrGpuResources register with GrResourceCache2 after fully constructed.

R=robertphillips@google.com

Author: bsalomon@google.com

Review URL: https://codereview.chromium.org/504313002
diff --git a/bench/GrResourceCacheBench.cpp b/bench/GrResourceCacheBench.cpp
index 84e0e5d..068aff2 100644
--- a/bench/GrResourceCacheBench.cpp
+++ b/bench/GrResourceCacheBench.cpp
@@ -27,6 +27,7 @@
     StencilResource(GrGpu* gpu, int id)
         : INHERITED(gpu, false)
         , fID(id) {
+        this->registerWithCache();
     }
 
     virtual ~StencilResource() { this->release(); }
@@ -51,6 +52,7 @@
     TextureResource(GrGpu* gpu, int id)
         : INHERITED(gpu, false)
         , fID(id) {
+        this->registerWithCache();
     }
 
     virtual ~TextureResource() { this->release(); }
diff --git a/include/gpu/GrGpuResource.h b/include/gpu/GrGpuResource.h
index 8b16282..17cdfc9 100644
--- a/include/gpu/GrGpuResource.h
+++ b/include/gpu/GrGpuResource.h
@@ -90,6 +90,11 @@
     uint32_t getUniqueID() const { return fUniqueID; }
 
 protected:
+
+    // This must be called by every GrGpuObject. It should be called once the object is fully
+    // initialized (i.e. not in a base class constructor).
+    void registerWithCache();
+
     GrGpuResource(GrGpu*, bool isWrapped);
     virtual ~GrGpuResource();
 
diff --git a/src/gpu/GrGpuResource.cpp b/src/gpu/GrGpuResource.cpp
index 7a19c25..a0a7278 100644
--- a/src/gpu/GrGpuResource.cpp
+++ b/src/gpu/GrGpuResource.cpp
@@ -28,6 +28,9 @@
     } else {
         fFlags = 0;
     }
+}
+
+void GrGpuResource::registerWithCache() {
     get_resource_cache2(fGpu)->insertResource(this);
 }
 
@@ -37,7 +40,7 @@
     SkASSERT(this->wasDestroyed());
 }
 
-void GrGpuResource::release() {
+void GrGpuResource::release() { 
     if (NULL != fGpu) {
         this->onRelease();
         get_resource_cache2(fGpu)->removeResource(this);
diff --git a/src/gpu/GrPathRange.h b/src/gpu/GrPathRange.h
index c53b987..b52fef1 100644
--- a/src/gpu/GrPathRange.h
+++ b/src/gpu/GrPathRange.h
@@ -38,6 +38,7 @@
         : INHERITED(gpu, kIsWrapped),
           fSize(size),
           fStroke(stroke) {
+        this->registerWithCache();
     }
 
     size_t getSize() const { return fSize; }
diff --git a/src/gpu/GrResourceCache2.cpp b/src/gpu/GrResourceCache2.cpp
index 0b6944e..c325efd 100644
--- a/src/gpu/GrResourceCache2.cpp
+++ b/src/gpu/GrResourceCache2.cpp
@@ -17,11 +17,13 @@
 void GrResourceCache2::insertResource(GrGpuResource* resource) {
     SkASSERT(NULL != resource);
     SkASSERT(!resource->wasDestroyed());
+    SkASSERT(!this->isInCache(resource));
     fResources.addToHead(resource);
     ++fCount;
 }
 
 void GrResourceCache2::removeResource(GrGpuResource* resource) {
+    SkASSERT(this->isInCache(resource));
     fResources.remove(resource);
     --fCount;
 }
diff --git a/src/gpu/GrResourceCache2.h b/src/gpu/GrResourceCache2.h
index 1262c80..8e79c09 100644
--- a/src/gpu/GrResourceCache2.h
+++ b/src/gpu/GrResourceCache2.h
@@ -33,6 +33,12 @@
     void releaseAll();
 
 private:
+#ifdef SK_DEBUG
+    bool isInCache(const GrGpuResource* r) const {
+        return fResources.isInList(r);
+    }
+#endif
+
     int                             fCount;
     SkTInternalLList<GrGpuResource> fResources;
 };
diff --git a/src/gpu/GrStencilAndCoverTextContext.cpp b/src/gpu/GrStencilAndCoverTextContext.cpp
index af4ba64..4f5cab3 100644
--- a/src/gpu/GrStencilAndCoverTextContext.cpp
+++ b/src/gpu/GrStencilAndCoverTextContext.cpp
@@ -43,6 +43,7 @@
             glyphs.reset(SkNEW_ARGS(GlyphPathRange, (context, cache->getDescriptor(), stroke)));
             context->addResourceToCache(resourceKey, glyphs);
         }
+        glyphs->registerWithCache();
 
         return glyphs.detach();
     }
diff --git a/src/gpu/gl/GrGLIndexBuffer.cpp b/src/gpu/gl/GrGLIndexBuffer.cpp
index a137348..5991c09 100644
--- a/src/gpu/gl/GrGLIndexBuffer.cpp
+++ b/src/gpu/gl/GrGLIndexBuffer.cpp
@@ -11,6 +11,7 @@
 GrGLIndexBuffer::GrGLIndexBuffer(GrGpuGL* gpu, const Desc& desc)
     : INHERITED(gpu, desc.fIsWrapped, desc.fSizeInBytes, desc.fDynamic, 0 == desc.fID)
     , fImpl(gpu, desc, GR_GL_ELEMENT_ARRAY_BUFFER) {
+    this->registerWithCache();
 }
 
 void GrGLIndexBuffer::onRelease() {
diff --git a/src/gpu/gl/GrGLPath.cpp b/src/gpu/gl/GrGLPath.cpp
index 8c76b59..972a7af 100644
--- a/src/gpu/gl/GrGLPath.cpp
+++ b/src/gpu/gl/GrGLPath.cpp
@@ -136,6 +136,7 @@
         // FIXME: try to account for stroking, without rasterizing the stroke.
         fBounds.outset(stroke.getWidth(), stroke.getWidth());
     }
+    this->registerWithCache();
 }
 
 GrGLPath::~GrGLPath() {
diff --git a/src/gpu/gl/GrGLRenderTarget.cpp b/src/gpu/gl/GrGLRenderTarget.cpp
index 2486396..6143f34 100644
--- a/src/gpu/gl/GrGLRenderTarget.cpp
+++ b/src/gpu/gl/GrGLRenderTarget.cpp
@@ -21,6 +21,7 @@
     fMSColorRenderbufferID  = desc.fMSColorRenderbufferID;
     fViewport               = viewport;
     fTexIDObj.reset(SkSafeRef(texID));
+    this->registerWithCache();
 }
 
 namespace {
diff --git a/src/gpu/gl/GrGLStencilBuffer.h b/src/gpu/gl/GrGLStencilBuffer.h
index 1cb0a33..024890d 100644
--- a/src/gpu/gl/GrGLStencilBuffer.h
+++ b/src/gpu/gl/GrGLStencilBuffer.h
@@ -32,6 +32,7 @@
         : GrStencilBuffer(gpu, isWrapped, width, height, format.fStencilBits, sampleCnt)
         , fFormat(format)
         , fRenderbufferID(rbid) {
+        this->registerWithCache();
     }
 
     virtual ~GrGLStencilBuffer();
diff --git a/src/gpu/gl/GrGLTexture.cpp b/src/gpu/gl/GrGLTexture.cpp
index 255cdd9..bc013bc 100644
--- a/src/gpu/gl/GrGLTexture.cpp
+++ b/src/gpu/gl/GrGLTexture.cpp
@@ -33,6 +33,7 @@
 
         fRenderTarget.reset(SkNEW_ARGS(GrGLRenderTarget, (gpu, *rtDesc, vp, fTexIDObj, this)));
     }
+    this->registerWithCache();
 }
 
 GrGLTexture::GrGLTexture(GrGpuGL* gpu,
diff --git a/src/gpu/gl/GrGLVertexArray.cpp b/src/gpu/gl/GrGLVertexArray.cpp
index 66feb82..39fd48c 100644
--- a/src/gpu/gl/GrGLVertexArray.cpp
+++ b/src/gpu/gl/GrGLVertexArray.cpp
@@ -73,6 +73,7 @@
     , fID(id)
     , fAttribArrays(attribCount)
     , fIndexBufferIDIsValid(false) {
+    this->registerWithCache();
 }
 
 void GrGLVertexArray::onAbandon() {
diff --git a/src/gpu/gl/GrGLVertexBuffer.cpp b/src/gpu/gl/GrGLVertexBuffer.cpp
index a13ad12..d6b6301 100644
--- a/src/gpu/gl/GrGLVertexBuffer.cpp
+++ b/src/gpu/gl/GrGLVertexBuffer.cpp
@@ -11,6 +11,7 @@
 GrGLVertexBuffer::GrGLVertexBuffer(GrGpuGL* gpu, const Desc& desc)
     : INHERITED(gpu, desc.fIsWrapped, desc.fSizeInBytes, desc.fDynamic, 0 == desc.fID)
     , fImpl(gpu, desc, GR_GL_ARRAY_BUFFER) {
+    this->registerWithCache();
 }
 
 void GrGLVertexBuffer::onRelease() {
diff --git a/tests/ResourceCacheTest.cpp b/tests/ResourceCacheTest.cpp
index 4b43d4f..ae140e2 100644
--- a/tests/ResourceCacheTest.cpp
+++ b/tests/ResourceCacheTest.cpp
@@ -69,6 +69,7 @@
         , fToDelete(NULL)
         , fSize(size) {
         ++fAlive;
+        this->registerWithCache();
     }
 
     ~TestResource() {