• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef GrGLRenderTarget_DEFINED
11 #define GrGLRenderTarget_DEFINED
12 
13 #include "GrGLIRect.h"
14 #include "GrRenderTarget.h"
15 #include "GrScalar.h"
16 
17 class GrGpuGL;
18 class GrGLTexture;
19 class GrGLTexID;
20 
21 class GrGLRenderTarget : public GrRenderTarget {
22 
23 public:
24     // set fTexFBOID to this value to indicate that it is multisampled but
25     // Gr doesn't know how to resolve it.
26     enum { kUnresolvableFBOID = 0 };
27 
28     struct Desc {
29         GrGLuint      fRTFBOID;
30         GrGLuint      fTexFBOID;
31         GrGLuint      fMSColorRenderbufferID;
32         bool          fOwnIDs;
33         GrPixelConfig fConfig;
34         int           fSampleCnt;
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 
~GrGLRenderTarget()49     virtual ~GrGLRenderTarget() { this->release(); }
50 
setViewport(const GrGLIRect & rect)51     void setViewport(const GrGLIRect& rect) { fViewport = rect; }
getViewport()52     const GrGLIRect& getViewport() const { return fViewport; }
53 
54     // The following two functions return the same ID when a
55     // texture-rendertarget is multisampled, and different IDs when
56     // it is.
57     // FBO ID used to render into
renderFBOID()58     GrGLuint renderFBOID() const { return fRTFBOID; }
59     // FBO ID that has texture ID attached.
textureFBOID()60     GrGLuint textureFBOID() const { return fTexFBOID; }
61 
62     // override of GrRenderTarget
getRenderTargetHandle()63     virtual intptr_t getRenderTargetHandle() const {
64         return this->renderFBOID();
65     }
getRenderTargetResolvedHandle()66     virtual intptr_t getRenderTargetResolvedHandle() const {
67         return this->textureFBOID();
68     }
getResolveType()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 
82 protected:
83     // override of GrResource
84     virtual void onAbandon();
85     virtual void onRelease();
86 
87 private:
88     GrGLuint      fRTFBOID;
89     GrGLuint      fTexFBOID;
90 
91     GrGLuint      fMSColorRenderbufferID;
92 
93     // Should this object delete IDs when it is destroyed or does someone
94     // else own them.
95     bool        fOwnIDs;
96 
97     // when we switch to this rendertarget we want to set the viewport to
98     // only render to to content area (as opposed to the whole allocation) and
99     // we want the rendering to be at top left (GL has origin in bottom left)
100     GrGLIRect fViewport;
101 
102     // non-NULL if this RT was created by Gr with an associated GrGLTexture.
103     GrGLTexID* fTexIDObj;
104 
105     void init(const Desc& desc, const GrGLIRect& viewport, GrGLTexID* texID);
106 
107     typedef GrRenderTarget INHERITED;
108 };
109 
110 #endif
111