blob: 7e441880740bfff576a378cac024a976e60978a5 [file] [log] [blame]
jvanverthcba99b82015-06-24 06:59:57 -07001/*
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
Brian Salomon94efbf52016-11-29 13:43:05 -05009#include "GrShaderCaps.h"
jvanverthcba99b82015-06-24 06:59:57 -070010
egdanielb7e7d572015-11-04 04:23:53 -080011#include "GrContextOptions.h"
Brian Osman71a18892017-08-10 10:23:25 -040012#include "SkJSONWriter.h"
egdanielb7e7d572015-11-04 04:23:53 -080013
jvanverthcba99b82015-06-24 06:59:57 -070014////////////////////////////////////////////////////////////////////////////////////////////
15
Brian Salomon94efbf52016-11-29 13:43:05 -050016static const char* shader_type_to_string(GrShaderType type) {
17 switch (type) {
18 case kVertex_GrShaderType:
19 return "vertex";
20 case kGeometry_GrShaderType:
21 return "geometry";
22 case kFragment_GrShaderType:
23 return "fragment";
24 }
25 return "";
26}
jvanverth98a83a92015-06-24 11:07:07 -070027
Brian Salomon94efbf52016-11-29 13:43:05 -050028static const char* precision_to_string(GrSLPrecision p) {
29 switch (p) {
30 case kLow_GrSLPrecision:
31 return "low";
32 case kMedium_GrSLPrecision:
33 return "medium";
34 case kHigh_GrSLPrecision:
35 return "high";
Brian Osman33aa2c72017-04-05 09:26:15 -040036 default:
Ben Wagnerb4aab9a2017-08-16 10:53:04 -040037 SK_ABORT("Unexpected precision type.");
Brian Osman33aa2c72017-04-05 09:26:15 -040038 return "";
Brian Salomon94efbf52016-11-29 13:43:05 -050039 }
Brian Salomon94efbf52016-11-29 13:43:05 -050040}
41
42GrShaderCaps::GrShaderCaps(const GrContextOptions& options) {
43 fGLSLGeneration = k330_GrGLSLGeneration;
44 fShaderDerivativeSupport = false;
45 fGeometryShaderSupport = false;
Chris Daltonf1b47bb2017-10-06 11:57:51 -060046 fGSInvocationsSupport = false;
Brian Salomon94efbf52016-11-29 13:43:05 -050047 fPathRenderingSupport = false;
48 fDstReadInShaderSupport = false;
49 fDualSourceBlendingSupport = false;
50 fIntegerSupport = false;
51 fTexelBufferSupport = false;
52 fImageLoadStoreSupport = false;
53 fShaderPrecisionVaries = false;
jvanverthcba99b82015-06-24 06:59:57 -070054 fDropsTileOnZeroDivide = false;
55 fFBFetchSupport = false;
56 fFBFetchNeedsCustomOutput = false;
57 fBindlessTextureSupport = false;
egdanielf5294392015-10-21 07:14:17 -070058 fUsesPrecisionModifiers = false;
egdaniel472d44e2015-10-22 08:20:00 -070059 fCanUseAnyFunctionInShader = true;
egdaniel8dcdedc2015-11-11 06:27:20 -080060 fCanUseMinAndAbsTogether = true;
Florin Malita8a0044f2017-08-07 14:38:22 -040061 fCanUseFractForNegativeValues = true;
egdaniel8dcdedc2015-11-11 06:27:20 -080062 fMustForceNegatedAtanParamToFloat = false;
Greg Daniel80a08dd2017-01-20 10:45:49 -050063 fAtan2ImplementedAsAtanYOverX = false;
egdaniel138c2632016-08-17 10:59:00 -070064 fRequiresLocalOutputColorForFBFetch = false;
Brian Osmanac1e4962017-05-25 11:34:38 -040065 fMustObfuscateUniformColor = false;
Brian Osmandff5d432017-08-01 14:46:18 -040066 fMustGuardDivisionEvenAfterExplicitZeroCheck = false;
cdaltonc08f1962016-02-12 12:14:06 -080067 fFlatInterpolationSupport = false;
Brian Salomon41274562017-09-15 09:40:03 -070068 fPreferFlatInterpolation = false;
cdaltonc08f1962016-02-12 12:14:06 -080069 fNoPerspectiveInterpolationSupport = false;
cdalton4a98cdb2016-03-01 12:12:20 -080070 fMultisampleInterpolationSupport = false;
cdalton33ad7012016-02-22 07:55:44 -080071 fSampleVariablesSupport = false;
72 fSampleMaskOverrideCoverageSupport = false;
cdalton9c3f1432016-03-11 10:07:37 -080073 fExternalTextureSupport = false;
cdaltonf8a6ce82016-04-11 13:02:05 -070074 fTexelFetchSupport = false;
Chris Dalton1d616352017-05-31 12:51:23 -060075 fVertexIDSupport = false;
Brian Salomon94efbf52016-11-29 13:43:05 -050076
egdaniel472d44e2015-10-22 08:20:00 -070077 fVersionDeclString = nullptr;
egdaniel574a4c12015-11-02 06:22:44 -080078 fShaderDerivativeExtensionString = nullptr;
Chris Daltonf1b47bb2017-10-06 11:57:51 -060079 fGSInvocationsExtensionString = nullptr;
egdaniel8dcdedc2015-11-11 06:27:20 -080080 fFragCoordConventionsExtensionString = nullptr;
81 fSecondaryOutputExtensionString = nullptr;
bsalomon7ea33f52015-11-22 14:51:00 -080082 fExternalTextureExtensionString = nullptr;
cdaltonf8a6ce82016-04-11 13:02:05 -070083 fTexelBufferExtensionString = nullptr;
cdaltonc08f1962016-02-12 12:14:06 -080084 fNoPerspectiveInterpolationExtensionString = nullptr;
cdalton4a98cdb2016-03-01 12:12:20 -080085 fMultisampleInterpolationExtensionString = nullptr;
cdalton33ad7012016-02-22 07:55:44 -080086 fSampleVariablesExtensionString = nullptr;
halcanary96fcdcc2015-08-27 07:41:13 -070087 fFBFetchColorName = nullptr;
88 fFBFetchExtensionString = nullptr;
Brian Salomonf26f7a02016-11-15 14:05:01 -050089 fImageLoadStoreExtensionString = nullptr;
cdalton9c3f1432016-03-11 10:07:37 -080090 fMaxVertexSamplers = 0;
91 fMaxGeometrySamplers = 0;
92 fMaxFragmentSamplers = 0;
93 fMaxCombinedSamplers = 0;
Brian Salomonf9f45122016-11-29 11:59:17 -050094 fMaxVertexImageStorages = 0;
95 fMaxGeometryImageStorages = 0;
96 fMaxFragmentImageStorages = 0;
97 fMaxCombinedImageStorages = 0;
jvanverth98a83a92015-06-24 11:07:07 -070098 fAdvBlendEqInteraction = kNotSupported_AdvBlendEqInteraction;
Brian Salomon0b4d8aa2017-10-11 15:34:27 -040099
100#if GR_TEST_UTILS
101 fDisableImageMultitexturing = options.fDisableImageMultitexturing;
102#else
103 fDisableImageMultitexturing = false;
104#endif
jvanverthcba99b82015-06-24 06:59:57 -0700105}
106
Brian Osman71a18892017-08-10 10:23:25 -0400107void GrShaderCaps::dumpJSON(SkJSONWriter* writer) const {
108 writer->beginObject();
Brian Salomon94efbf52016-11-29 13:43:05 -0500109
Brian Osman71a18892017-08-10 10:23:25 -0400110 writer->appendBool("Shader Derivative Support", fShaderDerivativeSupport);
111 writer->appendBool("Geometry Shader Support", fGeometryShaderSupport);
Chris Daltonf1b47bb2017-10-06 11:57:51 -0600112 writer->appendBool("Geometry Shader Invocations Support", fGSInvocationsSupport);
Brian Osman71a18892017-08-10 10:23:25 -0400113 writer->appendBool("Path Rendering Support", fPathRenderingSupport);
114 writer->appendBool("Dst Read In Shader Support", fDstReadInShaderSupport);
115 writer->appendBool("Dual Source Blending Support", fDualSourceBlendingSupport);
116 writer->appendBool("Integer Support", fIntegerSupport);
117 writer->appendBool("Texel Buffer Support", fTexelBufferSupport);
118 writer->appendBool("Image Load Store Support", fImageLoadStoreSupport);
119
120 writer->appendBool("Variable Precision", fShaderPrecisionVaries);
Brian Salomon94efbf52016-11-29 13:43:05 -0500121
122 for (int s = 0; s < kGrShaderTypeCount; ++s) {
123 GrShaderType shaderType = static_cast<GrShaderType>(s);
Brian Osman71a18892017-08-10 10:23:25 -0400124 writer->beginArray(SkStringPrintf("%s precisions",
125 shader_type_to_string(shaderType)).c_str());
Brian Salomon94efbf52016-11-29 13:43:05 -0500126 for (int p = 0; p < kGrSLPrecisionCount; ++p) {
127 if (fFloatPrecisions[s][p].supported()) {
128 GrSLPrecision precision = static_cast<GrSLPrecision>(p);
Brian Osman80488222017-08-10 13:29:30 -0400129 writer->beginObject(nullptr, false);
Brian Osman71a18892017-08-10 10:23:25 -0400130 writer->appendString("precision", precision_to_string(precision));
131 writer->appendS32("log_low", fFloatPrecisions[s][p].fLogRangeLow);
132 writer->appendS32("log_high", fFloatPrecisions[s][p].fLogRangeHigh);
133 writer->appendS32("bits", fFloatPrecisions[s][p].fBits);
134 writer->endObject();
Brian Salomon94efbf52016-11-29 13:43:05 -0500135 }
136 }
Brian Osman71a18892017-08-10 10:23:25 -0400137 writer->endArray();
Brian Salomon94efbf52016-11-29 13:43:05 -0500138 }
jvanverthcba99b82015-06-24 06:59:57 -0700139
140 static const char* kAdvBlendEqInteractionStr[] = {
141 "Not Supported",
142 "Automatic",
143 "General Enable",
144 "Specific Enables",
145 };
146 GR_STATIC_ASSERT(0 == kNotSupported_AdvBlendEqInteraction);
147 GR_STATIC_ASSERT(1 == kAutomatic_AdvBlendEqInteraction);
148 GR_STATIC_ASSERT(2 == kGeneralEnable_AdvBlendEqInteraction);
149 GR_STATIC_ASSERT(3 == kSpecificEnables_AdvBlendEqInteraction);
150 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kAdvBlendEqInteractionStr) == kLast_AdvBlendEqInteraction + 1);
151
Brian Osman71a18892017-08-10 10:23:25 -0400152 writer->appendBool("FB Fetch Support", fFBFetchSupport);
153 writer->appendBool("Drops tile on zero divide", fDropsTileOnZeroDivide);
154 writer->appendBool("Bindless texture support", fBindlessTextureSupport);
155 writer->appendBool("Uses precision modifiers", fUsesPrecisionModifiers);
156 writer->appendBool("Can use any() function", fCanUseAnyFunctionInShader);
157 writer->appendBool("Can use min() and abs() together", fCanUseMinAndAbsTogether);
158 writer->appendBool("Can use fract() for negative values", fCanUseFractForNegativeValues);
159 writer->appendBool("Must force negated atan param to float", fMustForceNegatedAtanParamToFloat);
160 writer->appendBool("Must use local out color for FBFetch", fRequiresLocalOutputColorForFBFetch);
Brian Osman71a18892017-08-10 10:23:25 -0400161 writer->appendBool("Must obfuscate uniform color", fMustObfuscateUniformColor);
162 writer->appendBool("Must guard division even after explicit zero check",
163 fMustGuardDivisionEvenAfterExplicitZeroCheck);
164 writer->appendBool("Flat interpolation support", fFlatInterpolationSupport);
Brian Salomon41274562017-09-15 09:40:03 -0700165 writer->appendBool("Prefer flat interpolation", fPreferFlatInterpolation);
Brian Osman71a18892017-08-10 10:23:25 -0400166 writer->appendBool("No perspective interpolation support", fNoPerspectiveInterpolationSupport);
167 writer->appendBool("Multisample interpolation support", fMultisampleInterpolationSupport);
168 writer->appendBool("Sample variables support", fSampleVariablesSupport);
169 writer->appendBool("Sample mask override coverage support", fSampleMaskOverrideCoverageSupport);
170 writer->appendBool("External texture support", fExternalTextureSupport);
171 writer->appendBool("texelFetch support", fTexelFetchSupport);
172 writer->appendBool("sk_VertexID support", fVertexIDSupport);
jvanverthcba99b82015-06-24 06:59:57 -0700173
Brian Osman71a18892017-08-10 10:23:25 -0400174 writer->appendS32("Max VS Samplers", fMaxVertexSamplers);
175 writer->appendS32("Max GS Samplers", fMaxGeometrySamplers);
176 writer->appendS32("Max FS Samplers", fMaxFragmentSamplers);
177 writer->appendS32("Max Combined Samplers", fMaxFragmentSamplers);
178 writer->appendS32("Max VS Image Storages", fMaxVertexImageStorages);
179 writer->appendS32("Max GS Image Storages", fMaxGeometryImageStorages);
180 writer->appendS32("Max FS Image Storages", fMaxFragmentImageStorages);
181 writer->appendS32("Max Combined Image Storages", fMaxFragmentImageStorages);
182 writer->appendString("Advanced blend equation interaction",
183 kAdvBlendEqInteractionStr[fAdvBlendEqInteraction]);
Brian Salomon0b4d8aa2017-10-11 15:34:27 -0400184 writer->appendBool("Disable image multitexturing", fDisableImageMultitexturing);
Brian Osman71a18892017-08-10 10:23:25 -0400185
186 writer->endObject();
jvanverthcba99b82015-06-24 06:59:57 -0700187}
188
Brian Salomon94efbf52016-11-29 13:43:05 -0500189void GrShaderCaps::initSamplerPrecisionTable() {
cdaltona6b92ad2016-04-11 12:03:08 -0700190 // Determine the largest precision qualifiers that are effectively the same as lowp/mediump.
191 // e.g. if lowp == mediump, then use mediump instead of lowp.
192 GrSLPrecision effectiveMediumP[kGrShaderTypeCount];
193 GrSLPrecision effectiveLowP[kGrShaderTypeCount];
194 for (int s = 0; s < kGrShaderTypeCount; ++s) {
195 const PrecisionInfo* info = fFloatPrecisions[s];
196 effectiveMediumP[s] = info[kHigh_GrSLPrecision] == info[kMedium_GrSLPrecision] ?
197 kHigh_GrSLPrecision : kMedium_GrSLPrecision;
198 effectiveLowP[s] = info[kMedium_GrSLPrecision] == info[kLow_GrSLPrecision] ?
199 effectiveMediumP[s] : kLow_GrSLPrecision;
200 }
201
202 // Determine which precision qualifiers should be used with samplers.
203 for (int visibility = 0; visibility < (1 << kGrShaderTypeCount); ++visibility) {
204 GrSLPrecision mediump = kHigh_GrSLPrecision;
205 GrSLPrecision lowp = kHigh_GrSLPrecision;
206 for (int s = 0; s < kGrShaderTypeCount; ++s) {
207 if (visibility & (1 << s)) {
208 mediump = SkTMin(mediump, effectiveMediumP[s]);
209 lowp = SkTMin(lowp, effectiveLowP[s]);
210 }
211
212 GR_STATIC_ASSERT(0 == kLow_GrSLPrecision);
213 GR_STATIC_ASSERT(1 == kMedium_GrSLPrecision);
214 GR_STATIC_ASSERT(2 == kHigh_GrSLPrecision);
215
216 GR_STATIC_ASSERT((1 << kVertex_GrShaderType) == kVertex_GrShaderFlag);
217 GR_STATIC_ASSERT((1 << kGeometry_GrShaderType) == kGeometry_GrShaderFlag);
218 GR_STATIC_ASSERT((1 << kFragment_GrShaderType) == kFragment_GrShaderFlag);
219 GR_STATIC_ASSERT(3 == kGrShaderTypeCount);
220 }
221
222 uint8_t* table = fSamplerPrecisions[visibility];
Brian Osman33aa2c72017-04-05 09:26:15 -0400223 table[kUnknown_GrPixelConfig] = lowp;
Brian Salomonbf7b6202016-11-11 16:08:03 -0500224 table[kAlpha_8_GrPixelConfig] = lowp;
Brian Osman986563b2017-01-10 14:20:02 -0500225 table[kGray_8_GrPixelConfig] = lowp;
Brian Salomonbf7b6202016-11-11 16:08:03 -0500226 table[kRGB_565_GrPixelConfig] = lowp;
227 table[kRGBA_4444_GrPixelConfig] = lowp;
228 table[kRGBA_8888_GrPixelConfig] = lowp;
229 table[kBGRA_8888_GrPixelConfig] = lowp;
230 table[kSRGBA_8888_GrPixelConfig] = lowp;
231 table[kSBGRA_8888_GrPixelConfig] = lowp;
232 table[kRGBA_8888_sint_GrPixelConfig] = lowp;
Brian Salomonbf7b6202016-11-11 16:08:03 -0500233 table[kRGBA_float_GrPixelConfig] = kHigh_GrSLPrecision;
csmartdalton6aa0e112017-02-08 16:14:11 -0500234 table[kRG_float_GrPixelConfig] = kHigh_GrSLPrecision;
Brian Salomonbf7b6202016-11-11 16:08:03 -0500235 table[kAlpha_half_GrPixelConfig] = mediump;
236 table[kRGBA_half_GrPixelConfig] = mediump;
cdaltona6b92ad2016-04-11 12:03:08 -0700237
Robert Phillips92de6312017-05-23 07:43:48 -0400238 GR_STATIC_ASSERT(14 == kGrPixelConfigCnt);
cdaltona6b92ad2016-04-11 12:03:08 -0700239 }
240}
241
Brian Salomon94efbf52016-11-29 13:43:05 -0500242void GrShaderCaps::applyOptionsOverrides(const GrContextOptions& options) {
Brian Osman195c05b2017-08-30 15:14:04 -0400243#if GR_TEST_UTILS
Brian Salomon94efbf52016-11-29 13:43:05 -0500244 fDualSourceBlendingSupport = fDualSourceBlendingSupport && !options.fSuppressDualSourceBlending;
Brian Osman195c05b2017-08-30 15:14:04 -0400245#endif
egdanielb7e7d572015-11-04 04:23:53 -0800246}