Delete GL tex ID when last of GrGLTexture or GrGLRenderTarget that reference it is destroyed
git-svn-id: http://skia.googlecode.com/svn/trunk@915 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/src/GrGLTexture.cpp b/gpu/src/GrGLTexture.cpp
index ae991e8..1acb871 100644
--- a/gpu/src/GrGLTexture.cpp
+++ b/gpu/src/GrGLTexture.cpp
@@ -1,5 +1,5 @@
/*
- Copyright 2010 Google Inc.
+ Copyright 2011 Google Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@
#include "GrGpuGL.h"
GrGLRenderTarget::GrGLRenderTarget(const GLRenderTargetIDs& ids,
+ GrGLTexID* texID,
GLuint stencilBits,
const GrGLIRect& viewport,
GrGLTexture* texture,
@@ -34,6 +35,8 @@
fNeedsResolve = false;
fViewport = viewport;
fOwnIDs = ids.fOwnIDs;
+ fTexIDObj = texID;
+ GrSafeRef(fTexIDObj);
}
GrGLRenderTarget::~GrGLRenderTarget() {
@@ -52,6 +55,7 @@
GR_GLEXT(fGL->extensions(), DeleteRenderbuffers(1, &fMSColorRenderbufferID));
}
}
+ GrSafeUnref(fTexIDObj);
}
void GrGLRenderTarget::abandon() {
@@ -59,6 +63,9 @@
fTexFBOID = 0;
fStencilRenderbufferID = 0;
fMSColorRenderbufferID = 0;
+ if (NULL != fTexIDObj) {
+ fTexIDObj->abandon();
+ }
}
@@ -84,7 +91,7 @@
textureDesc.fFormat) {
fTexParams = initialTexParams;
- fTextureID = textureDesc.fTextureID;
+ fTexIDObj = new GrGLTexID(textureDesc.fTextureID);
fUploadFormat = textureDesc.fUploadFormat;
fUploadByteCount = textureDesc.fUploadByteCount;
fUploadType = textureDesc.fUploadType;
@@ -108,43 +115,32 @@
vp.fHeight = textureDesc.fContentHeight;
vp.fBottom = textureDesc.fAllocHeight - textureDesc.fContentHeight;
- fRenderTarget = new GrGLRenderTarget(rtIDs, textureDesc.fStencilBits,
+ fRenderTarget = new GrGLRenderTarget(rtIDs, fTexIDObj,
+ textureDesc.fStencilBits,
vp, this, gl);
}
}
GrGLTexture::~GrGLTexture() {
- // make sure we haven't been abandoned
- if (fTextureID) {
- fGpuGL->notifyTextureDelete(this);
- GR_GL(DeleteTextures(1, &fTextureID));
- }
- delete fRenderTarget;
+ fGpuGL->notifyTextureDelete(this);
+ fTexIDObj->unref();
+ GrSafeUnref(fRenderTarget);
}
void GrGLTexture::abandon() {
- fTextureID = 0;
+ fTexIDObj->abandon();
if (NULL != fRenderTarget) {
fRenderTarget->abandon();
}
}
-bool GrGLTexture::isRenderTarget() const {
- return NULL != fRenderTarget;
-}
-
GrRenderTarget* GrGLTexture::asRenderTarget() {
return (GrRenderTarget*)fRenderTarget;
}
-void GrGLTexture::removeRenderTarget() {
- GrAssert(NULL != fRenderTarget);
- if (NULL != fRenderTarget) {
- // must do this notify before the delete
- fGpuGL->notifyTextureRemoveRenderTarget(this);
- delete fRenderTarget;
- fRenderTarget = NULL;
- }
+void GrGLTexture::releaseRenderTarget() {
+ GrSafeUnref(fRenderTarget);
+ fRenderTarget = NULL;
}
void GrGLTexture::uploadTextureData(uint32_t x,
@@ -162,7 +158,7 @@
// If we need to update textures that are created upside down
// then we have to modify this code to flip the srcData
GrAssert(kTopDown_Orientation == fOrientation);
- GR_GL(BindTexture(GL_TEXTURE_2D, fTextureID));
+ GR_GL(BindTexture(GL_TEXTURE_2D, fTexIDObj->id()));
GR_GL(PixelStorei(GL_UNPACK_ALIGNMENT, fUploadByteCount));
GR_GL(TexSubImage2D(GL_TEXTURE_2D, 0, x, y, width, height,
fUploadFormat, fUploadType, srcData));
@@ -170,7 +166,7 @@
}
intptr_t GrGLTexture::getTextureHandle() {
- return fTextureID;
+ return fTexIDObj->id();
}