blob: 48422daced8650dba132a60859f6608abdbf27ed [file] [log] [blame]
John Stiles270cec22021-02-17 12:59:36 -05001/*
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
Ethan Nicholasdaed2592021-03-04 14:30:25 -050011#include "include/private/SkSLDefines.h"
Ethan Nicholasee49efc2021-04-09 15:33:53 -040012#include "include/private/SkSLProgramKind.h"
John Stiles270cec22021-02-17 12:59:36 -050013
Ethan Nicholas55a63af2021-05-18 10:12:58 -040014#include <vector>
15
John Stiles270cec22021-02-17 12:59:36 -050016namespace SkSL {
17
Ethan Nicholas55a63af2021-05-18 10:12:58 -040018class ExternalFunction;
19
John Stiles270cec22021-02-17 12:59:36 -050020/**
John Stiles270cec22021-02-17 12:59:36 -050021 * Holds the compiler settings for a program.
22 */
23struct ProgramSettings {
John Stiles270cec22021-02-17 12:59:36 -050024 // 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;
John Stilesaddccaf2021-08-02 19:03:30 -040033 // if the program needs to create an RTFlip uniform, this is its offset in the uniform buffer
Brian Salomond8d85b92021-07-07 09:41:17 -040034 int fRTFlipOffset = -1;
John Stilesaddccaf2021-08-02 19:03:30 -040035 // 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.
Brian Salomond8d85b92021-07-07 09:41:17 -040037 int fRTFlipBinding = -1;
38 int fRTFlipSet = -1;
John Stiles270cec22021-02-17 12:59:36 -050039 // 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;
John Stiles66c53b92021-02-20 08:00:43 -050043 // Enables the SkSL optimizer.
John Stiles270cec22021-02-17 12:59:36 -050044 bool fOptimize = true;
John Stiles0bfeae62021-03-11 09:09:42 -050045 // (Requires fOptimize = true) Removes any uncalled functions other than main(). Note that a
John Stiles66c53b92021-02-20 08:00:43 -050046 // function which starts out being used may end up being uncalled after optimization.
47 bool fRemoveDeadFunctions = true;
John Stiles0bfeae62021-03-11 09:09:42 -050048 // (Requires fOptimize = true) Removes global variables which are never used.
49 bool fRemoveDeadVariables = true;
John Stiles66c53b92021-02-20 08:00:43 -050050 // (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;
John Stiles9d26af92021-03-23 09:25:33 -040053 // If true, every function in the generated program will be given the `noinline` modifier.
54 bool fForceNoInline = false;
John Stilesaddccaf2021-08-02 19:03:30 -040055 // If true, implicit conversions to lower precision numeric types are allowed (e.g., float to
56 // half). These are always allowed when compiling Runtime Effects.
John Stiles270cec22021-02-17 12:59:36 -050057 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;
John Stiles65d7ab22021-04-28 15:14:09 -040067 // 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;
Ethan Nicholas55a63af2021-05-18 10:12:58 -040070 // If true, the DSL should automatically mangle symbol names.
71 bool fDSLMangling = true;
72 // If true, the DSL should automatically mark variables declared upon creation.
73 bool fDSLMarkVarsDeclared = false;
Brian Salomond8d85b92021-07-07 09:41:17 -040074 // If true, the DSL should install a memory pool when possible.
75 bool fDSLUseMemoryPool = true;
Ethan Nicholas459777a2021-07-16 11:16:27 -040076 // If true, DSL objects assert that they were used prior to destruction
77 bool fAssertDSLObjectsReleased = true;
Ethan Nicholas55a63af2021-05-18 10:12:58 -040078 // External functions available for use in runtime effects. These values are registered in the
79 // symbol table of the Program, but ownership is *not* transferred. It is up to the caller to
80 // keep them alive.
81 const std::vector<std::unique_ptr<ExternalFunction>>* fExternalFunctions = nullptr;
John Stiles270cec22021-02-17 12:59:36 -050082};
83
84/**
85 * All the configuration data for a given program.
86 */
87struct ProgramConfig {
88 ProgramKind fKind;
89 ProgramSettings fSettings;
John Stilesca107c92021-02-19 09:54:44 -050090
91 bool strictES2Mode() const {
John Stiles65d7ab22021-04-28 15:14:09 -040092 return fSettings.fEnforceES2Restrictions &&
John Stilesaddccaf2021-08-02 19:03:30 -040093 (IsRuntimeEffect(fKind) || fKind == ProgramKind::kGeneric);
John Stilesbb2ef922021-07-26 08:32:07 -040094 }
95
John Stilesaddccaf2021-08-02 19:03:30 -040096 static bool IsRuntimeEffect(ProgramKind kind) {
97 return (kind == ProgramKind::kRuntimeColorFilter ||
98 kind == ProgramKind::kRuntimeShader ||
99 kind == ProgramKind::kRuntimeBlender);
John Stilesca107c92021-02-19 09:54:44 -0500100 }
John Stiles270cec22021-02-17 12:59:36 -0500101};
102
103} // namespace SkSL
104
105#endif