1
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9
10#include "GrGLRenderTarget.h"
11
12#include "GrGpuGL.h"
13
14#define GPUGL static_cast<GrGpuGL*>(getGpu())
15
16#define GL_CALL(X) GR_GL_CALL(GPUGL->glInterface(), X)
17
18void GrGLRenderTarget::init(const Desc& desc,
19                            const GrGLIRect& viewport,
20                            GrGLTexID* texID) {
21    fRTFBOID                = desc.fRTFBOID;
22    fTexFBOID               = desc.fTexFBOID;
23    fMSColorRenderbufferID  = desc.fMSColorRenderbufferID;
24    fViewport               = viewport;
25    fOwnIDs                 = desc.fOwnIDs;
26    fTexIDObj               = texID;
27    GrSafeRef(fTexIDObj);
28}
29
30GrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu,
31                                   const Desc& desc,
32                                   const GrGLIRect& viewport,
33                                   GrGLTexID* texID,
34                                   GrGLTexture* texture)
35    : INHERITED(gpu,
36                texture,
37                viewport.fWidth,
38                viewport.fHeight,
39                desc.fConfig,
40                desc.fSampleCnt) {
41    GrAssert(NULL != texID);
42    GrAssert(NULL != texture);
43    // FBO 0 can't also be a texture, right?
44    GrAssert(0 != desc.fRTFBOID);
45    GrAssert(0 != desc.fTexFBOID);
46
47    // we assume this is true, TODO: get rid of viewport as a param.
48    GrAssert(viewport.fWidth == texture->width());
49    GrAssert(viewport.fHeight == texture->height());
50
51    this->init(desc, viewport, texID);
52}
53
54GrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu,
55                                   const Desc& desc,
56                                   const GrGLIRect& viewport)
57    : INHERITED(gpu,
58                NULL,
59                viewport.fWidth,
60                viewport.fHeight,
61                desc.fConfig,
62                desc.fSampleCnt) {
63    this->init(desc, viewport, NULL);
64}
65
66void GrGLRenderTarget::onRelease() {
67    GPUGL->notifyRenderTargetDelete(this);
68    if (fOwnIDs) {
69        if (fTexFBOID) {
70            GL_CALL(DeleteFramebuffers(1, &fTexFBOID));
71        }
72        if (fRTFBOID && fRTFBOID != fTexFBOID) {
73            GL_CALL(DeleteFramebuffers(1, &fRTFBOID));
74        }
75        if (fMSColorRenderbufferID) {
76            GL_CALL(DeleteRenderbuffers(1, &fMSColorRenderbufferID));
77        }
78    }
79    fRTFBOID                = 0;
80    fTexFBOID               = 0;
81    fMSColorRenderbufferID  = 0;
82    GrSafeUnref(fTexIDObj);
83    fTexIDObj = NULL;
84    this->setStencilBuffer(NULL);
85}
86
87void GrGLRenderTarget::onAbandon() {
88    fRTFBOID                = 0;
89    fTexFBOID               = 0;
90    fMSColorRenderbufferID  = 0;
91    if (NULL != fTexIDObj) {
92        fTexIDObj->abandon();
93        fTexIDObj = NULL;
94    }
95    this->setStencilBuffer(NULL);
96}
97
98