diff -r 000000000000 -r 6474c204b198 gfx/skia/trunk/src/gpu/gl/GrGLRenderTarget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/skia/trunk/src/gpu/gl/GrGLRenderTarget.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,110 @@ +/* + * 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(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; + fTexIDObj.reset(SkSafeRef(texID)); +} + +namespace { +GrTextureDesc MakeDesc(GrTextureFlags flags, + int width, int height, + GrPixelConfig config, int sampleCnt, + GrSurfaceOrigin origin) { + GrTextureDesc temp; + temp.fFlags = flags; + temp.fWidth = width; + temp.fHeight = height; + temp.fConfig = config; + temp.fSampleCnt = sampleCnt; + temp.fOrigin = origin; + return temp; +} + +}; + +GrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu, + const Desc& desc, + const GrGLIRect& viewport, + GrGLTexID* texID, + GrGLTexture* texture) + : INHERITED(gpu, + desc.fIsWrapped, + texture, + MakeDesc(kNone_GrTextureFlags, + viewport.fWidth, viewport.fHeight, + desc.fConfig, desc.fSampleCnt, + desc.fOrigin)) { + SkASSERT(NULL != texID); + SkASSERT(NULL != texture); + // FBO 0 can't also be a texture, right? + SkASSERT(0 != desc.fRTFBOID); + SkASSERT(0 != desc.fTexFBOID); + + // we assume this is true, TODO: get rid of viewport as a param. + SkASSERT(viewport.fWidth == texture->width()); + SkASSERT(viewport.fHeight == texture->height()); + + this->init(desc, viewport, texID); +} + +GrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu, + const Desc& desc, + const GrGLIRect& viewport) + : INHERITED(gpu, + desc.fIsWrapped, + NULL, + MakeDesc(kNone_GrTextureFlags, + viewport.fWidth, viewport.fHeight, + desc.fConfig, desc.fSampleCnt, + desc.fOrigin)) { + this->init(desc, viewport, NULL); +} + +void GrGLRenderTarget::onRelease() { + GPUGL->notifyRenderTargetDelete(this); + if (!this->isWrapped()) { + 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; + fTexIDObj.reset(NULL); + INHERITED::onRelease(); +} + +void GrGLRenderTarget::onAbandon() { + fRTFBOID = 0; + fTexFBOID = 0; + fMSColorRenderbufferID = 0; + if (NULL != fTexIDObj.get()) { + fTexIDObj->abandon(); + fTexIDObj.reset(NULL); + } + INHERITED::onAbandon(); +}