aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar bsalomon <bsalomon@google.com>2014-08-26 14:01:07 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2014-08-26 14:01:07 -0700
commit169612621f00b3fe9f71014079991287d311751a (patch)
tree5a1ab159dc1515cb5d12fc759db2f611b0961eff
parent9407eceb2784dd13c135f8f266ffbeb1ffe5fd48 (diff)
Make GrGpuResources register with GrResourceCache2 after fully constructed.
Committed: https://skia.googlesource.com/skia/+/d68b3e491bb765beb7ca5e4ac8e0c80dedf5a83b R=robertphillips@google.com Author: bsalomon@google.com Review URL: https://codereview.chromium.org/504313002
-rw-r--r--bench/GrResourceCacheBench.cpp2
-rw-r--r--include/gpu/GrGpuResource.h5
-rw-r--r--src/gpu/GrGpuResource.cpp5
-rw-r--r--src/gpu/GrPathRange.h1
-rw-r--r--src/gpu/GrResourceCache2.cpp2
-rw-r--r--src/gpu/GrResourceCache2.h6
-rw-r--r--src/gpu/GrStencilAndCoverTextContext.cpp1
-rw-r--r--src/gpu/gl/GrGLIndexBuffer.cpp1
-rw-r--r--src/gpu/gl/GrGLPath.cpp1
-rw-r--r--src/gpu/gl/GrGLRenderTarget.cpp1
-rw-r--r--src/gpu/gl/GrGLStencilBuffer.h1
-rw-r--r--src/gpu/gl/GrGLTexture.cpp1
-rw-r--r--src/gpu/gl/GrGLVertexArray.cpp1
-rw-r--r--src/gpu/gl/GrGLVertexBuffer.cpp1
-rw-r--r--tests/ResourceCacheTest.cpp1
15 files changed, 29 insertions, 1 deletions
diff --git a/bench/GrResourceCacheBench.cpp b/bench/GrResourceCacheBench.cpp
index 84e0e5d4c8..068aff22d4 100644
--- a/bench/GrResourceCacheBench.cpp
+++ b/bench/GrResourceCacheBench.cpp
@@ -27,6 +27,7 @@ public:
StencilResource(GrGpu* gpu, int id)
: INHERITED(gpu, false)
, fID(id) {
+ this->registerWithCache();
}
virtual ~StencilResource() { this->release(); }
@@ -51,6 +52,7 @@ public:
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 8b162823bf..17cdfc9a4c 100644
--- a/include/gpu/GrGpuResource.h
+++ b/include/gpu/GrGpuResource.h
@@ -90,6 +90,11 @@ public:
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 7a19c25e46..a0a72785d9 100644
--- a/src/gpu/GrGpuResource.cpp
+++ b/src/gpu/GrGpuResource.cpp
@@ -28,6 +28,9 @@ GrGpuResource::GrGpuResource(GrGpu* gpu, bool isWrapped)
} else {
fFlags = 0;
}
+}
+
+void GrGpuResource::registerWithCache() {
get_resource_cache2(fGpu)->insertResource(this);
}
@@ -37,7 +40,7 @@ GrGpuResource::~GrGpuResource() {
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 c53b987382..b52fef170c 100644
--- a/src/gpu/GrPathRange.h
+++ b/src/gpu/GrPathRange.h
@@ -38,6 +38,7 @@ public:
: 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 0b6944ee85..c325efd40d 100644
--- a/src/gpu/GrResourceCache2.cpp
+++ b/src/gpu/GrResourceCache2.cpp
@@ -17,11 +17,13 @@ GrResourceCache2::~GrResourceCache2() {
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 1262c805ac..8e79c09e39 100644
--- a/src/gpu/GrResourceCache2.h
+++ b/src/gpu/GrResourceCache2.h
@@ -33,6 +33,12 @@ public:
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 af4ba64343..796183feba 100644
--- a/src/gpu/GrStencilAndCoverTextContext.cpp
+++ b/src/gpu/GrStencilAndCoverTextContext.cpp
@@ -41,6 +41,7 @@ public:
if (NULL == glyphs ||
!glyphs->fDesc->equals(cache->getDescriptor() /*checksum collision*/)) {
glyphs.reset(SkNEW_ARGS(GlyphPathRange, (context, cache->getDescriptor(), stroke)));
+ glyphs->registerWithCache();
context->addResourceToCache(resourceKey, glyphs);
}
diff --git a/src/gpu/gl/GrGLIndexBuffer.cpp b/src/gpu/gl/GrGLIndexBuffer.cpp
index a137348ef7..5991c09613 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 8c76b5922a..972a7af39b 100644
--- a/src/gpu/gl/GrGLPath.cpp
+++ b/src/gpu/gl/GrGLPath.cpp
@@ -136,6 +136,7 @@ GrGLPath::GrGLPath(GrGpuGL* gpu, const SkPath& path, const SkStrokeRec& stroke)
// 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 2486396186..6143f34b95 100644
--- a/src/gpu/gl/GrGLRenderTarget.cpp
+++ b/src/gpu/gl/GrGLRenderTarget.cpp
@@ -21,6 +21,7 @@ void GrGLRenderTarget::init(const Desc& desc,
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 1cb0a3301a..024890ddd7 100644
--- a/src/gpu/gl/GrGLStencilBuffer.h
+++ b/src/gpu/gl/GrGLStencilBuffer.h
@@ -32,6 +32,7 @@ public:
: 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 255cdd9631..bc013bc0ec 100644
--- a/src/gpu/gl/GrGLTexture.cpp
+++ b/src/gpu/gl/GrGLTexture.cpp
@@ -33,6 +33,7 @@ void GrGLTexture::init(GrGpuGL* gpu,
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 66feb82053..39fd48cb89 100644
--- a/src/gpu/gl/GrGLVertexArray.cpp
+++ b/src/gpu/gl/GrGLVertexArray.cpp
@@ -73,6 +73,7 @@ GrGLVertexArray::GrGLVertexArray(GrGpuGL* gpu, GrGLint id, int attribCount)
, 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 a13ad126ec..d6b630191c 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 4b43d4f48d..ae140e2846 100644
--- a/tests/ResourceCacheTest.cpp
+++ b/tests/ResourceCacheTest.cpp
@@ -69,6 +69,7 @@ public:
, fToDelete(NULL)
, fSize(size) {
++fAlive;
+ this->registerWithCache();
}
~TestResource() {