• 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 #ifndef GrRenderTarget_DEFINED
9 #define GrRenderTarget_DEFINED
10 
11 #include "GrSurface.h"
12 #include "SkRect.h"
13 
14 class GrCaps;
15 class GrRenderTargetOpList;
16 class GrRenderTargetPriv;
17 class GrStencilAttachment;
18 class GrBackendRenderTarget;
19 
20 /**
21  * GrRenderTarget represents a 2D buffer of pixels that can be rendered to.
22  * A context's render target is set by setRenderTarget(). Render targets are
23  * created by a createTexture with the kRenderTarget_SurfaceFlag flag.
24  * Additionally, GrContext provides methods for creating GrRenderTargets
25  * that wrap externally created render targets.
26  */
27 class GrRenderTarget : virtual public GrSurface {
28 public:
alwaysClearStencil()29     virtual bool alwaysClearStencil() const { return false; }
30 
31     // GrSurface overrides
asRenderTarget()32     GrRenderTarget* asRenderTarget() override { return this; }
asRenderTarget()33     const GrRenderTarget* asRenderTarget() const  override { return this; }
34 
35     // GrRenderTarget
isStencilBufferMultisampled()36     bool isStencilBufferMultisampled() const { return fSampleCnt > 1; }
37 
fsaaType()38     GrFSAAType fsaaType() const {
39         SkASSERT(fSampleCnt >= 1);
40         if (fSampleCnt <= 1) {
41             SkASSERT(!(fFlags & GrRenderTargetFlags::kMixedSampled));
42             return GrFSAAType::kNone;
43         }
44         return (fFlags & GrRenderTargetFlags::kMixedSampled) ? GrFSAAType::kMixedSamples
45                                                              : GrFSAAType::kUnifiedMSAA;
46     }
47 
48     /**
49      * Returns the number of samples/pixel in the stencil buffer (Zero if non-MSAA).
50      */
numStencilSamples()51     int numStencilSamples() const { return fSampleCnt; }
52 
53     /**
54      * Returns the number of samples/pixel in the color buffer (Zero if non-MSAA or mixed sampled).
55      */
numColorSamples()56     int numColorSamples() const {
57         return GrFSAAType::kMixedSamples == this->fsaaType() ? 1 : fSampleCnt;
58     }
59 
60     /**
61      * Call to indicate the multisample contents were modified such that the
62      * render target needs to be resolved before it can be used as texture. Gr
63      * tracks this for its own drawing and thus this only needs to be called
64      * when the render target has been modified outside of Gr. This has no
65      * effect on wrapped backend render targets.
66      *
67      * @param rect  a rect bounding the area needing resolve. NULL indicates
68      *              the whole RT needs resolving.
69      */
70     void flagAsNeedingResolve(const SkIRect* rect = nullptr);
71 
72     /**
73      * Call to override the region that needs to be resolved.
74      */
75     void overrideResolveRect(const SkIRect rect);
76 
77     /**
78      * Call to indicate that GrRenderTarget was externally resolved. This may
79      * allow Gr to skip a redundant resolve step.
80      */
81     void flagAsResolved();
82 
83     /**
84      * @return true if the GrRenderTarget requires MSAA resolving
85      */
needsResolve()86     bool needsResolve() const { return !fResolveRect.isEmpty(); }
87 
88     /**
89      * Returns a rect bounding the region needing resolving.
90      */
getResolveRect()91     const SkIRect& getResolveRect() const { return fResolveRect; }
92 
93     // a MSAA RT may require explicit resolving , it may auto-resolve (e.g. FBO
94     // 0 in GL), or be unresolvable because the client didn't give us the
95     // resolve destination.
96     enum ResolveType {
97         kCanResolve_ResolveType,
98         kAutoResolves_ResolveType,
99         kCantResolve_ResolveType,
100     };
101     virtual ResolveType getResolveType() const = 0;
102 
103     /**
104      *  Return the native ID or handle to the rendertarget, depending on the
105      *  platform. e.g. on OpenGL, return the FBO ID.
106      */
107     virtual GrBackendObject getRenderTargetHandle() const = 0;
108 
109     virtual GrBackendRenderTarget getBackendRenderTarget() const = 0;
110 
111     // Checked when this object is asked to attach a stencil buffer.
112     virtual bool canAttemptStencilAttachment() const = 0;
113 
114     // Provides access to functions that aren't part of the public API.
115     GrRenderTargetPriv renderTargetPriv();
116     const GrRenderTargetPriv renderTargetPriv() const;
117 
118 protected:
119     GrRenderTarget(GrGpu*, const GrSurfaceDesc&,
120                    GrRenderTargetFlags = GrRenderTargetFlags::kNone,
121                    GrStencilAttachment* = nullptr);
122 
123     // override of GrResource
124     void onAbandon() override;
125     void onRelease() override;
126 
127 private:
128     // Allows the backends to perform any additional work that is required for attaching a
129     // GrStencilAttachment. When this is called, the GrStencilAttachment has already been put onto
130     // the GrRenderTarget. This function must return false if any failures occur when completing the
131     // stencil attachment.
132     virtual bool completeStencilAttachment() = 0;
133 
134     friend class GrRenderTargetPriv;
135 
136     int                  fSampleCnt;
137     GrStencilAttachment* fStencilAttachment;
138     uint8_t              fMultisampleSpecsID;
139     GrRenderTargetFlags  fFlags;
140 
141     SkIRect              fResolveRect;
142 
143     typedef GrSurface INHERITED;
144 };
145 
146 #endif
147