GrGLRenderTarget.cpp revision 6ba6fa15261be591f33cf0e5df7134e4fc6432ac
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 "GrGLGpu.h" 11 12void GrGLFBO::release(const GrGLInterface* gl) { 13 SkASSERT(gl); 14 if (this->isValid()) { 15 GR_GL_CALL(gl, DeleteFramebuffers(1, &fID)); 16 fIsValid = false; 17 } 18} 19 20void GrGLFBO::abandon() { fIsValid = false; } 21 22////////////////////////////////////////////////////////////////////////////// 23 24#define GLGPU static_cast<GrGLGpu*>(this->getGpu()) 25#define GL_CALL(X) GR_GL_CALL(GLGPU->glInterface(), X) 26 27// Because this class is virtually derived from GrSurface we must explicitly call its constructor. 28GrGLRenderTarget::GrGLRenderTarget(GrGLGpu* gpu, const GrSurfaceDesc& desc, const IDDesc& idDesc) 29 : GrSurface(gpu, idDesc.fLifeCycle, desc) 30 , INHERITED(gpu, idDesc.fLifeCycle, desc) { 31 this->init(desc, idDesc); 32 this->registerWithCache(); 33} 34 35GrGLRenderTarget::GrGLRenderTarget(GrGLGpu* gpu, const GrSurfaceDesc& desc, const IDDesc& idDesc, 36 Derived) 37 : GrSurface(gpu, idDesc.fLifeCycle, desc) 38 , INHERITED(gpu, idDesc.fLifeCycle, desc) { 39 this->init(desc, idDesc); 40} 41 42void GrGLRenderTarget::init(const GrSurfaceDesc& desc, const IDDesc& idDesc) { 43 fRenderFBO.reset(SkRef(idDesc.fRenderFBO.get())); 44 fTextureFBO.reset(SkSafeRef(idDesc.fTextureFBO.get())); 45 SkASSERT(fRenderFBO->isValid()); 46 SkASSERT(!fTextureFBO || fTextureFBO->isValid()); 47 fMSColorRenderbufferID = idDesc.fMSColorRenderbufferID; 48 fIsWrapped = kWrapped_LifeCycle == idDesc.fLifeCycle; 49 50 fViewport.fLeft = 0; 51 fViewport.fBottom = 0; 52 fViewport.fWidth = desc.fWidth; 53 fViewport.fHeight = desc.fHeight; 54 55 // We own one color value for each MSAA sample. 56 fColorValuesPerPixel = SkTMax(1, fDesc.fSampleCnt); 57 if (fTextureFBO && fTextureFBO != fRenderFBO) { 58 // If we own the resolve buffer then that is one more sample per pixel. 59 fColorValuesPerPixel += 1; 60 } 61} 62 63size_t GrGLRenderTarget::onGpuMemorySize() const { 64 SkASSERT(kUnknown_GrPixelConfig != fDesc.fConfig); 65 SkASSERT(!GrPixelConfigIsCompressed(fDesc.fConfig)); 66 size_t colorBytes = GrBytesPerPixel(fDesc.fConfig); 67 SkASSERT(colorBytes > 0); 68 return fColorValuesPerPixel * fDesc.fWidth * fDesc.fHeight * colorBytes; 69} 70 71void GrGLRenderTarget::onRelease() { 72 if (!fIsWrapped) { 73 const GrGLInterface* gl = GLGPU->glInterface(); 74 if (fRenderFBO) { 75 fRenderFBO->release(gl); 76 fRenderFBO.reset(NULL); 77 } 78 if (fTextureFBO) { 79 fTextureFBO->release(gl); 80 fTextureFBO.reset(NULL); 81 } 82 if (fMSColorRenderbufferID) { 83 GL_CALL(DeleteRenderbuffers(1, &fMSColorRenderbufferID)); 84 fMSColorRenderbufferID = 0; 85 } 86 } else { 87 if (fRenderFBO) { 88 fRenderFBO->abandon(); 89 fRenderFBO.reset(NULL); 90 } 91 if (fTextureFBO) { 92 fTextureFBO->abandon(); 93 fTextureFBO.reset(NULL); 94 } 95 fMSColorRenderbufferID = 0; 96 } 97 INHERITED::onRelease(); 98} 99 100void GrGLRenderTarget::onAbandon() { 101 if (fRenderFBO) { 102 fRenderFBO->abandon(); 103 fRenderFBO.reset(NULL); 104 } 105 if (fTextureFBO) { 106 fTextureFBO->abandon(); 107 fTextureFBO.reset(NULL); 108 } 109 fMSColorRenderbufferID = 0; 110 INHERITED::onAbandon(); 111} 112