blob: fc29615cb54190ecb03ce3ee7075cc114d10055b [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
bsalomoncdee0092016-01-08 13:20:12 -0800136 /** Returns the mapping between GrPixelConfig components and GL internal format components. */
137 const GrSwizzle& configSwizzle(GrPixelConfig config) const {
138 return fConfigTable[config].fSwizzle;
139 }
140
bsalomon76148af2016-01-12 11:13:47 -0800141 bool getTexImageFormats(GrPixelConfig surfaceConfig, GrPixelConfig externalConfig,
142 GrGLenum* internalFormat, GrGLenum* externalFormat,
143 GrGLenum* externalType) const;
144
145 bool getCompressedTexImageFormats(GrPixelConfig surfaceConfig, GrGLenum* internalFormat) const;
146
147 bool getReadPixelsFormat(GrPixelConfig surfaceConfig, GrPixelConfig externalConfig,
148 GrGLenum* externalFormat, GrGLenum* externalType) const;
149
150 bool getRenderbufferFormat(GrPixelConfig config, GrGLenum* internalFormat) const;
151
bsalomon30447372015-12-21 09:03:05 -0800152 /**
153 * Gets an array of legal stencil formats. These formats are not guaranteed
154 * to be supported by the driver but are legal GLenum names given the GL
155 * version and extensions supported.
156 */
157 const SkTArray<StencilFormat, true>& stencilFormats() const {
158 return fStencilFormats;
159 }
160
161 /**
162 * Has a stencil format index been found for the config (or we've found that no format works).
163 */
164 bool hasStencilFormatBeenDeterminedForConfig(GrPixelConfig config) const {
165 return fConfigTable[config].fStencilFormatIndex != ConfigInfo::kUnknown_StencilIndex;
166 }
167
168 /**
169 * Gets the stencil format index for the config. This assumes
170 * hasStencilFormatBeenDeterminedForConfig has already been checked. Returns a value < 0 if
171 * no stencil format is supported with the config. Otherwise, returned index refers to the array
172 * returned by stencilFormats().
173 */
174 int getStencilFormatIndexForConfig(GrPixelConfig config) const {
175 SkASSERT(this->hasStencilFormatBeenDeterminedForConfig(config));
176 return fConfigTable[config].fStencilFormatIndex;
177 }
178
179 /**
180 * If index is >= 0 this records an index into stencilFormats() as the best stencil format for
181 * the config. If < 0 it records that the config has no supported stencil format index.
182 */
183 void setStencilFormatIndexForConfig(GrPixelConfig config, int index) {
184 SkASSERT(!this->hasStencilFormatBeenDeterminedForConfig(config));
185 if (index < 0) {
186 fConfigTable[config].fStencilFormatIndex = ConfigInfo::kUnsupported_StencilFormatIndex;
187 } else {
188 fConfigTable[config].fStencilFormatIndex = index;
189 }
190 }
191
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000192 /**
193 * Call to note that a color config has been verified as a valid color
194 * attachment. This may save future calls to glCheckFramebufferStatus
195 * using isConfigVerifiedColorAttachment().
196 */
197 void markConfigAsValidColorAttachment(GrPixelConfig config) {
bsalomon480e8c02015-12-21 13:44:18 -0800198 fConfigTable[config].fFlags |= ConfigInfo::kVerifiedColorAttachment_Flag;
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000199 }
200
201 /**
202 * Call to check whether a config has been verified as a valid color
203 * attachment.
204 */
205 bool isConfigVerifiedColorAttachment(GrPixelConfig config) const {
bsalomon480e8c02015-12-21 13:44:18 -0800206 return SkToBool(fConfigTable[config].fFlags & ConfigInfo::kVerifiedColorAttachment_Flag);
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000207 }
208
209 /**
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000210 * Reports the type of MSAA FBO support.
211 */
212 MSFBOType msFBOType() const { return fMSFBOType; }
213
214 /**
bsalomon083617b2016-02-12 12:10:14 -0800215 * Does the preferred MSAA FBO extension have MSAA renderbuffers?
bsalomon@google.com347c3822013-05-01 20:10:01 +0000216 */
217 bool usesMSAARenderBuffers() const {
218 return kNone_MSFBOType != fMSFBOType &&
219 kES_IMG_MsToTexture_MSFBOType != fMSFBOType &&
vbuzinovdded6962015-06-12 08:59:45 -0700220 kES_EXT_MsToTexture_MSFBOType != fMSFBOType &&
221 kMixedSamples_MSFBOType != fMSFBOType;
bsalomon@google.com347c3822013-05-01 20:10:01 +0000222 }
223
224 /**
bsalomon083617b2016-02-12 12:10:14 -0800225 * What functionality is supported by glBlitFramebuffer.
226 */
227 BlitFramebufferSupport blitFramebufferSupport() const { return fBlitFramebufferSupport; }
228
229 /**
bsalomon@google.com347c3822013-05-01 20:10:01 +0000230 * Is the MSAA FBO extension one where the texture is multisampled when bound to an FBO and
231 * then implicitly resolved when read.
232 */
233 bool usesImplicitMSAAResolve() const {
234 return kES_IMG_MsToTexture_MSFBOType == fMSFBOType ||
235 kES_EXT_MsToTexture_MSFBOType == fMSFBOType;
236 }
237
commit-bot@chromium.org52ffbf62014-04-02 16:19:33 +0000238 InvalidateFBType invalidateFBType() const { return fInvalidateFBType; }
239
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000240 /// What type of buffer mapping is supported?
241 MapBufferType mapBufferType() const { return fMapBufferType; }
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000242
jvanverthd7a2c1f2015-12-07 07:36:44 -0800243 /// What type of transfer buffer is supported?
244 TransferBufferType transferBufferType() const { return fTransferBufferType; }
245
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000246 /// The maximum number of fragment uniform vectors (GLES has min. 16).
247 int maxFragmentUniformVectors() const { return fMaxFragmentUniformVectors; }
248
commit-bot@chromium.orga15f7e52013-06-05 23:29:25 +0000249 /// maximum number of attribute values per vertex
bsalomon@google.com60da4172012-06-01 19:25:00 +0000250 int maxVertexAttributes() const { return fMaxVertexAttributes; }
251
commit-bot@chromium.orga15f7e52013-06-05 23:29:25 +0000252 /// maximum number of texture units accessible in the fragment shader.
253 int maxFragmentTextureUnits() const { return fMaxFragmentTextureUnits; }
254
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000255 /**
256 * Depending on the ES extensions present the BGRA external format may
bsalomon41e4384e2016-01-08 09:12:44 -0800257 * correspond to either a BGRA or RGBA internalFormat. On desktop GL it is
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000258 * RGBA.
259 */
bsalomon41e4384e2016-01-08 09:12:44 -0800260 bool bgraIsInternalFormat() const;
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000261
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000262 /// Is there support for GL_UNPACK_ROW_LENGTH
263 bool unpackRowLengthSupport() const { return fUnpackRowLengthSupport; }
264
265 /// Is there support for GL_UNPACK_FLIP_Y
266 bool unpackFlipYSupport() const { return fUnpackFlipYSupport; }
267
268 /// Is there support for GL_PACK_ROW_LENGTH
269 bool packRowLengthSupport() const { return fPackRowLengthSupport; }
270
271 /// Is there support for GL_PACK_REVERSE_ROW_ORDER
272 bool packFlipYSupport() const { return fPackFlipYSupport; }
273
274 /// Is there support for texture parameter GL_TEXTURE_USAGE
275 bool textureUsageSupport() const { return fTextureUsageSupport; }
276
277 /// Is there support for glTexStorage
278 bool texStorageSupport() const { return fTexStorageSupport; }
279
robertphillips@google.com443e5a52012-04-30 20:01:21 +0000280 /// Is there support for GL_RED and GL_R8
281 bool textureRedSupport() const { return fTextureRedSupport; }
282
bsalomon@google.come76b7cc2012-06-18 12:47:06 +0000283 /// Is GL_ARB_IMAGING supported
284 bool imagingSupport() const { return fImagingSupport; }
285
bsalomon@google.com07631cf2013-03-05 14:14:58 +0000286 /// Is there support for Vertex Array Objects?
287 bool vertexArrayObjectSupport() const { return fVertexArrayObjectSupport; }
288
cdalton626e1ff2015-06-12 13:56:46 -0700289 /// Is there support for GL_EXT_direct_state_access?
290 bool directStateAccessSupport() const { return fDirectStateAccessSupport; }
291
292 /// Is there support for GL_KHR_debug?
293 bool debugSupport() const { return fDebugSupport; }
294
jvanverth3f801cb2014-12-16 09:49:38 -0800295 /// Is there support for ES2 compatability?
296 bool ES2CompatibilitySupport() const { return fES2CompatibilitySupport; }
297
cdaltond4727922015-11-10 12:49:06 -0800298 /// Can we call glDisable(GL_MULTISAMPLE)?
bsalomon76148af2016-01-12 11:13:47 -0800299 bool multisampleDisableSupport() const { return fMultisampleDisableSupport; }
cdaltond4727922015-11-10 12:49:06 -0800300
cdalton06604b92016-02-05 10:09:51 -0800301 /// Is there support for glDraw*Indirect? Note that the baseInstance fields of indirect draw
302 /// commands cannot be used unless we have base instance support.
303 bool drawIndirectSupport() const { return fDrawIndirectSupport; }
304
305 /// Is there support for glMultiDraw*Indirect? Note that the baseInstance fields of indirect
306 /// draw commands cannot be used unless we have base instance support.
307 bool multiDrawIndirectSupport() const { return fMultiDrawIndirectSupport; }
308
309 /// Are the baseInstance fields supported in indirect draw commands?
310 bool baseInstanceSupport() const { return fBaseInstanceSupport; }
311
bsalomon@google.com07631cf2013-03-05 14:14:58 +0000312 /// Use indices or vertices in CPU arrays rather than VBOs for dynamic content.
bsalomon76148af2016-01-12 11:13:47 -0800313 bool useNonVBOVertexAndIndexDynamicData() const { return fUseNonVBOVertexAndIndexDynamicData; }
bsalomon@google.com96966a52013-02-21 16:34:21 +0000314
bsalomon1aa20292016-01-22 08:16:09 -0800315 /// Does ReadPixels support reading readConfig pixels from a FBO that is renderTargetConfig?
316 bool readPixelsSupported(GrPixelConfig renderTargetConfig,
bsalomon7928ef62016-01-05 10:26:39 -0800317 GrPixelConfig readConfig,
bsalomon1aa20292016-01-22 08:16:09 -0800318 std::function<void (GrGLenum, GrGLint*)> getIntegerv,
319 std::function<bool ()> bindRenderTarget) const;
skia.committer@gmail.com631cdcb2013-03-01 12:12:55 +0000320
bsalomon@google.com2b1b8c02013-02-28 22:06:02 +0000321 bool isCoreProfile() const { return fIsCoreProfile; }
robertphillips@google.com1d89c932012-06-27 19:31:41 +0000322
joshualittc1f56b52015-06-22 12:31:31 -0700323 bool bindFragDataLocationSupport() const { return fBindFragDataLocationSupport; }
324
joshualitt7bdd70a2015-10-01 06:28:11 -0700325 bool bindUniformLocationSupport() const { return fBindUniformLocationSupport; }
326
bsalomon7ea33f52015-11-22 14:51:00 -0800327 /// Are textures with GL_TEXTURE_EXTERNAL_OES type supported.
328 bool externalTextureSupport() const { return fExternalTextureSupport; }
329
bsalomone5286e02016-01-14 09:24:09 -0800330 /// Are textures with GL_TEXTURE_RECTANGLE type supported.
331 bool rectangleTextureSupport() const { return fRectangleTextureSupport; }
332
bsalomoncdee0092016-01-08 13:20:12 -0800333 /// GL_ARB_texture_swizzle
334 bool textureSwizzleSupport() const { return fTextureSwizzleSupport; }
335
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000336 /**
bsalomon16921ec2015-07-30 15:34:56 -0700337 * Is there support for enabling/disabling sRGB writes for sRGB-capable color attachments?
338 * If false this does not mean sRGB is not supported but rather that if it is supported
339 * it cannot be turned off for configs that support it.
340 */
341 bool srgbWriteControl() const { return fSRGBWriteControl; }
342
343 /**
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000344 * Returns a string containing the caps info.
345 */
mtklein36352bf2015-03-25 18:17:31 -0700346 SkString dump() const override;
commit-bot@chromium.orgbeb8b3a2014-04-15 15:37:51 +0000347
bsalomon88c7b982015-07-31 11:20:16 -0700348 bool rgba8888PixelsOpsAreSlow() const { return fRGBA8888PixelsOpsAreSlow; }
349 bool partialFBOReadIsSlow() const { return fPartialFBOReadIsSlow; }
350
egdanielf5294392015-10-21 07:14:17 -0700351 const GrGLSLCaps* glslCaps() const { return reinterpret_cast<GrGLSLCaps*>(fShaderCaps.get()); }
jvanverthe9c0fc62015-04-29 11:18:05 -0700352
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000353private:
bsalomon76148af2016-01-12 11:13:47 -0800354 enum ExternalFormatUsage {
355 kTexImage_ExternalFormatUsage,
356 kOther_ExternalFormatUsage,
357
358 kLast_ExternalFormatUsage = kOther_ExternalFormatUsage
359 };
360 static const int kExternalFormatUsageCnt = kLast_ExternalFormatUsage + 1;
361 bool getExternalFormat(GrPixelConfig surfaceConfig, GrPixelConfig memoryConfig,
362 ExternalFormatUsage usage, GrGLenum* externalFormat,
363 GrGLenum* externalType) const;
364
cdalton4cd67132015-06-10 19:23:46 -0700365 void init(const GrContextOptions&, const GrGLContextInfo&, const GrGLInterface*);
egdaniel05ded892015-10-26 07:38:05 -0700366 void initGLSL(const GrGLContextInfo&);
kkinnunencfe62e32015-07-01 02:58:50 -0700367 bool hasPathRenderingSupport(const GrGLContextInfo&, const GrGLInterface*);
bsalomon424cc262015-05-22 10:37:30 -0700368
egdanielb7e7d572015-11-04 04:23:53 -0800369 void onApplyOptionsOverrides(const GrContextOptions& options) override;
370
commit-bot@chromium.org73880512013-10-14 15:33:45 +0000371 void initFSAASupport(const GrGLContextInfo&, const GrGLInterface*);
cdalton1dd05422015-06-12 09:01:18 -0700372 void initBlendEqationSupport(const GrGLContextInfo&);
commit-bot@chromium.org73880512013-10-14 15:33:45 +0000373 void initStencilFormats(const GrGLContextInfo&);
commit-bot@chromium.org6b7938f2013-10-15 14:18:16 +0000374 // This must be called after initFSAASupport().
bsalomoncdee0092016-01-08 13:20:12 -0800375 void initConfigTable(const GrGLContextInfo&, const GrGLInterface* gli, GrGLSLCaps* glslCaps);
commit-bot@chromium.org42dc8132014-05-27 19:26:59 +0000376
jvanverthcba99b82015-06-24 06:59:57 -0700377 void initShaderPrecisionTable(const GrGLContextInfo& ctxInfo,
378 const GrGLInterface* intf,
379 GrGLSLCaps* glslCaps);
380
bsalomon1aa20292016-01-22 08:16:09 -0800381 GrGLStandard fStandard;
382
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000383 SkTArray<StencilFormat, true> fStencilFormats;
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000384
385 int fMaxFragmentUniformVectors;
bsalomon@google.com60da4172012-06-01 19:25:00 +0000386 int fMaxVertexAttributes;
commit-bot@chromium.orga15f7e52013-06-05 23:29:25 +0000387 int fMaxFragmentTextureUnits;
bsalomon@google.com60da4172012-06-01 19:25:00 +0000388
commit-bot@chromium.org52ffbf62014-04-02 16:19:33 +0000389 MSFBOType fMSFBOType;
commit-bot@chromium.org52ffbf62014-04-02 16:19:33 +0000390 InvalidateFBType fInvalidateFBType;
commit-bot@chromium.org160b4782014-05-05 12:32:37 +0000391 MapBufferType fMapBufferType;
jvanverthd7a2c1f2015-12-07 07:36:44 -0800392 TransferBufferType fTransferBufferType;
bsalomon@google.com6b0cf022013-05-03 13:35:14 +0000393
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000394 bool fUnpackRowLengthSupport : 1;
395 bool fUnpackFlipYSupport : 1;
396 bool fPackRowLengthSupport : 1;
397 bool fPackFlipYSupport : 1;
398 bool fTextureUsageSupport : 1;
399 bool fTexStorageSupport : 1;
robertphillips@google.com443e5a52012-04-30 20:01:21 +0000400 bool fTextureRedSupport : 1;
bsalomon@google.come76b7cc2012-06-18 12:47:06 +0000401 bool fImagingSupport : 1;
bsalomon@google.com07631cf2013-03-05 14:14:58 +0000402 bool fVertexArrayObjectSupport : 1;
cdalton626e1ff2015-06-12 13:56:46 -0700403 bool fDirectStateAccessSupport : 1;
404 bool fDebugSupport : 1;
jvanverth3f801cb2014-12-16 09:49:38 -0800405 bool fES2CompatibilitySupport : 1;
cdaltond4727922015-11-10 12:49:06 -0800406 bool fMultisampleDisableSupport : 1;
cdalton06604b92016-02-05 10:09:51 -0800407 bool fDrawIndirectSupport : 1;
408 bool fMultiDrawIndirectSupport : 1;
409 bool fBaseInstanceSupport : 1;
bsalomon@google.com96966a52013-02-21 16:34:21 +0000410 bool fUseNonVBOVertexAndIndexDynamicData : 1;
bsalomon@google.com2b1b8c02013-02-28 22:06:02 +0000411 bool fIsCoreProfile : 1;
joshualittc1f56b52015-06-22 12:31:31 -0700412 bool fBindFragDataLocationSupport : 1;
bsalomon16921ec2015-07-30 15:34:56 -0700413 bool fSRGBWriteControl : 1;
bsalomon88c7b982015-07-31 11:20:16 -0700414 bool fRGBA8888PixelsOpsAreSlow : 1;
415 bool fPartialFBOReadIsSlow : 1;
joshualitt7bdd70a2015-10-01 06:28:11 -0700416 bool fBindUniformLocationSupport : 1;
bsalomon7ea33f52015-11-22 14:51:00 -0800417 bool fExternalTextureSupport : 1;
bsalomone5286e02016-01-14 09:24:09 -0800418 bool fRectangleTextureSupport : 1;
bsalomoncdee0092016-01-08 13:20:12 -0800419 bool fTextureSwizzleSupport : 1;
joshualitt58162332014-08-01 06:44:53 -0700420
bsalomon083617b2016-02-12 12:10:14 -0800421 BlitFramebufferSupport fBlitFramebufferSupport;
422
bsalomon7928ef62016-01-05 10:26:39 -0800423 /** Number type of the components (with out considering number of bits.) */
424 enum FormatType {
425 kNormalizedFixedPoint_FormatType,
426 kFloat_FormatType,
427 };
428
429 struct ReadPixelsFormat {
430 ReadPixelsFormat() : fFormat(0), fType(0) {}
431 GrGLenum fFormat;
432 GrGLenum fType;
433 };
434
bsalomon76148af2016-01-12 11:13:47 -0800435 struct ConfigFormats {
436 ConfigFormats() {
437 // Inits to known bad GL enum values.
438 memset(this, 0xAB, sizeof(ConfigFormats));
439 }
440 GrGLenum fBaseInternalFormat;
441 GrGLenum fSizedInternalFormat;
442
443 /** The external format and type are to be used when uploading/downloading data using this
444 config where both the CPU data and GrSurface are the same config. To get the external
445 format and type when converting between configs while copying to/from memory use
446 getExternalFormat().
447 The kTexImage external format is usually the same as kOther except for kSRGBA on some
448 GL contexts. */
449 GrGLenum fExternalFormat[kExternalFormatUsageCnt];
450 GrGLenum fExternalType;
451
452
453 // Either the base or sized internal format depending on the GL and config.
454 GrGLenum fInternalFormatTexImage;
455 GrGLenum fInternalFormatRenderbuffer;
456 };
457
bsalomon30447372015-12-21 09:03:05 -0800458 struct ConfigInfo {
bsalomon7928ef62016-01-05 10:26:39 -0800459 ConfigInfo() : fStencilFormatIndex(kUnknown_StencilIndex), fFlags(0) {}
bsalomon30447372015-12-21 09:03:05 -0800460
461 ConfigFormats fFormats;
462
bsalomon7928ef62016-01-05 10:26:39 -0800463 FormatType fFormatType;
464
465 // On ES contexts there are restrictions on type type/format that may be used for
466 // ReadPixels. One is implicitly specified by the current FBO's format. The other is
467 // queryable. This stores the queried option (lazily).
468 ReadPixelsFormat fSecondReadPixelsFormat;
469
bsalomon30447372015-12-21 09:03:05 -0800470 enum {
471 // This indicates that a stencil format has not yet been determined for the config.
472 kUnknown_StencilIndex = -1,
473 // This indicates that there is no supported stencil format for the config.
474 kUnsupported_StencilFormatIndex = -2
475 };
bsalomon480e8c02015-12-21 13:44:18 -0800476
477 // Index fStencilFormats.
478 int fStencilFormatIndex;
479
480 enum {
bsalomon41e4384e2016-01-08 09:12:44 -0800481 kVerifiedColorAttachment_Flag = 0x1,
482 kTextureable_Flag = 0x2,
483 kRenderable_Flag = 0x4,
484 kRenderableWithMSAA_Flag = 0x8,
bsalomon480e8c02015-12-21 13:44:18 -0800485 };
486 uint32_t fFlags;
bsalomoncdee0092016-01-08 13:20:12 -0800487
488 GrSwizzle fSwizzle;
bsalomon30447372015-12-21 09:03:05 -0800489 };
490
491 ConfigInfo fConfigTable[kGrPixelConfigCnt];
492
bsalomon4b91f762015-05-19 09:29:46 -0700493 typedef GrCaps INHERITED;
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000494};
495
bsalomon@google.comf7fa8062012-02-14 14:09:57 +0000496#endif