• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include <vector>
15 
16 namespace SkSL {
17 
18 class ExternalFunction;
19 
20 /**
21  * Holds the compiler settings for a program.
22  */
23 struct ProgramSettings {
24     // If true the destination fragment color is read sk_FragColor. It must be declared inout.
25     bool fFragColorIsInOut = false;
26     // if true, Setting objects (e.g. sk_Caps.fbFetchSupport) should be replaced with their
27     // constant equivalents during compilation
28     bool fReplaceSettings = true;
29     // if true, all halfs are forced to be floats
30     bool fForceHighPrecision = false;
31     // if true, add -0.5 bias to LOD of all texture lookups
32     bool fSharpenTextures = false;
33     // if the program needs to create an RTFlip uniform, this is its offset in the uniform buffer
34     int fRTFlipOffset = -1;
35     // if the program needs to create an RTFlip uniform and is creating SPIR-V, this is the binding
36     // and set number of the uniform buffer.
37     int fRTFlipBinding = -1;
38     int fRTFlipSet = -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. Note that we never disable optimizations which are needed to
44     // fully evaluate constant-expressions, like constant folding or constant-intrinsic evaluation.
45     bool fOptimize = true;
46     // (Requires fOptimize = true) Removes any uncalled functions other than main(). Note that a
47     // function which starts out being used may end up being uncalled after optimization.
48     bool fRemoveDeadFunctions = true;
49     // (Requires fOptimize = true) Removes variables which are never used.
50     bool fRemoveDeadVariables = true;
51     // (Requires fOptimize = true) When greater than zero, enables the inliner. The threshold value
52     // sets an upper limit on the acceptable amount of code growth from inlining.
53     int fInlineThreshold = SkSL::kDefaultInlineThreshold;
54     // If true, every function in the generated program will be given the `noinline` modifier.
55     bool fForceNoInline = false;
56     // If true, implicit conversions to lower precision numeric types are allowed (e.g., float to
57     // half). These are always allowed when compiling Runtime Effects.
58     bool fAllowNarrowingConversions = false;
59     // If true, then Debug code will run SPIR-V output through the validator to ensure its
60     // correctness
61     bool fValidateSPIRV = true;
62     // If true, any synthetic uniforms must use push constant syntax
63     bool fUsePushConstants = false;
64     // Permits static if/switch statements to be used with non-constant tests. This is used when
65     // producing H and CPP code; the static tests don't have to have constant values *yet*, but
66     // the generated code will contain a static test which then does have to be a constant.
67     bool fPermitInvalidStaticTests = false;
68     // If true, configurations which demand strict ES2 conformance (runtime effects, generic
69     // programs, and SkVM rendering) will fail during compilation if ES2 restrictions are violated.
70     bool fEnforceES2Restrictions = true;
71     // If true, the DSL should automatically mangle symbol names.
72     bool fDSLMangling = true;
73     // If true, the DSL should automatically mark variables declared upon creation.
74     bool fDSLMarkVarsDeclared = false;
75     // If true, the DSL should install a memory pool when possible.
76     bool fDSLUseMemoryPool = true;
77     // If true, DSL objects assert that they were used prior to destruction
78     bool fAssertDSLObjectsReleased = true;
79     // External functions available for use in runtime effects. These values are registered in the
80     // symbol table of the Program, but ownership is *not* transferred. It is up to the caller to
81     // keep them alive.
82     const std::vector<std::unique_ptr<ExternalFunction>>* fExternalFunctions = nullptr;
83 };
84 
85 /**
86  * All the configuration data for a given program.
87  */
88 struct ProgramConfig {
89     /** True if we are currently processing one of the built-in SkSL include modules. */
90     bool fIsBuiltinCode;
91     ProgramKind fKind;
92     ProgramSettings fSettings;
93 
strictES2ModeProgramConfig94     bool strictES2Mode() const {
95         return fSettings.fEnforceES2Restrictions &&
96                (IsRuntimeEffect(fKind) || fKind == ProgramKind::kGeneric);
97     }
98 
IsRuntimeEffectProgramConfig99     static bool IsRuntimeEffect(ProgramKind kind) {
100         return (kind == ProgramKind::kRuntimeColorFilter ||
101                 kind == ProgramKind::kRuntimeShader ||
102                 kind == ProgramKind::kRuntimeBlender);
103     }
104 };
105 
106 }  // namespace SkSL
107 
108 #endif
109