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