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