1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2012 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrShaderCaps_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrShaderCaps_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLUtil.h" 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker class SkJSONWriter; 15*c8dee2aaSAndroid Build Coastguard Worker struct GrContextOptions; 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker struct GrShaderCaps : SkSL::ShaderCaps { GrShaderCapsGrShaderCaps18*c8dee2aaSAndroid Build Coastguard Worker GrShaderCaps() {} 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker void dumpJSON(SkJSONWriter*) const; 21*c8dee2aaSAndroid Build Coastguard Worker noperspectiveInterpolationExtensionStringGrShaderCaps22*c8dee2aaSAndroid Build Coastguard Worker const char* noperspectiveInterpolationExtensionString() const { 23*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->fNoPerspectiveInterpolationSupport); 24*c8dee2aaSAndroid Build Coastguard Worker return fNoPerspectiveInterpolationExtensionString; 25*c8dee2aaSAndroid Build Coastguard Worker } 26*c8dee2aaSAndroid Build Coastguard Worker sampleVariablesExtensionStringGrShaderCaps27*c8dee2aaSAndroid Build Coastguard Worker const char* sampleVariablesExtensionString() const { 28*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->fSampleMaskSupport); 29*c8dee2aaSAndroid Build Coastguard Worker return fSampleVariablesExtensionString; 30*c8dee2aaSAndroid Build Coastguard Worker } 31*c8dee2aaSAndroid Build Coastguard Worker 32*c8dee2aaSAndroid Build Coastguard Worker void applyOptionsOverrides(const GrContextOptions& options); 33*c8dee2aaSAndroid Build Coastguard Worker 34*c8dee2aaSAndroid Build Coastguard Worker bool fDstReadInShaderSupport = false; 35*c8dee2aaSAndroid Build Coastguard Worker bool fPreferFlatInterpolation = false; 36*c8dee2aaSAndroid Build Coastguard Worker bool fVertexIDSupport = false; 37*c8dee2aaSAndroid Build Coastguard Worker // Returns true if `expr` in `myArray[expr]` can be any integer expression. If false, `expr` 38*c8dee2aaSAndroid Build Coastguard Worker // must be a constant-index-expression as defined in the OpenGL ES2 specification, Appendix A.5. 39*c8dee2aaSAndroid Build Coastguard Worker bool fNonconstantArrayIndexSupport = false; 40*c8dee2aaSAndroid Build Coastguard Worker // frexp(), ldexp(), findMSB(), findLSB(). 41*c8dee2aaSAndroid Build Coastguard Worker bool fBitManipulationSupport = false; 42*c8dee2aaSAndroid Build Coastguard Worker bool fHalfIs32Bits = false; 43*c8dee2aaSAndroid Build Coastguard Worker bool fHasLowFragmentPrecision = false; 44*c8dee2aaSAndroid Build Coastguard Worker // Use a reduced set of rendering algorithms or less optimal effects in order to reduce the 45*c8dee2aaSAndroid Build Coastguard Worker // number of unique shaders generated. 46*c8dee2aaSAndroid Build Coastguard Worker bool fReducedShaderMode = false; 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Worker // Used for specific driver bug workarounds 49*c8dee2aaSAndroid Build Coastguard Worker bool fRequiresLocalOutputColorForFBFetch = false; 50*c8dee2aaSAndroid Build Coastguard Worker // Workaround for Mali GPU opacity bug with uniform colors. 51*c8dee2aaSAndroid Build Coastguard Worker bool fMustObfuscateUniformColor = false; 52*c8dee2aaSAndroid Build Coastguard Worker // On Nexus 6, the GL context can get lost if a shader does not write a value to gl_FragColor. 53*c8dee2aaSAndroid Build Coastguard Worker // https://bugs.chromium.org/p/chromium/issues/detail?id=445377 54*c8dee2aaSAndroid Build Coastguard Worker bool fMustWriteToFragColor = false; 55*c8dee2aaSAndroid Build Coastguard Worker // When we have the option of using either dFdx or dfDy in a shader, this returns whether we 56*c8dee2aaSAndroid Build Coastguard Worker // should avoid using dFdx. We have found some drivers have bugs or lower precision when using 57*c8dee2aaSAndroid Build Coastguard Worker // dFdx. 58*c8dee2aaSAndroid Build Coastguard Worker bool fAvoidDfDxForGradientsWhenPossible = false; 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker // This contains the name of an extension that must be enabled in the shader, if such a thing is 61*c8dee2aaSAndroid Build Coastguard Worker // required in order to use a secondary output in the shader. This returns a nullptr if no such 62*c8dee2aaSAndroid Build Coastguard Worker // extension is required. However, the return value of this function does not say whether dual 63*c8dee2aaSAndroid Build Coastguard Worker // source blending is supported. 64*c8dee2aaSAndroid Build Coastguard Worker const char* fSecondaryOutputExtensionString = nullptr; 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker const char* fNoPerspectiveInterpolationExtensionString = nullptr; 67*c8dee2aaSAndroid Build Coastguard Worker const char* fSampleVariablesExtensionString = nullptr; 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker const char* fFBFetchExtensionString = nullptr; 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker int fMaxFragmentSamplers = 0; 72*c8dee2aaSAndroid Build Coastguard Worker }; 73*c8dee2aaSAndroid Build Coastguard Worker 74*c8dee2aaSAndroid Build Coastguard Worker #endif 75