| /* |
| * 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 GrShaderCaps_DEFINED |
| #define GrShaderCaps_DEFINED |
| |
| #include "include/core/SkRefCnt.h" |
| #include "src/gpu/glsl/GrGLSL.h" |
| #include "src/sksl/SkSLUtil.h" |
| |
| struct GrContextOptions; |
| class SkJSONWriter; |
| |
| struct GrShaderCaps : SkSL::ShaderCaps { |
| GrShaderCaps() {} |
| |
| // |
| // TODO: Remove these unnecessary accessors |
| // |
| void dumpJSON(SkJSONWriter*) const; |
| |
| bool supportsDistanceFieldText() const { return fShaderDerivativeSupport; } |
| |
| bool dstReadInShaderSupport() const { return fDstReadInShaderSupport; } |
| bool dualSourceBlendingSupport() const { return fDualSourceBlendingSupport; } |
| |
| const char* fbFetchExtensionString() const { return fFBFetchExtensionString; } |
| |
| bool preferFlatInterpolation() const { return fPreferFlatInterpolation; } |
| |
| bool vertexIDSupport() const { return fVertexIDSupport; } |
| |
| // isinf() is defined, and floating point infinities are handled according to IEEE standards. |
| bool infinitySupport() const { return fInfinitySupport; } |
| |
| // Returns true if `expr` in `myArray[expr]` can be any integer expression. If false, `expr` |
| // must be a constant-index-expression as defined in the OpenGL ES2 specification, Appendix A.5. |
| bool nonconstantArrayIndexSupport() const { |
| return fNonconstantArrayIndexSupport; |
| } |
| |
| // frexp(), ldexp(), findMSB(), findLSB(). |
| bool bitManipulationSupport() const { return fBitManipulationSupport; } |
| |
| bool halfIs32Bits() const { return fHalfIs32Bits; } |
| |
| bool hasLowFragmentPrecision() const { return fHasLowFragmentPrecision; } |
| |
| // Use a reduced set of rendering algorithms or less optimal effects in order to |
| // reduce the number of unique shaders generated. |
| bool reducedShaderMode() const { return fReducedShaderMode; } |
| |
| /** |
| * SkSL ES3 requires support for derivatives, nonsquare matrices and bitwise integer operations. |
| */ |
| bool supportsSkSLES3() const { |
| return fShaderDerivativeSupport && fNonsquareMatrixSupport && fIntegerSupport && |
| fGLSLGeneration >= SkSL::GLSLGeneration::k330; |
| } |
| |
| // SkSL only. |
| bool colorSpaceMathNeedsFloat() const { return fColorSpaceMathNeedsFloat; } |
| |
| bool requiresLocalOutputColorForFBFetch() const { return fRequiresLocalOutputColorForFBFetch; } |
| |
| bool mustObfuscateUniformColor() const { return fMustObfuscateUniformColor; } |
| |
| // On Nexus 6, the GL context can get lost if a shader does not write a value to gl_FragColor. |
| // https://bugs.chromium.org/p/chromium/issues/detail?id=445377 |
| bool mustWriteToFragColor() const { return fMustWriteToFragColor; } |
| |
| // Some GPUs produce poor results when enabling Metal's fastmath option |
| bool canUseFastMath() const { return fCanUseFastMath; } |
| |
| // When we have the option of using either dFdx or dfDy in a shader, this returns whether we |
| // should avoid using dFdx. We have found some drivers have bugs or lower precision when using |
| // dFdx. |
| bool avoidDfDxForGradientsWhenPossible() const { return fAvoidDfDxForGradientsWhenPossible; } |
| |
| // This returns the name of an extension that must be enabled in the shader, if such a thing is |
| // required in order to use a secondary output in the shader. This returns a nullptr if no such |
| // extension is required. However, the return value of this function does not say whether dual |
| // source blending is supported. |
| const char* secondaryOutputExtensionString() const { return fSecondaryOutputExtensionString; } |
| |
| const char* noperspectiveInterpolationExtensionString() const { |
| SkASSERT(this->noperspectiveInterpolationSupport()); |
| return fNoPerspectiveInterpolationExtensionString; |
| } |
| |
| const char* sampleVariablesExtensionString() const { |
| SkASSERT(this->sampleMaskSupport()); |
| return fSampleVariablesExtensionString; |
| } |
| |
| const char* tessellationExtensionString() const { |
| SkASSERT(this->tessellationSupport()); |
| return fTessellationExtensionString; |
| } |
| |
| int maxFragmentSamplers() const { return fMaxFragmentSamplers; } |
| |
| // Maximum number of segments a tessellation edge can be divided into. |
| int maxTessellationSegments() const { return fMaxTessellationSegments; } |
| |
| bool tessellationSupport() const { return SkToBool(fMaxTessellationSegments);} |
| |
| void applyOptionsOverrides(const GrContextOptions& options); |
| |
| bool fDstReadInShaderSupport = false; |
| bool fDualSourceBlendingSupport = false; |
| bool fPreferFlatInterpolation = false; |
| bool fVertexIDSupport = false; |
| bool fInfinitySupport = false; |
| bool fNonconstantArrayIndexSupport = false; |
| bool fBitManipulationSupport = false; |
| bool fHalfIs32Bits = false; |
| bool fHasLowFragmentPrecision = false; |
| bool fReducedShaderMode = false; |
| |
| // Used for specific driver bug work arounds |
| bool fRequiresLocalOutputColorForFBFetch = false; |
| bool fMustObfuscateUniformColor = false; |
| bool fMustWriteToFragColor = false; |
| bool fColorSpaceMathNeedsFloat = false; |
| bool fCanUseFastMath = false; |
| bool fAvoidDfDxForGradientsWhenPossible = false; |
| |
| const char* fSecondaryOutputExtensionString = nullptr; |
| const char* fNoPerspectiveInterpolationExtensionString = nullptr; |
| const char* fSampleVariablesExtensionString = nullptr; |
| const char* fTessellationExtensionString = nullptr; |
| |
| const char* fFBFetchExtensionString = nullptr; |
| |
| int fMaxFragmentSamplers = 0; |
| int fMaxTessellationSegments = 0; |
| }; |
| |
| #endif |