1 2/* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10#include "GrGLRenderTarget.h" 11 12#include "GrGpuGL.h" 13 14#define GPUGL static_cast<GrGpuGL*>(getGpu()) 15 16#define GL_CALL(X) GR_GL_CALL(GPUGL->glInterface(), X) 17 18void GrGLRenderTarget::init(const Desc& desc, 19 const GrGLIRect& viewport, 20 GrGLTexID* texID) { 21 fRTFBOID = desc.fRTFBOID; 22 fTexFBOID = desc.fTexFBOID; 23 fMSColorRenderbufferID = desc.fMSColorRenderbufferID; 24 fViewport = viewport; 25 fOwnIDs = desc.fOwnIDs; 26 fTexIDObj = texID; 27 GrSafeRef(fTexIDObj); 28} 29 30GrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu, 31 const Desc& desc, 32 const GrGLIRect& viewport, 33 GrGLTexID* texID, 34 GrGLTexture* texture) 35 : INHERITED(gpu, 36 texture, 37 viewport.fWidth, 38 viewport.fHeight, 39 desc.fConfig, 40 desc.fSampleCnt) { 41 GrAssert(NULL != texID); 42 GrAssert(NULL != texture); 43 // FBO 0 can't also be a texture, right? 44 GrAssert(0 != desc.fRTFBOID); 45 GrAssert(0 != desc.fTexFBOID); 46 47 // we assume this is true, TODO: get rid of viewport as a param. 48 GrAssert(viewport.fWidth == texture->width()); 49 GrAssert(viewport.fHeight == texture->height()); 50 51 this->init(desc, viewport, texID); 52} 53 54GrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu, 55 const Desc& desc, 56 const GrGLIRect& viewport) 57 : INHERITED(gpu, 58 NULL, 59 viewport.fWidth, 60 viewport.fHeight, 61 desc.fConfig, 62 desc.fSampleCnt) { 63 this->init(desc, viewport, NULL); 64} 65 66void GrGLRenderTarget::onRelease() { 67 GPUGL->notifyRenderTargetDelete(this); 68 if (fOwnIDs) { 69 if (fTexFBOID) { 70 GL_CALL(DeleteFramebuffers(1, &fTexFBOID)); 71 } 72 if (fRTFBOID && fRTFBOID != fTexFBOID) { 73 GL_CALL(DeleteFramebuffers(1, &fRTFBOID)); 74 } 75 if (fMSColorRenderbufferID) { 76 GL_CALL(DeleteRenderbuffers(1, &fMSColorRenderbufferID)); 77 } 78 } 79 fRTFBOID = 0; 80 fTexFBOID = 0; 81 fMSColorRenderbufferID = 0; 82 GrSafeUnref(fTexIDObj); 83 fTexIDObj = NULL; 84 this->setStencilBuffer(NULL); 85} 86 87void GrGLRenderTarget::onAbandon() { 88 fRTFBOID = 0; 89 fTexFBOID = 0; 90 fMSColorRenderbufferID = 0; 91 if (NULL != fTexIDObj) { 92 fTexIDObj->abandon(); 93 fTexIDObj = NULL; 94 } 95 this->setStencilBuffer(NULL); 96} 97 98