xref: /aosp_15_r20/external/skia/src/gpu/ganesh/glsl/GrGLSLShaderBuilder.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2014 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrGLSLShaderBuilder_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define GrGLSLShaderBuilder_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSpan.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkTBlockList.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrShaderVar.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/glsl/GrGLSLUniformHandler.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLDefines.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLStatement.h"  // IWYU pragma: keep
20*c8dee2aaSAndroid Build Coastguard Worker 
21*c8dee2aaSAndroid Build Coastguard Worker #include <cstdarg>
22*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
23*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
24*c8dee2aaSAndroid Build Coastguard Worker #include <string>
25*c8dee2aaSAndroid Build Coastguard Worker 
26*c8dee2aaSAndroid Build Coastguard Worker class GrGLSLColorSpaceXformHelper;
27*c8dee2aaSAndroid Build Coastguard Worker class GrGLSLProgramBuilder;
28*c8dee2aaSAndroid Build Coastguard Worker enum class SkBlendMode;
29*c8dee2aaSAndroid Build Coastguard Worker enum class SkSLType : char;
30*c8dee2aaSAndroid Build Coastguard Worker 
31*c8dee2aaSAndroid Build Coastguard Worker /**
32*c8dee2aaSAndroid Build Coastguard Worker   base class for all shaders builders
33*c8dee2aaSAndroid Build Coastguard Worker */
34*c8dee2aaSAndroid Build Coastguard Worker class GrGLSLShaderBuilder {
35*c8dee2aaSAndroid Build Coastguard Worker public:
36*c8dee2aaSAndroid Build Coastguard Worker     GrGLSLShaderBuilder(GrGLSLProgramBuilder* program);
~GrGLSLShaderBuilder()37*c8dee2aaSAndroid Build Coastguard Worker     virtual ~GrGLSLShaderBuilder() {}
38*c8dee2aaSAndroid Build Coastguard Worker 
39*c8dee2aaSAndroid Build Coastguard Worker     using SamplerHandle      = GrGLSLUniformHandler::SamplerHandle;
40*c8dee2aaSAndroid Build Coastguard Worker 
41*c8dee2aaSAndroid Build Coastguard Worker     /** Appends a 2D texture sample with projection if necessary. The vec length and swizzle
42*c8dee2aaSAndroid Build Coastguard Worker         order of the result depends on the GrProcessor::TextureSampler associated with the
43*c8dee2aaSAndroid Build Coastguard Worker         SamplerHandle.
44*c8dee2aaSAndroid Build Coastguard Worker         */
45*c8dee2aaSAndroid Build Coastguard Worker     void appendTextureLookup(SkString* out, SamplerHandle, const char* coordName) const;
46*c8dee2aaSAndroid Build Coastguard Worker 
47*c8dee2aaSAndroid Build Coastguard Worker     /** Version of above that appends the result to the shader code instead.*/
48*c8dee2aaSAndroid Build Coastguard Worker     void appendTextureLookup(SamplerHandle,
49*c8dee2aaSAndroid Build Coastguard Worker                              const char* coordName,
50*c8dee2aaSAndroid Build Coastguard Worker                              GrGLSLColorSpaceXformHelper* colorXformHelper = nullptr);
51*c8dee2aaSAndroid Build Coastguard Worker 
52*c8dee2aaSAndroid Build Coastguard Worker     /** Does the work of appendTextureLookup and blends the result by dst, treating the texture
53*c8dee2aaSAndroid Build Coastguard Worker         lookup as the src input to the blend. The dst is assumed to be half4 and the result is
54*c8dee2aaSAndroid Build Coastguard Worker         always a half4. If dst is nullptr we use half4(1) as the blend dst. */
55*c8dee2aaSAndroid Build Coastguard Worker     void appendTextureLookupAndBlend(const char* dst,
56*c8dee2aaSAndroid Build Coastguard Worker                                      SkBlendMode,
57*c8dee2aaSAndroid Build Coastguard Worker                                      SamplerHandle,
58*c8dee2aaSAndroid Build Coastguard Worker                                      const char* coordName,
59*c8dee2aaSAndroid Build Coastguard Worker                                      GrGLSLColorSpaceXformHelper* colorXformHelper = nullptr);
60*c8dee2aaSAndroid Build Coastguard Worker 
61*c8dee2aaSAndroid Build Coastguard Worker     /** Appends a load of an input attachment into the shader code. */
62*c8dee2aaSAndroid Build Coastguard Worker     void appendInputLoad(SamplerHandle);
63*c8dee2aaSAndroid Build Coastguard Worker 
64*c8dee2aaSAndroid Build Coastguard Worker     /** Adds a helper function to facilitate color gamut transformation, and produces code that
65*c8dee2aaSAndroid Build Coastguard Worker         returns the srcColor transformed into a new gamut (via multiplication by the xform from
66*c8dee2aaSAndroid Build Coastguard Worker         colorXformHelper). Premultiplied sources are also handled correctly (colorXformHelper
67*c8dee2aaSAndroid Build Coastguard Worker         determines if the source is premultipled or not). */
68*c8dee2aaSAndroid Build Coastguard Worker     void appendColorGamutXform(SkString* out, const char* srcColor,
69*c8dee2aaSAndroid Build Coastguard Worker                                GrGLSLColorSpaceXformHelper* colorXformHelper);
70*c8dee2aaSAndroid Build Coastguard Worker 
71*c8dee2aaSAndroid Build Coastguard Worker     /** Version of above that appends the result to the shader code instead. */
72*c8dee2aaSAndroid Build Coastguard Worker     void appendColorGamutXform(const char* srcColor, GrGLSLColorSpaceXformHelper* colorXformHelper);
73*c8dee2aaSAndroid Build Coastguard Worker 
74*c8dee2aaSAndroid Build Coastguard Worker     /**
75*c8dee2aaSAndroid Build Coastguard Worker     * Adds a constant declaration to the top of the shader.
76*c8dee2aaSAndroid Build Coastguard Worker     */
defineConstant(const char * type,const char * name,const char * value)77*c8dee2aaSAndroid Build Coastguard Worker     void defineConstant(const char* type, const char* name, const char* value) {
78*c8dee2aaSAndroid Build Coastguard Worker         this->definitions().appendf("const %s %s = %s;\n", type, name, value);
79*c8dee2aaSAndroid Build Coastguard Worker     }
80*c8dee2aaSAndroid Build Coastguard Worker 
defineConstant(const char * name,int value)81*c8dee2aaSAndroid Build Coastguard Worker     void defineConstant(const char* name, int value) {
82*c8dee2aaSAndroid Build Coastguard Worker         this->definitions().appendf("const int %s = %i;\n", name, value);
83*c8dee2aaSAndroid Build Coastguard Worker     }
84*c8dee2aaSAndroid Build Coastguard Worker 
defineConstant(const char * name,float value)85*c8dee2aaSAndroid Build Coastguard Worker     void defineConstant(const char* name, float value) {
86*c8dee2aaSAndroid Build Coastguard Worker         this->definitions().appendf("const float %s = %f;\n", name, value);
87*c8dee2aaSAndroid Build Coastguard Worker     }
88*c8dee2aaSAndroid Build Coastguard Worker 
defineConstantf(const char * type,const char * name,const char * fmt,...)89*c8dee2aaSAndroid Build Coastguard Worker     void defineConstantf(const char* type, const char* name, const char* fmt, ...)
90*c8dee2aaSAndroid Build Coastguard Worker             SK_PRINTF_LIKE(4, 5) {
91*c8dee2aaSAndroid Build Coastguard Worker         this->definitions().appendf("const %s %s = ", type, name);
92*c8dee2aaSAndroid Build Coastguard Worker         va_list args;
93*c8dee2aaSAndroid Build Coastguard Worker         va_start(args, fmt);
94*c8dee2aaSAndroid Build Coastguard Worker         this->definitions().appendVAList(fmt, args);
95*c8dee2aaSAndroid Build Coastguard Worker         va_end(args);
96*c8dee2aaSAndroid Build Coastguard Worker         this->definitions().append(";\n");
97*c8dee2aaSAndroid Build Coastguard Worker     }
98*c8dee2aaSAndroid Build Coastguard Worker 
definitionAppend(const char * str)99*c8dee2aaSAndroid Build Coastguard Worker     void definitionAppend(const char* str) { this->definitions().append(str); }
100*c8dee2aaSAndroid Build Coastguard Worker 
101*c8dee2aaSAndroid Build Coastguard Worker     void declareGlobal(const GrShaderVar&);
102*c8dee2aaSAndroid Build Coastguard Worker 
103*c8dee2aaSAndroid Build Coastguard Worker     // Generates a unique variable name for holding the result of a temporary expression when it's
104*c8dee2aaSAndroid Build Coastguard Worker     // not reasonable to just add a new block for scoping. Does not declare anything.
newTmpVarName(const char * suffix)105*c8dee2aaSAndroid Build Coastguard Worker     SkString newTmpVarName(const char* suffix) {
106*c8dee2aaSAndroid Build Coastguard Worker         int tmpIdx = fTmpVariableCounter++;
107*c8dee2aaSAndroid Build Coastguard Worker         return SkStringPrintf("_tmp_%d_%s", tmpIdx, suffix);
108*c8dee2aaSAndroid Build Coastguard Worker     }
109*c8dee2aaSAndroid Build Coastguard Worker 
110*c8dee2aaSAndroid Build Coastguard Worker     /**
111*c8dee2aaSAndroid Build Coastguard Worker      * Called by GrGLSLProcessors to add code to one of the shaders.
112*c8dee2aaSAndroid Build Coastguard Worker      */
codeAppendf(const char format[],...)113*c8dee2aaSAndroid Build Coastguard Worker     void codeAppendf(const char format[], ...) SK_PRINTF_LIKE(2, 3) {
114*c8dee2aaSAndroid Build Coastguard Worker        va_list args;
115*c8dee2aaSAndroid Build Coastguard Worker        va_start(args, format);
116*c8dee2aaSAndroid Build Coastguard Worker        this->code().appendVAList(format, args);
117*c8dee2aaSAndroid Build Coastguard Worker        va_end(args);
118*c8dee2aaSAndroid Build Coastguard Worker     }
119*c8dee2aaSAndroid Build Coastguard Worker 
codeAppend(const char * str)120*c8dee2aaSAndroid Build Coastguard Worker     void codeAppend(const char* str) { this->code().append(str); }
121*c8dee2aaSAndroid Build Coastguard Worker 
codeAppend(const char * str,size_t length)122*c8dee2aaSAndroid Build Coastguard Worker     void codeAppend(const char* str, size_t length) { this->code().append(str, length); }
123*c8dee2aaSAndroid Build Coastguard Worker 
codePrependf(const char format[],...)124*c8dee2aaSAndroid Build Coastguard Worker     void codePrependf(const char format[], ...) SK_PRINTF_LIKE(2, 3) {
125*c8dee2aaSAndroid Build Coastguard Worker        va_list args;
126*c8dee2aaSAndroid Build Coastguard Worker        va_start(args, format);
127*c8dee2aaSAndroid Build Coastguard Worker        this->code().prependVAList(format, args);
128*c8dee2aaSAndroid Build Coastguard Worker        va_end(args);
129*c8dee2aaSAndroid Build Coastguard Worker     }
130*c8dee2aaSAndroid Build Coastguard Worker 
131*c8dee2aaSAndroid Build Coastguard Worker     /**
132*c8dee2aaSAndroid Build Coastguard Worker      * Appends a variable declaration to one of the shaders
133*c8dee2aaSAndroid Build Coastguard Worker      */
134*c8dee2aaSAndroid Build Coastguard Worker     void declAppend(const GrShaderVar& var);
135*c8dee2aaSAndroid Build Coastguard Worker 
136*c8dee2aaSAndroid Build Coastguard Worker     /**
137*c8dee2aaSAndroid Build Coastguard Worker      * Generates a mangled name for a helper function in the fragment shader. Will give consistent
138*c8dee2aaSAndroid Build Coastguard Worker      * results if called more than once.
139*c8dee2aaSAndroid Build Coastguard Worker      */
140*c8dee2aaSAndroid Build Coastguard Worker     SkString getMangledFunctionName(const char* baseName);
141*c8dee2aaSAndroid Build Coastguard Worker 
142*c8dee2aaSAndroid Build Coastguard Worker     /** Emits a prototype for a helper function outside of main() in the fragment shader. */
143*c8dee2aaSAndroid Build Coastguard Worker     void emitFunctionPrototype(SkSLType returnType,
144*c8dee2aaSAndroid Build Coastguard Worker                                const char* mangledName,
145*c8dee2aaSAndroid Build Coastguard Worker                                SkSpan<const GrShaderVar> args);
146*c8dee2aaSAndroid Build Coastguard Worker 
147*c8dee2aaSAndroid Build Coastguard Worker     void emitFunctionPrototype(const char* declaration);
148*c8dee2aaSAndroid Build Coastguard Worker 
149*c8dee2aaSAndroid Build Coastguard Worker     /** Emits a helper function outside of main() in the fragment shader. */
150*c8dee2aaSAndroid Build Coastguard Worker     void emitFunction(SkSLType returnType,
151*c8dee2aaSAndroid Build Coastguard Worker                       const char* mangledName,
152*c8dee2aaSAndroid Build Coastguard Worker                       SkSpan<const GrShaderVar> args,
153*c8dee2aaSAndroid Build Coastguard Worker                       const char* body);
154*c8dee2aaSAndroid Build Coastguard Worker 
155*c8dee2aaSAndroid Build Coastguard Worker     void emitFunction(const char* declaration, const char* body);
156*c8dee2aaSAndroid Build Coastguard Worker 
157*c8dee2aaSAndroid Build Coastguard Worker     /**
158*c8dee2aaSAndroid Build Coastguard Worker      * Combines the various parts of the shader to create a single finalized shader string.
159*c8dee2aaSAndroid Build Coastguard Worker      */
160*c8dee2aaSAndroid Build Coastguard Worker     void finalize(uint32_t visibility);
161*c8dee2aaSAndroid Build Coastguard Worker 
162*c8dee2aaSAndroid Build Coastguard Worker     /**
163*c8dee2aaSAndroid Build Coastguard Worker      * Get parent builder for adding uniforms.
164*c8dee2aaSAndroid Build Coastguard Worker      */
getProgramBuilder()165*c8dee2aaSAndroid Build Coastguard Worker     GrGLSLProgramBuilder* getProgramBuilder() { return fProgramBuilder; }
166*c8dee2aaSAndroid Build Coastguard Worker 
167*c8dee2aaSAndroid Build Coastguard Worker     /**
168*c8dee2aaSAndroid Build Coastguard Worker      * Helper for begining and ending a block in the shader code.
169*c8dee2aaSAndroid Build Coastguard Worker      */
170*c8dee2aaSAndroid Build Coastguard Worker     class ShaderBlock {
171*c8dee2aaSAndroid Build Coastguard Worker     public:
ShaderBlock(GrGLSLShaderBuilder * builder)172*c8dee2aaSAndroid Build Coastguard Worker         ShaderBlock(GrGLSLShaderBuilder* builder) : fBuilder(builder) {
173*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(builder);
174*c8dee2aaSAndroid Build Coastguard Worker             fBuilder->codeAppend("{");
175*c8dee2aaSAndroid Build Coastguard Worker         }
176*c8dee2aaSAndroid Build Coastguard Worker 
~ShaderBlock()177*c8dee2aaSAndroid Build Coastguard Worker         ~ShaderBlock() {
178*c8dee2aaSAndroid Build Coastguard Worker             fBuilder->codeAppend("}");
179*c8dee2aaSAndroid Build Coastguard Worker         }
180*c8dee2aaSAndroid Build Coastguard Worker     private:
181*c8dee2aaSAndroid Build Coastguard Worker         GrGLSLShaderBuilder* fBuilder;
182*c8dee2aaSAndroid Build Coastguard Worker     };
183*c8dee2aaSAndroid Build Coastguard Worker 
184*c8dee2aaSAndroid Build Coastguard Worker protected:
185*c8dee2aaSAndroid Build Coastguard Worker     typedef SkTBlockList<GrShaderVar> VarArray;
186*c8dee2aaSAndroid Build Coastguard Worker     void appendDecls(const VarArray& vars, SkString* out) const;
187*c8dee2aaSAndroid Build Coastguard Worker 
188*c8dee2aaSAndroid Build Coastguard Worker     void appendFunctionDecl(SkSLType returnType,
189*c8dee2aaSAndroid Build Coastguard Worker                             const char* mangledName,
190*c8dee2aaSAndroid Build Coastguard Worker                             SkSpan<const GrShaderVar> args);
191*c8dee2aaSAndroid Build Coastguard Worker 
192*c8dee2aaSAndroid Build Coastguard Worker     /**
193*c8dee2aaSAndroid Build Coastguard Worker      * Features that should only be enabled internally by the builders.
194*c8dee2aaSAndroid Build Coastguard Worker      */
195*c8dee2aaSAndroid Build Coastguard Worker     enum GLSLPrivateFeature {
196*c8dee2aaSAndroid Build Coastguard Worker         kFragCoordConventions_GLSLPrivateFeature,
197*c8dee2aaSAndroid Build Coastguard Worker         kBlendEquationAdvanced_GLSLPrivateFeature,
198*c8dee2aaSAndroid Build Coastguard Worker         kBlendFuncExtended_GLSLPrivateFeature,
199*c8dee2aaSAndroid Build Coastguard Worker         kFramebufferFetch_GLSLPrivateFeature,
200*c8dee2aaSAndroid Build Coastguard Worker         kNoPerspectiveInterpolation_GLSLPrivateFeature,
201*c8dee2aaSAndroid Build Coastguard Worker         kSampleVariables_GLSLPrivateFeature,
202*c8dee2aaSAndroid Build Coastguard Worker         kLastGLSLPrivateFeature = kSampleVariables_GLSLPrivateFeature
203*c8dee2aaSAndroid Build Coastguard Worker     };
204*c8dee2aaSAndroid Build Coastguard Worker 
205*c8dee2aaSAndroid Build Coastguard Worker     /*
206*c8dee2aaSAndroid Build Coastguard Worker      * A general function which enables an extension in a shader if the feature bit is not present
207*c8dee2aaSAndroid Build Coastguard Worker      *
208*c8dee2aaSAndroid Build Coastguard Worker      * @return true if the feature bit was not yet present, false otherwise.
209*c8dee2aaSAndroid Build Coastguard Worker      */
210*c8dee2aaSAndroid Build Coastguard Worker     bool addFeature(uint32_t featureBit, const char* extensionName);
211*c8dee2aaSAndroid Build Coastguard Worker 
212*c8dee2aaSAndroid Build Coastguard Worker     enum InterfaceQualifier {
213*c8dee2aaSAndroid Build Coastguard Worker         kIn_InterfaceQualifier,
214*c8dee2aaSAndroid Build Coastguard Worker         kOut_InterfaceQualifier,
215*c8dee2aaSAndroid Build Coastguard Worker         kLastInterfaceQualifier = kOut_InterfaceQualifier
216*c8dee2aaSAndroid Build Coastguard Worker     };
217*c8dee2aaSAndroid Build Coastguard Worker 
218*c8dee2aaSAndroid Build Coastguard Worker     /*
219*c8dee2aaSAndroid Build Coastguard Worker      * A low level function to build default layout qualifiers.
220*c8dee2aaSAndroid Build Coastguard Worker      *
221*c8dee2aaSAndroid Build Coastguard Worker      *   e.g. layout(param1, param2, ...) out;
222*c8dee2aaSAndroid Build Coastguard Worker      *
223*c8dee2aaSAndroid Build Coastguard Worker      * GLSL allows default layout qualifiers for in, out, and uniform.
224*c8dee2aaSAndroid Build Coastguard Worker      */
225*c8dee2aaSAndroid Build Coastguard Worker     void addLayoutQualifier(const char* param, InterfaceQualifier);
226*c8dee2aaSAndroid Build Coastguard Worker 
227*c8dee2aaSAndroid Build Coastguard Worker     void compileAndAppendLayoutQualifiers();
228*c8dee2aaSAndroid Build Coastguard Worker 
nextStage()229*c8dee2aaSAndroid Build Coastguard Worker     void nextStage() {
230*c8dee2aaSAndroid Build Coastguard Worker         fShaderStrings.push_back();
231*c8dee2aaSAndroid Build Coastguard Worker         fCodeIndex++;
232*c8dee2aaSAndroid Build Coastguard Worker     }
233*c8dee2aaSAndroid Build Coastguard Worker 
deleteStage()234*c8dee2aaSAndroid Build Coastguard Worker     void deleteStage() {
235*c8dee2aaSAndroid Build Coastguard Worker         fShaderStrings.pop_back();
236*c8dee2aaSAndroid Build Coastguard Worker         fCodeIndex--;
237*c8dee2aaSAndroid Build Coastguard Worker     }
238*c8dee2aaSAndroid Build Coastguard Worker 
extensions()239*c8dee2aaSAndroid Build Coastguard Worker     SkString& extensions() { return fShaderStrings[kExtensions]; }
definitions()240*c8dee2aaSAndroid Build Coastguard Worker     SkString& definitions() { return fShaderStrings[kDefinitions]; }
precisionQualifier()241*c8dee2aaSAndroid Build Coastguard Worker     SkString& precisionQualifier() { return fShaderStrings[kPrecisionQualifier]; }
layoutQualifiers()242*c8dee2aaSAndroid Build Coastguard Worker     SkString& layoutQualifiers() { return fShaderStrings[kLayoutQualifiers]; }
uniforms()243*c8dee2aaSAndroid Build Coastguard Worker     SkString& uniforms() { return fShaderStrings[kUniforms]; }
inputs()244*c8dee2aaSAndroid Build Coastguard Worker     SkString& inputs() { return fShaderStrings[kInputs]; }
outputs()245*c8dee2aaSAndroid Build Coastguard Worker     SkString& outputs() { return fShaderStrings[kOutputs]; }
functions()246*c8dee2aaSAndroid Build Coastguard Worker     SkString& functions() { return fShaderStrings[kFunctions]; }
main()247*c8dee2aaSAndroid Build Coastguard Worker     SkString& main() { return fShaderStrings[kMain]; }
code()248*c8dee2aaSAndroid Build Coastguard Worker     SkString& code() { return fShaderStrings[fCodeIndex]; }
249*c8dee2aaSAndroid Build Coastguard Worker 
250*c8dee2aaSAndroid Build Coastguard Worker     virtual void onFinalize() = 0;
251*c8dee2aaSAndroid Build Coastguard Worker 
252*c8dee2aaSAndroid Build Coastguard Worker     enum {
253*c8dee2aaSAndroid Build Coastguard Worker         kExtensions,
254*c8dee2aaSAndroid Build Coastguard Worker         kDefinitions,
255*c8dee2aaSAndroid Build Coastguard Worker         kPrecisionQualifier,
256*c8dee2aaSAndroid Build Coastguard Worker         kLayoutQualifiers,
257*c8dee2aaSAndroid Build Coastguard Worker         kUniforms,
258*c8dee2aaSAndroid Build Coastguard Worker         kInputs,
259*c8dee2aaSAndroid Build Coastguard Worker         kOutputs,
260*c8dee2aaSAndroid Build Coastguard Worker         kFunctions,
261*c8dee2aaSAndroid Build Coastguard Worker         kMain,
262*c8dee2aaSAndroid Build Coastguard Worker         kCode,
263*c8dee2aaSAndroid Build Coastguard Worker 
264*c8dee2aaSAndroid Build Coastguard Worker         kPrealloc = kCode + 6,  // 6 == Reasonable upper bound on number of processor stages
265*c8dee2aaSAndroid Build Coastguard Worker     };
266*c8dee2aaSAndroid Build Coastguard Worker 
267*c8dee2aaSAndroid Build Coastguard Worker     GrGLSLProgramBuilder* fProgramBuilder;
268*c8dee2aaSAndroid Build Coastguard Worker     std::string fCompilerString;
269*c8dee2aaSAndroid Build Coastguard Worker     skia_private::STArray<kPrealloc, SkString> fShaderStrings;
270*c8dee2aaSAndroid Build Coastguard Worker     SkString fCode;
271*c8dee2aaSAndroid Build Coastguard Worker     SkString fFunctions;
272*c8dee2aaSAndroid Build Coastguard Worker     SkString fExtensions;
273*c8dee2aaSAndroid Build Coastguard Worker     // Hangs onto Declarations so we don't destroy them prior to the variables that refer to them.
274*c8dee2aaSAndroid Build Coastguard Worker     SkSL::StatementArray fDeclarations;
275*c8dee2aaSAndroid Build Coastguard Worker 
276*c8dee2aaSAndroid Build Coastguard Worker     VarArray fInputs;
277*c8dee2aaSAndroid Build Coastguard Worker     VarArray fOutputs;
278*c8dee2aaSAndroid Build Coastguard Worker     uint32_t fFeaturesAddedMask;
279*c8dee2aaSAndroid Build Coastguard Worker     skia_private::STArray<1, SkString> fLayoutParams[kLastInterfaceQualifier + 1];
280*c8dee2aaSAndroid Build Coastguard Worker     int fCodeIndex;
281*c8dee2aaSAndroid Build Coastguard Worker     bool fFinalized;
282*c8dee2aaSAndroid Build Coastguard Worker 
283*c8dee2aaSAndroid Build Coastguard Worker     // Counter for generating unique scratch variable names in a shader.
284*c8dee2aaSAndroid Build Coastguard Worker     int fTmpVariableCounter;
285*c8dee2aaSAndroid Build Coastguard Worker 
286*c8dee2aaSAndroid Build Coastguard Worker     friend class GrGLSLProgramBuilder;
287*c8dee2aaSAndroid Build Coastguard Worker     friend class GrGLProgramBuilder;
288*c8dee2aaSAndroid Build Coastguard Worker     friend class GrD3DPipelineStateBuilder;
289*c8dee2aaSAndroid Build Coastguard Worker     friend class GrDawnProgramBuilder;
290*c8dee2aaSAndroid Build Coastguard Worker     friend class GrGLSLVaryingHandler; // to access noperspective interpolation feature.
291*c8dee2aaSAndroid Build Coastguard Worker     friend class GrGLPathProgramBuilder; // to access fInputs.
292*c8dee2aaSAndroid Build Coastguard Worker     friend class GrVkPipelineStateBuilder;
293*c8dee2aaSAndroid Build Coastguard Worker     friend class GrMtlPipelineStateBuilder;
294*c8dee2aaSAndroid Build Coastguard Worker };
295*c8dee2aaSAndroid Build Coastguard Worker #endif
296