blob: 2acfbd74ae5b8eb5fb5dd727c8c37c0633343396 [file] [log] [blame]
bsalomon@google.comf7fa8062012-02-14 14:09:57 +00001/*
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
robertphillips@google.coma2d71482012-08-01 20:08:47 +000012#include "SkTArray.h"
13#include "SkTDArray.h"
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000014#include "GrGLStencilBuffer.h"
15
16class GrGLContextInfo;
17
18/**
19 * Stores some capabilities of a GL context. Most are determined by the GL
20 * version and the extensions string. It also tracks formats that have passed
21 * the FBO completeness test.
22 */
23class GrGLCaps {
24public:
25 typedef GrGLStencilBuffer::Format StencilFormat;
26
27 /**
bsalomon@google.comc9668ec2012-04-11 18:16:41 +000028 * Represents a supported multisampling/coverage-sampling mode.
29 */
30 struct MSAACoverageMode {
31 // "Coverage samples" includes samples that actually have color, depth,
32 // stencil, ... as well as those that don't (coverage only). All samples
33 // are coverage samples. (We're using the word "coverage sample" to
34 // match the NV extension language.)
35 int fCoverageSampleCnt;
36
37 // Color samples are samples that store data values (color, stencil,
38 // depth) rather than just representing coverage. They are a subset
39 // of coverage samples. (Again the wording was chosen to match the
40 // extension.)
41 int fColorSampleCnt;
42 };
43
44 /**
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000045 * The type of MSAA for FBOs supported. Different extensions have different
46 * semantics of how / when a resolve is performed.
47 */
48 enum MSFBOType {
49 /**
50 * no support for MSAA FBOs
51 */
52 kNone_MSFBOType = 0,
53 /**
54 * GL3.0-style MSAA FBO (GL_ARB_framebuffer_object)
55 */
56 kDesktopARB_MSFBOType,
57 /**
58 * earlier GL_EXT_framebuffer* extensions
59 */
60 kDesktopEXT_MSFBOType,
61 /**
62 * GL_APPLE_framebuffer_multisample ES extension
63 */
64 kAppleES_MSFBOType,
65 };
66
bsalomon@google.comc9668ec2012-04-11 18:16:41 +000067 enum CoverageAAType {
68 /**
69 * No coverage sample support
70 */
71 kNone_CoverageAAType,
72
73 /**
74 * GL_NV_framebuffer_multisample_coverage
75 */
76 kNVDesktop_CoverageAAType,
77 };
78
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000079 /**
80 * Creates a GrGLCaps that advertises no support for any extensions,
81 * formats, etc. Call init to initialize from a GrGLContextInfo.
82 */
83 GrGLCaps();
84
85 GrGLCaps(const GrGLCaps& caps);
86
87 GrGLCaps& operator = (const GrGLCaps& caps);
88
89 /**
90 * Resets the caps such that nothing is supported.
91 */
92 void reset();
93
94 /**
95 * Initializes the GrGLCaps to the set of features supported in the current
96 * OpenGL context accessible via ctxInfo.
97 */
98 void init(const GrGLContextInfo& ctxInfo);
99
100 /**
101 * Call to note that a color config has been verified as a valid color
102 * attachment. This may save future calls to glCheckFramebufferStatus
103 * using isConfigVerifiedColorAttachment().
104 */
105 void markConfigAsValidColorAttachment(GrPixelConfig config) {
106 fVerifiedColorConfigs.markVerified(config);
107 }
108
109 /**
110 * Call to check whether a config has been verified as a valid color
111 * attachment.
112 */
113 bool isConfigVerifiedColorAttachment(GrPixelConfig config) const {
114 return fVerifiedColorConfigs.isVerified(config);
115 }
116
117 /**
118 * Call to note that a color config / stencil format pair passed
119 * FBO status check. We may skip calling glCheckFramebufferStatus for
120 * this combination in the future using
121 * isColorConfigAndStencilFormatVerified().
122 */
123 void markColorConfigAndStencilFormatAsVerified(
124 GrPixelConfig config,
125 const GrGLStencilBuffer::Format& format);
126
127 /**
128 * Call to check whether color config / stencil format pair has already
129 * passed FBO status check.
130 */
131 bool isColorConfigAndStencilFormatVerified(
132 GrPixelConfig config,
133 const GrGLStencilBuffer::Format& format) const;
134
135 /**
136 * Reports the type of MSAA FBO support.
137 */
138 MSFBOType msFBOType() const { return fMSFBOType; }
139
140 /**
bsalomon@google.comf6b070d2012-04-27 14:25:44 +0000141 * Reports the maximum number of samples supported.
142 */
143 int maxSampleCount() const { return fMaxSampleCount; }
144
145 /**
bsalomon@google.comc9668ec2012-04-11 18:16:41 +0000146 * Reports the type of coverage sample AA support.
147 */
148 CoverageAAType coverageAAType() const { return fCoverageAAType; }
149
150 /**
151 * Chooses a supported coverage mode based on a desired sample count. The
152 * desired sample count is rounded up the next supported coverage sample
153 * count unless a it is larger than the max in which case it is rounded
154 * down. Once a coverage sample count is decided, the supported mode with
155 * the fewest color samples is chosen.
156 */
157 const MSAACoverageMode& getMSAACoverageMode(int desiredSampleCount) const;
158
159 /**
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000160 * Prints the caps info using GrPrintf.
161 */
162 void print() const;
163
164 /**
165 * Gets an array of legal stencil formats. These formats are not guaranteed
166 * to be supported by the driver but are legal GLenum names given the GL
167 * version and extensions supported.
168 */
169 const SkTArray<StencilFormat, true>& stencilFormats() const {
170 return fStencilFormats;
171 }
172
173 /// The maximum number of fragment uniform vectors (GLES has min. 16).
174 int maxFragmentUniformVectors() const { return fMaxFragmentUniformVectors; }
175
bsalomon@google.com60da4172012-06-01 19:25:00 +0000176 // maximum number of attribute values per vertex
177 int maxVertexAttributes() const { return fMaxVertexAttributes; }
178
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000179 /// ES requires an extension to support RGBA8 in RenderBufferStorage
180 bool rgba8RenderbufferSupport() const { return fRGBA8RenderbufferSupport; }
181
182 /// Is GL_BGRA supported
183 bool bgraFormatSupport() const { return fBGRAFormatSupport; }
184
185 /**
186 * Depending on the ES extensions present the BGRA external format may
187 * correspond either a BGRA or RGBA internalFormat. On desktop GL it is
188 * RGBA.
189 */
190 bool bgraIsInternalFormat() const { return fBGRAIsInternalFormat; }
191
192 /// GL_ARB_texture_swizzle support
193 bool textureSwizzleSupport() const { return fTextureSwizzleSupport; }
194
195 /// Is there support for GL_UNPACK_ROW_LENGTH
196 bool unpackRowLengthSupport() const { return fUnpackRowLengthSupport; }
197
198 /// Is there support for GL_UNPACK_FLIP_Y
199 bool unpackFlipYSupport() const { return fUnpackFlipYSupport; }
200
201 /// Is there support for GL_PACK_ROW_LENGTH
202 bool packRowLengthSupport() const { return fPackRowLengthSupport; }
203
204 /// Is there support for GL_PACK_REVERSE_ROW_ORDER
205 bool packFlipYSupport() const { return fPackFlipYSupport; }
206
207 /// Is there support for texture parameter GL_TEXTURE_USAGE
208 bool textureUsageSupport() const { return fTextureUsageSupport; }
209
210 /// Is there support for glTexStorage
211 bool texStorageSupport() const { return fTexStorageSupport; }
212
robertphillips@google.com443e5a52012-04-30 20:01:21 +0000213 /// Is there support for GL_RED and GL_R8
214 bool textureRedSupport() const { return fTextureRedSupport; }
215
bsalomon@google.come76b7cc2012-06-18 12:47:06 +0000216 /// Is GL_ARB_IMAGING supported
217 bool imagingSupport() const { return fImagingSupport; }
218
robertphillips@google.com1d89c932012-06-27 19:31:41 +0000219 // Does ReadPixels support the provided format/type combo?
220 bool readPixelsSupported(const GrGLInterface* intf,
221 GrGLenum format,
222 GrGLenum type) const;
223
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000224private:
225 /**
226 * Maintains a bit per GrPixelConfig. It is used to avoid redundantly
227 * performing glCheckFrameBufferStatus for the same config.
228 */
229 struct VerifiedColorConfigs {
230 VerifiedColorConfigs() {
231 this->reset();
232 }
233
234 void reset() {
235 for (int i = 0; i < kNumUints; ++i) {
236 fVerifiedColorConfigs[i] = 0;
237 }
238 }
239
240 static const int kNumUints = (kGrPixelConfigCount + 31) / 32;
241 uint32_t fVerifiedColorConfigs[kNumUints];
242
243 void markVerified(GrPixelConfig config) {
244#if !GR_GL_CHECK_FBO_STATUS_ONCE_PER_FORMAT
245 return;
246#endif
247 int u32Idx = config / 32;
248 int bitIdx = config % 32;
249 fVerifiedColorConfigs[u32Idx] |= 1 << bitIdx;
250 }
251
252 bool isVerified(GrPixelConfig config) const {
253#if !GR_GL_CHECK_FBO_STATUS_ONCE_PER_FORMAT
254 return false;
255#endif
256 int u32Idx = config / 32;
257 int bitIdx = config % 32;
258 return SkToBool(fVerifiedColorConfigs[u32Idx] & (1 << bitIdx));
259 }
260 };
261
262 void initFSAASupport(const GrGLContextInfo& ctxInfo);
263 void initStencilFormats(const GrGLContextInfo& ctxInfo);
264
265 // tracks configs that have been verified to pass the FBO completeness when
266 // used as a color attachment
267 VerifiedColorConfigs fVerifiedColorConfigs;
268
269 SkTArray<StencilFormat, true> fStencilFormats;
270 // tracks configs that have been verified to pass the FBO completeness when
271 // used as a color attachment when a particular stencil format is used
272 // as a stencil attachment.
273 SkTArray<VerifiedColorConfigs, true> fStencilVerifiedColorConfigs;
274
275 int fMaxFragmentUniformVectors;
bsalomon@google.com60da4172012-06-01 19:25:00 +0000276 int fMaxVertexAttributes;
277
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000278 MSFBOType fMSFBOType;
bsalomon@google.comf6b070d2012-04-27 14:25:44 +0000279 int fMaxSampleCount;
bsalomon@google.comc9668ec2012-04-11 18:16:41 +0000280 CoverageAAType fCoverageAAType;
281 SkTDArray<MSAACoverageMode> fMSAACoverageModes;
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000282
283 bool fRGBA8RenderbufferSupport : 1;
284 bool fBGRAFormatSupport : 1;
285 bool fBGRAIsInternalFormat : 1;
286 bool fTextureSwizzleSupport : 1;
287 bool fUnpackRowLengthSupport : 1;
288 bool fUnpackFlipYSupport : 1;
289 bool fPackRowLengthSupport : 1;
290 bool fPackFlipYSupport : 1;
291 bool fTextureUsageSupport : 1;
292 bool fTexStorageSupport : 1;
robertphillips@google.com443e5a52012-04-30 20:01:21 +0000293 bool fTextureRedSupport : 1;
bsalomon@google.come76b7cc2012-06-18 12:47:06 +0000294 bool fImagingSupport : 1;
robertphillips@google.com1d89c932012-06-27 19:31:41 +0000295 bool fTwoFormatLimit : 1;
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000296};
297
298#endif