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.reset(SkSafeRef(texID));
24    this->registerWithCache();
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    SkASSERT(texID);
57    SkASSERT(texture);
58    // FBO 0 can't also be a texture, right?
59    SkASSERT(0 != desc.fRTFBOID);
60    SkASSERT(0 != desc.fTexFBOID);
61
62    // we assume this is true, TODO: get rid of viewport as a param.
63    SkASSERT(viewport.fWidth == texture->width());
64    SkASSERT(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    if (!this->isWrapped()) {
84        if (fTexFBOID) {
85            GL_CALL(DeleteFramebuffers(1, &fTexFBOID));
86        }
87        if (fRTFBOID && fRTFBOID != fTexFBOID) {
88            GL_CALL(DeleteFramebuffers(1, &fRTFBOID));
89        }
90        if (fMSColorRenderbufferID) {
91            GL_CALL(DeleteRenderbuffers(1, &fMSColorRenderbufferID));
92        }
93    }
94    fRTFBOID                = 0;
95    fTexFBOID               = 0;
96    fMSColorRenderbufferID  = 0;
97    fTexIDObj.reset(NULL);
98    INHERITED::onRelease();
99}
100
101void GrGLRenderTarget::onAbandon() {
102    fRTFBOID                = 0;
103    fTexFBOID               = 0;
104    fMSColorRenderbufferID  = 0;
105    if (fTexIDObj.get()) {
106        fTexIDObj->abandon();
107        fTexIDObj.reset(NULL);
108    }
109    INHERITED::onAbandon();
110}
111