| |
| /* |
| * Copyright 2011 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| |
| #include "GrGLRenderTarget.h" |
| |
| #include "GrGpuGL.h" |
| |
| #define GPUGL static_cast<GrGpuGL*>(getGpu()) |
| |
| #define GL_CALL(X) GR_GL_CALL(GPUGL->glInterface(), X) |
| |
| void GrGLRenderTarget::init(const Desc& desc, |
| const GrGLIRect& viewport, |
| GrGLTexID* texID) { |
| fRTFBOID = desc.fRTFBOID; |
| fTexFBOID = desc.fTexFBOID; |
| fMSColorRenderbufferID = desc.fMSColorRenderbufferID; |
| fViewport = viewport; |
| fOwnIDs = desc.fOwnIDs; |
| fTexIDObj = texID; |
| GrSafeRef(fTexIDObj); |
| } |
| |
| GrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu, |
| const Desc& desc, |
| const GrGLIRect& viewport, |
| GrGLTexID* texID, |
| GrGLTexture* texture) |
| : INHERITED(gpu, |
| texture, |
| viewport.fWidth, |
| viewport.fHeight, |
| desc.fConfig, |
| desc.fSampleCnt) { |
| GrAssert(NULL != texID); |
| GrAssert(NULL != texture); |
| // FBO 0 can't also be a texture, right? |
| GrAssert(0 != desc.fRTFBOID); |
| GrAssert(0 != desc.fTexFBOID); |
| |
| // we assume this is true, TODO: get rid of viewport as a param. |
| GrAssert(viewport.fWidth == texture->width()); |
| GrAssert(viewport.fHeight == texture->height()); |
| |
| this->init(desc, viewport, texID); |
| } |
| |
| GrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu, |
| const Desc& desc, |
| const GrGLIRect& viewport) |
| : INHERITED(gpu, |
| NULL, |
| viewport.fWidth, |
| viewport.fHeight, |
| desc.fConfig, |
| desc.fSampleCnt) { |
| this->init(desc, viewport, NULL); |
| } |
| |
| void GrGLRenderTarget::onRelease() { |
| GPUGL->notifyRenderTargetDelete(this); |
| if (fOwnIDs) { |
| if (fTexFBOID) { |
| GL_CALL(DeleteFramebuffers(1, &fTexFBOID)); |
| } |
| if (fRTFBOID && fRTFBOID != fTexFBOID) { |
| GL_CALL(DeleteFramebuffers(1, &fRTFBOID)); |
| } |
| if (fMSColorRenderbufferID) { |
| GL_CALL(DeleteRenderbuffers(1, &fMSColorRenderbufferID)); |
| } |
| } |
| fRTFBOID = 0; |
| fTexFBOID = 0; |
| fMSColorRenderbufferID = 0; |
| GrSafeUnref(fTexIDObj); |
| fTexIDObj = NULL; |
| this->setStencilBuffer(NULL); |
| } |
| |
| void GrGLRenderTarget::onAbandon() { |
| fRTFBOID = 0; |
| fTexFBOID = 0; |
| fMSColorRenderbufferID = 0; |
| if (NULL != fTexIDObj) { |
| fTexIDObj->abandon(); |
| fTexIDObj = NULL; |
| } |
| this->setStencilBuffer(NULL); |
| } |
| |