blob: ed673e7ce73cd507a1cc96d5545431bd5029a322 [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
bsalomon1aa20292016-01-22 08:16:09 -080012#include <functional>
13
mtklein3183a412016-01-08 12:11:39 -080014#include "glsl/GrGLSL.h"
bsalomoncdee0092016-01-08 13:20:12 -080015#include "GrCaps.h"
egdaniel8dc7c3a2015-04-16 11:22:42 -070016#include "GrGLStencilAttachment.h"
bsalomoncdee0092016-01-08 13:20:12 -080017#include "GrSwizzle.h"
piotaixre4b23142014-10-02 10:57:53 -070018#include "SkChecksum.h"
mtklein2aa1f7e2015-02-20 12:35:32 -080019#include "SkTHash.h"
robertphillips@google.coma2d71482012-08-01 20:08:47 +000020#include "SkTArray.h"
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000021
22class GrGLContextInfo;
jvanverthe9c0fc62015-04-29 11:18:05 -070023class GrGLSLCaps;
bsalomon1aa20292016-01-22 08:16:09 -080024class GrGLRenderTarget;
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000025
26/**
27 * Stores some capabilities of a GL context. Most are determined by the GL
28 * version and the extensions string. It also tracks formats that have passed
29 * the FBO completeness test.
30 */
bsalomon4b91f762015-05-19 09:29:46 -070031class GrGLCaps : public GrCaps {
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000032public:
egdaniel8dc7c3a2015-04-16 11:22:42 -070033 typedef GrGLStencilAttachment::Format StencilFormat;
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000034
35 /**
36 * The type of MSAA for FBOs supported. Different extensions have different
37 * semantics of how / when a resolve is performed.
38 */
39 enum MSFBOType {
40 /**
41 * no support for MSAA FBOs
42 */
rmistry@google.comfbfcd562012-08-23 18:09:54 +000043 kNone_MSFBOType = 0,
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000044 /**
skia.committer@gmail.com6fc1b492013-09-06 07:01:45 +000045 * GL3.0-style MSAA FBO (GL_ARB_framebuffer_object).
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000046 */
bsalomon@google.com347c3822013-05-01 20:10:01 +000047 kDesktop_ARB_MSFBOType,
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000048 /**
49 * earlier GL_EXT_framebuffer* extensions
50 */
bsalomon@google.com347c3822013-05-01 20:10:01 +000051 kDesktop_EXT_MSFBOType,
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000052 /**
commit-bot@chromium.orga8e5a062013-09-05 23:44:09 +000053 * Similar to kDesktop_ARB but with additional restrictions on glBlitFramebuffer.
54 */
55 kES_3_0_MSFBOType,
56 /**
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000057 * GL_APPLE_framebuffer_multisample ES extension
58 */
bsalomon@google.com347c3822013-05-01 20:10:01 +000059 kES_Apple_MSFBOType,
bsalomon@google.comf3a60c02013-03-19 19:06:09 +000060 /**
bsalomon@google.com347c3822013-05-01 20:10:01 +000061 * GL_IMG_multisampled_render_to_texture. This variation does not have MSAA renderbuffers.
62 * Instead the texture is multisampled when bound to the FBO and then resolved automatically
63 * when read. It also defines an alternate value for GL_MAX_SAMPLES (which we call
64 * GR_GL_MAX_SAMPLES_IMG).
bsalomon@google.comf3a60c02013-03-19 19:06:09 +000065 */
bsalomon@google.com347c3822013-05-01 20:10:01 +000066 kES_IMG_MsToTexture_MSFBOType,
67 /**
68 * GL_EXT_multisampled_render_to_texture. Same as the IMG one above but uses the standard
69 * GL_MAX_SAMPLES value.
70 */
71 kES_EXT_MsToTexture_MSFBOType,
vbuzinovdded6962015-06-12 08:59:45 -070072 /**
73 * GL_NV_framebuffer_mixed_samples.
74 */
75 kMixedSamples_MSFBOType,
bsalomon@google.com6b0cf022013-05-03 13:35:14 +000076
vbuzinovdded6962015-06-12 08:59:45 -070077 kLast_MSFBOType = kMixedSamples_MSFBOType
bsalomon@google.com6b0cf022013-05-03 13:35:14 +000078 };
79
bsalomon083617b2016-02-12 12:10:14 -080080 enum BlitFramebufferSupport {
81 kNone_BlitFramebufferSupport,
82 /**
83 * ANGLE exposes a limited blit framebuffer extension that does not allow for stretching
84 * or mirroring.
85 */
86 kNoScalingNoMirroring_BlitFramebufferSupport,
87 kFull_BlitFramebufferSupport
88 };
89
commit-bot@chromium.org52ffbf62014-04-02 16:19:33 +000090 enum InvalidateFBType {
91 kNone_InvalidateFBType,
92 kDiscard_InvalidateFBType, //<! glDiscardFramebuffer()
bsalomon083617b2016-02-12 12:10:14 -080093 kInvalidate_InvalidateFBType, //<! glInvalidateFramebuffer()
commit-bot@chromium.org52ffbf62014-04-02 16:19:33 +000094
95 kLast_InvalidateFBType = kInvalidate_InvalidateFBType
bsalomon@google.comf7fa8062012-02-14 14:09:57 +000096 };
97
commit-bot@chromium.org160b4782014-05-05 12:32:37 +000098 enum MapBufferType {
99 kNone_MapBufferType,
100 kMapBuffer_MapBufferType, // glMapBuffer()
101 kMapBufferRange_MapBufferType, // glMapBufferRange()
102 kChromium_MapBufferType, // GL_CHROMIUM_map_sub
103
104 kLast_MapBufferType = kChromium_MapBufferType,
105 };
106
jvanverthd7a2c1f2015-12-07 07:36:44 -0800107 enum TransferBufferType {
108 kNone_TransferBufferType,
109 kPBO_TransferBufferType, // ARB_pixel_buffer_object
110 kChromium_TransferBufferType, // CHROMIUM_pixel_transfer_buffer_object
111
112 kLast_TransferBufferType = kChromium_TransferBufferType,
113 };
114
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000115 /**
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000116 * Initializes the GrGLCaps to the set of features supported in the current
117 * OpenGL context accessible via ctxInfo.
118 */
bsalomon682c2692015-05-22 14:01:46 -0700119 GrGLCaps(const GrContextOptions& contextOptions, const GrGLContextInfo& ctxInfo,
120 const GrGLInterface* glInterface);
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000121
bsalomon41e4384e2016-01-08 09:12:44 -0800122 bool isConfigTexturable(GrPixelConfig config) const override {
bsalomon41e4384e2016-01-08 09:12:44 -0800123 return SkToBool(fConfigTable[config].fFlags & ConfigInfo::kTextureable_Flag);
124 }
125
126 bool isConfigRenderable(GrPixelConfig config, bool withMSAA) const override {
bsalomon41e4384e2016-01-08 09:12:44 -0800127 if (withMSAA) {
128 return SkToBool(fConfigTable[config].fFlags & ConfigInfo::kRenderableWithMSAA_Flag);
129 } else {
130 return SkToBool(fConfigTable[config].fFlags & ConfigInfo::kRenderable_Flag);
131 }
132 }
133
cblume790d5132016-02-29 11:13:29 -0800134 bool isConfigTexSupportEnabled(GrPixelConfig config) const {
cblume790d5132016-02-29 11:13:29 -0800135 return SkToBool(fConfigTable[config].fFlags & ConfigInfo::kCanUseTexStorage_Flag);
136 }
137
bsalomoncdee0092016-01-08 13:20:12 -0800138 /** Returns the mapping between GrPixelConfig components and GL internal format components. */
139 const GrSwizzle& configSwizzle(GrPixelConfig config) const {
140 return fConfigTable[config].fSwizzle;
141 }
142
bsalomon76148af2016-01-12 11:13:47 -0800143 bool getTexImageFormats(GrPixelConfig surfaceConfig, GrPixelConfig externalConfig,
144 GrGLenum* internalFormat, GrGLenum* externalFormat,
145 GrGLenum* externalType) const;
146
147 bool getCompressedTexImageFormats(GrPixelConfig surfaceConfig, GrGLenum* internalFormat) const;
148
149 bool getReadPixelsFormat(GrPixelConfig surfaceConfig, GrPixelConfig externalConfig,
150 GrGLenum* externalFormat, GrGLenum* externalType) const;
151
152 bool getRenderbufferFormat(GrPixelConfig config, GrGLenum* internalFormat) const;
153
bsalomon30447372015-12-21 09:03:05 -0800154 /**
155 * Gets an array of legal stencil formats. These formats are not guaranteed
156 * to be supported by the driver but are legal GLenum names given the GL
157 * version and extensions supported.
158 */
159 const SkTArray<StencilFormat, true>& stencilFormats() const {
160 return fStencilFormats;
161 }
162
163 /**
164 * Has a stencil format index been found for the config (or we've found that no format works).
165 */
166 bool hasStencilFormatBeenDeterminedForConfig(GrPixelConfig config) const {
167 return fConfigTable[config].fStencilFormatIndex != ConfigInfo::kUnknown_StencilIndex;
168 }
169
170 /**
171 * Gets the stencil format index for the config. This assumes
172 * hasStencilFormatBeenDeterminedForConfig has already been checked. Returns a value < 0 if
173 * no stencil format is supported with the config. Otherwise, returned index refers to the array
174 * returned by stencilFormats().
175 */
176 int getStencilFormatIndexForConfig(GrPixelConfig config) const {
177 SkASSERT(this->hasStencilFormatBeenDeterminedForConfig(config));
178 return fConfigTable[config].fStencilFormatIndex;
179 }
180
181 /**
182 * If index is >= 0 this records an index into stencilFormats() as the best stencil format for
183 * the config. If < 0 it records that the config has no supported stencil format index.
184 */
185 void setStencilFormatIndexForConfig(GrPixelConfig config, int index) {
186 SkASSERT(!this->hasStencilFormatBeenDeterminedForConfig(config));
187 if (index < 0) {
188 fConfigTable[config].fStencilFormatIndex = ConfigInfo::kUnsupported_StencilFormatIndex;
189 } else {
190 fConfigTable[config].fStencilFormatIndex = index;
191 }
192 }
193
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000194 /**
195 * Call to note that a color config has been verified as a valid color
196 * attachment. This may save future calls to glCheckFramebufferStatus
197 * using isConfigVerifiedColorAttachment().
198 */
199 void markConfigAsValidColorAttachment(GrPixelConfig config) {
bsalomon480e8c02015-12-21 13:44:18 -0800200 fConfigTable[config].fFlags |= ConfigInfo::kVerifiedColorAttachment_Flag;
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000201 }
202
203 /**
204 * Call to check whether a config has been verified as a valid color
205 * attachment.
206 */
207 bool isConfigVerifiedColorAttachment(GrPixelConfig config) const {
bsalomon480e8c02015-12-21 13:44:18 -0800208 return SkToBool(fConfigTable[config].fFlags & ConfigInfo::kVerifiedColorAttachment_Flag);
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000209 }
210
211 /**
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000212 * Reports the type of MSAA FBO support.
213 */
214 MSFBOType msFBOType() const { return fMSFBOType; }
215
216 /**
bsalomon083617b2016-02-12 12:10:14 -0800217 * Does the preferred MSAA FBO extension have MSAA renderbuffers?
bsalomon@google.com347c3822013-05-01 20:10:01 +0000218 */
219 bool usesMSAARenderBuffers() const {
220 return kNone_MSFBOType != fMSFBOType &&
221 kES_IMG_MsToTexture_MSFBOType != fMSFBOType &&
vbuzinovdded6962015-06-12 08:59:45 -0700222 kES_EXT_MsToTexture_MSFBOType != fMSFBOType &&
223 kMixedSamples_MSFBOType != fMSFBOType;
bsalomon@google.com347c3822013-05-01 20:10:01 +0000224 }
225
226 /**
bsalomon083617b2016-02-12 12:10:14 -0800227 * What functionality is supported by glBlitFramebuffer.
228 */
229 BlitFramebufferSupport blitFramebufferSupport() const { return fBlitFramebufferSupport; }
230
231 /**
bsalomon@google.com347c3822013-05-01 20:10:01 +0000232 * Is the MSAA FBO extension one where the texture is multisampled when bound to an FBO and
233 * then implicitly resolved when read.
234 */
235 bool usesImplicitMSAAResolve() const {
236 return kES_IMG_MsToTexture_MSFBOType == fMSFBOType ||
237 kES_EXT_MsToTexture_MSFBOType == fMSFBOType;
238 }
239
commit-bot@chromium.org52ffbf62014-04-02 16:19:33 +0000240 InvalidateFBType invalidateFBType() const { return fInvalidateFBType; }
241
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000242 /// What type of buffer mapping is supported?
243 MapBufferType mapBufferType() const { return fMapBufferType; }
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000244
jvanverthd7a2c1f2015-12-07 07:36:44 -0800245 /// What type of transfer buffer is supported?
246 TransferBufferType transferBufferType() const { return fTransferBufferType; }
247
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000248 /// The maximum number of fragment uniform vectors (GLES has min. 16).
249 int maxFragmentUniformVectors() const { return fMaxFragmentUniformVectors; }
250
commit-bot@chromium.orga15f7e52013-06-05 23:29:25 +0000251 /// maximum number of attribute values per vertex
bsalomon@google.com60da4172012-06-01 19:25:00 +0000252 int maxVertexAttributes() const { return fMaxVertexAttributes; }
253
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000254 /**
255 * Depending on the ES extensions present the BGRA external format may
bsalomon41e4384e2016-01-08 09:12:44 -0800256 * correspond to either a BGRA or RGBA internalFormat. On desktop GL it is
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000257 * RGBA.
258 */
bsalomon41e4384e2016-01-08 09:12:44 -0800259 bool bgraIsInternalFormat() const;
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000260
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000261 /// Is there support for GL_UNPACK_ROW_LENGTH
262 bool unpackRowLengthSupport() const { return fUnpackRowLengthSupport; }
263
264 /// Is there support for GL_UNPACK_FLIP_Y
265 bool unpackFlipYSupport() const { return fUnpackFlipYSupport; }
266
267 /// Is there support for GL_PACK_ROW_LENGTH
268 bool packRowLengthSupport() const { return fPackRowLengthSupport; }
269
270 /// Is there support for GL_PACK_REVERSE_ROW_ORDER
271 bool packFlipYSupport() const { return fPackFlipYSupport; }
272
273 /// Is there support for texture parameter GL_TEXTURE_USAGE
274 bool textureUsageSupport() const { return fTextureUsageSupport; }
275
robertphillips@google.com443e5a52012-04-30 20:01:21 +0000276 /// Is there support for GL_RED and GL_R8
277 bool textureRedSupport() const { return fTextureRedSupport; }
278
bsalomon@google.come76b7cc2012-06-18 12:47:06 +0000279 /// Is GL_ARB_IMAGING supported
280 bool imagingSupport() const { return fImagingSupport; }
281
bsalomon@google.com07631cf2013-03-05 14:14:58 +0000282 /// Is there support for Vertex Array Objects?
283 bool vertexArrayObjectSupport() const { return fVertexArrayObjectSupport; }
284
cdalton626e1ff2015-06-12 13:56:46 -0700285 /// Is there support for GL_EXT_direct_state_access?
286 bool directStateAccessSupport() const { return fDirectStateAccessSupport; }
287
288 /// Is there support for GL_KHR_debug?
289 bool debugSupport() const { return fDebugSupport; }
290
jvanverth3f801cb2014-12-16 09:49:38 -0800291 /// Is there support for ES2 compatability?
292 bool ES2CompatibilitySupport() const { return fES2CompatibilitySupport; }
293
cdaltond4727922015-11-10 12:49:06 -0800294 /// Can we call glDisable(GL_MULTISAMPLE)?
bsalomon76148af2016-01-12 11:13:47 -0800295 bool multisampleDisableSupport() const { return fMultisampleDisableSupport; }
cdaltond4727922015-11-10 12:49:06 -0800296
cdalton06604b92016-02-05 10:09:51 -0800297 /// Is there support for glDraw*Indirect? Note that the baseInstance fields of indirect draw
298 /// commands cannot be used unless we have base instance support.
299 bool drawIndirectSupport() const { return fDrawIndirectSupport; }
300
301 /// Is there support for glMultiDraw*Indirect? Note that the baseInstance fields of indirect
302 /// draw commands cannot be used unless we have base instance support.
303 bool multiDrawIndirectSupport() const { return fMultiDrawIndirectSupport; }
304
305 /// Are the baseInstance fields supported in indirect draw commands?
306 bool baseInstanceSupport() const { return fBaseInstanceSupport; }
307
bsalomon@google.com07631cf2013-03-05 14:14:58 +0000308 /// Use indices or vertices in CPU arrays rather than VBOs for dynamic content.
bsalomon76148af2016-01-12 11:13:47 -0800309 bool useNonVBOVertexAndIndexDynamicData() const { return fUseNonVBOVertexAndIndexDynamicData; }
bsalomon@google.com96966a52013-02-21 16:34:21 +0000310
bsalomon1aa20292016-01-22 08:16:09 -0800311 /// Does ReadPixels support reading readConfig pixels from a FBO that is renderTargetConfig?
312 bool readPixelsSupported(GrPixelConfig renderTargetConfig,
bsalomon7928ef62016-01-05 10:26:39 -0800313 GrPixelConfig readConfig,
bsalomon1aa20292016-01-22 08:16:09 -0800314 std::function<void (GrGLenum, GrGLint*)> getIntegerv,
315 std::function<bool ()> bindRenderTarget) const;
skia.committer@gmail.com631cdcb2013-03-01 12:12:55 +0000316
bsalomon@google.com2b1b8c02013-02-28 22:06:02 +0000317 bool isCoreProfile() const { return fIsCoreProfile; }
robertphillips@google.com1d89c932012-06-27 19:31:41 +0000318
joshualittc1f56b52015-06-22 12:31:31 -0700319 bool bindFragDataLocationSupport() const { return fBindFragDataLocationSupport; }
320
joshualitt7bdd70a2015-10-01 06:28:11 -0700321 bool bindUniformLocationSupport() const { return fBindUniformLocationSupport; }
322
bsalomone5286e02016-01-14 09:24:09 -0800323 /// Are textures with GL_TEXTURE_RECTANGLE type supported.
324 bool rectangleTextureSupport() const { return fRectangleTextureSupport; }
325
bsalomoncdee0092016-01-08 13:20:12 -0800326 /// GL_ARB_texture_swizzle
327 bool textureSwizzleSupport() const { return fTextureSwizzleSupport; }
328
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000329 /**
bsalomon16921ec2015-07-30 15:34:56 -0700330 * Is there support for enabling/disabling sRGB writes for sRGB-capable color attachments?
331 * If false this does not mean sRGB is not supported but rather that if it is supported
332 * it cannot be turned off for configs that support it.
333 */
334 bool srgbWriteControl() const { return fSRGBWriteControl; }
335
cblume09bd2c02016-03-01 14:08:28 -0800336 bool mipMapLevelAndLodControlSupport() const { return fMipMapLevelAndLodControlSupport; }
337
bsalomon16921ec2015-07-30 15:34:56 -0700338 /**
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000339 * Returns a string containing the caps info.
340 */
mtklein36352bf2015-03-25 18:17:31 -0700341 SkString dump() const override;
commit-bot@chromium.orgbeb8b3a2014-04-15 15:37:51 +0000342
bsalomon88c7b982015-07-31 11:20:16 -0700343 bool rgba8888PixelsOpsAreSlow() const { return fRGBA8888PixelsOpsAreSlow; }
344 bool partialFBOReadIsSlow() const { return fPartialFBOReadIsSlow; }
ericrkb4ecabd2016-03-11 15:18:20 -0800345 bool rgbaToBgraReadbackConversionsAreSlow() const {
346 return fRGBAToBGRAReadbackConversionsAreSlow;
347 }
bsalomon88c7b982015-07-31 11:20:16 -0700348
egdanielf5294392015-10-21 07:14:17 -0700349 const GrGLSLCaps* glslCaps() const { return reinterpret_cast<GrGLSLCaps*>(fShaderCaps.get()); }
jvanverthe9c0fc62015-04-29 11:18:05 -0700350
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000351private:
bsalomon76148af2016-01-12 11:13:47 -0800352 enum ExternalFormatUsage {
353 kTexImage_ExternalFormatUsage,
354 kOther_ExternalFormatUsage,
355
356 kLast_ExternalFormatUsage = kOther_ExternalFormatUsage
357 };
358 static const int kExternalFormatUsageCnt = kLast_ExternalFormatUsage + 1;
359 bool getExternalFormat(GrPixelConfig surfaceConfig, GrPixelConfig memoryConfig,
360 ExternalFormatUsage usage, GrGLenum* externalFormat,
361 GrGLenum* externalType) const;
362
cdalton4cd67132015-06-10 19:23:46 -0700363 void init(const GrContextOptions&, const GrGLContextInfo&, const GrGLInterface*);
egdaniel05ded892015-10-26 07:38:05 -0700364 void initGLSL(const GrGLContextInfo&);
kkinnunencfe62e32015-07-01 02:58:50 -0700365 bool hasPathRenderingSupport(const GrGLContextInfo&, const GrGLInterface*);
bsalomon424cc262015-05-22 10:37:30 -0700366
egdanielb7e7d572015-11-04 04:23:53 -0800367 void onApplyOptionsOverrides(const GrContextOptions& options) override;
368
commit-bot@chromium.org73880512013-10-14 15:33:45 +0000369 void initFSAASupport(const GrGLContextInfo&, const GrGLInterface*);
cdalton1dd05422015-06-12 09:01:18 -0700370 void initBlendEqationSupport(const GrGLContextInfo&);
commit-bot@chromium.org73880512013-10-14 15:33:45 +0000371 void initStencilFormats(const GrGLContextInfo&);
commit-bot@chromium.org6b7938f2013-10-15 14:18:16 +0000372 // This must be called after initFSAASupport().
bsalomoncdee0092016-01-08 13:20:12 -0800373 void initConfigTable(const GrGLContextInfo&, const GrGLInterface* gli, GrGLSLCaps* glslCaps);
commit-bot@chromium.org42dc8132014-05-27 19:26:59 +0000374
jvanverthcba99b82015-06-24 06:59:57 -0700375 void initShaderPrecisionTable(const GrGLContextInfo& ctxInfo,
376 const GrGLInterface* intf,
377 GrGLSLCaps* glslCaps);
378
bsalomon1aa20292016-01-22 08:16:09 -0800379 GrGLStandard fStandard;
380
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000381 SkTArray<StencilFormat, true> fStencilFormats;
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000382
383 int fMaxFragmentUniformVectors;
bsalomon@google.com60da4172012-06-01 19:25:00 +0000384 int fMaxVertexAttributes;
385
commit-bot@chromium.org52ffbf62014-04-02 16:19:33 +0000386 MSFBOType fMSFBOType;
commit-bot@chromium.org52ffbf62014-04-02 16:19:33 +0000387 InvalidateFBType fInvalidateFBType;
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000388 MapBufferType fMapBufferType;
jvanverthd7a2c1f2015-12-07 07:36:44 -0800389 TransferBufferType fTransferBufferType;
bsalomon@google.com6b0cf022013-05-03 13:35:14 +0000390
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000391 bool fUnpackRowLengthSupport : 1;
392 bool fUnpackFlipYSupport : 1;
393 bool fPackRowLengthSupport : 1;
394 bool fPackFlipYSupport : 1;
395 bool fTextureUsageSupport : 1;
robertphillips@google.com443e5a52012-04-30 20:01:21 +0000396 bool fTextureRedSupport : 1;
bsalomon@google.come76b7cc2012-06-18 12:47:06 +0000397 bool fImagingSupport : 1;
bsalomon@google.com07631cf2013-03-05 14:14:58 +0000398 bool fVertexArrayObjectSupport : 1;
cdalton626e1ff2015-06-12 13:56:46 -0700399 bool fDirectStateAccessSupport : 1;
400 bool fDebugSupport : 1;
jvanverth3f801cb2014-12-16 09:49:38 -0800401 bool fES2CompatibilitySupport : 1;
cdaltond4727922015-11-10 12:49:06 -0800402 bool fMultisampleDisableSupport : 1;
cdalton06604b92016-02-05 10:09:51 -0800403 bool fDrawIndirectSupport : 1;
404 bool fMultiDrawIndirectSupport : 1;
405 bool fBaseInstanceSupport : 1;
bsalomon@google.com96966a52013-02-21 16:34:21 +0000406 bool fUseNonVBOVertexAndIndexDynamicData : 1;
bsalomon@google.com2b1b8c02013-02-28 22:06:02 +0000407 bool fIsCoreProfile : 1;
joshualittc1f56b52015-06-22 12:31:31 -0700408 bool fBindFragDataLocationSupport : 1;
bsalomon16921ec2015-07-30 15:34:56 -0700409 bool fSRGBWriteControl : 1;
bsalomon88c7b982015-07-31 11:20:16 -0700410 bool fRGBA8888PixelsOpsAreSlow : 1;
411 bool fPartialFBOReadIsSlow : 1;
joshualitt7bdd70a2015-10-01 06:28:11 -0700412 bool fBindUniformLocationSupport : 1;
bsalomone5286e02016-01-14 09:24:09 -0800413 bool fRectangleTextureSupport : 1;
bsalomoncdee0092016-01-08 13:20:12 -0800414 bool fTextureSwizzleSupport : 1;
cblume09bd2c02016-03-01 14:08:28 -0800415 bool fMipMapLevelAndLodControlSupport : 1;
ericrkb4ecabd2016-03-11 15:18:20 -0800416 bool fRGBAToBGRAReadbackConversionsAreSlow : 1;
joshualitt58162332014-08-01 06:44:53 -0700417
bsalomon083617b2016-02-12 12:10:14 -0800418 BlitFramebufferSupport fBlitFramebufferSupport;
419
bsalomon7928ef62016-01-05 10:26:39 -0800420 /** Number type of the components (with out considering number of bits.) */
421 enum FormatType {
422 kNormalizedFixedPoint_FormatType,
423 kFloat_FormatType,
424 };
425
426 struct ReadPixelsFormat {
427 ReadPixelsFormat() : fFormat(0), fType(0) {}
428 GrGLenum fFormat;
429 GrGLenum fType;
430 };
431
bsalomon76148af2016-01-12 11:13:47 -0800432 struct ConfigFormats {
433 ConfigFormats() {
434 // Inits to known bad GL enum values.
435 memset(this, 0xAB, sizeof(ConfigFormats));
436 }
437 GrGLenum fBaseInternalFormat;
438 GrGLenum fSizedInternalFormat;
439
440 /** The external format and type are to be used when uploading/downloading data using this
441 config where both the CPU data and GrSurface are the same config. To get the external
442 format and type when converting between configs while copying to/from memory use
443 getExternalFormat().
444 The kTexImage external format is usually the same as kOther except for kSRGBA on some
445 GL contexts. */
446 GrGLenum fExternalFormat[kExternalFormatUsageCnt];
447 GrGLenum fExternalType;
448
449
450 // Either the base or sized internal format depending on the GL and config.
451 GrGLenum fInternalFormatTexImage;
452 GrGLenum fInternalFormatRenderbuffer;
453 };
454
bsalomon30447372015-12-21 09:03:05 -0800455 struct ConfigInfo {
bsalomon7928ef62016-01-05 10:26:39 -0800456 ConfigInfo() : fStencilFormatIndex(kUnknown_StencilIndex), fFlags(0) {}
bsalomon30447372015-12-21 09:03:05 -0800457
458 ConfigFormats fFormats;
459
bsalomon7928ef62016-01-05 10:26:39 -0800460 FormatType fFormatType;
461
462 // On ES contexts there are restrictions on type type/format that may be used for
463 // ReadPixels. One is implicitly specified by the current FBO's format. The other is
464 // queryable. This stores the queried option (lazily).
465 ReadPixelsFormat fSecondReadPixelsFormat;
466
bsalomon30447372015-12-21 09:03:05 -0800467 enum {
468 // This indicates that a stencil format has not yet been determined for the config.
469 kUnknown_StencilIndex = -1,
470 // This indicates that there is no supported stencil format for the config.
471 kUnsupported_StencilFormatIndex = -2
472 };
bsalomon480e8c02015-12-21 13:44:18 -0800473
474 // Index fStencilFormats.
475 int fStencilFormatIndex;
476
477 enum {
bsalomon41e4384e2016-01-08 09:12:44 -0800478 kVerifiedColorAttachment_Flag = 0x1,
479 kTextureable_Flag = 0x2,
480 kRenderable_Flag = 0x4,
481 kRenderableWithMSAA_Flag = 0x8,
cblume790d5132016-02-29 11:13:29 -0800482 kCanUseTexStorage_Flag = 0x10,
bsalomon480e8c02015-12-21 13:44:18 -0800483 };
484 uint32_t fFlags;
bsalomoncdee0092016-01-08 13:20:12 -0800485
486 GrSwizzle fSwizzle;
bsalomon30447372015-12-21 09:03:05 -0800487 };
488
489 ConfigInfo fConfigTable[kGrPixelConfigCnt];
490
bsalomon4b91f762015-05-19 09:29:46 -0700491 typedef GrCaps INHERITED;
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000492};
493
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000494#endif