1 /* 2 * Copyright 2016 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 #ifndef SKSL_PROGRAMSETTINGS 9 #define SKSL_PROGRAMSETTINGS 10 11 #include "include/private/SkSLDefines.h" 12 #include "include/private/SkSLProgramKind.h" 13 14 namespace SkSL { 15 16 /** 17 * Holds the compiler settings for a program. 18 */ 19 struct ProgramSettings { 20 // if false, sk_FragCoord is exactly the same as gl_FragCoord. If true, the y coordinate 21 // must be flipped. 22 bool fFlipY = false; 23 // If true the destination fragment color is read sk_FragColor. It must be declared inout. 24 bool fFragColorIsInOut = false; 25 // if true, Setting objects (e.g. sk_Caps.fbFetchSupport) should be replaced with their 26 // constant equivalents during compilation 27 bool fReplaceSettings = true; 28 // if true, all halfs are forced to be floats 29 bool fForceHighPrecision = false; 30 // if true, add -0.5 bias to LOD of all texture lookups 31 bool fSharpenTextures = false; 32 // if the program needs to create an RTHeight uniform, this is its offset in the uniform 33 // buffer 34 int fRTHeightOffset = -1; 35 // if the program needs to create an RTHeight uniform and is creating spriv, this is the 36 // binding and set number of the uniform buffer. 37 int fRTHeightBinding = -1; 38 int fRTHeightSet = -1; 39 // If layout(set=S, binding=B) is not specified for a uniform, these values will be used. 40 // At present, zero is always used by our backends. 41 int fDefaultUniformSet = 0; 42 int fDefaultUniformBinding = 0; 43 // Enables the SkSL optimizer. 44 bool fOptimize = true; 45 // (Requires fOptimize = true) Removes any uncalled functions other than main(). Note that a 46 // function which starts out being used may end up being uncalled after optimization. 47 bool fRemoveDeadFunctions = true; 48 // (Requires fOptimize = true) Removes global variables which are never used. 49 bool fRemoveDeadVariables = true; 50 // (Requires fOptimize = true) When greater than zero, enables the inliner. The threshold value 51 // sets an upper limit on the acceptable amount of code growth from inlining. 52 int fInlineThreshold = SkSL::kDefaultInlineThreshold; 53 // If true, every function in the generated program will be given the `noinline` modifier. 54 bool fForceNoInline = false; 55 // If true, implicit conversions to lower precision numeric types are allowed 56 // (eg, float to half) 57 bool fAllowNarrowingConversions = false; 58 // If true, then Debug code will run SPIR-V output through the validator to ensure its 59 // correctness 60 bool fValidateSPIRV = true; 61 // If true, any synthetic uniforms must use push constant syntax 62 bool fUsePushConstants = false; 63 // Permits static if/switch statements to be used with non-constant tests. This is used when 64 // producing H and CPP code; the static tests don't have to have constant values *yet*, but 65 // the generated code will contain a static test which then does have to be a constant. 66 bool fPermitInvalidStaticTests = false; 67 // If true, configurations which demand strict ES2 conformance (runtime effects, generic 68 // programs, and SkVM rendering) will fail during compilation if ES2 restrictions are violated. 69 bool fEnforceES2Restrictions = true; 70 }; 71 72 /** 73 * All the configuration data for a given program. 74 */ 75 struct ProgramConfig { 76 ProgramKind fKind; 77 ProgramSettings fSettings; 78 strictES2ModeProgramConfig79 bool strictES2Mode() const { 80 return fSettings.fEnforceES2Restrictions && 81 (fKind == ProgramKind::kRuntimeColorFilter || 82 fKind == ProgramKind::kRuntimeShader || 83 fKind == ProgramKind::kGeneric); 84 } 85 }; 86 87 } // namespace SkSL 88 89 #endif 90