1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/gpu/gl/GrGLRenderTarget.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,110 @@ 1.4 +/* 1.5 + * Copyright 2011 Google Inc. 1.6 + * 1.7 + * Use of this source code is governed by a BSD-style license that can be 1.8 + * found in the LICENSE file. 1.9 + */ 1.10 + 1.11 +#include "GrGLRenderTarget.h" 1.12 + 1.13 +#include "GrGpuGL.h" 1.14 + 1.15 +#define GPUGL static_cast<GrGpuGL*>(getGpu()) 1.16 + 1.17 +#define GL_CALL(X) GR_GL_CALL(GPUGL->glInterface(), X) 1.18 + 1.19 +void GrGLRenderTarget::init(const Desc& desc, 1.20 + const GrGLIRect& viewport, 1.21 + GrGLTexID* texID) { 1.22 + fRTFBOID = desc.fRTFBOID; 1.23 + fTexFBOID = desc.fTexFBOID; 1.24 + fMSColorRenderbufferID = desc.fMSColorRenderbufferID; 1.25 + fViewport = viewport; 1.26 + fTexIDObj.reset(SkSafeRef(texID)); 1.27 +} 1.28 + 1.29 +namespace { 1.30 +GrTextureDesc MakeDesc(GrTextureFlags flags, 1.31 + int width, int height, 1.32 + GrPixelConfig config, int sampleCnt, 1.33 + GrSurfaceOrigin origin) { 1.34 + GrTextureDesc temp; 1.35 + temp.fFlags = flags; 1.36 + temp.fWidth = width; 1.37 + temp.fHeight = height; 1.38 + temp.fConfig = config; 1.39 + temp.fSampleCnt = sampleCnt; 1.40 + temp.fOrigin = origin; 1.41 + return temp; 1.42 +} 1.43 + 1.44 +}; 1.45 + 1.46 +GrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu, 1.47 + const Desc& desc, 1.48 + const GrGLIRect& viewport, 1.49 + GrGLTexID* texID, 1.50 + GrGLTexture* texture) 1.51 + : INHERITED(gpu, 1.52 + desc.fIsWrapped, 1.53 + texture, 1.54 + MakeDesc(kNone_GrTextureFlags, 1.55 + viewport.fWidth, viewport.fHeight, 1.56 + desc.fConfig, desc.fSampleCnt, 1.57 + desc.fOrigin)) { 1.58 + SkASSERT(NULL != texID); 1.59 + SkASSERT(NULL != texture); 1.60 + // FBO 0 can't also be a texture, right? 1.61 + SkASSERT(0 != desc.fRTFBOID); 1.62 + SkASSERT(0 != desc.fTexFBOID); 1.63 + 1.64 + // we assume this is true, TODO: get rid of viewport as a param. 1.65 + SkASSERT(viewport.fWidth == texture->width()); 1.66 + SkASSERT(viewport.fHeight == texture->height()); 1.67 + 1.68 + this->init(desc, viewport, texID); 1.69 +} 1.70 + 1.71 +GrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu, 1.72 + const Desc& desc, 1.73 + const GrGLIRect& viewport) 1.74 + : INHERITED(gpu, 1.75 + desc.fIsWrapped, 1.76 + NULL, 1.77 + MakeDesc(kNone_GrTextureFlags, 1.78 + viewport.fWidth, viewport.fHeight, 1.79 + desc.fConfig, desc.fSampleCnt, 1.80 + desc.fOrigin)) { 1.81 + this->init(desc, viewport, NULL); 1.82 +} 1.83 + 1.84 +void GrGLRenderTarget::onRelease() { 1.85 + GPUGL->notifyRenderTargetDelete(this); 1.86 + if (!this->isWrapped()) { 1.87 + if (fTexFBOID) { 1.88 + GL_CALL(DeleteFramebuffers(1, &fTexFBOID)); 1.89 + } 1.90 + if (fRTFBOID && fRTFBOID != fTexFBOID) { 1.91 + GL_CALL(DeleteFramebuffers(1, &fRTFBOID)); 1.92 + } 1.93 + if (fMSColorRenderbufferID) { 1.94 + GL_CALL(DeleteRenderbuffers(1, &fMSColorRenderbufferID)); 1.95 + } 1.96 + } 1.97 + fRTFBOID = 0; 1.98 + fTexFBOID = 0; 1.99 + fMSColorRenderbufferID = 0; 1.100 + fTexIDObj.reset(NULL); 1.101 + INHERITED::onRelease(); 1.102 +} 1.103 + 1.104 +void GrGLRenderTarget::onAbandon() { 1.105 + fRTFBOID = 0; 1.106 + fTexFBOID = 0; 1.107 + fMSColorRenderbufferID = 0; 1.108 + if (NULL != fTexIDObj.get()) { 1.109 + fTexIDObj->abandon(); 1.110 + fTexIDObj.reset(NULL); 1.111 + } 1.112 + INHERITED::onAbandon(); 1.113 +}