GrGLRenderTarget.cpp revision 39edf7664f50b6c890b933b5bbed67a8735b349b
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 12861e1037017bbb7ac52ec5ebecab3a636a82a3e8bsalomon#define GPUGL static_cast<GrGLGpu*>(this->getGpu()) 130b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com#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) 1737dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon : GrSurface(gpu, idDesc.fIsWrapped, desc) 1837dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon , INHERITED(gpu, idDesc.fIsWrapped, 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) 2537dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon : GrSurface(gpu, idDesc.fIsWrapped, desc) 2637dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon , INHERITED(gpu, idDesc.fIsWrapped, desc) { 2737dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon this->init(desc, idDesc); 2837dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon} 2937dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon 3037dd331b20a92ce79cc26556e065dec98a66cb0bbsalomonvoid GrGLRenderTarget::init(const GrSurfaceDesc& desc, const IDDesc& idDesc) { 3137dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon fRTFBOID = idDesc.fRTFBOID; 3237dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon fTexFBOID = idDesc.fTexFBOID; 3337dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon fMSColorRenderbufferID = idDesc.fMSColorRenderbufferID; 349a0c7abfd7ce8694136840fa224e99579b8329f6hendrikw fIsWrapped = idDesc.fIsWrapped; 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. 4237dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon fColorValuesPerPixel = SkTMax(1, fDesc.fSampleCnt); 4337dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon if (fTexFBOID != fRTFBOID) { 4437dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon // If we own the resolve buffer then that is one more sample per pixel. 4537dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon fColorValuesPerPixel += 1; 4637dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon } 475bfc21761e0ce41206acac4c5008fc0f24debd44bsalomon@google.com} 485bfc21761e0ce41206acac4c5008fc0f24debd44bsalomon@google.com 4969ed47f42d4877c178fdc0031cb01af2966ae235bsalomonsize_t GrGLRenderTarget::onGpuMemorySize() const { 5037dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon SkASSERT(kUnknown_GrPixelConfig != fDesc.fConfig); 5137dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon SkASSERT(!GrPixelConfigIsCompressed(fDesc.fConfig)); 5237dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon size_t colorBytes = GrBytesPerPixel(fDesc.fConfig); 5337dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon SkASSERT(colorBytes > 0); 5437dd331b20a92ce79cc26556e065dec98a66cb0bbsalomon return fColorValuesPerPixel * fDesc.fWidth * fDesc.fHeight * colorBytes; 555bfc21761e0ce41206acac4c5008fc0f24debd44bsalomon@google.com} 565bfc21761e0ce41206acac4c5008fc0f24debd44bsalomon@google.com 57aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.comvoid GrGLRenderTarget::onRelease() { 589a0c7abfd7ce8694136840fa224e99579b8329f6hendrikw if (!fIsWrapped) { 59aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com if (fTexFBOID) { 600b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GL_CALL(DeleteFramebuffers(1, &fTexFBOID)); 61aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com } 62aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com if (fRTFBOID && fRTFBOID != fTexFBOID) { 630b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GL_CALL(DeleteFramebuffers(1, &fRTFBOID)); 64aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com } 65aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com if (fMSColorRenderbufferID) { 660b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GL_CALL(DeleteRenderbuffers(1, &fMSColorRenderbufferID)); 67aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com } 68aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com } 69aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com fRTFBOID = 0; 70aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com fTexFBOID = 0; 71aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com fMSColorRenderbufferID = 0; 729a0c7abfd7ce8694136840fa224e99579b8329f6hendrikw fIsWrapped = false; 73d6bbbf8a831cc982cda9b91e84c5600c631af5b2robertphillips@google.com INHERITED::onRelease(); 74aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com} 75aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com 76aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.comvoid GrGLRenderTarget::onAbandon() { 77aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com fRTFBOID = 0; 78aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com fTexFBOID = 0; 79aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com fMSColorRenderbufferID = 0; 809a0c7abfd7ce8694136840fa224e99579b8329f6hendrikw fIsWrapped = false; 81d6bbbf8a831cc982cda9b91e84c5600c631af5b2robertphillips@google.com INHERITED::onAbandon(); 82aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com} 83