blob: c0b34ab7467169b38e339475d50380d43096237e [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 -050016GrShaderCaps::GrShaderCaps(const GrContextOptions& options) {
17 fGLSLGeneration = k330_GrGLSLGeneration;
18 fShaderDerivativeSupport = false;
19 fGeometryShaderSupport = false;
Chris Daltonf1b47bb2017-10-06 11:57:51 -060020 fGSInvocationsSupport = false;
Brian Salomon94efbf52016-11-29 13:43:05 -050021 fPathRenderingSupport = false;
22 fDstReadInShaderSupport = false;
23 fDualSourceBlendingSupport = false;
24 fIntegerSupport = false;
25 fTexelBufferSupport = false;
26 fImageLoadStoreSupport = false;
jvanverthcba99b82015-06-24 06:59:57 -070027 fDropsTileOnZeroDivide = false;
28 fFBFetchSupport = false;
29 fFBFetchNeedsCustomOutput = false;
egdanielf5294392015-10-21 07:14:17 -070030 fUsesPrecisionModifiers = false;
egdaniel472d44e2015-10-22 08:20:00 -070031 fCanUseAnyFunctionInShader = true;
egdaniel8dcdedc2015-11-11 06:27:20 -080032 fCanUseMinAndAbsTogether = true;
Florin Malita8a0044f2017-08-07 14:38:22 -040033 fCanUseFractForNegativeValues = true;
egdaniel8dcdedc2015-11-11 06:27:20 -080034 fMustForceNegatedAtanParamToFloat = false;
Greg Daniel80a08dd2017-01-20 10:45:49 -050035 fAtan2ImplementedAsAtanYOverX = false;
Greg Daniel10ed2432017-12-01 16:19:43 -050036 fMustDoOpBetweenFloorAndAbs = false;
egdaniel138c2632016-08-17 10:59:00 -070037 fRequiresLocalOutputColorForFBFetch = false;
Brian Osmanac1e4962017-05-25 11:34:38 -040038 fMustObfuscateUniformColor = false;
Brian Osmandff5d432017-08-01 14:46:18 -040039 fMustGuardDivisionEvenAfterExplicitZeroCheck = false;
Brian Osmancd3261a2018-01-16 13:52:29 +000040 fCanUseFragCoord = true;
Brian Salomondba65f92018-01-22 08:43:38 -050041 fInterpolantsAreInaccurate = false;
Chris Daltonc2d0dd62018-03-07 07:46:10 -070042 fIncompleteShortIntPrecision = false;
cdaltonc08f1962016-02-12 12:14:06 -080043 fFlatInterpolationSupport = false;
Brian Salomon41274562017-09-15 09:40:03 -070044 fPreferFlatInterpolation = false;
cdaltonc08f1962016-02-12 12:14:06 -080045 fNoPerspectiveInterpolationSupport = false;
cdalton9c3f1432016-03-11 10:07:37 -080046 fExternalTextureSupport = false;
cdaltonf8a6ce82016-04-11 13:02:05 -070047 fTexelFetchSupport = false;
Chris Dalton1d616352017-05-31 12:51:23 -060048 fVertexIDSupport = false;
Chris Dalton7c7ff032018-03-28 20:09:58 -060049 fFPManipulationSupport = false;
Chris Dalton47c8ed32017-11-15 18:27:09 -070050 fFloatIs32Bits = true;
51 fHalfIs32Bits = false;
Brian Salomon94efbf52016-11-29 13:43:05 -050052
egdaniel472d44e2015-10-22 08:20:00 -070053 fVersionDeclString = nullptr;
egdaniel574a4c12015-11-02 06:22:44 -080054 fShaderDerivativeExtensionString = nullptr;
Chris Dalton8fd79552018-01-11 00:46:14 -050055 fGeometryShaderExtensionString = nullptr;
Chris Daltonf1b47bb2017-10-06 11:57:51 -060056 fGSInvocationsExtensionString = nullptr;
egdaniel8dcdedc2015-11-11 06:27:20 -080057 fFragCoordConventionsExtensionString = nullptr;
58 fSecondaryOutputExtensionString = nullptr;
bsalomon7ea33f52015-11-22 14:51:00 -080059 fExternalTextureExtensionString = nullptr;
cdaltonf8a6ce82016-04-11 13:02:05 -070060 fTexelBufferExtensionString = nullptr;
cdaltonc08f1962016-02-12 12:14:06 -080061 fNoPerspectiveInterpolationExtensionString = nullptr;
halcanary96fcdcc2015-08-27 07:41:13 -070062 fFBFetchColorName = nullptr;
63 fFBFetchExtensionString = nullptr;
Brian Salomonf26f7a02016-11-15 14:05:01 -050064 fImageLoadStoreExtensionString = nullptr;
cdalton9c3f1432016-03-11 10:07:37 -080065 fMaxVertexSamplers = 0;
66 fMaxGeometrySamplers = 0;
67 fMaxFragmentSamplers = 0;
68 fMaxCombinedSamplers = 0;
jvanverth98a83a92015-06-24 11:07:07 -070069 fAdvBlendEqInteraction = kNotSupported_AdvBlendEqInteraction;
Brian Salomon0b4d8aa2017-10-11 15:34:27 -040070
Brian Salomon762d5e72017-12-01 10:25:08 -050071 // TODO: Default this to 0 and only enable image multitexturing when a "safe" threshold is
72 // known for a GPU class.
73 fDisableImageMultitexturingDstRectAreaThreshold = std::numeric_limits<size_t>::max();
jvanverthcba99b82015-06-24 06:59:57 -070074}
75
Brian Osman71a18892017-08-10 10:23:25 -040076void GrShaderCaps::dumpJSON(SkJSONWriter* writer) const {
77 writer->beginObject();
Brian Salomon94efbf52016-11-29 13:43:05 -050078
Brian Osman71a18892017-08-10 10:23:25 -040079 writer->appendBool("Shader Derivative Support", fShaderDerivativeSupport);
80 writer->appendBool("Geometry Shader Support", fGeometryShaderSupport);
Chris Daltonf1b47bb2017-10-06 11:57:51 -060081 writer->appendBool("Geometry Shader Invocations Support", fGSInvocationsSupport);
Brian Osman71a18892017-08-10 10:23:25 -040082 writer->appendBool("Path Rendering Support", fPathRenderingSupport);
83 writer->appendBool("Dst Read In Shader Support", fDstReadInShaderSupport);
84 writer->appendBool("Dual Source Blending Support", fDualSourceBlendingSupport);
85 writer->appendBool("Integer Support", fIntegerSupport);
86 writer->appendBool("Texel Buffer Support", fTexelBufferSupport);
87 writer->appendBool("Image Load Store Support", fImageLoadStoreSupport);
88
jvanverthcba99b82015-06-24 06:59:57 -070089 static const char* kAdvBlendEqInteractionStr[] = {
90 "Not Supported",
91 "Automatic",
92 "General Enable",
93 "Specific Enables",
94 };
95 GR_STATIC_ASSERT(0 == kNotSupported_AdvBlendEqInteraction);
96 GR_STATIC_ASSERT(1 == kAutomatic_AdvBlendEqInteraction);
97 GR_STATIC_ASSERT(2 == kGeneralEnable_AdvBlendEqInteraction);
98 GR_STATIC_ASSERT(3 == kSpecificEnables_AdvBlendEqInteraction);
99 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kAdvBlendEqInteractionStr) == kLast_AdvBlendEqInteraction + 1);
100
Brian Osman71a18892017-08-10 10:23:25 -0400101 writer->appendBool("FB Fetch Support", fFBFetchSupport);
102 writer->appendBool("Drops tile on zero divide", fDropsTileOnZeroDivide);
Brian Osman71a18892017-08-10 10:23:25 -0400103 writer->appendBool("Uses precision modifiers", fUsesPrecisionModifiers);
104 writer->appendBool("Can use any() function", fCanUseAnyFunctionInShader);
105 writer->appendBool("Can use min() and abs() together", fCanUseMinAndAbsTogether);
106 writer->appendBool("Can use fract() for negative values", fCanUseFractForNegativeValues);
107 writer->appendBool("Must force negated atan param to float", fMustForceNegatedAtanParamToFloat);
Greg Daniel10ed2432017-12-01 16:19:43 -0500108 writer->appendBool("Must do op between floor and abs", fMustDoOpBetweenFloorAndAbs);
Brian Osman71a18892017-08-10 10:23:25 -0400109 writer->appendBool("Must use local out color for FBFetch", fRequiresLocalOutputColorForFBFetch);
Brian Osman71a18892017-08-10 10:23:25 -0400110 writer->appendBool("Must obfuscate uniform color", fMustObfuscateUniformColor);
111 writer->appendBool("Must guard division even after explicit zero check",
112 fMustGuardDivisionEvenAfterExplicitZeroCheck);
Brian Osmancd3261a2018-01-16 13:52:29 +0000113 writer->appendBool("Can use gl_FragCoord", fCanUseFragCoord);
Brian Salomondba65f92018-01-22 08:43:38 -0500114 writer->appendBool("Interpolants are inaccurate", fInterpolantsAreInaccurate);
Chris Daltonc2d0dd62018-03-07 07:46:10 -0700115 writer->appendBool("Incomplete short int precision", fIncompleteShortIntPrecision);
Brian Osman71a18892017-08-10 10:23:25 -0400116 writer->appendBool("Flat interpolation support", fFlatInterpolationSupport);
Brian Salomon41274562017-09-15 09:40:03 -0700117 writer->appendBool("Prefer flat interpolation", fPreferFlatInterpolation);
Brian Osman71a18892017-08-10 10:23:25 -0400118 writer->appendBool("No perspective interpolation support", fNoPerspectiveInterpolationSupport);
Brian Osman71a18892017-08-10 10:23:25 -0400119 writer->appendBool("External texture support", fExternalTextureSupport);
120 writer->appendBool("texelFetch support", fTexelFetchSupport);
121 writer->appendBool("sk_VertexID support", fVertexIDSupport);
Chris Dalton7c7ff032018-03-28 20:09:58 -0600122 writer->appendBool("Floating point manipulation support", fFPManipulationSupport);
Chris Dalton47c8ed32017-11-15 18:27:09 -0700123 writer->appendBool("float == fp32", fFloatIs32Bits);
124 writer->appendBool("half == fp32", fHalfIs32Bits);
jvanverthcba99b82015-06-24 06:59:57 -0700125
Brian Osman71a18892017-08-10 10:23:25 -0400126 writer->appendS32("Max VS Samplers", fMaxVertexSamplers);
127 writer->appendS32("Max GS Samplers", fMaxGeometrySamplers);
128 writer->appendS32("Max FS Samplers", fMaxFragmentSamplers);
129 writer->appendS32("Max Combined Samplers", fMaxFragmentSamplers);
Brian Osman71a18892017-08-10 10:23:25 -0400130 writer->appendString("Advanced blend equation interaction",
131 kAdvBlendEqInteractionStr[fAdvBlendEqInteraction]);
Brian Salomon762d5e72017-12-01 10:25:08 -0500132 writer->appendU64("Disable image multitexturing dst area threshold",
133 fDisableImageMultitexturingDstRectAreaThreshold);
Brian Osman71a18892017-08-10 10:23:25 -0400134
135 writer->endObject();
jvanverthcba99b82015-06-24 06:59:57 -0700136}
137
Brian Salomon94efbf52016-11-29 13:43:05 -0500138void GrShaderCaps::applyOptionsOverrides(const GrContextOptions& options) {
Brian Salomon01b476a2018-01-23 11:06:41 -0500139 if (options.fDisableDriverCorrectnessWorkarounds) {
140 SkASSERT(fCanUseAnyFunctionInShader);
141 SkASSERT(fCanUseMinAndAbsTogether);
142 SkASSERT(fCanUseFractForNegativeValues);
143 SkASSERT(!fMustForceNegatedAtanParamToFloat);
144 SkASSERT(!fAtan2ImplementedAsAtanYOverX);
145 SkASSERT(!fMustDoOpBetweenFloorAndAbs);
146 SkASSERT(!fRequiresLocalOutputColorForFBFetch);
147 SkASSERT(!fMustObfuscateUniformColor);
148 SkASSERT(!fMustGuardDivisionEvenAfterExplicitZeroCheck);
149 SkASSERT(fCanUseFragCoord);
150 SkASSERT(!fInterpolantsAreInaccurate);
Chris Daltonc2d0dd62018-03-07 07:46:10 -0700151 SkASSERT(!fIncompleteShortIntPrecision);
Brian Salomon01b476a2018-01-23 11:06:41 -0500152 }
Brian Osman195c05b2017-08-30 15:14:04 -0400153#if GR_TEST_UTILS
Brian Salomon94efbf52016-11-29 13:43:05 -0500154 fDualSourceBlendingSupport = fDualSourceBlendingSupport && !options.fSuppressDualSourceBlending;
Brian Salomon762d5e72017-12-01 10:25:08 -0500155 if (options.fDisableImageMultitexturing) {
156 fDisableImageMultitexturingDstRectAreaThreshold = 0;
157 }
Brian Osman195c05b2017-08-30 15:14:04 -0400158#endif
egdanielb7e7d572015-11-04 04:23:53 -0800159}