GrGLRenderTarget.cpp revision 3cb406bb88f5aa09cf9f5a9554b4b1314cf1a2ee
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 "GrGpuGL.h"
11
12#define GPUGL static_cast<GrGpuGL*>(getGpu())
13
14#define GL_CALL(X) GR_GL_CALL(GPUGL->glInterface(), X)
15
16void GrGLRenderTarget::init(const Desc& desc,
17                            const GrGLIRect& viewport,
18                            GrGLTexID* texID) {
19    fRTFBOID                = desc.fRTFBOID;
20    fTexFBOID               = desc.fTexFBOID;
21    fMSColorRenderbufferID  = desc.fMSColorRenderbufferID;
22    fViewport               = viewport;
23    fTexIDObj               = texID;
24    GrSafeRef(fTexIDObj);
25}
26
27namespace {
28GrTextureDesc MakeDesc(GrTextureFlags flags,
29                       int width, int height,
30                       GrPixelConfig config, int sampleCnt,
31                       GrSurfaceOrigin origin) {
32    GrTextureDesc temp;
33    temp.fFlags = flags;
34    temp.fWidth = width;
35    temp.fHeight = height;
36    temp.fConfig = config;
37    temp.fSampleCnt = sampleCnt;
38    temp.fOrigin = origin;
39    return temp;
40}
41
42};
43
44GrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu,
45                                   const Desc& desc,
46                                   const GrGLIRect& viewport,
47                                   GrGLTexID* texID,
48                                   GrGLTexture* texture)
49    : INHERITED(gpu,
50                desc.fIsWrapped,
51                texture,
52                MakeDesc(kNone_GrTextureFlags,
53                         viewport.fWidth, viewport.fHeight,
54                         desc.fConfig, desc.fSampleCnt,
55                         desc.fOrigin)) {
56    GrAssert(NULL != texID);
57    GrAssert(NULL != texture);
58    // FBO 0 can't also be a texture, right?
59    GrAssert(0 != desc.fRTFBOID);
60    GrAssert(0 != desc.fTexFBOID);
61
62    // we assume this is true, TODO: get rid of viewport as a param.
63    GrAssert(viewport.fWidth == texture->width());
64    GrAssert(viewport.fHeight == texture->height());
65
66    this->init(desc, viewport, texID);
67}
68
69GrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu,
70                                   const Desc& desc,
71                                   const GrGLIRect& viewport)
72    : INHERITED(gpu,
73                desc.fIsWrapped,
74                NULL,
75                MakeDesc(kNone_GrTextureFlags,
76                         viewport.fWidth, viewport.fHeight,
77                         desc.fConfig, desc.fSampleCnt,
78                         desc.fOrigin)) {
79    this->init(desc, viewport, NULL);
80}
81
82void GrGLRenderTarget::onRelease() {
83    GPUGL->notifyRenderTargetDelete(this);
84    if (!this->isWrapped()) {
85        if (fTexFBOID) {
86            GL_CALL(DeleteFramebuffers(1, &fTexFBOID));
87        }
88        if (fRTFBOID && fRTFBOID != fTexFBOID) {
89            GL_CALL(DeleteFramebuffers(1, &fRTFBOID));
90        }
91        if (fMSColorRenderbufferID) {
92            GL_CALL(DeleteRenderbuffers(1, &fMSColorRenderbufferID));
93        }
94    }
95    fRTFBOID                = 0;
96    fTexFBOID               = 0;
97    fMSColorRenderbufferID  = 0;
98    GrSafeUnref(fTexIDObj);
99    fTexIDObj = NULL;
100    INHERITED::onRelease();
101}
102
103void GrGLRenderTarget::onAbandon() {
104    fRTFBOID                = 0;
105    fTexFBOID               = 0;
106    fMSColorRenderbufferID  = 0;
107    if (NULL != fTexIDObj) {
108        fTexIDObj->abandon();
109        fTexIDObj = NULL;
110    }
111    INHERITED::onAbandon();
112}
113