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