1aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com/* 2aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com * Copyright 2011 Google Inc. 3aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com * 4aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com * Use of this source code is governed by a BSD-style license that can be 5aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com * found in the LICENSE file. 6aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com */ 7aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com 8aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com#include "GrGLRenderTarget.h" 9aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com 1039edf7664f50b6c890b933b5bbed67a8735b349bjvanverth#include "GrGLGpu.h" 11aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com 12d803f2731f778317b46da64bce6e7a8a221ffccdegdaniel#define GPUGL static_cast<GrGLGpu*>(this->getGpu()) 13d803f2731f778317b46da64bce6e7a8a221ffccdegdaniel#define GL_CALL(X) GR_GL_CALL(GPUGL->glInterface(), X) 140b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com 1537dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon// Because this class is virtually derived from GrSurface we must explicitly call its constructor. 16861e1037017bbb7ac52ec5ebecab3a636a82a3e8bsalomonGrGLRenderTarget::GrGLRenderTarget(GrGLGpu* gpu, const GrSurfaceDesc& desc, const IDDesc& idDesc) 175236cf480daf82b2f36e42795abdbbc915533a59bsalomon : GrSurface(gpu, idDesc.fLifeCycle, desc) 185236cf480daf82b2f36e42795abdbbc915533a59bsalomon , INHERITED(gpu, idDesc.fLifeCycle, desc) { 1937dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon this->init(desc, idDesc); 20169612621f00b3fe9f71014079991287d311751absalomon this->registerWithCache(); 21aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com} 22aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com 23861e1037017bbb7ac52ec5ebecab3a636a82a3e8bsalomonGrGLRenderTarget::GrGLRenderTarget(GrGLGpu* gpu, const GrSurfaceDesc& desc, const IDDesc& idDesc, 2437dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon Derived) 255236cf480daf82b2f36e42795abdbbc915533a59bsalomon : GrSurface(gpu, idDesc.fLifeCycle, desc) 265236cf480daf82b2f36e42795abdbbc915533a59bsalomon , INHERITED(gpu, idDesc.fLifeCycle, desc) { 2737dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon this->init(desc, idDesc); 2837dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon} 2937dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon 3037dd331b20a92ce79cc26556e065dec98a66cb0bbsalomonvoid GrGLRenderTarget::init(const GrSurfaceDesc& desc, const IDDesc& idDesc) { 31d803f2731f778317b46da64bce6e7a8a221ffccdegdaniel fRTFBOID = idDesc.fRTFBOID; 32d803f2731f778317b46da64bce6e7a8a221ffccdegdaniel fTexFBOID = idDesc.fTexFBOID; 3337dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon fMSColorRenderbufferID = idDesc.fMSColorRenderbufferID; 345236cf480daf82b2f36e42795abdbbc915533a59bsalomon fIsWrapped = kWrapped_LifeCycle == idDesc.fLifeCycle; 359962108c400dadcae913614e8a5ab781780981d8bsalomon@google.com 3637dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon fViewport.fLeft = 0; 3737dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon fViewport.fBottom = 0; 3837dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon fViewport.fWidth = desc.fWidth; 3937dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon fViewport.fHeight = desc.fHeight; 409962108c400dadcae913614e8a5ab781780981d8bsalomon@google.com 4137dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon // We own one color value for each MSAA sample. 42d298121f5d753b21c62709ae33ac08ddb053c719senorblanco int colorValuesPerPixel = SkTMax(1, fDesc.fSampleCnt); 43d803f2731f778317b46da64bce6e7a8a221ffccdegdaniel if (fTexFBOID != fRTFBOID) { 4437dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon // If we own the resolve buffer then that is one more sample per pixel. 45d298121f5d753b21c62709ae33ac08ddb053c719senorblanco colorValuesPerPixel += 1; 46d298121f5d753b21c62709ae33ac08ddb053c719senorblanco } else if (fTexFBOID != 0) { 47d298121f5d753b21c62709ae33ac08ddb053c719senorblanco // For auto-resolving FBOs, the MSAA buffer is free. 48d298121f5d753b21c62709ae33ac08ddb053c719senorblanco colorValuesPerPixel = 1; 49d298121f5d753b21c62709ae33ac08ddb053c719senorblanco } 5037dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon SkASSERT(kUnknown_GrPixelConfig != fDesc.fConfig); 5137dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon SkASSERT(!GrPixelConfigIsCompressed(fDesc.fConfig)); 5237dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon size_t colorBytes = GrBytesPerPixel(fDesc.fConfig); 5337dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon SkASSERT(colorBytes > 0); 54d298121f5d753b21c62709ae33ac08ddb053c719senorblanco fGpuMemorySize = colorValuesPerPixel * fDesc.fWidth * fDesc.fHeight * colorBytes; 55d298121f5d753b21c62709ae33ac08ddb053c719senorblanco} 56d298121f5d753b21c62709ae33ac08ddb053c719senorblanco 57d298121f5d753b21c62709ae33ac08ddb053c719senorblancosize_t GrGLRenderTarget::onGpuMemorySize() const { 58d298121f5d753b21c62709ae33ac08ddb053c719senorblanco return fGpuMemorySize; 595bfc21761e0ce41206acac4c5008fc0f24debd44bsalomon@google.com} 605bfc21761e0ce41206acac4c5008fc0f24debd44bsalomon@google.com 61aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.comvoid GrGLRenderTarget::onRelease() { 629a0c7abfd7ce8694136840fa224e99579b8329f6hendrikw if (!fIsWrapped) { 63d803f2731f778317b46da64bce6e7a8a221ffccdegdaniel if (fTexFBOID) { 64d803f2731f778317b46da64bce6e7a8a221ffccdegdaniel GL_CALL(DeleteFramebuffers(1, &fTexFBOID)); 65aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com } 66d803f2731f778317b46da64bce6e7a8a221ffccdegdaniel if (fRTFBOID && fRTFBOID != fTexFBOID) { 67d803f2731f778317b46da64bce6e7a8a221ffccdegdaniel GL_CALL(DeleteFramebuffers(1, &fRTFBOID)); 68aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com } 69aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com if (fMSColorRenderbufferID) { 700b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GL_CALL(DeleteRenderbuffers(1, &fMSColorRenderbufferID)); 71aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com } 72aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com } 73d803f2731f778317b46da64bce6e7a8a221ffccdegdaniel fRTFBOID = 0; 74d803f2731f778317b46da64bce6e7a8a221ffccdegdaniel fTexFBOID = 0; 75d803f2731f778317b46da64bce6e7a8a221ffccdegdaniel fMSColorRenderbufferID = 0; 76d803f2731f778317b46da64bce6e7a8a221ffccdegdaniel fIsWrapped = false; 77d6bbbf8a831cc982cda9b91e84c5600c631af5b2robertphillips@google.com INHERITED::onRelease(); 78aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com} 79aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com 80aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.comvoid GrGLRenderTarget::onAbandon() { 81d803f2731f778317b46da64bce6e7a8a221ffccdegdaniel fRTFBOID = 0; 82d803f2731f778317b46da64bce6e7a8a221ffccdegdaniel fTexFBOID = 0; 83aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com fMSColorRenderbufferID = 0; 84d803f2731f778317b46da64bce6e7a8a221ffccdegdaniel fIsWrapped = false; 85d6bbbf8a831cc982cda9b91e84c5600c631af5b2robertphillips@google.com INHERITED::onAbandon(); 86aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com} 87