Add GrResource base class for ibs, texs, vbs, etc.
Add lostContext() to GrContext.
Review URL: http://codereview.appspot.com/4328044/
git-svn-id: http://skia.googlecode.com/svn/trunk@1026 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/src/GrGLTexture.cpp b/gpu/src/GrGLTexture.cpp
index ae36e4c..bd157d2 100644
--- a/gpu/src/GrGLTexture.cpp
+++ b/gpu/src/GrGLTexture.cpp
@@ -18,16 +18,15 @@
#include "GrGLTexture.h"
#include "GrGpuGL.h"
-GrGLRenderTarget::GrGLRenderTarget(const GLRenderTargetIDs& ids,
+#define GPUGL static_cast<GrGpuGL*>(getGpu())
+
+GrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu,
+ const GLRenderTargetIDs& ids,
GrGLTexID* texID,
GrGLuint stencilBits,
const GrGLIRect& viewport,
- GrGLTexture* texture,
- GrGpuGL* gl) : INHERITED(texture,
- viewport.fWidth,
- viewport.fHeight,
- stencilBits) {
- fGL = gl;
+ GrGLTexture* texture)
+ : INHERITED(gpu, texture, viewport.fWidth, viewport.fHeight, stencilBits) {
fRTFBOID = ids.fRTFBOID;
fTexFBOID = ids.fTexFBOID;
fStencilRenderbufferID = ids.fStencilRenderbufferID;
@@ -39,10 +38,10 @@
GrSafeRef(fTexIDObj);
}
-GrGLRenderTarget::~GrGLRenderTarget() {
- fGL->notifyRenderTargetDelete(this);
+void GrGLRenderTarget::onRelease() {
if (fOwnIDs) {
if (fTexFBOID) {
+ GPUGL->notifyRenderTargetDelete(this);
GR_GL(DeleteFramebuffers(1, &fTexFBOID));
}
if (fRTFBOID && fRTFBOID != fTexFBOID) {
@@ -55,16 +54,22 @@
GR_GL(DeleteRenderbuffers(1, &fMSColorRenderbufferID));
}
}
+ fRTFBOID = 0;
+ fTexFBOID = 0;
+ fStencilRenderbufferID = 0;
+ fMSColorRenderbufferID = 0;
GrSafeUnref(fTexIDObj);
+ fTexIDObj = NULL;
}
-void GrGLRenderTarget::abandon() {
+void GrGLRenderTarget::onAbandon() {
fRTFBOID = 0;
fTexFBOID = 0;
fStencilRenderbufferID = 0;
fMSColorRenderbufferID = 0;
if (NULL != fTexIDObj) {
fTexIDObj->abandon();
+ fTexIDObj = NULL;
}
}
@@ -92,13 +97,14 @@
};
-GrGLTexture::GrGLTexture(const GLTextureDesc& textureDesc,
+GrGLTexture::GrGLTexture(GrGpuGL* gpu,
+ const GLTextureDesc& textureDesc,
const GLRenderTargetIDs& rtIDs,
- const TexParams& initialTexParams,
- GrGpuGL* gl)
- : INHERITED(textureDesc.fContentWidth,
- textureDesc.fContentHeight,
- textureDesc.fFormat) {
+ const TexParams& initialTexParams)
+ : INHERITED(gpu,
+ textureDesc.fContentWidth,
+ textureDesc.fContentHeight,
+ textureDesc.fFormat) {
fTexParams = initialTexParams;
fTexIDObj = new GrGLTexID(textureDesc.fTextureID);
@@ -113,7 +119,6 @@
fScaleY = GrIntToScalar(textureDesc.fContentHeight) /
textureDesc.fAllocHeight;
fRenderTarget = NULL;
- fGpuGL = gl;
GrAssert(0 != textureDesc.fTextureID);
@@ -125,27 +130,32 @@
vp.fHeight = textureDesc.fContentHeight;
vp.fBottom = textureDesc.fAllocHeight - textureDesc.fContentHeight;
- fRenderTarget = new GrGLRenderTarget(rtIDs, fTexIDObj,
+ fRenderTarget = new GrGLRenderTarget(gpu, rtIDs, fTexIDObj,
textureDesc.fStencilBits,
- vp, this, gl);
+ vp, this);
}
}
-GrGLTexture::~GrGLTexture() {
- fGpuGL->notifyTextureDelete(this);
- fTexIDObj->unref();
- GrSafeUnref(fRenderTarget);
+void GrGLTexture::onRelease() {
+ if (NULL != fTexIDObj) {
+ GPUGL->notifyTextureDelete(this);
+ fTexIDObj->unref();
+ fTexIDObj = NULL;
+ GrSafeUnref(fRenderTarget);
+ }
}
-void GrGLTexture::abandon() {
- fTexIDObj->abandon();
+void GrGLTexture::onAbandon() {
+ if (NULL != fTexIDObj) {
+ fTexIDObj->abandon();
+ }
if (NULL != fRenderTarget) {
fRenderTarget->abandon();
}
}
GrRenderTarget* GrGLTexture::asRenderTarget() {
- return (GrRenderTarget*)fRenderTarget;
+ return fRenderTarget;
}
void GrGLTexture::releaseRenderTarget() {
@@ -158,8 +168,8 @@
uint32_t width,
uint32_t height,
const void* srcData) {
-
- fGpuGL->setSpareTextureUnit();
+
+ GPUGL->setSpareTextureUnit();
// glCompressedTexSubImage2D doesn't support any formats
// (at least without extensions)
@@ -170,7 +180,7 @@
GrAssert(kTopDown_Orientation == fOrientation);
GR_GL(BindTexture(GR_GL_TEXTURE_2D, fTexIDObj->id()));
GR_GL(PixelStorei(GR_GL_UNPACK_ALIGNMENT, fUploadByteCount));
- GR_GL(TexSubImage2D(GR_GL_TEXTURE_2D, 0, x, y, width, height,
+ GR_GL(TexSubImage2D(GR_GL_TEXTURE_2D, 0, x, y, width, height,
fUploadFormat, fUploadType, srcData));
}