michael@0: /* michael@0: * Copyright 2011 Google Inc. michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: michael@0: #include "GrGLRenderTarget.h" michael@0: michael@0: #include "GrGpuGL.h" michael@0: michael@0: #define GPUGL static_cast(getGpu()) michael@0: michael@0: #define GL_CALL(X) GR_GL_CALL(GPUGL->glInterface(), X) michael@0: michael@0: void GrGLRenderTarget::init(const Desc& desc, michael@0: const GrGLIRect& viewport, michael@0: GrGLTexID* texID) { michael@0: fRTFBOID = desc.fRTFBOID; michael@0: fTexFBOID = desc.fTexFBOID; michael@0: fMSColorRenderbufferID = desc.fMSColorRenderbufferID; michael@0: fViewport = viewport; michael@0: fTexIDObj.reset(SkSafeRef(texID)); michael@0: } michael@0: michael@0: namespace { michael@0: GrTextureDesc MakeDesc(GrTextureFlags flags, michael@0: int width, int height, michael@0: GrPixelConfig config, int sampleCnt, michael@0: GrSurfaceOrigin origin) { michael@0: GrTextureDesc temp; michael@0: temp.fFlags = flags; michael@0: temp.fWidth = width; michael@0: temp.fHeight = height; michael@0: temp.fConfig = config; michael@0: temp.fSampleCnt = sampleCnt; michael@0: temp.fOrigin = origin; michael@0: return temp; michael@0: } michael@0: michael@0: }; michael@0: michael@0: GrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu, michael@0: const Desc& desc, michael@0: const GrGLIRect& viewport, michael@0: GrGLTexID* texID, michael@0: GrGLTexture* texture) michael@0: : INHERITED(gpu, michael@0: desc.fIsWrapped, michael@0: texture, michael@0: MakeDesc(kNone_GrTextureFlags, michael@0: viewport.fWidth, viewport.fHeight, michael@0: desc.fConfig, desc.fSampleCnt, michael@0: desc.fOrigin)) { michael@0: SkASSERT(NULL != texID); michael@0: SkASSERT(NULL != texture); michael@0: // FBO 0 can't also be a texture, right? michael@0: SkASSERT(0 != desc.fRTFBOID); michael@0: SkASSERT(0 != desc.fTexFBOID); michael@0: michael@0: // we assume this is true, TODO: get rid of viewport as a param. michael@0: SkASSERT(viewport.fWidth == texture->width()); michael@0: SkASSERT(viewport.fHeight == texture->height()); michael@0: michael@0: this->init(desc, viewport, texID); michael@0: } michael@0: michael@0: GrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu, michael@0: const Desc& desc, michael@0: const GrGLIRect& viewport) michael@0: : INHERITED(gpu, michael@0: desc.fIsWrapped, michael@0: NULL, michael@0: MakeDesc(kNone_GrTextureFlags, michael@0: viewport.fWidth, viewport.fHeight, michael@0: desc.fConfig, desc.fSampleCnt, michael@0: desc.fOrigin)) { michael@0: this->init(desc, viewport, NULL); michael@0: } michael@0: michael@0: void GrGLRenderTarget::onRelease() { michael@0: GPUGL->notifyRenderTargetDelete(this); michael@0: if (!this->isWrapped()) { michael@0: if (fTexFBOID) { michael@0: GL_CALL(DeleteFramebuffers(1, &fTexFBOID)); michael@0: } michael@0: if (fRTFBOID && fRTFBOID != fTexFBOID) { michael@0: GL_CALL(DeleteFramebuffers(1, &fRTFBOID)); michael@0: } michael@0: if (fMSColorRenderbufferID) { michael@0: GL_CALL(DeleteRenderbuffers(1, &fMSColorRenderbufferID)); michael@0: } michael@0: } michael@0: fRTFBOID = 0; michael@0: fTexFBOID = 0; michael@0: fMSColorRenderbufferID = 0; michael@0: fTexIDObj.reset(NULL); michael@0: INHERITED::onRelease(); michael@0: } michael@0: michael@0: void GrGLRenderTarget::onAbandon() { michael@0: fRTFBOID = 0; michael@0: fTexFBOID = 0; michael@0: fMSColorRenderbufferID = 0; michael@0: if (NULL != fTexIDObj.get()) { michael@0: fTexIDObj->abandon(); michael@0: fTexIDObj.reset(NULL); michael@0: } michael@0: INHERITED::onAbandon(); michael@0: }