| /* | |
| * 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/private/base/SkAssert.h" | |
| #include "src/sksl/SkSLUtil.h" | |
| class SkJSONWriter; | |
| struct GrContextOptions; | |
| struct GrShaderCaps : SkSL::ShaderCaps { | |
| GrShaderCaps() {} | |
| void dumpJSON(SkJSONWriter*) const; | |
| const char* noperspectiveInterpolationExtensionString() const { | |
| SkASSERT(this->fNoPerspectiveInterpolationSupport); | |
| return fNoPerspectiveInterpolationExtensionString; | |
| } | |
| const char* sampleVariablesExtensionString() const { | |
| SkASSERT(this->fSampleMaskSupport); | |
| return fSampleVariablesExtensionString; | |
| } | |
| void applyOptionsOverrides(const GrContextOptions& options); | |
| bool fDstReadInShaderSupport = false; | |
| bool fPreferFlatInterpolation = false; | |
| bool fVertexIDSupport = false; | |
| // 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 fNonconstantArrayIndexSupport = false; | |
| // frexp(), ldexp(), findMSB(), findLSB(). | |
| bool fBitManipulationSupport = false; | |
| bool fHalfIs32Bits = false; | |
| bool fHasLowFragmentPrecision = false; | |
| // Use a reduced set of rendering algorithms or less optimal effects in order to reduce the | |
| // number of unique shaders generated. | |
| bool fReducedShaderMode = false; | |
| // Used for specific driver bug workarounds | |
| bool fRequiresLocalOutputColorForFBFetch = false; | |
| // Workaround for Mali GPU opacity bug with uniform colors. | |
| bool fMustObfuscateUniformColor = false; | |
| // 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 fMustWriteToFragColor = false; | |
| // 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 fAvoidDfDxForGradientsWhenPossible = false; | |
| // This contains 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* fSecondaryOutputExtensionString = nullptr; | |
| const char* fNoPerspectiveInterpolationExtensionString = nullptr; | |
| const char* fSampleVariablesExtensionString = nullptr; | |
| const char* fFBFetchExtensionString = nullptr; | |
| int fMaxFragmentSamplers = 0; | |
| }; | |
| #endif |