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 "GrShaderCaps.h" 10 11 #include "GrContextOptions.h" 12 #include "SkJSONWriter.h" 13 14 //////////////////////////////////////////////////////////////////////////////////////////// 15 16 GrShaderCaps::GrShaderCaps(const GrContextOptions& options) { 17 fGLSLGeneration = k330_GrGLSLGeneration; 18 fShaderDerivativeSupport = false; 19 fGeometryShaderSupport = false; 20 fGSInvocationsSupport = false; 21 fPathRenderingSupport = false; 22 fDstReadInShaderSupport = false; 23 fDualSourceBlendingSupport = false; 24 fIntegerSupport = false; 25 fImageLoadStoreSupport = false; 26 fDropsTileOnZeroDivide = false; 27 fFBFetchSupport = false; 28 fFBFetchNeedsCustomOutput = false; 29 fUsesPrecisionModifiers = false; 30 fCanUseAnyFunctionInShader = true; 31 fCanUseMinAndAbsTogether = true; 32 fCanUseFractForNegativeValues = true; 33 fMustForceNegatedAtanParamToFloat = false; 34 fAtan2ImplementedAsAtanYOverX = false; 35 fMustDoOpBetweenFloorAndAbs = false; 36 fRequiresLocalOutputColorForFBFetch = false; 37 fMustObfuscateUniformColor = false; 38 fMustGuardDivisionEvenAfterExplicitZeroCheck = false; 39 fCanUseFragCoord = true; 40 fIncompleteShortIntPrecision = false; 41 fAddAndTrueToLoopCondition = false; 42 fUnfoldShortCircuitAsTernary = false; 43 fEmulateAbsIntFunction = false; 44 fRewriteDoWhileLoops = false; 45 fRemovePowWithConstantExponent = false; 46 fFlatInterpolationSupport = false; 47 fPreferFlatInterpolation = false; 48 fNoPerspectiveInterpolationSupport = false; 49 fExternalTextureSupport = false; 50 fVertexIDSupport = false; 51 fFPManipulationSupport = false; 52 fFloatIs32Bits = true; 53 fHalfIs32Bits = false; 54 fUnsignedSupport = false; 55 fBuiltinFMASupport = false; 56 57 fVersionDeclString = nullptr; 58 fShaderDerivativeExtensionString = nullptr; 59 fGeometryShaderExtensionString = nullptr; 60 fGSInvocationsExtensionString = nullptr; 61 fFragCoordConventionsExtensionString = nullptr; 62 fSecondaryOutputExtensionString = nullptr; 63 fExternalTextureExtensionString = nullptr; 64 fSecondExternalTextureExtensionString = nullptr; 65 fNoPerspectiveInterpolationExtensionString = nullptr; 66 fFBFetchColorName = nullptr; 67 fFBFetchExtensionString = nullptr; 68 fImageLoadStoreExtensionString = nullptr; 69 fMaxFragmentSamplers = 0; 70 fAdvBlendEqInteraction = kNotSupported_AdvBlendEqInteraction; 71 } 72 73 #ifdef SK_ENABLE_DUMP_GPU 74 void GrShaderCaps::dumpJSON(SkJSONWriter* writer) const { 75 writer->beginObject(); 76 77 writer->appendBool("Shader Derivative Support", fShaderDerivativeSupport); 78 writer->appendBool("Geometry Shader Support", fGeometryShaderSupport); 79 writer->appendBool("Geometry Shader Invocations Support", fGSInvocationsSupport); 80 writer->appendBool("Path Rendering Support", fPathRenderingSupport); 81 writer->appendBool("Dst Read In Shader Support", fDstReadInShaderSupport); 82 writer->appendBool("Dual Source Blending Support", fDualSourceBlendingSupport); 83 writer->appendBool("Integer Support", fIntegerSupport); 84 writer->appendBool("Image Load Store Support", fImageLoadStoreSupport); 85 86 static const char* kAdvBlendEqInteractionStr[] = { 87 "Not Supported", 88 "Automatic", 89 "General Enable", 90 "Specific Enables", 91 }; 92 GR_STATIC_ASSERT(0 == kNotSupported_AdvBlendEqInteraction); 93 GR_STATIC_ASSERT(1 == kAutomatic_AdvBlendEqInteraction); 94 GR_STATIC_ASSERT(2 == kGeneralEnable_AdvBlendEqInteraction); 95 GR_STATIC_ASSERT(3 == kSpecificEnables_AdvBlendEqInteraction); 96 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kAdvBlendEqInteractionStr) == kLast_AdvBlendEqInteraction + 1); 97 98 writer->appendBool("FB Fetch Support", fFBFetchSupport); 99 writer->appendBool("Drops tile on zero divide", fDropsTileOnZeroDivide); 100 writer->appendBool("Uses precision modifiers", fUsesPrecisionModifiers); 101 writer->appendBool("Can use any() function", fCanUseAnyFunctionInShader); 102 writer->appendBool("Can use min() and abs() together", fCanUseMinAndAbsTogether); 103 writer->appendBool("Can use fract() for negative values", fCanUseFractForNegativeValues); 104 writer->appendBool("Must force negated atan param to float", fMustForceNegatedAtanParamToFloat); 105 writer->appendBool("Must do op between floor and abs", fMustDoOpBetweenFloorAndAbs); 106 writer->appendBool("Must use local out color for FBFetch", fRequiresLocalOutputColorForFBFetch); 107 writer->appendBool("Must obfuscate uniform color", fMustObfuscateUniformColor); 108 writer->appendBool("Must guard division even after explicit zero check", 109 fMustGuardDivisionEvenAfterExplicitZeroCheck); 110 writer->appendBool("Can use gl_FragCoord", fCanUseFragCoord); 111 writer->appendBool("Incomplete short int precision", fIncompleteShortIntPrecision); 112 writer->appendBool("Add and true to loops workaround", fAddAndTrueToLoopCondition); 113 writer->appendBool("Unfold short circuit as ternary", fUnfoldShortCircuitAsTernary); 114 writer->appendBool("Emulate abs(int) function", fEmulateAbsIntFunction); 115 writer->appendBool("Rewrite do while loops", fRewriteDoWhileLoops); 116 writer->appendBool("Rewrite pow with constant exponent", fRemovePowWithConstantExponent); 117 writer->appendBool("Flat interpolation support", fFlatInterpolationSupport); 118 writer->appendBool("Prefer flat interpolation", fPreferFlatInterpolation); 119 writer->appendBool("No perspective interpolation support", fNoPerspectiveInterpolationSupport); 120 writer->appendBool("External texture support", fExternalTextureSupport); 121 writer->appendBool("sk_VertexID support", fVertexIDSupport); 122 writer->appendBool("Floating point manipulation support", fFPManipulationSupport); 123 writer->appendBool("float == fp32", fFloatIs32Bits); 124 writer->appendBool("half == fp32", fHalfIs32Bits); 125 writer->appendBool("Builtin fma() support", fBuiltinFMASupport); 126 127 writer->appendS32("Max FS Samplers", fMaxFragmentSamplers); 128 writer->appendString("Advanced blend equation interaction", 129 kAdvBlendEqInteractionStr[fAdvBlendEqInteraction]); 130 131 writer->endObject(); 132 } 133 #else 134 void GrShaderCaps::dumpJSON(SkJSONWriter* writer) const { } 135 #endif 136 137 void GrShaderCaps::applyOptionsOverrides(const GrContextOptions& options) { 138 if (options.fDisableDriverCorrectnessWorkarounds) { 139 SkASSERT(fCanUseAnyFunctionInShader); 140 SkASSERT(fCanUseMinAndAbsTogether); 141 SkASSERT(fCanUseFractForNegativeValues); 142 SkASSERT(!fMustForceNegatedAtanParamToFloat); 143 SkASSERT(!fAtan2ImplementedAsAtanYOverX); 144 SkASSERT(!fMustDoOpBetweenFloorAndAbs); 145 SkASSERT(!fRequiresLocalOutputColorForFBFetch); 146 SkASSERT(!fMustObfuscateUniformColor); 147 SkASSERT(!fMustGuardDivisionEvenAfterExplicitZeroCheck); 148 SkASSERT(fCanUseFragCoord); 149 SkASSERT(!fIncompleteShortIntPrecision); 150 SkASSERT(!fAddAndTrueToLoopCondition); 151 SkASSERT(!fUnfoldShortCircuitAsTernary); 152 SkASSERT(!fEmulateAbsIntFunction); 153 SkASSERT(!fRewriteDoWhileLoops); 154 SkASSERT(!fRemovePowWithConstantExponent); 155 } 156 #if GR_TEST_UTILS 157 fDualSourceBlendingSupport = fDualSourceBlendingSupport && !options.fSuppressDualSourceBlending; 158 #endif 159 } 160