/* * 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