blob: 06deaafae10676159c479a0a1abb21250c10e8e4 [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 {
123 SkASSERT(kGrPixelConfigCnt > config);
124 return SkToBool(fConfigTable[config].fFlags & ConfigInfo::kTextureable_Flag);
125 }
126
127 bool isConfigRenderable(GrPixelConfig config, bool withMSAA) const override {
128 SkASSERT(kGrPixelConfigCnt > config);
129 if (withMSAA) {
130 return SkToBool(fConfigTable[config].fFlags & ConfigInfo::kRenderableWithMSAA_Flag);
131 } else {
132 return SkToBool(fConfigTable[config].fFlags & ConfigInfo::kRenderable_Flag);
133 }
134 }
135
cblume790d5132016-02-29 11:13:29 -0800136 bool isConfigTexSupportEnabled(GrPixelConfig config) const {
137 SkASSERT(kGrPixelConfigCnt > config);
138 return SkToBool(fConfigTable[config].fFlags & ConfigInfo::kCanUseTexStorage_Flag);
139 }
140
bsalomoncdee0092016-01-08 13:20:12 -0800141 /** Returns the mapping between GrPixelConfig components and GL internal format components. */
142 const GrSwizzle& configSwizzle(GrPixelConfig config) const {
143 return fConfigTable[config].fSwizzle;
144 }
145
bsalomon76148af2016-01-12 11:13:47 -0800146 bool getTexImageFormats(GrPixelConfig surfaceConfig, GrPixelConfig externalConfig,
147 GrGLenum* internalFormat, GrGLenum* externalFormat,
148 GrGLenum* externalType) const;
149
150 bool getCompressedTexImageFormats(GrPixelConfig surfaceConfig, GrGLenum* internalFormat) const;
151
152 bool getReadPixelsFormat(GrPixelConfig surfaceConfig, GrPixelConfig externalConfig,
153 GrGLenum* externalFormat, GrGLenum* externalType) const;
154
155 bool getRenderbufferFormat(GrPixelConfig config, GrGLenum* internalFormat) const;
156
bsalomon30447372015-12-21 09:03:05 -0800157 /**
158 * Gets an array of legal stencil formats. These formats are not guaranteed
159 * to be supported by the driver but are legal GLenum names given the GL
160 * version and extensions supported.
161 */
162 const SkTArray<StencilFormat, true>& stencilFormats() const {
163 return fStencilFormats;
164 }
165
166 /**
167 * Has a stencil format index been found for the config (or we've found that no format works).
168 */
169 bool hasStencilFormatBeenDeterminedForConfig(GrPixelConfig config) const {
170 return fConfigTable[config].fStencilFormatIndex != ConfigInfo::kUnknown_StencilIndex;
171 }
172
173 /**
174 * Gets the stencil format index for the config. This assumes
175 * hasStencilFormatBeenDeterminedForConfig has already been checked. Returns a value < 0 if
176 * no stencil format is supported with the config. Otherwise, returned index refers to the array
177 * returned by stencilFormats().
178 */
179 int getStencilFormatIndexForConfig(GrPixelConfig config) const {
180 SkASSERT(this->hasStencilFormatBeenDeterminedForConfig(config));
181 return fConfigTable[config].fStencilFormatIndex;
182 }
183
184 /**
185 * If index is >= 0 this records an index into stencilFormats() as the best stencil format for
186 * the config. If < 0 it records that the config has no supported stencil format index.
187 */
188 void setStencilFormatIndexForConfig(GrPixelConfig config, int index) {
189 SkASSERT(!this->hasStencilFormatBeenDeterminedForConfig(config));
190 if (index < 0) {
191 fConfigTable[config].fStencilFormatIndex = ConfigInfo::kUnsupported_StencilFormatIndex;
192 } else {
193 fConfigTable[config].fStencilFormatIndex = index;
194 }
195 }
196
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000197 /**
198 * Call to note that a color config has been verified as a valid color
199 * attachment. This may save future calls to glCheckFramebufferStatus
200 * using isConfigVerifiedColorAttachment().
201 */
202 void markConfigAsValidColorAttachment(GrPixelConfig config) {
bsalomon480e8c02015-12-21 13:44:18 -0800203 fConfigTable[config].fFlags |= ConfigInfo::kVerifiedColorAttachment_Flag;
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000204 }
205
206 /**
207 * Call to check whether a config has been verified as a valid color
208 * attachment.
209 */
210 bool isConfigVerifiedColorAttachment(GrPixelConfig config) const {
bsalomon480e8c02015-12-21 13:44:18 -0800211 return SkToBool(fConfigTable[config].fFlags & ConfigInfo::kVerifiedColorAttachment_Flag);
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000212 }
213
214 /**
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000215 * Reports the type of MSAA FBO support.
216 */
217 MSFBOType msFBOType() const { return fMSFBOType; }
218
219 /**
bsalomon083617b2016-02-12 12:10:14 -0800220 * Does the preferred MSAA FBO extension have MSAA renderbuffers?
bsalomon@google.com347c3822013-05-01 20:10:01 +0000221 */
222 bool usesMSAARenderBuffers() const {
223 return kNone_MSFBOType != fMSFBOType &&
224 kES_IMG_MsToTexture_MSFBOType != fMSFBOType &&
vbuzinovdded6962015-06-12 08:59:45 -0700225 kES_EXT_MsToTexture_MSFBOType != fMSFBOType &&
226 kMixedSamples_MSFBOType != fMSFBOType;
bsalomon@google.com347c3822013-05-01 20:10:01 +0000227 }
228
229 /**
bsalomon083617b2016-02-12 12:10:14 -0800230 * What functionality is supported by glBlitFramebuffer.
231 */
232 BlitFramebufferSupport blitFramebufferSupport() const { return fBlitFramebufferSupport; }
233
234 /**
bsalomon@google.com347c3822013-05-01 20:10:01 +0000235 * Is the MSAA FBO extension one where the texture is multisampled when bound to an FBO and
236 * then implicitly resolved when read.
237 */
238 bool usesImplicitMSAAResolve() const {
239 return kES_IMG_MsToTexture_MSFBOType == fMSFBOType ||
240 kES_EXT_MsToTexture_MSFBOType == fMSFBOType;
241 }
242
commit-bot@chromium.org52ffbf62014-04-02 16:19:33 +0000243 InvalidateFBType invalidateFBType() const { return fInvalidateFBType; }
244
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000245 /// What type of buffer mapping is supported?
246 MapBufferType mapBufferType() const { return fMapBufferType; }
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000247
jvanverthd7a2c1f2015-12-07 07:36:44 -0800248 /// What type of transfer buffer is supported?
249 TransferBufferType transferBufferType() const { return fTransferBufferType; }
250
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000251 /// The maximum number of fragment uniform vectors (GLES has min. 16).
252 int maxFragmentUniformVectors() const { return fMaxFragmentUniformVectors; }
253
commit-bot@chromium.orga15f7e52013-06-05 23:29:25 +0000254 /// maximum number of attribute values per vertex
bsalomon@google.com60da4172012-06-01 19:25:00 +0000255 int maxVertexAttributes() const { return fMaxVertexAttributes; }
256
commit-bot@chromium.orga15f7e52013-06-05 23:29:25 +0000257 /// maximum number of texture units accessible in the fragment shader.
258 int maxFragmentTextureUnits() const { return fMaxFragmentTextureUnits; }
259
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000260 /**
261 * Depending on the ES extensions present the BGRA external format may
bsalomon41e4384e2016-01-08 09:12:44 -0800262 * correspond to either a BGRA or RGBA internalFormat. On desktop GL it is
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000263 * RGBA.
264 */
bsalomon41e4384e2016-01-08 09:12:44 -0800265 bool bgraIsInternalFormat() const;
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000266
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000267 /// Is there support for GL_UNPACK_ROW_LENGTH
268 bool unpackRowLengthSupport() const { return fUnpackRowLengthSupport; }
269
270 /// Is there support for GL_UNPACK_FLIP_Y
271 bool unpackFlipYSupport() const { return fUnpackFlipYSupport; }
272
273 /// Is there support for GL_PACK_ROW_LENGTH
274 bool packRowLengthSupport() const { return fPackRowLengthSupport; }
275
276 /// Is there support for GL_PACK_REVERSE_ROW_ORDER
277 bool packFlipYSupport() const { return fPackFlipYSupport; }
278
279 /// Is there support for texture parameter GL_TEXTURE_USAGE
280 bool textureUsageSupport() const { return fTextureUsageSupport; }
281
robertphillips@google.com443e5a52012-04-30 20:01:21 +0000282 /// Is there support for GL_RED and GL_R8
283 bool textureRedSupport() const { return fTextureRedSupport; }
284
bsalomon@google.come76b7cc2012-06-18 12:47:06 +0000285 /// Is GL_ARB_IMAGING supported
286 bool imagingSupport() const { return fImagingSupport; }
287
bsalomon@google.com07631cf2013-03-05 14:14:58 +0000288 /// Is there support for Vertex Array Objects?
289 bool vertexArrayObjectSupport() const { return fVertexArrayObjectSupport; }
290
cdalton626e1ff2015-06-12 13:56:46 -0700291 /// Is there support for GL_EXT_direct_state_access?
292 bool directStateAccessSupport() const { return fDirectStateAccessSupport; }
293
294 /// Is there support for GL_KHR_debug?
295 bool debugSupport() const { return fDebugSupport; }
296
jvanverth3f801cb2014-12-16 09:49:38 -0800297 /// Is there support for ES2 compatability?
298 bool ES2CompatibilitySupport() const { return fES2CompatibilitySupport; }
299
cdaltond4727922015-11-10 12:49:06 -0800300 /// Can we call glDisable(GL_MULTISAMPLE)?
bsalomon76148af2016-01-12 11:13:47 -0800301 bool multisampleDisableSupport() const { return fMultisampleDisableSupport; }
cdaltond4727922015-11-10 12:49:06 -0800302
cdalton06604b92016-02-05 10:09:51 -0800303 /// Is there support for glDraw*Indirect? Note that the baseInstance fields of indirect draw
304 /// commands cannot be used unless we have base instance support.
305 bool drawIndirectSupport() const { return fDrawIndirectSupport; }
306
307 /// Is there support for glMultiDraw*Indirect? Note that the baseInstance fields of indirect
308 /// draw commands cannot be used unless we have base instance support.
309 bool multiDrawIndirectSupport() const { return fMultiDrawIndirectSupport; }
310
311 /// Are the baseInstance fields supported in indirect draw commands?
312 bool baseInstanceSupport() const { return fBaseInstanceSupport; }
313
bsalomon@google.com07631cf2013-03-05 14:14:58 +0000314 /// Use indices or vertices in CPU arrays rather than VBOs for dynamic content.
bsalomon76148af2016-01-12 11:13:47 -0800315 bool useNonVBOVertexAndIndexDynamicData() const { return fUseNonVBOVertexAndIndexDynamicData; }
bsalomon@google.com96966a52013-02-21 16:34:21 +0000316
bsalomon1aa20292016-01-22 08:16:09 -0800317 /// Does ReadPixels support reading readConfig pixels from a FBO that is renderTargetConfig?
318 bool readPixelsSupported(GrPixelConfig renderTargetConfig,
bsalomon7928ef62016-01-05 10:26:39 -0800319 GrPixelConfig readConfig,
bsalomon1aa20292016-01-22 08:16:09 -0800320 std::function<void (GrGLenum, GrGLint*)> getIntegerv,
321 std::function<bool ()> bindRenderTarget) const;
skia.committer@gmail.com631cdcb2013-03-01 12:12:55 +0000322
bsalomon@google.com2b1b8c02013-02-28 22:06:02 +0000323 bool isCoreProfile() const { return fIsCoreProfile; }
robertphillips@google.com1d89c932012-06-27 19:31:41 +0000324
joshualittc1f56b52015-06-22 12:31:31 -0700325 bool bindFragDataLocationSupport() const { return fBindFragDataLocationSupport; }
326
joshualitt7bdd70a2015-10-01 06:28:11 -0700327 bool bindUniformLocationSupport() const { return fBindUniformLocationSupport; }
328
bsalomon7ea33f52015-11-22 14:51:00 -0800329 /// Are textures with GL_TEXTURE_EXTERNAL_OES type supported.
330 bool externalTextureSupport() const { return fExternalTextureSupport; }
331
bsalomone5286e02016-01-14 09:24:09 -0800332 /// Are textures with GL_TEXTURE_RECTANGLE type supported.
333 bool rectangleTextureSupport() const { return fRectangleTextureSupport; }
334
bsalomoncdee0092016-01-08 13:20:12 -0800335 /// GL_ARB_texture_swizzle
336 bool textureSwizzleSupport() const { return fTextureSwizzleSupport; }
337
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000338 /**
bsalomon16921ec2015-07-30 15:34:56 -0700339 * Is there support for enabling/disabling sRGB writes for sRGB-capable color attachments?
340 * If false this does not mean sRGB is not supported but rather that if it is supported
341 * it cannot be turned off for configs that support it.
342 */
343 bool srgbWriteControl() const { return fSRGBWriteControl; }
344
cblume09bd2c02016-03-01 14:08:28 -0800345 bool mipMapLevelAndLodControlSupport() const { return fMipMapLevelAndLodControlSupport; }
346
bsalomon16921ec2015-07-30 15:34:56 -0700347 /**
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000348 * Returns a string containing the caps info.
349 */
mtklein36352bf2015-03-25 18:17:31 -0700350 SkString dump() const override;
commit-bot@chromium.orgbeb8b3a2014-04-15 15:37:51 +0000351
bsalomon88c7b982015-07-31 11:20:16 -0700352 bool rgba8888PixelsOpsAreSlow() const { return fRGBA8888PixelsOpsAreSlow; }
353 bool partialFBOReadIsSlow() const { return fPartialFBOReadIsSlow; }
354
egdanielf5294392015-10-21 07:14:17 -0700355 const GrGLSLCaps* glslCaps() const { return reinterpret_cast<GrGLSLCaps*>(fShaderCaps.get()); }
jvanverthe9c0fc62015-04-29 11:18:05 -0700356
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000357private:
bsalomon76148af2016-01-12 11:13:47 -0800358 enum ExternalFormatUsage {
359 kTexImage_ExternalFormatUsage,
360 kOther_ExternalFormatUsage,
361
362 kLast_ExternalFormatUsage = kOther_ExternalFormatUsage
363 };
364 static const int kExternalFormatUsageCnt = kLast_ExternalFormatUsage + 1;
365 bool getExternalFormat(GrPixelConfig surfaceConfig, GrPixelConfig memoryConfig,
366 ExternalFormatUsage usage, GrGLenum* externalFormat,
367 GrGLenum* externalType) const;
368
cdalton4cd67132015-06-10 19:23:46 -0700369 void init(const GrContextOptions&, const GrGLContextInfo&, const GrGLInterface*);
egdaniel05ded892015-10-26 07:38:05 -0700370 void initGLSL(const GrGLContextInfo&);
kkinnunencfe62e32015-07-01 02:58:50 -0700371 bool hasPathRenderingSupport(const GrGLContextInfo&, const GrGLInterface*);
bsalomon424cc262015-05-22 10:37:30 -0700372
egdanielb7e7d572015-11-04 04:23:53 -0800373 void onApplyOptionsOverrides(const GrContextOptions& options) override;
374
commit-bot@chromium.org73880512013-10-14 15:33:45 +0000375 void initFSAASupport(const GrGLContextInfo&, const GrGLInterface*);
cdalton1dd05422015-06-12 09:01:18 -0700376 void initBlendEqationSupport(const GrGLContextInfo&);
commit-bot@chromium.org73880512013-10-14 15:33:45 +0000377 void initStencilFormats(const GrGLContextInfo&);
commit-bot@chromium.org6b7938f2013-10-15 14:18:16 +0000378 // This must be called after initFSAASupport().
bsalomoncdee0092016-01-08 13:20:12 -0800379 void initConfigTable(const GrGLContextInfo&, const GrGLInterface* gli, GrGLSLCaps* glslCaps);
commit-bot@chromium.org42dc8132014-05-27 19:26:59 +0000380
jvanverthcba99b82015-06-24 06:59:57 -0700381 void initShaderPrecisionTable(const GrGLContextInfo& ctxInfo,
382 const GrGLInterface* intf,
383 GrGLSLCaps* glslCaps);
384
bsalomon1aa20292016-01-22 08:16:09 -0800385 GrGLStandard fStandard;
386
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000387 SkTArray<StencilFormat, true> fStencilFormats;
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000388
389 int fMaxFragmentUniformVectors;
bsalomon@google.com60da4172012-06-01 19:25:00 +0000390 int fMaxVertexAttributes;
commit-bot@chromium.orga15f7e52013-06-05 23:29:25 +0000391 int fMaxFragmentTextureUnits;
bsalomon@google.com60da4172012-06-01 19:25:00 +0000392
commit-bot@chromium.org52ffbf62014-04-02 16:19:33 +0000393 MSFBOType fMSFBOType;
commit-bot@chromium.org52ffbf62014-04-02 16:19:33 +0000394 InvalidateFBType fInvalidateFBType;
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000395 MapBufferType fMapBufferType;
jvanverthd7a2c1f2015-12-07 07:36:44 -0800396 TransferBufferType fTransferBufferType;
bsalomon@google.com6b0cf022013-05-03 13:35:14 +0000397
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000398 bool fUnpackRowLengthSupport : 1;
399 bool fUnpackFlipYSupport : 1;
400 bool fPackRowLengthSupport : 1;
401 bool fPackFlipYSupport : 1;
402 bool fTextureUsageSupport : 1;
robertphillips@google.com443e5a52012-04-30 20:01:21 +0000403 bool fTextureRedSupport : 1;
bsalomon@google.come76b7cc2012-06-18 12:47:06 +0000404 bool fImagingSupport : 1;
bsalomon@google.com07631cf2013-03-05 14:14:58 +0000405 bool fVertexArrayObjectSupport : 1;
cdalton626e1ff2015-06-12 13:56:46 -0700406 bool fDirectStateAccessSupport : 1;
407 bool fDebugSupport : 1;
jvanverth3f801cb2014-12-16 09:49:38 -0800408 bool fES2CompatibilitySupport : 1;
cdaltond4727922015-11-10 12:49:06 -0800409 bool fMultisampleDisableSupport : 1;
cdalton06604b92016-02-05 10:09:51 -0800410 bool fDrawIndirectSupport : 1;
411 bool fMultiDrawIndirectSupport : 1;
412 bool fBaseInstanceSupport : 1;
bsalomon@google.com96966a52013-02-21 16:34:21 +0000413 bool fUseNonVBOVertexAndIndexDynamicData : 1;
bsalomon@google.com2b1b8c02013-02-28 22:06:02 +0000414 bool fIsCoreProfile : 1;
joshualittc1f56b52015-06-22 12:31:31 -0700415 bool fBindFragDataLocationSupport : 1;
bsalomon16921ec2015-07-30 15:34:56 -0700416 bool fSRGBWriteControl : 1;
bsalomon88c7b982015-07-31 11:20:16 -0700417 bool fRGBA8888PixelsOpsAreSlow : 1;
418 bool fPartialFBOReadIsSlow : 1;
joshualitt7bdd70a2015-10-01 06:28:11 -0700419 bool fBindUniformLocationSupport : 1;
bsalomon7ea33f52015-11-22 14:51:00 -0800420 bool fExternalTextureSupport : 1;
bsalomone5286e02016-01-14 09:24:09 -0800421 bool fRectangleTextureSupport : 1;
bsalomoncdee0092016-01-08 13:20:12 -0800422 bool fTextureSwizzleSupport : 1;
cblume09bd2c02016-03-01 14:08:28 -0800423 bool fMipMapLevelAndLodControlSupport : 1;
joshualitt58162332014-08-01 06:44:53 -0700424
bsalomon083617b2016-02-12 12:10:14 -0800425 BlitFramebufferSupport fBlitFramebufferSupport;
426
bsalomon7928ef62016-01-05 10:26:39 -0800427 /** Number type of the components (with out considering number of bits.) */
428 enum FormatType {
429 kNormalizedFixedPoint_FormatType,
430 kFloat_FormatType,
431 };
432
433 struct ReadPixelsFormat {
434 ReadPixelsFormat() : fFormat(0), fType(0) {}
435 GrGLenum fFormat;
436 GrGLenum fType;
437 };
438
bsalomon76148af2016-01-12 11:13:47 -0800439 struct ConfigFormats {
440 ConfigFormats() {
441 // Inits to known bad GL enum values.
442 memset(this, 0xAB, sizeof(ConfigFormats));
443 }
444 GrGLenum fBaseInternalFormat;
445 GrGLenum fSizedInternalFormat;
446
447 /** The external format and type are to be used when uploading/downloading data using this
448 config where both the CPU data and GrSurface are the same config. To get the external
449 format and type when converting between configs while copying to/from memory use
450 getExternalFormat().
451 The kTexImage external format is usually the same as kOther except for kSRGBA on some
452 GL contexts. */
453 GrGLenum fExternalFormat[kExternalFormatUsageCnt];
454 GrGLenum fExternalType;
455
456
457 // Either the base or sized internal format depending on the GL and config.
458 GrGLenum fInternalFormatTexImage;
459 GrGLenum fInternalFormatRenderbuffer;
460 };
461
bsalomon30447372015-12-21 09:03:05 -0800462 struct ConfigInfo {
bsalomon7928ef62016-01-05 10:26:39 -0800463 ConfigInfo() : fStencilFormatIndex(kUnknown_StencilIndex), fFlags(0) {}
bsalomon30447372015-12-21 09:03:05 -0800464
465 ConfigFormats fFormats;
466
bsalomon7928ef62016-01-05 10:26:39 -0800467 FormatType fFormatType;
468
469 // On ES contexts there are restrictions on type type/format that may be used for
470 // ReadPixels. One is implicitly specified by the current FBO's format. The other is
471 // queryable. This stores the queried option (lazily).
472 ReadPixelsFormat fSecondReadPixelsFormat;
473
bsalomon30447372015-12-21 09:03:05 -0800474 enum {
475 // This indicates that a stencil format has not yet been determined for the config.
476 kUnknown_StencilIndex = -1,
477 // This indicates that there is no supported stencil format for the config.
478 kUnsupported_StencilFormatIndex = -2
479 };
bsalomon480e8c02015-12-21 13:44:18 -0800480
481 // Index fStencilFormats.
482 int fStencilFormatIndex;
483
484 enum {
bsalomon41e4384e2016-01-08 09:12:44 -0800485 kVerifiedColorAttachment_Flag = 0x1,
486 kTextureable_Flag = 0x2,
487 kRenderable_Flag = 0x4,
488 kRenderableWithMSAA_Flag = 0x8,
cblume790d5132016-02-29 11:13:29 -0800489 kCanUseTexStorage_Flag = 0x10,
bsalomon480e8c02015-12-21 13:44:18 -0800490 };
491 uint32_t fFlags;
bsalomoncdee0092016-01-08 13:20:12 -0800492
493 GrSwizzle fSwizzle;
bsalomon30447372015-12-21 09:03:05 -0800494 };
495
496 ConfigInfo fConfigTable[kGrPixelConfigCnt];
497
bsalomon4b91f762015-05-19 09:29:46 -0700498 typedef GrCaps INHERITED;
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000499};
500
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000501#endif