Make GrResource know whether 3D objects' lifetimes are managed by Skia or not.
Review URL: https://codereview.appspot.com/7201046
git-svn-id: http://skia.googlecode.com/svn/trunk@7348 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/include/gpu/GrRenderTarget.h b/include/gpu/GrRenderTarget.h
index 9964c9b..4e77466 100644
--- a/include/gpu/GrRenderTarget.h
+++ b/include/gpu/GrRenderTarget.h
@@ -139,10 +139,11 @@
protected:
GrRenderTarget(GrGpu* gpu,
+ bool isWrapped,
GrTexture* texture,
const GrTextureDesc& desc,
Origin origin)
- : INHERITED(gpu, desc, origin)
+ : INHERITED(gpu, isWrapped, desc, origin)
, fStencilBuffer(NULL)
, fTexture(texture) {
fResolveRect.setLargestInverted();
diff --git a/include/gpu/GrResource.h b/include/gpu/GrResource.h
index 3c306f8..9330abb 100644
--- a/include/gpu/GrResource.h
+++ b/include/gpu/GrResource.h
@@ -70,7 +70,12 @@
GrResourceEntry* getCacheEntry() { return fCacheEntry; }
protected:
- explicit GrResource(GrGpu* gpu);
+ /**
+ * isWrapped indicates we have wrapped a client-created backend resource in a GrResource. If it
+ * is true then the client is responsible for the lifetime of the underlying backend resource.
+ * Otherwise, our onRelease() should free the resource.
+ */
+ GrResource(GrGpu* gpu, bool isWrapped);
virtual ~GrResource();
GrGpu* getGpu() const { return fGpu; }
@@ -81,9 +86,9 @@
virtual void onAbandon() {};
bool isInCache() const { return NULL != fCacheEntry; }
+ bool isWrapped() const { return kWrapped_Flag & fFlags; }
private:
-
#if GR_DEBUG
friend class GrGpu; // for assert in GrGpu to access getGpu
#endif
@@ -98,6 +103,11 @@
GrResourceEntry* fCacheEntry; // NULL if not in cache
+ enum Flags {
+ kWrapped_Flag,
+ };
+ uint32_t fFlags;
+
typedef GrRefCnt INHERITED;
};
diff --git a/include/gpu/GrSurface.h b/include/gpu/GrSurface.h
index d7aa267..4ef0acb 100644
--- a/include/gpu/GrSurface.h
+++ b/include/gpu/GrSurface.h
@@ -115,8 +115,8 @@
uint32_t pixelOpsFlags = 0) = 0;
protected:
- GrSurface(GrGpu* gpu, const GrTextureDesc& desc, Origin origin)
- : INHERITED(gpu)
+ GrSurface(GrGpu* gpu, bool isWrapped, const GrTextureDesc& desc, Origin origin)
+ : INHERITED(gpu, isWrapped)
, fDesc(desc)
, fOrigin(origin) {
}
diff --git a/include/gpu/GrTexture.h b/include/gpu/GrTexture.h
index 36515b4..657e6e5 100644
--- a/include/gpu/GrTexture.h
+++ b/include/gpu/GrTexture.h
@@ -140,8 +140,8 @@
// base class cons sets to NULL
// subclass cons can create and set
- GrTexture(GrGpu* gpu, const GrTextureDesc& desc, Origin origin)
- : INHERITED(gpu, desc, origin)
+ GrTexture(GrGpu* gpu, bool isWrapped, const GrTextureDesc& desc, Origin origin)
+ : INHERITED(gpu, isWrapped, desc, origin)
, fRenderTarget(NULL) {
// only make sense if alloc size is pow2
@@ -167,4 +167,3 @@
};
#endif
-
diff --git a/src/gpu/GrGeometryBuffer.h b/src/gpu/GrGeometryBuffer.h
index c156fa3..52318c1 100644
--- a/src/gpu/GrGeometryBuffer.h
+++ b/src/gpu/GrGeometryBuffer.h
@@ -76,8 +76,8 @@
virtual size_t sizeInBytes() const { return fSizeInBytes; }
protected:
- GrGeometryBuffer(GrGpu* gpu, size_t sizeInBytes, bool dynamic)
- : INHERITED(gpu)
+ GrGeometryBuffer(GrGpu* gpu, bool isWrapped, size_t sizeInBytes, bool dynamic)
+ : INHERITED(gpu, isWrapped)
, fSizeInBytes(sizeInBytes)
, fDynamic(dynamic) {}
diff --git a/src/gpu/GrIndexBuffer.h b/src/gpu/GrIndexBuffer.h
index a7e7a57..6e556d2 100644
--- a/src/gpu/GrIndexBuffer.h
+++ b/src/gpu/GrIndexBuffer.h
@@ -15,17 +15,17 @@
class GrIndexBuffer : public GrGeometryBuffer {
public:
- /**
- * Retrieves the maximum number of quads that could be rendered
- * from the index buffer (using kTriangles_GrPrimitiveType).
- * @return the maximum number of quads using full size of index buffer.
- */
- int maxQuads() const {
- return this->sizeInBytes() / (sizeof(uint16_t) * 6);
- }
+ /**
+ * Retrieves the maximum number of quads that could be rendered
+ * from the index buffer (using kTriangles_GrPrimitiveType).
+ * @return the maximum number of quads using full size of index buffer.
+ */
+ int maxQuads() const {
+ return this->sizeInBytes() / (sizeof(uint16_t) * 6);
+ }
protected:
- GrIndexBuffer(GrGpu* gpu, size_t sizeInBytes, bool dynamic)
- : INHERITED(gpu, sizeInBytes, dynamic) {}
+ GrIndexBuffer(GrGpu* gpu, bool isWrapped, size_t sizeInBytes, bool dynamic)
+ : INHERITED(gpu, isWrapped, sizeInBytes, dynamic) {}
private:
typedef GrGeometryBuffer INHERITED;
};
diff --git a/src/gpu/GrPath.h b/src/gpu/GrPath.h
index e8f0d58..ad3a5c3 100644
--- a/src/gpu/GrPath.h
+++ b/src/gpu/GrPath.h
@@ -16,7 +16,7 @@
public:
SK_DECLARE_INST_COUNT(GrPath);
- GrPath(GrGpu* gpu) : INHERITED(gpu) {}
+ GrPath(GrGpu* gpu, bool isWrapped) : INHERITED(gpu, isWrapped) {}
const GrRect& getBounds() const { return fBounds; }
diff --git a/src/gpu/GrResource.cpp b/src/gpu/GrResource.cpp
index 2ff7df6..002c262 100644
--- a/src/gpu/GrResource.cpp
+++ b/src/gpu/GrResource.cpp
@@ -12,9 +12,14 @@
SK_DEFINE_INST_COUNT(GrResource)
-GrResource::GrResource(GrGpu* gpu) {
+GrResource::GrResource(GrGpu* gpu, bool isWrapped) {
fGpu = gpu;
fCacheEntry = NULL;
+ if (isWrapped) {
+ fFlags = kWrapped_Flag;
+ } else {
+ fFlags = 0;
+ }
fGpu->insertResource(this);
}
@@ -54,4 +59,3 @@
return NULL;
}
}
-
diff --git a/src/gpu/GrStencilBuffer.h b/src/gpu/GrStencilBuffer.h
index 459d801..3765a4c 100644
--- a/src/gpu/GrStencilBuffer.h
+++ b/src/gpu/GrStencilBuffer.h
@@ -55,8 +55,8 @@
static GrResourceKey ComputeKey(int width, int height, int sampleCnt);
protected:
- GrStencilBuffer(GrGpu* gpu, int width, int height, int bits, int sampleCnt)
- : GrResource(gpu)
+ GrStencilBuffer(GrGpu* gpu, bool isWrapped, int width, int height, int bits, int sampleCnt)
+ : GrResource(gpu, isWrapped)
, fWidth(width)
, fHeight(height)
, fBits(bits)
diff --git a/src/gpu/GrVertexBuffer.h b/src/gpu/GrVertexBuffer.h
index bda235c..b53cbf0 100644
--- a/src/gpu/GrVertexBuffer.h
+++ b/src/gpu/GrVertexBuffer.h
@@ -15,8 +15,8 @@
class GrVertexBuffer : public GrGeometryBuffer {
protected:
- GrVertexBuffer(GrGpu* gpu, size_t sizeInBytes, bool dynamic)
- : INHERITED(gpu, sizeInBytes, dynamic) {}
+ GrVertexBuffer(GrGpu* gpu, bool isWrapped, size_t sizeInBytes, bool dynamic)
+ : INHERITED(gpu, isWrapped, sizeInBytes, dynamic) {}
private:
typedef GrGeometryBuffer INHERITED;
};
diff --git a/src/gpu/gl/GrGLIndexBuffer.cpp b/src/gpu/gl/GrGLIndexBuffer.cpp
index 66ee095..561133a 100644
--- a/src/gpu/gl/GrGLIndexBuffer.cpp
+++ b/src/gpu/gl/GrGLIndexBuffer.cpp
@@ -15,10 +15,11 @@
#define GL_CALL(X) GR_GL_CALL(GPUGL->glInterface(), X)
GrGLIndexBuffer::GrGLIndexBuffer(GrGpuGL* gpu,
+ bool isWrapped,
GrGLuint id,
size_t sizeInBytes,
bool dynamic)
- : INHERITED(gpu, sizeInBytes, dynamic)
+ : INHERITED(gpu, isWrapped, sizeInBytes, dynamic)
, fBufferID(id)
, fLockPtr(NULL) {
@@ -26,7 +27,7 @@
void GrGLIndexBuffer::onRelease() {
// make sure we've not been abandoned
- if (fBufferID) {
+ if (fBufferID && !this->isWrapped()) {
GPUGL->notifyIndexBufferDelete(this);
GL_CALL(DeleteBuffers(1, &fBufferID));
fBufferID = 0;
@@ -134,4 +135,3 @@
#endif
return true;
}
-
diff --git a/src/gpu/gl/GrGLIndexBuffer.h b/src/gpu/gl/GrGLIndexBuffer.h
index e282001..936e650 100644
--- a/src/gpu/gl/GrGLIndexBuffer.h
+++ b/src/gpu/gl/GrGLIndexBuffer.h
@@ -32,6 +32,7 @@
protected:
GrGLIndexBuffer(GrGpuGL* gpu,
+ bool isWrapped,
GrGLuint id,
size_t sizeInBytes,
bool dynamic);
diff --git a/src/gpu/gl/GrGLPath.cpp b/src/gpu/gl/GrGLPath.cpp
index 1de8713..8c6e11e 100644
--- a/src/gpu/gl/GrGLPath.cpp
+++ b/src/gpu/gl/GrGLPath.cpp
@@ -54,7 +54,9 @@
#endif
}
-GrGLPath::GrGLPath(GrGpuGL* gpu, const SkPath& path) : INHERITED(gpu) {
+static const bool kIsWrapped = false; // The constructor creates the GL path object.
+
+GrGLPath::GrGLPath(GrGpuGL* gpu, const SkPath& path) : INHERITED(gpu, kIsWrapped) {
GL_CALL_RET(fPathID, GenPaths(1));
SkPath::Iter iter(path, true);
@@ -92,7 +94,7 @@
}
void GrGLPath::onRelease() {
- if (0 != fPathID) {
+ if (0 != fPathID && !this->isWrapped()) {
GL_CALL(DeletePaths(fPathID, 1));
fPathID = 0;
}
@@ -105,4 +107,3 @@
INHERITED::onAbandon();
}
-
diff --git a/src/gpu/gl/GrGLRenderTarget.cpp b/src/gpu/gl/GrGLRenderTarget.cpp
index 9bbc842..c68283e 100644
--- a/src/gpu/gl/GrGLRenderTarget.cpp
+++ b/src/gpu/gl/GrGLRenderTarget.cpp
@@ -20,7 +20,6 @@
fTexFBOID = desc.fTexFBOID;
fMSColorRenderbufferID = desc.fMSColorRenderbufferID;
fViewport = viewport;
- fOwnIDs = desc.fOwnIDs;
fTexIDObj = texID;
GrSafeRef(fTexIDObj);
}
@@ -46,6 +45,7 @@
GrGLTexID* texID,
GrGLTexture* texture)
: INHERITED(gpu,
+ desc.fIsWrapped,
texture,
MakeDesc(kNone_GrTextureFlags,
viewport.fWidth, viewport.fHeight,
@@ -69,6 +69,7 @@
const Desc& desc,
const GrGLIRect& viewport)
: INHERITED(gpu,
+ desc.fIsWrapped,
NULL,
MakeDesc(kNone_GrTextureFlags,
viewport.fWidth, viewport.fHeight,
@@ -79,7 +80,7 @@
void GrGLRenderTarget::onRelease() {
GPUGL->notifyRenderTargetDelete(this);
- if (fOwnIDs) {
+ if (!this->isWrapped()) {
if (fTexFBOID) {
GL_CALL(DeleteFramebuffers(1, &fTexFBOID));
}
@@ -108,4 +109,3 @@
}
INHERITED::onAbandon();
}
-
diff --git a/src/gpu/gl/GrGLRenderTarget.h b/src/gpu/gl/GrGLRenderTarget.h
index b26223e..9a39ca1 100644
--- a/src/gpu/gl/GrGLRenderTarget.h
+++ b/src/gpu/gl/GrGLRenderTarget.h
@@ -28,7 +28,7 @@
GrGLuint fRTFBOID;
GrGLuint fTexFBOID;
GrGLuint fMSColorRenderbufferID;
- bool fOwnIDs;
+ bool fIsWrapped;
GrPixelConfig fConfig;
int fSampleCnt;
};
@@ -89,10 +89,6 @@
GrGLuint fMSColorRenderbufferID;
- // Should this object delete IDs when it is destroyed or does someone
- // else own them.
- bool fOwnIDs;
-
// when we switch to this render target we want to set the viewport to
// only render to to content area (as opposed to the whole allocation) and
// we want the rendering to be at top left (GL has origin in bottom left)
diff --git a/src/gpu/gl/GrGLStencilBuffer.cpp b/src/gpu/gl/GrGLStencilBuffer.cpp
index 030b54e..d9322c2 100644
--- a/src/gpu/gl/GrGLStencilBuffer.cpp
+++ b/src/gpu/gl/GrGLStencilBuffer.cpp
@@ -22,7 +22,7 @@
}
void GrGLStencilBuffer::onRelease() {
- if (0 != fRenderbufferID) {
+ if (0 != fRenderbufferID && !this->isWrapped()) {
GrGpuGL* gpuGL = (GrGpuGL*) this->getGpu();
const GrGLInterface* gl = gpuGL->glInterface();
GR_GL_CALL(gl, DeleteRenderbuffers(1, &fRenderbufferID));
@@ -37,5 +37,3 @@
INHERITED::onAbandon();
}
-
-
diff --git a/src/gpu/gl/GrGLStencilBuffer.h b/src/gpu/gl/GrGLStencilBuffer.h
index 2d175f6..2bf33ef 100644
--- a/src/gpu/gl/GrGLStencilBuffer.h
+++ b/src/gpu/gl/GrGLStencilBuffer.h
@@ -23,11 +23,13 @@
bool fPacked;
};
- GrGLStencilBuffer(GrGpu* gpu, GrGLint rbid,
+ GrGLStencilBuffer(GrGpu* gpu,
+ bool isWrapped,
+ GrGLint rbid,
int width, int height,
int sampleCnt,
const Format& format)
- : GrStencilBuffer(gpu, width, height, format.fStencilBits, sampleCnt)
+ : GrStencilBuffer(gpu, isWrapped, width, height, format.fStencilBits, sampleCnt)
, fFormat(format)
, fRenderbufferID(rbid) {
}
diff --git a/src/gpu/gl/GrGLTexture.cpp b/src/gpu/gl/GrGLTexture.cpp
index 6c815e8..5c588e7 100644
--- a/src/gpu/gl/GrGLTexture.cpp
+++ b/src/gpu/gl/GrGLTexture.cpp
@@ -25,7 +25,7 @@
fTexIDObj = SkNEW_ARGS(GrGLTexID,
(GPUGL->glInterface(),
textureDesc.fTextureID,
- textureDesc.fOwnsID));
+ textureDesc.fIsWrapped));
if (NULL != rtDesc) {
GrAssert(kBottomLeft_Origin == textureDesc.fOrigin);
@@ -42,14 +42,14 @@
GrGLTexture::GrGLTexture(GrGpuGL* gpu,
const Desc& textureDesc)
- : INHERITED(gpu, textureDesc, textureDesc.fOrigin) {
+ : INHERITED(gpu, textureDesc.fIsWrapped, textureDesc, textureDesc.fOrigin) {
this->init(gpu, textureDesc, NULL);
}
GrGLTexture::GrGLTexture(GrGpuGL* gpu,
const Desc& textureDesc,
const GrGLRenderTarget::Desc& rtDesc)
- : INHERITED(gpu, textureDesc, textureDesc.fOrigin) {
+ : INHERITED(gpu, textureDesc.fIsWrapped, textureDesc, textureDesc.fOrigin) {
this->init(gpu, textureDesc, &rtDesc);
}
@@ -74,4 +74,3 @@
GrBackendObject GrGLTexture::getTextureHandle() const {
return fTexIDObj->id();
}
-
diff --git a/src/gpu/gl/GrGLTexture.h b/src/gpu/gl/GrGLTexture.h
index 4666bfb..527bab0 100644
--- a/src/gpu/gl/GrGLTexture.h
+++ b/src/gpu/gl/GrGLTexture.h
@@ -19,14 +19,14 @@
public:
SK_DECLARE_INST_COUNT(GrGLTexID)
- GrGLTexID(const GrGLInterface* gl, GrGLuint texID, bool ownsID)
+ GrGLTexID(const GrGLInterface* gl, GrGLuint texID, bool isWrapped)
: fGL(gl)
, fTexID(texID)
- , fOwnsID(ownsID) {
+ , fIsWrapped(isWrapped) {
}
virtual ~GrGLTexID() {
- if (0 != fTexID && fOwnsID) {
+ if (0 != fTexID && !fIsWrapped) {
GR_GL_CALL(fGL, DeleteTextures(1, &fTexID));
}
}
@@ -37,7 +37,7 @@
private:
const GrGLInterface* fGL;
GrGLuint fTexID;
- bool fOwnsID;
+ bool fIsWrapped;
typedef GrRefCnt INHERITED;
};
@@ -58,7 +58,7 @@
struct Desc : public GrTextureDesc {
GrGLuint fTextureID;
- bool fOwnsID;
+ bool fIsWrapped;
Origin fOrigin;
};
diff --git a/src/gpu/gl/GrGLVertexBuffer.cpp b/src/gpu/gl/GrGLVertexBuffer.cpp
index 7cee29e..1512fef 100644
--- a/src/gpu/gl/GrGLVertexBuffer.cpp
+++ b/src/gpu/gl/GrGLVertexBuffer.cpp
@@ -15,17 +15,18 @@
#define GL_CALL(X) GR_GL_CALL(GPUGL->glInterface(), X)
GrGLVertexBuffer::GrGLVertexBuffer(GrGpuGL* gpu,
+ bool isWrapped,
GrGLuint id,
size_t sizeInBytes,
bool dynamic)
- : INHERITED(gpu, sizeInBytes, dynamic)
+ : INHERITED(gpu, isWrapped, sizeInBytes, dynamic)
, fBufferID(id)
, fLockPtr(NULL) {
}
void GrGLVertexBuffer::onRelease() {
// make sure we've not been abandoned
- if (fBufferID) {
+ if (fBufferID && !this->isWrapped()) {
GPUGL->notifyVertexBufferDelete(this);
GL_CALL(DeleteBuffers(1, &fBufferID));
fBufferID = 0;
@@ -146,4 +147,3 @@
#endif
return true;
}
-
diff --git a/src/gpu/gl/GrGLVertexBuffer.h b/src/gpu/gl/GrGLVertexBuffer.h
index bb829d3..17b0283 100644
--- a/src/gpu/gl/GrGLVertexBuffer.h
+++ b/src/gpu/gl/GrGLVertexBuffer.h
@@ -29,6 +29,7 @@
protected:
GrGLVertexBuffer(GrGpuGL* gpu,
+ bool isWrapped,
GrGLuint id,
size_t sizeInBytes,
bool dynamic);
diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp
index bb727e2..dc41fbb 100644
--- a/src/gpu/gl/GrGpuGL.cpp
+++ b/src/gpu/gl/GrGpuGL.cpp
@@ -498,7 +498,7 @@
glTexDesc.fConfig = desc.fConfig;
glTexDesc.fSampleCnt = desc.fSampleCnt;
glTexDesc.fTextureID = static_cast<GrGLuint>(desc.fTextureHandle);
- glTexDesc.fOwnsID = false;
+ glTexDesc.fIsWrapped = true;
glTexDesc.fOrigin = GrSurface::kBottomLeft_Origin;
GrGLTexture* texture = NULL;
@@ -507,7 +507,7 @@
glRTDesc.fRTFBOID = 0;
glRTDesc.fTexFBOID = 0;
glRTDesc.fMSColorRenderbufferID = 0;
- glRTDesc.fOwnIDs = true;
+ glRTDesc.fIsWrapped = false;
glRTDesc.fConfig = desc.fConfig;
glRTDesc.fSampleCnt = desc.fSampleCnt;
if (!this->createRenderTargetObjects(glTexDesc.fWidth,
@@ -535,7 +535,7 @@
glDesc.fMSColorRenderbufferID = 0;
glDesc.fTexFBOID = GrGLRenderTarget::kUnresolvableFBOID;
glDesc.fSampleCnt = desc.fSampleCnt;
- glDesc.fOwnIDs = false;
+ glDesc.fIsWrapped = true;
GrGLIRect viewport;
viewport.fLeft = 0;
viewport.fBottom = 0;
@@ -550,8 +550,10 @@
format.fPacked = false;
format.fStencilBits = desc.fStencilBits;
format.fTotalBits = desc.fStencilBits;
+ static const bool kIsWrapped = false;
GrGLStencilBuffer* sb = SkNEW_ARGS(GrGLStencilBuffer,
(this,
+ kIsWrapped,
0,
desc.fWidth,
desc.fHeight,
@@ -827,7 +829,7 @@
desc->fMSColorRenderbufferID = 0;
desc->fRTFBOID = 0;
desc->fTexFBOID = 0;
- desc->fOwnIDs = true;
+ desc->fIsWrapped = false;
GrGLenum status;
@@ -942,12 +944,12 @@
glTexDesc.fConfig = desc.fConfig;
glTexDesc.fSampleCnt = desc.fSampleCnt;
- glTexDesc.fOwnsID = true;
+ glTexDesc.fIsWrapped = false;
glRTDesc.fMSColorRenderbufferID = 0;
glRTDesc.fRTFBOID = 0;
glRTDesc.fTexFBOID = 0;
- glRTDesc.fOwnIDs = true;
+ glRTDesc.fIsWrapped = false;
glRTDesc.fConfig = glTexDesc.fConfig;
bool renderTarget = 0 != (desc.fFlags & kRenderTarget_GrTextureFlagBit);
@@ -1112,8 +1114,9 @@
// whatever sizes GL gives us. In that case we query for the size.
GrGLStencilBuffer::Format format = sFmt;
get_stencil_rb_sizes(this->glInterface(), sbID, &format);
+ static const bool kIsWrapped = false;
SkAutoTUnref<GrStencilBuffer> sb(SkNEW_ARGS(GrGLStencilBuffer,
- (this, sbID, width, height,
+ (this, kIsWrapped, sbID, width, height,
samples, format)));
if (this->attachStencilBufferToRenderTarget(sb, rt)) {
fLastSuccessfulStencilFmtIdx = sIdx;
@@ -1214,8 +1217,9 @@
fHWGeometryState.fVertexBuffer = NULL;
return NULL;
}
+ static const bool kIsWrapped = false;
GrGLVertexBuffer* vertexBuffer = SkNEW_ARGS(GrGLVertexBuffer,
- (this, id,
+ (this, kIsWrapped, id,
size, dynamic));
fHWGeometryState.fVertexBuffer = vertexBuffer;
return vertexBuffer;
@@ -1242,8 +1246,9 @@
fHWGeometryState.fIndexBuffer = NULL;
return NULL;
}
+ static const bool kIsWrapped = false;
GrIndexBuffer* indexBuffer = SkNEW_ARGS(GrGLIndexBuffer,
- (this, id, size, dynamic));
+ (this, kIsWrapped, id, size, dynamic));
fHWGeometryState.fIndexBuffer = indexBuffer;
return indexBuffer;
}
@@ -2363,4 +2368,3 @@
}
}
}
-