• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
GrShaderCaps(const GrContextOptions & options)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     fTexelBufferSupport = false;
26     fImageLoadStoreSupport = false;
27     fDropsTileOnZeroDivide = false;
28     fFBFetchSupport = false;
29     fFBFetchNeedsCustomOutput = false;
30     fBindlessTextureSupport = false;
31     fUsesPrecisionModifiers = false;
32     fCanUseAnyFunctionInShader = true;
33     fCanUseMinAndAbsTogether = true;
34     fCanUseFractForNegativeValues = true;
35     fMustForceNegatedAtanParamToFloat = false;
36     fAtan2ImplementedAsAtanYOverX = false;
37     fMustDoOpBetweenFloorAndAbs = false;
38     fRequiresLocalOutputColorForFBFetch = false;
39     fMustObfuscateUniformColor = false;
40     fMustGuardDivisionEvenAfterExplicitZeroCheck = false;
41     fCanUseFragCoord = true;
42     fInterpolantsAreInaccurate = false;
43     fFlatInterpolationSupport = false;
44     fPreferFlatInterpolation = false;
45     fNoPerspectiveInterpolationSupport = false;
46     fMultisampleInterpolationSupport = false;
47     fSampleVariablesSupport = false;
48     fSampleMaskOverrideCoverageSupport = false;
49     fExternalTextureSupport = false;
50     fTexelFetchSupport = false;
51     fVertexIDSupport = false;
52     fFloatIs32Bits = true;
53     fHalfIs32Bits = false;
54 
55     fVersionDeclString = nullptr;
56     fShaderDerivativeExtensionString = nullptr;
57     fGeometryShaderExtensionString = nullptr;
58     fGSInvocationsExtensionString = nullptr;
59     fFragCoordConventionsExtensionString = nullptr;
60     fSecondaryOutputExtensionString = nullptr;
61     fExternalTextureExtensionString = nullptr;
62     fTexelBufferExtensionString = nullptr;
63     fNoPerspectiveInterpolationExtensionString = nullptr;
64     fMultisampleInterpolationExtensionString = nullptr;
65     fSampleVariablesExtensionString = nullptr;
66     fFBFetchColorName = nullptr;
67     fFBFetchExtensionString = nullptr;
68     fImageLoadStoreExtensionString = nullptr;
69     fMaxVertexSamplers = 0;
70     fMaxGeometrySamplers = 0;
71     fMaxFragmentSamplers = 0;
72     fMaxCombinedSamplers = 0;
73     fAdvBlendEqInteraction = kNotSupported_AdvBlendEqInteraction;
74 
75     // TODO: Default this to 0 and only enable image multitexturing when a "safe" threshold is
76     // known for a GPU class.
77     fDisableImageMultitexturingDstRectAreaThreshold = std::numeric_limits<size_t>::max();
78 }
79 
dumpJSON(SkJSONWriter * writer) const80 void GrShaderCaps::dumpJSON(SkJSONWriter* writer) const {
81     writer->beginObject();
82 
83     writer->appendBool("Shader Derivative Support", fShaderDerivativeSupport);
84     writer->appendBool("Geometry Shader Support", fGeometryShaderSupport);
85     writer->appendBool("Geometry Shader Invocations Support", fGSInvocationsSupport);
86     writer->appendBool("Path Rendering Support", fPathRenderingSupport);
87     writer->appendBool("Dst Read In Shader Support", fDstReadInShaderSupport);
88     writer->appendBool("Dual Source Blending Support", fDualSourceBlendingSupport);
89     writer->appendBool("Integer Support", fIntegerSupport);
90     writer->appendBool("Texel Buffer Support", fTexelBufferSupport);
91     writer->appendBool("Image Load Store Support", fImageLoadStoreSupport);
92 
93     static const char* kAdvBlendEqInteractionStr[] = {
94         "Not Supported",
95         "Automatic",
96         "General Enable",
97         "Specific Enables",
98     };
99     GR_STATIC_ASSERT(0 == kNotSupported_AdvBlendEqInteraction);
100     GR_STATIC_ASSERT(1 == kAutomatic_AdvBlendEqInteraction);
101     GR_STATIC_ASSERT(2 == kGeneralEnable_AdvBlendEqInteraction);
102     GR_STATIC_ASSERT(3 == kSpecificEnables_AdvBlendEqInteraction);
103     GR_STATIC_ASSERT(SK_ARRAY_COUNT(kAdvBlendEqInteractionStr) == kLast_AdvBlendEqInteraction + 1);
104 
105     writer->appendBool("FB Fetch Support", fFBFetchSupport);
106     writer->appendBool("Drops tile on zero divide", fDropsTileOnZeroDivide);
107     writer->appendBool("Bindless texture support", fBindlessTextureSupport);
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 do op between floor and abs", fMustDoOpBetweenFloorAndAbs);
114     writer->appendBool("Must use local out color for FBFetch", fRequiresLocalOutputColorForFBFetch);
115     writer->appendBool("Must obfuscate uniform color", fMustObfuscateUniformColor);
116     writer->appendBool("Must guard division even after explicit zero check",
117                        fMustGuardDivisionEvenAfterExplicitZeroCheck);
118     writer->appendBool("Can use gl_FragCoord", fCanUseFragCoord);
119     writer->appendBool("Interpolants are inaccurate", fInterpolantsAreInaccurate);
120     writer->appendBool("Flat interpolation support", fFlatInterpolationSupport);
121     writer->appendBool("Prefer flat interpolation", fPreferFlatInterpolation);
122     writer->appendBool("No perspective interpolation support", fNoPerspectiveInterpolationSupport);
123     writer->appendBool("Multisample interpolation support", fMultisampleInterpolationSupport);
124     writer->appendBool("Sample variables support", fSampleVariablesSupport);
125     writer->appendBool("Sample mask override coverage support", fSampleMaskOverrideCoverageSupport);
126     writer->appendBool("External texture support", fExternalTextureSupport);
127     writer->appendBool("texelFetch support", fTexelFetchSupport);
128     writer->appendBool("sk_VertexID support", fVertexIDSupport);
129     writer->appendBool("float == fp32", fFloatIs32Bits);
130     writer->appendBool("half == fp32", fHalfIs32Bits);
131 
132     writer->appendS32("Max VS Samplers", fMaxVertexSamplers);
133     writer->appendS32("Max GS Samplers", fMaxGeometrySamplers);
134     writer->appendS32("Max FS Samplers", fMaxFragmentSamplers);
135     writer->appendS32("Max Combined Samplers", fMaxFragmentSamplers);
136     writer->appendString("Advanced blend equation interaction",
137                          kAdvBlendEqInteractionStr[fAdvBlendEqInteraction]);
138     writer->appendU64("Disable image multitexturing dst area threshold",
139                       fDisableImageMultitexturingDstRectAreaThreshold);
140 
141     writer->endObject();
142 }
143 
applyOptionsOverrides(const GrContextOptions & options)144 void GrShaderCaps::applyOptionsOverrides(const GrContextOptions& options) {
145     if (options.fDisableDriverCorrectnessWorkarounds) {
146         SkASSERT(fCanUseAnyFunctionInShader);
147         SkASSERT(fCanUseMinAndAbsTogether);
148         SkASSERT(fCanUseFractForNegativeValues);
149         SkASSERT(!fMustForceNegatedAtanParamToFloat);
150         SkASSERT(!fAtan2ImplementedAsAtanYOverX);
151         SkASSERT(!fMustDoOpBetweenFloorAndAbs);
152         SkASSERT(!fRequiresLocalOutputColorForFBFetch);
153         SkASSERT(!fMustObfuscateUniformColor);
154         SkASSERT(!fMustGuardDivisionEvenAfterExplicitZeroCheck);
155         SkASSERT(fCanUseFragCoord);
156         SkASSERT(!fInterpolantsAreInaccurate);
157     }
158 #if GR_TEST_UTILS
159     fDualSourceBlendingSupport = fDualSourceBlendingSupport && !options.fSuppressDualSourceBlending;
160     if (options.fDisableImageMultitexturing) {
161         fDisableImageMultitexturingDstRectAreaThreshold = 0;
162     }
163 #endif
164 }
165