Index: src/gpu/gl/GrGLCaps.h |
diff --git a/src/gpu/gl/GrGLCaps.h b/src/gpu/gl/GrGLCaps.h |
index 71bbafd8d9b046d4c673c5769e4180cda90deb3c..f08aa452669d5b372eece188cfab9636c23a89d4 100644 |
--- a/src/gpu/gl/GrGLCaps.h |
+++ b/src/gpu/gl/GrGLCaps.h |
@@ -1,398 +1,400 @@ |
-/* |
- * Copyright 2012 Google Inc. |
- * |
- * Use of this source code is governed by a BSD-style license that can be |
- * found in the LICENSE file. |
- */ |
- |
- |
-#ifndef GrGLCaps_DEFINED |
-#define GrGLCaps_DEFINED |
- |
-#include "GrDrawTargetCaps.h" |
-#include "GrGLStencilAttachment.h" |
-#include "SkChecksum.h" |
-#include "SkTHash.h" |
-#include "SkTArray.h" |
- |
-class GrGLContextInfo; |
- |
-/** |
- * Stores some capabilities of a GL context. Most are determined by the GL |
- * version and the extensions string. It also tracks formats that have passed |
- * the FBO completeness test. |
- */ |
-class GrGLCaps : public GrDrawTargetCaps { |
-public: |
- SK_DECLARE_INST_COUNT(GrGLCaps) |
- |
- typedef GrGLStencilAttachment::Format StencilFormat; |
- |
- /** |
- * The type of MSAA for FBOs supported. Different extensions have different |
- * semantics of how / when a resolve is performed. |
- */ |
- enum MSFBOType { |
- /** |
- * no support for MSAA FBOs |
- */ |
- kNone_MSFBOType = 0, |
- /** |
- * GL3.0-style MSAA FBO (GL_ARB_framebuffer_object). |
- */ |
- kDesktop_ARB_MSFBOType, |
- /** |
- * earlier GL_EXT_framebuffer* extensions |
- */ |
- kDesktop_EXT_MSFBOType, |
- /** |
- * Similar to kDesktop_ARB but with additional restrictions on glBlitFramebuffer. |
- */ |
- kES_3_0_MSFBOType, |
- /** |
- * GL_APPLE_framebuffer_multisample ES extension |
- */ |
- kES_Apple_MSFBOType, |
- /** |
- * GL_IMG_multisampled_render_to_texture. This variation does not have MSAA renderbuffers. |
- * Instead the texture is multisampled when bound to the FBO and then resolved automatically |
- * when read. It also defines an alternate value for GL_MAX_SAMPLES (which we call |
- * GR_GL_MAX_SAMPLES_IMG). |
- */ |
- kES_IMG_MsToTexture_MSFBOType, |
- /** |
- * GL_EXT_multisampled_render_to_texture. Same as the IMG one above but uses the standard |
- * GL_MAX_SAMPLES value. |
- */ |
- kES_EXT_MsToTexture_MSFBOType, |
- |
- kLast_MSFBOType = kES_EXT_MsToTexture_MSFBOType |
- }; |
- |
- enum InvalidateFBType { |
- kNone_InvalidateFBType, |
- kDiscard_InvalidateFBType, //<! glDiscardFramebuffer() |
- kInvalidate_InvalidateFBType, //<! glInvalidateFramebuffer() |
- |
- kLast_InvalidateFBType = kInvalidate_InvalidateFBType |
- }; |
- |
- enum MapBufferType { |
- kNone_MapBufferType, |
- kMapBuffer_MapBufferType, // glMapBuffer() |
- kMapBufferRange_MapBufferType, // glMapBufferRange() |
- kChromium_MapBufferType, // GL_CHROMIUM_map_sub |
- |
- kLast_MapBufferType = kChromium_MapBufferType, |
- }; |
- |
- /** |
- * Creates a GrGLCaps that advertises no support for any extensions, |
- * formats, etc. Call init to initialize from a GrGLContextInfo. |
- */ |
- GrGLCaps(); |
- |
- GrGLCaps(const GrGLCaps& caps); |
- |
- GrGLCaps& operator = (const GrGLCaps& caps); |
- |
- /** |
- * Resets the caps such that nothing is supported. |
- */ |
- void reset() override; |
- |
- /** |
- * Initializes the GrGLCaps to the set of features supported in the current |
- * OpenGL context accessible via ctxInfo. |
- */ |
- bool init(const GrGLContextInfo& ctxInfo, const GrGLInterface* glInterface); |
- |
- /** |
- * Call to note that a color config has been verified as a valid color |
- * attachment. This may save future calls to glCheckFramebufferStatus |
- * using isConfigVerifiedColorAttachment(). |
- */ |
- void markConfigAsValidColorAttachment(GrPixelConfig config) { |
- fVerifiedColorConfigs.markVerified(config); |
- } |
- |
- /** |
- * Call to check whether a config has been verified as a valid color |
- * attachment. |
- */ |
- bool isConfigVerifiedColorAttachment(GrPixelConfig config) const { |
- return fVerifiedColorConfigs.isVerified(config); |
- } |
- |
- /** |
- * Call to note that a color config / stencil format pair passed |
- * FBO status check. We may skip calling glCheckFramebufferStatus for |
- * this combination in the future using |
- * isColorConfigAndStencilFormatVerified(). |
- */ |
- void markColorConfigAndStencilFormatAsVerified( |
- GrPixelConfig config, |
- const GrGLStencilAttachment::Format& format); |
- |
- /** |
- * Call to check whether color config / stencil format pair has already |
- * passed FBO status check. |
- */ |
- bool isColorConfigAndStencilFormatVerified( |
- GrPixelConfig config, |
- const GrGLStencilAttachment::Format& format) const; |
- |
- /** |
- * Reports the type of MSAA FBO support. |
- */ |
- MSFBOType msFBOType() const { return fMSFBOType; } |
- |
- /** |
- * Does the supported MSAA FBO extension have MSAA renderbuffers? |
- */ |
- bool usesMSAARenderBuffers() const { |
- return kNone_MSFBOType != fMSFBOType && |
- kES_IMG_MsToTexture_MSFBOType != fMSFBOType && |
- kES_EXT_MsToTexture_MSFBOType != fMSFBOType; |
- } |
- |
- /** |
- * Is the MSAA FBO extension one where the texture is multisampled when bound to an FBO and |
- * then implicitly resolved when read. |
- */ |
- bool usesImplicitMSAAResolve() const { |
- return kES_IMG_MsToTexture_MSFBOType == fMSFBOType || |
- kES_EXT_MsToTexture_MSFBOType == fMSFBOType; |
- } |
- |
- /** |
- * Some helper functions for encapsulating various extensions to read FB Buffer on openglES |
- * |
- * TODO(joshualitt) On desktop opengl 4.2+ we can achieve something similar to this effect |
- */ |
- bool fbFetchSupport() const { return fFBFetchSupport; } |
- |
- bool fbFetchNeedsCustomOutput() const { return fFBFetchNeedsCustomOutput; } |
- |
- const char* fbFetchColorName() const { return fFBFetchColorName; } |
- |
- const char* fbFetchExtensionString() const { return fFBFetchExtensionString; } |
- |
- bool fbMixedSamplesSupport() const { return fFBMixedSamplesSupport; } |
- |
- InvalidateFBType invalidateFBType() const { return fInvalidateFBType; } |
- |
- /// What type of buffer mapping is supported? |
- MapBufferType mapBufferType() const { return fMapBufferType; } |
- |
- /** |
- * Gets an array of legal stencil formats. These formats are not guaranteed |
- * to be supported by the driver but are legal GLenum names given the GL |
- * version and extensions supported. |
- */ |
- const SkTArray<StencilFormat, true>& stencilFormats() const { |
- return fStencilFormats; |
- } |
- |
- /// The maximum number of fragment uniform vectors (GLES has min. 16). |
- int maxFragmentUniformVectors() const { return fMaxFragmentUniformVectors; } |
- |
- /// maximum number of attribute values per vertex |
- int maxVertexAttributes() const { return fMaxVertexAttributes; } |
- |
- /// maximum number of texture units accessible in the fragment shader. |
- int maxFragmentTextureUnits() const { return fMaxFragmentTextureUnits; } |
- |
- /// ES requires an extension to support RGBA8 in RenderBufferStorage |
- bool rgba8RenderbufferSupport() const { return fRGBA8RenderbufferSupport; } |
- |
- /** |
- * Depending on the ES extensions present the BGRA external format may |
- * correspond either a BGRA or RGBA internalFormat. On desktop GL it is |
- * RGBA. |
- */ |
- bool bgraIsInternalFormat() const { return fBGRAIsInternalFormat; } |
- |
- /// GL_ARB_texture_swizzle support |
- bool textureSwizzleSupport() const { return fTextureSwizzleSupport; } |
- |
- /// Is there support for GL_UNPACK_ROW_LENGTH |
- bool unpackRowLengthSupport() const { return fUnpackRowLengthSupport; } |
- |
- /// Is there support for GL_UNPACK_FLIP_Y |
- bool unpackFlipYSupport() const { return fUnpackFlipYSupport; } |
- |
- /// Is there support for GL_PACK_ROW_LENGTH |
- bool packRowLengthSupport() const { return fPackRowLengthSupport; } |
- |
- /// Is there support for GL_PACK_REVERSE_ROW_ORDER |
- bool packFlipYSupport() const { return fPackFlipYSupport; } |
- |
- /// Is there support for texture parameter GL_TEXTURE_USAGE |
- bool textureUsageSupport() const { return fTextureUsageSupport; } |
- |
- /// Is there support for glTexStorage |
- bool texStorageSupport() const { return fTexStorageSupport; } |
- |
- /// Is there support for GL_RED and GL_R8 |
- bool textureRedSupport() const { return fTextureRedSupport; } |
- |
- /// Is GL_ARB_IMAGING supported |
- bool imagingSupport() const { return fImagingSupport; } |
- |
- /// Is GL_ARB_fragment_coord_conventions supported? |
- bool fragCoordConventionsSupport() const { return fFragCoordsConventionSupport; } |
- |
- /// Is there support for Vertex Array Objects? |
- bool vertexArrayObjectSupport() const { return fVertexArrayObjectSupport; } |
- |
- /// Is there support for ES2 compatability? |
- bool ES2CompatibilitySupport() const { return fES2CompatibilitySupport; } |
- |
- /// Use indices or vertices in CPU arrays rather than VBOs for dynamic content. |
- bool useNonVBOVertexAndIndexDynamicData() const { |
- return fUseNonVBOVertexAndIndexDynamicData; |
- } |
- |
- /// Does ReadPixels support the provided format/type combo? |
- bool readPixelsSupported(const GrGLInterface* intf, |
- GrGLenum format, |
- GrGLenum type, |
- GrGLenum currFboFormat) const; |
- |
- bool isCoreProfile() const { return fIsCoreProfile; } |
- |
- |
- bool fullClearIsFree() const { return fFullClearIsFree; } |
- |
- bool dropsTileOnZeroDivide() const { return fDropsTileOnZeroDivide; } |
- |
- /** |
- * Returns a string containing the caps info. |
- */ |
- SkString dump() const override; |
- |
- /** |
- * LATC can appear under one of three possible names. In order to know |
- * which GL internal format to use, we need to keep track of which name |
- * we found LATC under. The default is LATC. |
- */ |
- enum LATCAlias { |
- kLATC_LATCAlias, |
- kRGTC_LATCAlias, |
- k3DC_LATCAlias |
- }; |
- |
- LATCAlias latcAlias() const { return fLATCAlias; } |
- |
-private: |
- /** |
- * Maintains a bit per GrPixelConfig. It is used to avoid redundantly |
- * performing glCheckFrameBufferStatus for the same config. |
- */ |
- struct VerifiedColorConfigs { |
- VerifiedColorConfigs() { |
- this->reset(); |
- } |
- |
- void reset() { |
- for (int i = 0; i < kNumUints; ++i) { |
- fVerifiedColorConfigs[i] = 0; |
- } |
- } |
- |
- static const int kNumUints = (kGrPixelConfigCnt + 31) / 32; |
- uint32_t fVerifiedColorConfigs[kNumUints]; |
- |
- void markVerified(GrPixelConfig config) { |
-#if !GR_GL_CHECK_FBO_STATUS_ONCE_PER_FORMAT |
- return; |
-#endif |
- int u32Idx = config / 32; |
- int bitIdx = config % 32; |
- fVerifiedColorConfigs[u32Idx] |= 1 << bitIdx; |
- } |
- |
- bool isVerified(GrPixelConfig config) const { |
-#if !GR_GL_CHECK_FBO_STATUS_ONCE_PER_FORMAT |
- return false; |
-#endif |
- int u32Idx = config / 32; |
- int bitIdx = config % 32; |
- return SkToBool(fVerifiedColorConfigs[u32Idx] & (1 << bitIdx)); |
- } |
- }; |
- |
- void initFSAASupport(const GrGLContextInfo&, const GrGLInterface*); |
- void initStencilFormats(const GrGLContextInfo&); |
- // This must be called after initFSAASupport(). |
- void initConfigRenderableTable(const GrGLContextInfo&); |
- void initConfigTexturableTable(const GrGLContextInfo&, const GrGLInterface*); |
- |
- // Must be called after fGeometryShaderSupport is initialized. |
- void initShaderPrecisionTable(const GrGLContextInfo&, const GrGLInterface*); |
- |
- bool doReadPixelsSupported(const GrGLInterface* intf, GrGLenum format, GrGLenum type) const; |
- |
- // tracks configs that have been verified to pass the FBO completeness when |
- // used as a color attachment |
- VerifiedColorConfigs fVerifiedColorConfigs; |
- |
- SkTArray<StencilFormat, true> fStencilFormats; |
- // tracks configs that have been verified to pass the FBO completeness when |
- // used as a color attachment when a particular stencil format is used |
- // as a stencil attachment. |
- SkTArray<VerifiedColorConfigs, true> fStencilVerifiedColorConfigs; |
- |
- int fMaxFragmentUniformVectors; |
- int fMaxVertexAttributes; |
- int fMaxFragmentTextureUnits; |
- |
- MSFBOType fMSFBOType; |
- InvalidateFBType fInvalidateFBType; |
- MapBufferType fMapBufferType; |
- LATCAlias fLATCAlias; |
- |
- bool fRGBA8RenderbufferSupport : 1; |
- bool fBGRAIsInternalFormat : 1; |
- bool fTextureSwizzleSupport : 1; |
- bool fUnpackRowLengthSupport : 1; |
- bool fUnpackFlipYSupport : 1; |
- bool fPackRowLengthSupport : 1; |
- bool fPackFlipYSupport : 1; |
- bool fTextureUsageSupport : 1; |
- bool fTexStorageSupport : 1; |
- bool fTextureRedSupport : 1; |
- bool fImagingSupport : 1; |
- bool fTwoFormatLimit : 1; |
- bool fFragCoordsConventionSupport : 1; |
- bool fVertexArrayObjectSupport : 1; |
- bool fES2CompatibilitySupport : 1; |
- bool fUseNonVBOVertexAndIndexDynamicData : 1; |
- bool fIsCoreProfile : 1; |
- bool fFullClearIsFree : 1; |
- bool fDropsTileOnZeroDivide : 1; |
- bool fFBFetchSupport : 1; |
- bool fFBFetchNeedsCustomOutput : 1; |
- bool fFBMixedSamplesSupport : 1; |
- |
- const char* fFBFetchColorName; |
- const char* fFBFetchExtensionString; |
- |
- struct ReadPixelsSupportedFormat { |
- GrGLenum fFormat; |
- GrGLenum fType; |
- GrGLenum fFboFormat; |
- |
- bool operator==(const ReadPixelsSupportedFormat& rhs) const { |
- return fFormat == rhs.fFormat |
- && fType == rhs.fType |
- && fFboFormat == rhs.fFboFormat; |
- } |
- }; |
- mutable SkTHashMap<ReadPixelsSupportedFormat, bool> fReadPixelsSupportedCache; |
- |
- typedef GrDrawTargetCaps INHERITED; |
-}; |
- |
-#endif |
+/* |
+ * Copyright 2012 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+ |
+#ifndef GrGLCaps_DEFINED |
+#define GrGLCaps_DEFINED |
+ |
+#include "GrDrawTargetCaps.h" |
+#include "GrGLStencilAttachment.h" |
+#include "SkChecksum.h" |
+#include "SkTHash.h" |
+#include "SkTArray.h" |
+ |
+class GrGLContextInfo; |
+ |
+/** |
+ * Stores some capabilities of a GL context. Most are determined by the GL |
+ * version and the extensions string. It also tracks formats that have passed |
+ * the FBO completeness test. |
+ */ |
+class GrGLCaps : public GrDrawTargetCaps { |
+public: |
+ SK_DECLARE_INST_COUNT(GrGLCaps) |
+ |
+ typedef GrGLStencilAttachment::Format StencilFormat; |
+ |
+ /** |
+ * The type of MSAA for FBOs supported. Different extensions have different |
+ * semantics of how / when a resolve is performed. |
+ */ |
+ enum MSFBOType { |
+ /** |
+ * no support for MSAA FBOs |
+ */ |
+ kNone_MSFBOType = 0, |
+ /** |
+ * GL3.0-style MSAA FBO (GL_ARB_framebuffer_object). |
+ */ |
+ kDesktop_ARB_MSFBOType, |
+ /** |
+ * earlier GL_EXT_framebuffer* extensions |
+ */ |
+ kDesktop_EXT_MSFBOType, |
+ /** |
+ * Similar to kDesktop_ARB but with additional restrictions on glBlitFramebuffer. |
+ */ |
+ kES_3_0_MSFBOType, |
+ /** |
+ * GL_APPLE_framebuffer_multisample ES extension |
+ */ |
+ kES_Apple_MSFBOType, |
+ /** |
+ * GL_IMG_multisampled_render_to_texture. This variation does not have MSAA renderbuffers. |
+ * Instead the texture is multisampled when bound to the FBO and then resolved automatically |
+ * when read. It also defines an alternate value for GL_MAX_SAMPLES (which we call |
+ * GR_GL_MAX_SAMPLES_IMG). |
+ */ |
+ kES_IMG_MsToTexture_MSFBOType, |
+ /** |
+ * GL_EXT_multisampled_render_to_texture. Same as the IMG one above but uses the standard |
+ * GL_MAX_SAMPLES value. |
+ */ |
+ kES_EXT_MsToTexture_MSFBOType, |
+ |
+ kLast_MSFBOType = kES_EXT_MsToTexture_MSFBOType |
+ }; |
+ |
+ enum InvalidateFBType { |
+ kNone_InvalidateFBType, |
+ kDiscard_InvalidateFBType, //<! glDiscardFramebuffer() |
+ kInvalidate_InvalidateFBType, //<! glInvalidateFramebuffer() |
+ |
+ kLast_InvalidateFBType = kInvalidate_InvalidateFBType |
+ }; |
+ |
+ enum MapBufferType { |
+ kNone_MapBufferType, |
+ kMapBuffer_MapBufferType, // glMapBuffer() |
+ kMapBufferRange_MapBufferType, // glMapBufferRange() |
+ kChromium_MapBufferType, // GL_CHROMIUM_map_sub |
+ |
+ kLast_MapBufferType = kChromium_MapBufferType, |
+ }; |
+ |
+ /** |
+ * Creates a GrGLCaps that advertises no support for any extensions, |
+ * formats, etc. Call init to initialize from a GrGLContextInfo. |
+ */ |
+ GrGLCaps(); |
+ |
+ GrGLCaps(const GrGLCaps& caps); |
+ |
+ GrGLCaps& operator = (const GrGLCaps& caps); |
+ |
+ /** |
+ * Resets the caps such that nothing is supported. |
+ */ |
+ void reset() override; |
+ |
+ /** |
+ * Initializes the GrGLCaps to the set of features supported in the current |
+ * OpenGL context accessible via ctxInfo. |
+ */ |
+ bool init(const GrGLContextInfo& ctxInfo, const GrGLInterface* glInterface); |
+ |
+ /** |
+ * Call to note that a color config has been verified as a valid color |
+ * attachment. This may save future calls to glCheckFramebufferStatus |
+ * using isConfigVerifiedColorAttachment(). |
+ */ |
+ void markConfigAsValidColorAttachment(GrPixelConfig config) { |
+ fVerifiedColorConfigs.markVerified(config); |
+ } |
+ |
+ /** |
+ * Call to check whether a config has been verified as a valid color |
+ * attachment. |
+ */ |
+ bool isConfigVerifiedColorAttachment(GrPixelConfig config) const { |
+ return fVerifiedColorConfigs.isVerified(config); |
+ } |
+ |
+ /** |
+ * Call to note that a color config / stencil format pair passed |
+ * FBO status check. We may skip calling glCheckFramebufferStatus for |
+ * this combination in the future using |
+ * isColorConfigAndStencilFormatVerified(). |
+ */ |
+ void markColorConfigAndStencilFormatAsVerified( |
+ GrPixelConfig config, |
+ const GrGLStencilAttachment::Format& format); |
+ |
+ /** |
+ * Call to check whether color config / stencil format pair has already |
+ * passed FBO status check. |
+ */ |
+ bool isColorConfigAndStencilFormatVerified( |
+ GrPixelConfig config, |
+ const GrGLStencilAttachment::Format& format) const; |
+ |
+ /** |
+ * Reports the type of MSAA FBO support. |
+ */ |
+ MSFBOType msFBOType() const { return fMSFBOType; } |
+ |
+ /** |
+ * Does the supported MSAA FBO extension have MSAA renderbuffers? |
+ */ |
+ bool usesMSAARenderBuffers() const { |
+ return kNone_MSFBOType != fMSFBOType && |
+ kES_IMG_MsToTexture_MSFBOType != fMSFBOType && |
+ kES_EXT_MsToTexture_MSFBOType != fMSFBOType; |
+ } |
+ |
+ /** |
+ * Is the MSAA FBO extension one where the texture is multisampled when bound to an FBO and |
+ * then implicitly resolved when read. |
+ */ |
+ bool usesImplicitMSAAResolve() const { |
+ return kES_IMG_MsToTexture_MSFBOType == fMSFBOType || |
+ kES_EXT_MsToTexture_MSFBOType == fMSFBOType; |
+ } |
+ |
+ /** |
+ * Some helper functions for encapsulating various extensions to read FB Buffer on openglES |
+ * |
+ * TODO(joshualitt) On desktop opengl 4.2+ we can achieve something similar to this effect |
+ */ |
+ bool fbFetchSupport() const { return fFBFetchSupport; } |
+ |
+ bool fbFetchNeedsCustomOutput() const { return fFBFetchNeedsCustomOutput; } |
+ |
+ const char* fbFetchColorName() const { return fFBFetchColorName; } |
+ |
+ const char* fbFetchExtensionString() const { return fFBFetchExtensionString; } |
+ |
+ bool fbMixedSamplesSupport() const { return fFBMixedSamplesSupport; } |
+ |
+ InvalidateFBType invalidateFBType() const { return fInvalidateFBType; } |
+ |
+ /// What type of buffer mapping is supported? |
+ MapBufferType mapBufferType() const { return fMapBufferType; } |
+ |
+ /** |
+ * Gets an array of legal stencil formats. These formats are not guaranteed |
+ * to be supported by the driver but are legal GLenum names given the GL |
+ * version and extensions supported. |
+ */ |
+ const SkTArray<StencilFormat, true>& stencilFormats() const { |
+ return fStencilFormats; |
+ } |
+ |
+ /// The maximum number of fragment uniform vectors (GLES has min. 16). |
+ int maxFragmentUniformVectors() const { return fMaxFragmentUniformVectors; } |
+ |
+ /// maximum number of attribute values per vertex |
+ int maxVertexAttributes() const { return fMaxVertexAttributes; } |
+ |
+ /// maximum number of texture units accessible in the fragment shader. |
+ int maxFragmentTextureUnits() const { return fMaxFragmentTextureUnits; } |
+ |
+ /// ES requires an extension to support RGBA8 in RenderBufferStorage |
+ bool rgba8RenderbufferSupport() const { return fRGBA8RenderbufferSupport; } |
+ |
+ /** |
+ * Depending on the ES extensions present the BGRA external format may |
+ * correspond either a BGRA or RGBA internalFormat. On desktop GL it is |
+ * RGBA. |
+ */ |
+ bool bgraIsInternalFormat() const { return fBGRAIsInternalFormat; } |
+ |
+ /// GL_ARB_texture_swizzle support |
+ bool textureSwizzleSupport() const { return fTextureSwizzleSupport; } |
+ |
+ /// Is there support for GL_UNPACK_ROW_LENGTH |
+ bool unpackRowLengthSupport() const { return fUnpackRowLengthSupport; } |
+ |
+ /// Is there support for GL_UNPACK_FLIP_Y |
+ bool unpackFlipYSupport() const { return fUnpackFlipYSupport; } |
+ |
+ /// Is there support for GL_PACK_ROW_LENGTH |
+ bool packRowLengthSupport() const { return fPackRowLengthSupport; } |
+ |
+ /// Is there support for GL_PACK_REVERSE_ROW_ORDER |
+ bool packFlipYSupport() const { return fPackFlipYSupport; } |
+ |
+ /// Is there support for texture parameter GL_TEXTURE_USAGE |
+ bool textureUsageSupport() const { return fTextureUsageSupport; } |
+ |
+ /// Is there support for glTexStorage |
+ bool texStorageSupport() const { return fTexStorageSupport; } |
+ |
+ /// Is there support for GL_RED and GL_R8 |
+ bool textureRedSupport() const { return fTextureRedSupport; } |
+ |
+ /// Is GL_ARB_IMAGING supported |
+ bool imagingSupport() const { return fImagingSupport; } |
+ |
+ /// Is GL_ARB_fragment_coord_conventions supported? |
+ bool fragCoordConventionsSupport() const { return fFragCoordsConventionSupport; } |
+ |
+ /// Is there support for Vertex Array Objects? |
+ bool vertexArrayObjectSupport() const { return fVertexArrayObjectSupport; } |
+ |
+ /// Is there support for ES2 compatability? |
+ bool ES2CompatibilitySupport() const { return fES2CompatibilitySupport; } |
+ |
+ /// Use indices or vertices in CPU arrays rather than VBOs for dynamic content. |
+ bool useNonVBOVertexAndIndexDynamicData() const { |
+ return fUseNonVBOVertexAndIndexDynamicData; |
+ } |
+ |
+ /// Does ReadPixels support the provided format/type combo? |
+ bool readPixelsSupported(const GrGLInterface* intf, |
+ GrGLenum format, |
+ GrGLenum type, |
+ GrGLenum currFboFormat) const; |
+ |
+ bool isCoreProfile() const { return fIsCoreProfile; } |
+ |
+ |
+ bool fullClearIsFree() const { return fFullClearIsFree; } |
+ |
+ bool dropsTileOnZeroDivide() const { return fDropsTileOnZeroDivide; } |
+ |
+ /** |
+ * Returns a string containing the caps info. |
+ */ |
+ SkString dump() const override; |
+ |
+ /** |
+ * LATC can appear under one of three possible names. In order to know |
+ * which GL internal format to use, we need to keep track of which name |
+ * we found LATC under. The default is LATC. |
+ */ |
+ enum LATCAlias { |
+ kLATC_LATCAlias, |
+ kRGTC_LATCAlias, |
+ k3DC_LATCAlias |
+ }; |
+ |
+ LATCAlias latcAlias() const { return fLATCAlias; } |
+ |
+private: |
+ /** |
+ * Maintains a bit per GrPixelConfig. It is used to avoid redundantly |
+ * performing glCheckFrameBufferStatus for the same config. |
+ */ |
+ struct VerifiedColorConfigs { |
+ VerifiedColorConfigs() { |
+ this->reset(); |
+ } |
+ |
+ void reset() { |
+ for (int i = 0; i < kNumUints; ++i) { |
+ fVerifiedColorConfigs[i] = 0; |
+ } |
+ } |
+ |
+ static const int kNumUints = (kGrPixelConfigCnt + 31) / 32; |
+ uint32_t fVerifiedColorConfigs[kNumUints]; |
+ |
+ void markVerified(GrPixelConfig config) { |
+#if !GR_GL_CHECK_FBO_STATUS_ONCE_PER_FORMAT |
+ return; |
+#endif |
+ int u32Idx = config / 32; |
+ int bitIdx = config % 32; |
+ fVerifiedColorConfigs[u32Idx] |= 1 << bitIdx; |
+ } |
+ |
+ bool isVerified(GrPixelConfig config) const { |
+#if !GR_GL_CHECK_FBO_STATUS_ONCE_PER_FORMAT |
+ return false; |
+#endif |
+ int u32Idx = config / 32; |
+ int bitIdx = config % 32; |
+ return SkToBool(fVerifiedColorConfigs[u32Idx] & (1 << bitIdx)); |
+ } |
+ }; |
+ |
+ void initFSAASupport(const GrGLContextInfo&, const GrGLInterface*); |
+ void initStencilFormats(const GrGLContextInfo&); |
+ // This must be called after initFSAASupport(). |
+ void initConfigRenderableTable(const GrGLContextInfo&); |
+ void initConfigTexturableTable(const GrGLContextInfo&, const GrGLInterface*); |
+ |
+ // Must be called after fGeometryShaderSupport is initialized. |
+ void initShaderPrecisionTable(const GrGLContextInfo&, const GrGLInterface*); |
+ |
+ bool doReadPixelsSupported(const GrGLInterface* intf, GrGLenum format, GrGLenum type) const; |
+ |
+ // tracks configs that have been verified to pass the FBO completeness when |
+ // used as a color attachment |
+ VerifiedColorConfigs fVerifiedColorConfigs; |
+ |
+ SkTArray<StencilFormat, true> fStencilFormats; |
+ // tracks configs that have been verified to pass the FBO completeness when |
+ // used as a color attachment when a particular stencil format is used |
+ // as a stencil attachment. |
+ SkTArray<VerifiedColorConfigs, true> fStencilVerifiedColorConfigs; |
+ |
+ int fMaxFragmentUniformVectors; |
+ int fMaxVertexAttributes; |
+ int fMaxFragmentTextureUnits; |
+ |
+ MSFBOType fMSFBOType; |
+ InvalidateFBType fInvalidateFBType; |
+ MapBufferType fMapBufferType; |
+ LATCAlias fLATCAlias; |
+ |
+ bool fRGBA8RenderbufferSupport : 1; |
+ bool fBGRAIsInternalFormat : 1; |
+ bool fTextureSwizzleSupport : 1; |
+ bool fUnpackRowLengthSupport : 1; |
+ bool fUnpackFlipYSupport : 1; |
+ bool fPackRowLengthSupport : 1; |
+ bool fPackFlipYSupport : 1; |
+ bool fTextureUsageSupport : 1; |
+ bool fTexStorageSupport : 1; |
+ bool fTextureRedSupport : 1; |
+ bool fImagingSupport : 1; |
+ bool fTwoFormatLimit : 1; |
+ bool fFragCoordsConventionSupport : 1; |
+ bool fVertexArrayObjectSupport : 1; |
+ bool fES2CompatibilitySupport : 1; |
+ bool fUseNonVBOVertexAndIndexDynamicData : 1; |
+ bool fIsCoreProfile : 1; |
+ bool fFullClearIsFree : 1; |
+ bool fDropsTileOnZeroDivide : 1; |
+ bool fFBFetchSupport : 1; |
+ bool fFBFetchNeedsCustomOutput : 1; |
+ bool fFBMixedSamplesSupport : 1; |
+ |
+ const char* fFBFetchColorName; |
+ const char* fFBFetchExtensionString; |
+ |
+ struct ReadPixelsSupportedFormat { |
+ GrGLenum fFormat; |
+ GrGLenum fType; |
+ GrGLenum fFboFormat; |
+ |
+ bool operator==(const ReadPixelsSupportedFormat& rhs) const { |
+ return fFormat == rhs.fFormat |
+ && fType == rhs.fType |
+ && fFboFormat == rhs.fFboFormat; |
+ } |
+ }; |
+ mutable SkTHashMap<ReadPixelsSupportedFormat, bool> fReadPixelsSupportedCache; |
+ |
+ typedef GrDrawTargetCaps INHERITED; |
+}; |
+ |
+typedef GrGLCaps GrGLSLCaps; |
+ |
+#endif |