/src/skia/src/gpu/ganesh/GrShaderCaps.cpp
Line | Count | Source (jump to first uncovered line) |
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/ganesh/GrShaderCaps.h" |
10 | | |
11 | | #include "include/gpu/ganesh/GrContextOptions.h" |
12 | | |
13 | | //////////////////////////////////////////////////////////////////////////////////////////// |
14 | | |
15 | | #ifdef SK_ENABLE_DUMP_GPU |
16 | | #include "src/utils/SkJSONWriter.h" |
17 | | |
18 | | void GrShaderCaps::dumpJSON(SkJSONWriter* writer) const { |
19 | | writer->beginObject(); |
20 | | |
21 | | writer->appendBool("Shader Derivative Support", fShaderDerivativeSupport); |
22 | | writer->appendBool("Dst Read In Shader Support", fDstReadInShaderSupport); |
23 | | writer->appendBool("Dual Source Blending Support", fDualSourceBlendingSupport); |
24 | | writer->appendBool("Integer Support", fIntegerSupport); |
25 | | writer->appendBool("Nonsquare Matrix Support", fNonsquareMatrixSupport); |
26 | | writer->appendBool("Inverse Hyperbolic Support", fInverseHyperbolicSupport); |
27 | | |
28 | | static const char* kAdvBlendEqInteractionStr[] = { |
29 | | "Not Supported", |
30 | | "Automatic", |
31 | | "General Enable", |
32 | | }; |
33 | | static_assert(0 == kNotSupported_AdvBlendEqInteraction); |
34 | | static_assert(1 == kAutomatic_AdvBlendEqInteraction); |
35 | | static_assert(2 == kGeneralEnable_AdvBlendEqInteraction); |
36 | | static_assert(std::size(kAdvBlendEqInteractionStr) == kLast_AdvBlendEqInteraction + 1); |
37 | | |
38 | | writer->appendBool("FB Fetch Support", fFBFetchSupport); |
39 | | writer->appendBool("Uses precision modifiers", fUsesPrecisionModifiers); |
40 | | writer->appendBool("Can use void-typed expressions in a sequence expression", |
41 | | fCanUseVoidInSequenceExpressions); |
42 | | writer->appendBool("Can use min() and abs() together", fCanUseMinAndAbsTogether); |
43 | | writer->appendBool("Can use fract() for negative values", fCanUseFractForNegativeValues); |
44 | | writer->appendBool("Must force negated atan param to float", fMustForceNegatedAtanParamToFloat); |
45 | | writer->appendBool("Must force negated ldexp param to multiply", |
46 | | fMustForceNegatedLdexpParamToMultiply); |
47 | | writer->appendBool("Must do op between floor and abs", fMustDoOpBetweenFloorAndAbs); |
48 | | writer->appendBool("Must use local out color for FBFetch", fRequiresLocalOutputColorForFBFetch); |
49 | | writer->appendBool("Must obfuscate uniform color", fMustObfuscateUniformColor); |
50 | | writer->appendBool("Must guard division even after explicit zero check", |
51 | | fMustGuardDivisionEvenAfterExplicitZeroCheck); |
52 | | writer->appendBool("Can use gl_FragCoord", fCanUseFragCoord); |
53 | | writer->appendBool("Add and true to loops workaround", fAddAndTrueToLoopCondition); |
54 | | writer->appendBool("Unfold short circuit as ternary", fUnfoldShortCircuitAsTernary); |
55 | | writer->appendBool("Emulate abs(int) function", fEmulateAbsIntFunction); |
56 | | writer->appendBool("Rewrite do while loops", fRewriteDoWhileLoops); |
57 | | writer->appendBool("Rewrite switch statements", fRewriteSwitchStatements); |
58 | | writer->appendBool("Rewrite pow with constant exponent", fRemovePowWithConstantExponent); |
59 | | writer->appendBool("Must write to sk_FragColor [workaround]", fMustWriteToFragColor); |
60 | | writer->appendBool("Don't add default precision statement for samplerExternalOES", |
61 | | fNoDefaultPrecisionForExternalSamplers); |
62 | | writer->appendBool("Rewrite matrix-vector multiply", fRewriteMatrixVectorMultiply); |
63 | | writer->appendBool("Rewrite matrix equality comparisons", fRewriteMatrixComparisons); |
64 | | writer->appendBool("Rounding fix required for Perlin noise", fPerlinNoiseRoundingFix); |
65 | | writer->appendBool("Must declare fragment front-facing", fMustDeclareFragmentFrontFacing); |
66 | | writer->appendBool("Flat interpolation support", fFlatInterpolationSupport); |
67 | | writer->appendBool("Prefer flat interpolation", fPreferFlatInterpolation); |
68 | | writer->appendBool("No perspective interpolation support", fNoPerspectiveInterpolationSupport); |
69 | | writer->appendBool("Sample mask support", fSampleMaskSupport); |
70 | | writer->appendBool("External texture support", fExternalTextureSupport); |
71 | | writer->appendBool("sk_VertexID support", fVertexIDSupport); |
72 | | writer->appendBool("Infinity support", fInfinitySupport); |
73 | | writer->appendBool("Non-constant array index support", fNonconstantArrayIndexSupport); |
74 | | writer->appendBool("Bit manipulation support", fBitManipulationSupport); |
75 | | writer->appendBool("float == fp32", fFloatIs32Bits); |
76 | | writer->appendBool("half == fp32", fHalfIs32Bits); |
77 | | writer->appendBool("Has poor fragment precision", fHasLowFragmentPrecision); |
78 | | writer->appendBool("Builtin fma() support", fBuiltinFMASupport); |
79 | | writer->appendBool("Builtin determinant() support", fBuiltinDeterminantSupport); |
80 | | |
81 | | writer->appendS32("Max FS Samplers", fMaxFragmentSamplers); |
82 | | writer->appendCString("Advanced blend equation interaction", |
83 | | kAdvBlendEqInteractionStr[fAdvBlendEqInteraction]); |
84 | | |
85 | | writer->endObject(); |
86 | | } |
87 | | #else |
88 | 0 | void GrShaderCaps::dumpJSON(SkJSONWriter* writer) const { } |
89 | | #endif |
90 | | |
91 | 4.32k | void GrShaderCaps::applyOptionsOverrides(const GrContextOptions& options) { |
92 | 4.32k | if (options.fDisableDriverCorrectnessWorkarounds) { |
93 | 0 | SkASSERT(fCanUseVoidInSequenceExpressions); |
94 | 0 | SkASSERT(fCanUseMinAndAbsTogether); |
95 | 0 | SkASSERT(fCanUseFractForNegativeValues); |
96 | 0 | SkASSERT(!fMustForceNegatedAtanParamToFloat); |
97 | 0 | SkASSERT(!fMustForceNegatedLdexpParamToMultiply); |
98 | 0 | SkASSERT(!fAtan2ImplementedAsAtanYOverX); |
99 | 0 | SkASSERT(!fMustDoOpBetweenFloorAndAbs); |
100 | 0 | SkASSERT(!fRequiresLocalOutputColorForFBFetch); |
101 | 0 | SkASSERT(!fMustObfuscateUniformColor); |
102 | 0 | SkASSERT(!fMustGuardDivisionEvenAfterExplicitZeroCheck); |
103 | 0 | SkASSERT(fCanUseFragCoord); |
104 | 0 | SkASSERT(!fAddAndTrueToLoopCondition); |
105 | 0 | SkASSERT(!fUnfoldShortCircuitAsTernary); |
106 | 0 | SkASSERT(!fEmulateAbsIntFunction); |
107 | 0 | SkASSERT(!fRewriteDoWhileLoops); |
108 | 0 | SkASSERT(!fRewriteSwitchStatements); |
109 | 0 | SkASSERT(!fRemovePowWithConstantExponent); |
110 | 0 | SkASSERT(!fMustWriteToFragColor); |
111 | 0 | SkASSERT(!fNoDefaultPrecisionForExternalSamplers); |
112 | 0 | SkASSERT(!fRewriteMatrixVectorMultiply); |
113 | 0 | SkASSERT(!fRewriteMatrixComparisons); |
114 | 0 | SkASSERT(!fPerlinNoiseRoundingFix); |
115 | 0 | SkASSERT(!fMustDeclareFragmentFrontFacing); |
116 | 0 | } |
117 | 4.32k | if (options.fReducedShaderVariations) { |
118 | 0 | fReducedShaderMode = true; |
119 | 0 | } |
120 | 4.32k | #if defined(GPU_TEST_UTILS) |
121 | 4.32k | if (options.fSuppressDualSourceBlending) { |
122 | 0 | fDualSourceBlendingSupport = false; |
123 | 0 | } |
124 | 4.32k | if (options.fSuppressFramebufferFetch) { |
125 | 0 | fFBFetchSupport = false; |
126 | 0 | } |
127 | 4.32k | #endif |
128 | 4.32k | } |