GrGLRenderTarget.h 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
9#ifndef GrGLRenderTarget_DEFINED
10#define GrGLRenderTarget_DEFINED
11
12#include "GrGLIRect.h"
13#include "GrRenderTarget.h"
14#include "SkScalar.h"
15
16class GrGpuGL;
17class GrGLTexture;
18class GrGLTexID;
19
20class GrGLRenderTarget : public GrRenderTarget {
21
22public:
23    // set fTexFBOID to this value to indicate that it is multisampled but
24    // Gr doesn't know how to resolve it.
25    enum { kUnresolvableFBOID = 0 };
26
27    struct Desc {
28        GrGLuint         fRTFBOID;
29        GrGLuint         fTexFBOID;
30        GrGLuint         fMSColorRenderbufferID;
31        bool             fIsWrapped;
32        GrPixelConfig    fConfig;
33        int              fSampleCnt;
34        GrSurfaceOrigin  fOrigin;
35    };
36
37    // creates a GrGLRenderTarget associated with a texture
38    GrGLRenderTarget(GrGpuGL*          gpu,
39                     const Desc&       desc,
40                     const GrGLIRect&  viewport,
41                     GrGLTexID*        texID,
42                     GrGLTexture*      texture);
43
44    // creates an independent GrGLRenderTarget
45    GrGLRenderTarget(GrGpuGL*          gpu,
46                     const Desc&       desc,
47                     const GrGLIRect&  viewport);
48
49    virtual ~GrGLRenderTarget() { this->release(); }
50
51    void setViewport(const GrGLIRect& rect) { fViewport = rect; }
52    const GrGLIRect& getViewport() const { return fViewport; }
53
54    // The following two functions return the same ID when a
55    // texture/render target is multisampled, and different IDs when
56    // it is.
57    // FBO ID used to render into
58    GrGLuint renderFBOID() const { return fRTFBOID; }
59    // FBO ID that has texture ID attached.
60    GrGLuint textureFBOID() const { return fTexFBOID; }
61
62    // override of GrRenderTarget
63    virtual GrBackendObject getRenderTargetHandle() const {
64        return this->renderFBOID();
65    }
66    virtual GrBackendObject getRenderTargetResolvedHandle() const {
67        return this->textureFBOID();
68    }
69    virtual ResolveType getResolveType() const {
70
71        if (!this->isMultisampled() ||
72            fRTFBOID == fTexFBOID) {
73            // catches FBO 0 and non MSAA case
74            return kAutoResolves_ResolveType;
75        } else if (kUnresolvableFBOID == fTexFBOID) {
76            return kCantResolve_ResolveType;
77        } else {
78            return kCanResolve_ResolveType;
79        }
80    }
81
82protected:
83    // override of GrResource
84    virtual void onAbandon() SK_OVERRIDE;
85    virtual void onRelease() SK_OVERRIDE;
86
87private:
88    GrGLuint      fRTFBOID;
89    GrGLuint      fTexFBOID;
90
91    GrGLuint      fMSColorRenderbufferID;
92
93    // when we switch to this render target we want to set the viewport to
94    // only render to to content area (as opposed to the whole allocation) and
95    // we want the rendering to be at top left (GL has origin in bottom left)
96    GrGLIRect fViewport;
97
98    // non-NULL if this RT was created by Gr with an associated GrGLTexture.
99    GrGLTexID* fTexIDObj;
100
101    void init(const Desc& desc, const GrGLIRect& viewport, GrGLTexID* texID);
102
103    typedef GrRenderTarget INHERITED;
104};
105
106#endif
107