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