1/* 2 * Copyright 2012 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 9#include "src/gpu/GrShaderCaps.h" 10 11#include "include/gpu/GrContextOptions.h" 12 13//////////////////////////////////////////////////////////////////////////////////////////// 14 15GrShaderCaps::GrShaderCaps() { 16 fGLSLGeneration = k330_GrGLSLGeneration; 17 fShaderDerivativeSupport = false; 18 fDstReadInShaderSupport = false; 19 fDualSourceBlendingSupport = false; 20 fIntegerSupport = false; 21 fNonsquareMatrixSupport = false; 22 fInverseHyperbolicSupport = false; 23 fFBFetchSupport = false; 24 fFBFetchNeedsCustomOutput = false; 25 fUsesPrecisionModifiers = false; 26 fCanUseAnyFunctionInShader = true; 27 fCanUseMinAndAbsTogether = true; 28 fCanUseFractForNegativeValues = true; 29 fMustForceNegatedAtanParamToFloat = false; 30 fMustForceNegatedLdexpParamToMultiply = false; 31 fAtan2ImplementedAsAtanYOverX = false; 32 fMustDoOpBetweenFloorAndAbs = false; 33 fRequiresLocalOutputColorForFBFetch = false; 34 fMustObfuscateUniformColor = false; 35 fMustGuardDivisionEvenAfterExplicitZeroCheck = false; 36 fCanUseFragCoord = true; 37 fIncompleteShortIntPrecision = false; 38 fAddAndTrueToLoopCondition = false; 39 fUnfoldShortCircuitAsTernary = false; 40 fEmulateAbsIntFunction = false; 41 fRewriteDoWhileLoops = false; 42 fRewriteSwitchStatements = false; 43 fRemovePowWithConstantExponent = false; 44 fMustWriteToFragColor = false; 45 fNoDefaultPrecisionForExternalSamplers = false; 46 fRewriteMatrixVectorMultiply = false; 47 fRewriteMatrixComparisons = false; 48 fFlatInterpolationSupport = false; 49 fPreferFlatInterpolation = false; 50 fNoPerspectiveInterpolationSupport = false; 51 fSampleMaskSupport = false; 52 fExternalTextureSupport = false; 53 fVertexIDSupport = false; 54 fInfinitySupport = false; 55 fNonconstantArrayIndexSupport = false; 56 fBitManipulationSupport = false; 57 fFloatIs32Bits = true; 58 fHalfIs32Bits = false; 59 fHasLowFragmentPrecision = false; 60 fReducedShaderMode = false; 61 fColorSpaceMathNeedsFloat = false; 62 fBuiltinFMASupport = false; 63 fBuiltinDeterminantSupport = false; 64 fCanUseDoLoops = true; 65 fCanUseFastMath = false; 66 fUseNodePools = true; 67 fAvoidDfDxForGradientsWhenPossible = false; 68 69 fVersionDeclString = nullptr; 70 fShaderDerivativeExtensionString = nullptr; 71 fSecondaryOutputExtensionString = nullptr; 72 fExternalTextureExtensionString = nullptr; 73 fSecondExternalTextureExtensionString = nullptr; 74 fNoPerspectiveInterpolationExtensionString = nullptr; 75 fSampleVariablesExtensionString = nullptr; 76 fTessellationExtensionString = nullptr; 77 fFBFetchColorName = nullptr; 78 fFBFetchExtensionString = nullptr; 79 fMaxFragmentSamplers = 0; 80 fMaxTessellationSegments = 0; 81 fAdvBlendEqInteraction = kNotSupported_AdvBlendEqInteraction; 82} 83 84#ifdef SK_ENABLE_DUMP_GPU 85#include "src/utils/SkJSONWriter.h" 86 87void GrShaderCaps::dumpJSON(SkJSONWriter* writer) const { 88 writer->beginObject(); 89 90 writer->appendBool("Shader Derivative Support", fShaderDerivativeSupport); 91 writer->appendBool("Dst Read In Shader Support", fDstReadInShaderSupport); 92 writer->appendBool("Dual Source Blending Support", fDualSourceBlendingSupport); 93 writer->appendBool("Integer Support", fIntegerSupport); 94 writer->appendBool("Nonsquare Matrix Support", fNonsquareMatrixSupport); 95 writer->appendBool("Inverse Hyperbolic Support", fInverseHyperbolicSupport); 96 97 static const char* kAdvBlendEqInteractionStr[] = { 98 "Not Supported", 99 "Automatic", 100 "General Enable", 101 }; 102 static_assert(0 == kNotSupported_AdvBlendEqInteraction); 103 static_assert(1 == kAutomatic_AdvBlendEqInteraction); 104 static_assert(2 == kGeneralEnable_AdvBlendEqInteraction); 105 static_assert(SK_ARRAY_COUNT(kAdvBlendEqInteractionStr) == kLast_AdvBlendEqInteraction + 1); 106 107 writer->appendBool("FB Fetch Support", fFBFetchSupport); 108 writer->appendBool("Uses precision modifiers", fUsesPrecisionModifiers); 109 writer->appendBool("Can use any() function", fCanUseAnyFunctionInShader); 110 writer->appendBool("Can use min() and abs() together", fCanUseMinAndAbsTogether); 111 writer->appendBool("Can use fract() for negative values", fCanUseFractForNegativeValues); 112 writer->appendBool("Must force negated atan param to float", fMustForceNegatedAtanParamToFloat); 113 writer->appendBool("Must force negated ldexp param to multiply", 114 fMustForceNegatedLdexpParamToMultiply); 115 writer->appendBool("Must do op between floor and abs", fMustDoOpBetweenFloorAndAbs); 116 writer->appendBool("Must use local out color for FBFetch", fRequiresLocalOutputColorForFBFetch); 117 writer->appendBool("Must obfuscate uniform color", fMustObfuscateUniformColor); 118 writer->appendBool("Must guard division even after explicit zero check", 119 fMustGuardDivisionEvenAfterExplicitZeroCheck); 120 writer->appendBool("Can use gl_FragCoord", fCanUseFragCoord); 121 writer->appendBool("Incomplete short int precision", fIncompleteShortIntPrecision); 122 writer->appendBool("Add and true to loops workaround", fAddAndTrueToLoopCondition); 123 writer->appendBool("Unfold short circuit as ternary", fUnfoldShortCircuitAsTernary); 124 writer->appendBool("Emulate abs(int) function", fEmulateAbsIntFunction); 125 writer->appendBool("Rewrite do while loops", fRewriteDoWhileLoops); 126 writer->appendBool("Rewrite switch statements", fRewriteSwitchStatements); 127 writer->appendBool("Rewrite pow with constant exponent", fRemovePowWithConstantExponent); 128 writer->appendBool("Must write to sk_FragColor [workaround]", fMustWriteToFragColor); 129 writer->appendBool("Don't add default precision statement for samplerExternalOES", 130 fNoDefaultPrecisionForExternalSamplers); 131 writer->appendBool("Rewrite matrix-vector multiply", fRewriteMatrixVectorMultiply); 132 writer->appendBool("Rewrite matrix equality comparisons", fRewriteMatrixComparisons); 133 writer->appendBool("Flat interpolation support", fFlatInterpolationSupport); 134 writer->appendBool("Prefer flat interpolation", fPreferFlatInterpolation); 135 writer->appendBool("No perspective interpolation support", fNoPerspectiveInterpolationSupport); 136 writer->appendBool("Sample mask support", fSampleMaskSupport); 137 writer->appendBool("External texture support", fExternalTextureSupport); 138 writer->appendBool("sk_VertexID support", fVertexIDSupport); 139 writer->appendBool("Infinity support", fInfinitySupport); 140 writer->appendBool("Non-constant array index support", fNonconstantArrayIndexSupport); 141 writer->appendBool("Bit manipulation support", fBitManipulationSupport); 142 writer->appendBool("float == fp32", fFloatIs32Bits); 143 writer->appendBool("half == fp32", fHalfIs32Bits); 144 writer->appendBool("Has poor fragment precision", fHasLowFragmentPrecision); 145 writer->appendBool("Color space math needs float", fColorSpaceMathNeedsFloat); 146 writer->appendBool("Builtin fma() support", fBuiltinFMASupport); 147 writer->appendBool("Builtin determinant() support", fBuiltinDeterminantSupport); 148 writer->appendBool("Can use do-while loops", fCanUseDoLoops); 149 writer->appendBool("Use node pools", fUseNodePools); 150 151 writer->appendS32("Max FS Samplers", fMaxFragmentSamplers); 152 writer->appendS32("Max Tessellation Segments", fMaxTessellationSegments); 153 writer->appendString("Advanced blend equation interaction", 154 kAdvBlendEqInteractionStr[fAdvBlendEqInteraction]); 155 156 writer->endObject(); 157} 158#else 159void GrShaderCaps::dumpJSON(SkJSONWriter* writer) const { } 160#endif 161 162void GrShaderCaps::applyOptionsOverrides(const GrContextOptions& options) { 163 if (options.fDisableDriverCorrectnessWorkarounds) { 164 SkASSERT(fCanUseAnyFunctionInShader); 165 SkASSERT(fCanUseMinAndAbsTogether); 166 SkASSERT(fCanUseFractForNegativeValues); 167 SkASSERT(!fMustForceNegatedAtanParamToFloat); 168 SkASSERT(!fMustForceNegatedLdexpParamToMultiply); 169 SkASSERT(!fAtan2ImplementedAsAtanYOverX); 170 SkASSERT(!fMustDoOpBetweenFloorAndAbs); 171 SkASSERT(!fRequiresLocalOutputColorForFBFetch); 172 SkASSERT(!fMustObfuscateUniformColor); 173 SkASSERT(!fMustGuardDivisionEvenAfterExplicitZeroCheck); 174 SkASSERT(fCanUseFragCoord); 175 SkASSERT(!fIncompleteShortIntPrecision); 176 SkASSERT(!fAddAndTrueToLoopCondition); 177 SkASSERT(!fUnfoldShortCircuitAsTernary); 178 SkASSERT(!fEmulateAbsIntFunction); 179 SkASSERT(!fRewriteDoWhileLoops); 180 SkASSERT(!fRewriteSwitchStatements); 181 SkASSERT(!fRemovePowWithConstantExponent); 182 SkASSERT(!fMustWriteToFragColor); 183 SkASSERT(!fNoDefaultPrecisionForExternalSamplers); 184 SkASSERT(!fRewriteMatrixVectorMultiply); 185 SkASSERT(!fRewriteMatrixComparisons); 186 } 187 if (!options.fEnableExperimentalHardwareTessellation) { 188 fMaxTessellationSegments = 0; 189 } 190 if (options.fReducedShaderVariations) { 191 fReducedShaderMode = true; 192 } 193#if GR_TEST_UTILS 194 if (options.fSuppressDualSourceBlending) { 195 fDualSourceBlendingSupport = false; 196 } 197 if (options.fSuppressFramebufferFetch) { 198 fFBFetchSupport = false; 199 } 200 if (options.fMaxTessellationSegmentsOverride > 0) { 201 fMaxTessellationSegments = std::min(options.fMaxTessellationSegmentsOverride, 202 fMaxTessellationSegments); 203 } 204#endif 205} 206