• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2012 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 GrGLCaps_DEFINED
10 #define GrGLCaps_DEFINED
11 
12 #include "GrDrawTargetCaps.h"
13 #include "GrGLStencilBuffer.h"
14 #include "SkTArray.h"
15 #include "SkTDArray.h"
16 
17 class GrGLContextInfo;
18 
19 /**
20  * Stores some capabilities of a GL context. Most are determined by the GL
21  * version and the extensions string. It also tracks formats that have passed
22  * the FBO completeness test.
23  */
24 class GrGLCaps : public GrDrawTargetCaps {
25 public:
26     SK_DECLARE_INST_COUNT(GrGLCaps)
27 
28     typedef GrGLStencilBuffer::Format StencilFormat;
29 
30     /**
31      * The type of MSAA for FBOs supported. Different extensions have different
32      * semantics of how / when a resolve is performed.
33      */
34     enum MSFBOType {
35         /**
36          * no support for MSAA FBOs
37          */
38         kNone_MSFBOType = 0,
39         /**
40          * GL3.0-style MSAA FBO (GL_ARB_framebuffer_object).
41          */
42         kDesktop_ARB_MSFBOType,
43         /**
44          * earlier GL_EXT_framebuffer* extensions
45          */
46         kDesktop_EXT_MSFBOType,
47         /**
48          * Similar to kDesktop_ARB but with additional restrictions on glBlitFramebuffer.
49          */
50         kES_3_0_MSFBOType,
51         /**
52          * GL_APPLE_framebuffer_multisample ES extension
53          */
54         kES_Apple_MSFBOType,
55         /**
56          * GL_IMG_multisampled_render_to_texture. This variation does not have MSAA renderbuffers.
57          * Instead the texture is multisampled when bound to the FBO and then resolved automatically
58          * when read. It also defines an alternate value for GL_MAX_SAMPLES (which we call
59          * GR_GL_MAX_SAMPLES_IMG).
60          */
61         kES_IMG_MsToTexture_MSFBOType,
62         /**
63          * GL_EXT_multisampled_render_to_texture. Same as the IMG one above but uses the standard
64          * GL_MAX_SAMPLES value.
65          */
66         kES_EXT_MsToTexture_MSFBOType,
67 
68         kLast_MSFBOType = kES_EXT_MsToTexture_MSFBOType
69     };
70 
71     enum FBFetchType {
72         kNone_FBFetchType,
73         /** GL_EXT_shader_framebuffer_fetch */
74         kEXT_FBFetchType,
75         /** GL_NV_shader_framebuffer_fetch */
76         kNV_FBFetchType,
77 
78         kLast_FBFetchType = kNV_FBFetchType
79     };
80 
81     enum InvalidateFBType {
82         kNone_InvalidateFBType,
83         kDiscard_InvalidateFBType,       //<! glDiscardFramebuffer()
84         kInvalidate_InvalidateFBType,     //<! glInvalidateFramebuffer()
85 
86         kLast_InvalidateFBType = kInvalidate_InvalidateFBType
87     };
88 
89     enum MapBufferType {
90         kNone_MapBufferType,
91         kMapBuffer_MapBufferType,         // glMapBuffer()
92         kMapBufferRange_MapBufferType,    // glMapBufferRange()
93         kChromium_MapBufferType,          // GL_CHROMIUM_map_sub
94 
95         kLast_MapBufferType = kChromium_MapBufferType,
96     };
97 
98     /**
99      * Creates a GrGLCaps that advertises no support for any extensions,
100      * formats, etc. Call init to initialize from a GrGLContextInfo.
101      */
102     GrGLCaps();
103 
104     GrGLCaps(const GrGLCaps& caps);
105 
106     GrGLCaps& operator = (const GrGLCaps& caps);
107 
108     /**
109      * Resets the caps such that nothing is supported.
110      */
111     virtual void reset() SK_OVERRIDE;
112 
113     /**
114      * Initializes the GrGLCaps to the set of features supported in the current
115      * OpenGL context accessible via ctxInfo.
116      */
117     bool init(const GrGLContextInfo& ctxInfo, const GrGLInterface* interface);
118 
119     /**
120      * Call to note that a color config has been verified as a valid color
121      * attachment. This may save future calls to glCheckFramebufferStatus
122      * using isConfigVerifiedColorAttachment().
123      */
markConfigAsValidColorAttachment(GrPixelConfig config)124     void markConfigAsValidColorAttachment(GrPixelConfig config) {
125         fVerifiedColorConfigs.markVerified(config);
126     }
127 
128     /**
129      * Call to check whether a config has been verified as a valid color
130      * attachment.
131      */
isConfigVerifiedColorAttachment(GrPixelConfig config)132     bool isConfigVerifiedColorAttachment(GrPixelConfig config) const {
133         return fVerifiedColorConfigs.isVerified(config);
134     }
135 
136     /**
137      * Call to note that a color config / stencil format pair passed
138      * FBO status check. We may skip calling glCheckFramebufferStatus for
139      * this combination in the future using
140      * isColorConfigAndStencilFormatVerified().
141      */
142     void markColorConfigAndStencilFormatAsVerified(
143                     GrPixelConfig config,
144                     const GrGLStencilBuffer::Format& format);
145 
146     /**
147      * Call to check whether color config / stencil format pair has already
148      * passed FBO status check.
149      */
150     bool isColorConfigAndStencilFormatVerified(
151                     GrPixelConfig config,
152                     const GrGLStencilBuffer::Format& format) const;
153 
154     /**
155      * Reports the type of MSAA FBO support.
156      */
msFBOType()157     MSFBOType msFBOType() const { return fMSFBOType; }
158 
159     /**
160      * Does the supported MSAA FBO extension have MSAA renderbuffers?
161      */
usesMSAARenderBuffers()162     bool usesMSAARenderBuffers() const {
163         return kNone_MSFBOType != fMSFBOType &&
164                kES_IMG_MsToTexture_MSFBOType != fMSFBOType &&
165                kES_EXT_MsToTexture_MSFBOType != fMSFBOType;
166     }
167 
168     /**
169      * Is the MSAA FBO extension one where the texture is multisampled when bound to an FBO and
170      * then implicitly resolved when read.
171      */
usesImplicitMSAAResolve()172     bool usesImplicitMSAAResolve() const {
173         return kES_IMG_MsToTexture_MSFBOType == fMSFBOType ||
174                kES_EXT_MsToTexture_MSFBOType == fMSFBOType;
175     }
176 
fbFetchType()177     FBFetchType fbFetchType() const { return fFBFetchType; }
178 
invalidateFBType()179     InvalidateFBType invalidateFBType() const { return fInvalidateFBType; }
180 
181     /// What type of buffer mapping is supported?
mapBufferType()182     MapBufferType mapBufferType() const { return fMapBufferType; }
183 
184     /**
185      * Gets an array of legal stencil formats. These formats are not guaranteed
186      * to be supported by the driver but are legal GLenum names given the GL
187      * version and extensions supported.
188      */
stencilFormats()189     const SkTArray<StencilFormat, true>& stencilFormats() const {
190         return fStencilFormats;
191     }
192 
193     /// The maximum number of fragment uniform vectors (GLES has min. 16).
maxFragmentUniformVectors()194     int maxFragmentUniformVectors() const { return fMaxFragmentUniformVectors; }
195 
196     /// maximum number of attribute values per vertex
maxVertexAttributes()197     int maxVertexAttributes() const { return fMaxVertexAttributes; }
198 
199     /// maximum number of texture units accessible in the fragment shader.
maxFragmentTextureUnits()200     int maxFragmentTextureUnits() const { return fMaxFragmentTextureUnits; }
201 
202     /// maximum number of fixed-function texture coords, or zero if no fixed-function.
maxFixedFunctionTextureCoords()203     int maxFixedFunctionTextureCoords() const { return fMaxFixedFunctionTextureCoords; }
204 
205     /// ES requires an extension to support RGBA8 in RenderBufferStorage
rgba8RenderbufferSupport()206     bool rgba8RenderbufferSupport() const { return fRGBA8RenderbufferSupport; }
207 
208     /**
209      * Depending on the ES extensions present the BGRA external format may
210      * correspond either a BGRA or RGBA internalFormat. On desktop GL it is
211      * RGBA.
212      */
bgraIsInternalFormat()213     bool bgraIsInternalFormat() const { return fBGRAIsInternalFormat; }
214 
215     /// GL_ARB_texture_swizzle support
textureSwizzleSupport()216     bool textureSwizzleSupport() const { return fTextureSwizzleSupport; }
217 
218     /// Is there support for GL_UNPACK_ROW_LENGTH
unpackRowLengthSupport()219     bool unpackRowLengthSupport() const { return fUnpackRowLengthSupport; }
220 
221     /// Is there support for GL_UNPACK_FLIP_Y
unpackFlipYSupport()222     bool unpackFlipYSupport() const { return fUnpackFlipYSupport; }
223 
224     /// Is there support for GL_PACK_ROW_LENGTH
packRowLengthSupport()225     bool packRowLengthSupport() const { return fPackRowLengthSupport; }
226 
227     /// Is there support for GL_PACK_REVERSE_ROW_ORDER
packFlipYSupport()228     bool packFlipYSupport() const { return fPackFlipYSupport; }
229 
230     /// Is there support for texture parameter GL_TEXTURE_USAGE
textureUsageSupport()231     bool textureUsageSupport() const { return fTextureUsageSupport; }
232 
233     /// Is there support for glTexStorage
texStorageSupport()234     bool texStorageSupport() const { return fTexStorageSupport; }
235 
236     /// Is there support for GL_RED and GL_R8
textureRedSupport()237     bool textureRedSupport() const { return fTextureRedSupport; }
238 
239     /// Is GL_ARB_IMAGING supported
imagingSupport()240     bool imagingSupport() const { return fImagingSupport; }
241 
242     /// Is GL_ARB_fragment_coord_conventions supported?
fragCoordConventionsSupport()243     bool fragCoordConventionsSupport() const { return fFragCoordsConventionSupport; }
244 
245     /// Is there support for Vertex Array Objects?
vertexArrayObjectSupport()246     bool vertexArrayObjectSupport() const { return fVertexArrayObjectSupport; }
247 
248     /// Use indices or vertices in CPU arrays rather than VBOs for dynamic content.
useNonVBOVertexAndIndexDynamicData()249     bool useNonVBOVertexAndIndexDynamicData() const {
250         return fUseNonVBOVertexAndIndexDynamicData;
251     }
252 
253     /// Does ReadPixels support the provided format/type combo?
254     bool readPixelsSupported(const GrGLInterface* intf,
255                              GrGLenum format,
256                              GrGLenum type) const;
257 
isCoreProfile()258     bool isCoreProfile() const { return fIsCoreProfile; }
259 
260 
fullClearIsFree()261     bool fullClearIsFree() const { return fFullClearIsFree; }
262 
dropsTileOnZeroDivide()263     bool dropsTileOnZeroDivide() const { return fDropsTileOnZeroDivide; }
264 
265     /**
266      * Returns a string containing the caps info.
267      */
268     virtual SkString dump() const SK_OVERRIDE;
269 
270     /**
271      * LATC can appear under one of three possible names. In order to know
272      * which GL internal format to use, we need to keep track of which name
273      * we found LATC under. The default is LATC.
274      */
275     enum LATCAlias {
276         kLATC_LATCAlias,
277         kRGTC_LATCAlias,
278         k3DC_LATCAlias
279     };
280 
latcAlias()281     LATCAlias latcAlias() const { return fLATCAlias; }
282 
283 private:
284     /**
285      * Maintains a bit per GrPixelConfig. It is used to avoid redundantly
286      * performing glCheckFrameBufferStatus for the same config.
287      */
288     struct VerifiedColorConfigs {
VerifiedColorConfigsVerifiedColorConfigs289         VerifiedColorConfigs() {
290             this->reset();
291         }
292 
resetVerifiedColorConfigs293         void reset() {
294             for (int i = 0; i < kNumUints; ++i) {
295                 fVerifiedColorConfigs[i] = 0;
296             }
297         }
298 
299         static const int kNumUints = (kGrPixelConfigCnt  + 31) / 32;
300         uint32_t fVerifiedColorConfigs[kNumUints];
301 
markVerifiedVerifiedColorConfigs302         void markVerified(GrPixelConfig config) {
303 #if !GR_GL_CHECK_FBO_STATUS_ONCE_PER_FORMAT
304                 return;
305 #endif
306             int u32Idx = config / 32;
307             int bitIdx = config % 32;
308             fVerifiedColorConfigs[u32Idx] |= 1 << bitIdx;
309         }
310 
isVerifiedVerifiedColorConfigs311         bool isVerified(GrPixelConfig config) const {
312 #if !GR_GL_CHECK_FBO_STATUS_ONCE_PER_FORMAT
313             return false;
314 #endif
315             int u32Idx = config / 32;
316             int bitIdx = config % 32;
317             return SkToBool(fVerifiedColorConfigs[u32Idx] & (1 << bitIdx));
318         }
319     };
320 
321     void initFSAASupport(const GrGLContextInfo&, const GrGLInterface*);
322     void initStencilFormats(const GrGLContextInfo&);
323     // This must be called after initFSAASupport().
324     void initConfigRenderableTable(const GrGLContextInfo&);
325     void initConfigTexturableTable(const GrGLContextInfo&, const GrGLInterface*);
326 
327     // tracks configs that have been verified to pass the FBO completeness when
328     // used as a color attachment
329     VerifiedColorConfigs fVerifiedColorConfigs;
330 
331     SkTArray<StencilFormat, true> fStencilFormats;
332     // tracks configs that have been verified to pass the FBO completeness when
333     // used as a color attachment when a particular stencil format is used
334     // as a stencil attachment.
335     SkTArray<VerifiedColorConfigs, true> fStencilVerifiedColorConfigs;
336 
337     int fMaxFragmentUniformVectors;
338     int fMaxVertexAttributes;
339     int fMaxFragmentTextureUnits;
340     int fMaxFixedFunctionTextureCoords;
341 
342     MSFBOType           fMSFBOType;
343     FBFetchType         fFBFetchType;
344     InvalidateFBType    fInvalidateFBType;
345     MapBufferType       fMapBufferType;
346     LATCAlias           fLATCAlias;
347 
348     bool fRGBA8RenderbufferSupport : 1;
349     bool fBGRAIsInternalFormat : 1;
350     bool fTextureSwizzleSupport : 1;
351     bool fUnpackRowLengthSupport : 1;
352     bool fUnpackFlipYSupport : 1;
353     bool fPackRowLengthSupport : 1;
354     bool fPackFlipYSupport : 1;
355     bool fTextureUsageSupport : 1;
356     bool fTexStorageSupport : 1;
357     bool fTextureRedSupport : 1;
358     bool fImagingSupport  : 1;
359     bool fTwoFormatLimit : 1;
360     bool fFragCoordsConventionSupport : 1;
361     bool fVertexArrayObjectSupport : 1;
362     bool fUseNonVBOVertexAndIndexDynamicData : 1;
363     bool fIsCoreProfile : 1;
364     bool fFullClearIsFree : 1;
365     bool fDropsTileOnZeroDivide : 1;
366 
367     typedef GrDrawTargetCaps INHERITED;
368 };
369 
370 #endif
371