GrGLRenderTarget.cpp revision 3cb406bb88f5aa09cf9f5a9554b4b1314cf1a2ee
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 fTexIDObj = texID; 24 GrSafeRef(fTexIDObj); 25} 26 27namespace { 28GrTextureDesc MakeDesc(GrTextureFlags flags, 29 int width, int height, 30 GrPixelConfig config, int sampleCnt, 31 GrSurfaceOrigin origin) { 32 GrTextureDesc temp; 33 temp.fFlags = flags; 34 temp.fWidth = width; 35 temp.fHeight = height; 36 temp.fConfig = config; 37 temp.fSampleCnt = sampleCnt; 38 temp.fOrigin = origin; 39 return temp; 40} 41 42}; 43 44GrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu, 45 const Desc& desc, 46 const GrGLIRect& viewport, 47 GrGLTexID* texID, 48 GrGLTexture* texture) 49 : INHERITED(gpu, 50 desc.fIsWrapped, 51 texture, 52 MakeDesc(kNone_GrTextureFlags, 53 viewport.fWidth, viewport.fHeight, 54 desc.fConfig, desc.fSampleCnt, 55 desc.fOrigin)) { 56 GrAssert(NULL != texID); 57 GrAssert(NULL != texture); 58 // FBO 0 can't also be a texture, right? 59 GrAssert(0 != desc.fRTFBOID); 60 GrAssert(0 != desc.fTexFBOID); 61 62 // we assume this is true, TODO: get rid of viewport as a param. 63 GrAssert(viewport.fWidth == texture->width()); 64 GrAssert(viewport.fHeight == texture->height()); 65 66 this->init(desc, viewport, texID); 67} 68 69GrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu, 70 const Desc& desc, 71 const GrGLIRect& viewport) 72 : INHERITED(gpu, 73 desc.fIsWrapped, 74 NULL, 75 MakeDesc(kNone_GrTextureFlags, 76 viewport.fWidth, viewport.fHeight, 77 desc.fConfig, desc.fSampleCnt, 78 desc.fOrigin)) { 79 this->init(desc, viewport, NULL); 80} 81 82void GrGLRenderTarget::onRelease() { 83 GPUGL->notifyRenderTargetDelete(this); 84 if (!this->isWrapped()) { 85 if (fTexFBOID) { 86 GL_CALL(DeleteFramebuffers(1, &fTexFBOID)); 87 } 88 if (fRTFBOID && fRTFBOID != fTexFBOID) { 89 GL_CALL(DeleteFramebuffers(1, &fRTFBOID)); 90 } 91 if (fMSColorRenderbufferID) { 92 GL_CALL(DeleteRenderbuffers(1, &fMSColorRenderbufferID)); 93 } 94 } 95 fRTFBOID = 0; 96 fTexFBOID = 0; 97 fMSColorRenderbufferID = 0; 98 GrSafeUnref(fTexIDObj); 99 fTexIDObj = NULL; 100 INHERITED::onRelease(); 101} 102 103void GrGLRenderTarget::onAbandon() { 104 fRTFBOID = 0; 105 fTexFBOID = 0; 106 fMSColorRenderbufferID = 0; 107 if (NULL != fTexIDObj) { 108 fTexIDObj->abandon(); 109 fTexIDObj = NULL; 110 } 111 INHERITED::onAbandon(); 112} 113