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