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