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