• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
16 class GrGpuGL;
17 class GrGLTexture;
18 class GrGLTexID;
19 
20 class GrGLRenderTarget : public GrRenderTarget {
21 
22 public:
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         bool             fCheckAllocation;
36     };
37 
38     // creates a GrGLRenderTarget associated with a texture
39     GrGLRenderTarget(GrGpuGL*          gpu,
40                      const Desc&       desc,
41                      const GrGLIRect&  viewport,
42                      GrGLTexID*        texID,
43                      GrGLTexture*      texture);
44 
45     // creates an independent GrGLRenderTarget
46     GrGLRenderTarget(GrGpuGL*          gpu,
47                      const Desc&       desc,
48                      const GrGLIRect&  viewport);
49 
~GrGLRenderTarget()50     virtual ~GrGLRenderTarget() { this->release(); }
51 
setViewport(const GrGLIRect & rect)52     void setViewport(const GrGLIRect& rect) { fViewport = rect; }
getViewport()53     const GrGLIRect& getViewport() const { return fViewport; }
54 
55     // The following two functions return the same ID when a
56     // texture/render target is multisampled, and different IDs when
57     // it is.
58     // FBO ID used to render into
renderFBOID()59     GrGLuint renderFBOID() const { return fRTFBOID; }
60     // FBO ID that has texture ID attached.
textureFBOID()61     GrGLuint textureFBOID() const { return fTexFBOID; }
62 
63     // override of GrRenderTarget
getRenderTargetHandle()64     virtual GrBackendObject getRenderTargetHandle() const {
65         return this->renderFBOID();
66     }
getRenderTargetResolvedHandle()67     virtual GrBackendObject getRenderTargetResolvedHandle() const {
68         return this->textureFBOID();
69     }
getResolveType()70     virtual ResolveType getResolveType() const {
71 
72         if (!this->isMultisampled() ||
73             fRTFBOID == fTexFBOID) {
74             // catches FBO 0 and non MSAA case
75             return kAutoResolves_ResolveType;
76         } else if (kUnresolvableFBOID == fTexFBOID) {
77             return kCantResolve_ResolveType;
78         } else {
79             return kCanResolve_ResolveType;
80         }
81     }
82 
83 protected:
84     // override of GrResource
85     virtual void onAbandon() SK_OVERRIDE;
86     virtual void onRelease() SK_OVERRIDE;
87 
88 private:
89     GrGLuint      fRTFBOID;
90     GrGLuint      fTexFBOID;
91 
92     GrGLuint      fMSColorRenderbufferID;
93 
94     // when we switch to this render target we want to set the viewport to
95     // only render to to content area (as opposed to the whole allocation) and
96     // we want the rendering to be at top left (GL has origin in bottom left)
97     GrGLIRect fViewport;
98 
99     // non-NULL if this RT was created by Gr with an associated GrGLTexture.
100     SkAutoTUnref<GrGLTexID> fTexIDObj;
101 
102     void init(const Desc& desc, const GrGLIRect& viewport, GrGLTexID* texID);
103 
104     typedef GrRenderTarget INHERITED;
105 };
106 
107 #endif
108