• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2015 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 GrGLSLProgramBuilder_DEFINED
9 #define GrGLSLProgramBuilder_DEFINED
10 
11 #include "GrCaps.h"
12 #include "GrGeometryProcessor.h"
13 #include "GrProgramDesc.h"
14 #include "glsl/GrGLSLFragmentProcessor.h"
15 #include "glsl/GrGLSLFragmentShaderBuilder.h"
16 #include "glsl/GrGLSLGeometryShaderBuilder.h"
17 #include "glsl/GrGLSLPrimitiveProcessor.h"
18 #include "glsl/GrGLSLProgramDataManager.h"
19 #include "glsl/GrGLSLUniformHandler.h"
20 #include "glsl/GrGLSLVertexShaderBuilder.h"
21 #include "glsl/GrGLSLXferProcessor.h"
22 
23 class GrShaderVar;
24 class GrGLSLVaryingHandler;
25 class SkString;
26 class GrShaderCaps;
27 
28 typedef SkSTArray<8, GrGLSLFragmentProcessor*, true> GrGLSLFragProcs;
29 
30 class GrGLSLProgramBuilder {
31 public:
32     using UniformHandle      = GrGLSLUniformHandler::UniformHandle;
33     using SamplerHandle      = GrGLSLUniformHandler::SamplerHandle;
34     using TexelBufferHandle  = GrGLSLUniformHandler::TexelBufferHandle;
35     using ImageStorageHandle = GrGLSLUniformHandler::ImageStorageHandle;
36 
~GrGLSLProgramBuilder()37     virtual ~GrGLSLProgramBuilder() {}
38 
39     virtual const GrCaps* caps() const = 0;
shaderCaps()40     const GrShaderCaps* shaderCaps() const { return this->caps()->shaderCaps(); }
41 
primitiveProcessor()42     const GrPrimitiveProcessor& primitiveProcessor() const { return fPrimProc; }
pipeline()43     const GrPipeline& pipeline() const { return fPipeline; }
desc()44     GrProgramDesc* desc() { return fDesc; }
header()45     const GrProgramDesc::KeyHeader& header() const { return fDesc->header(); }
46 
47     void appendUniformDecls(GrShaderFlags visibility, SkString*) const;
48 
samplerVariable(SamplerHandle handle)49     const GrShaderVar& samplerVariable(SamplerHandle handle) const {
50         return this->uniformHandler()->samplerVariable(handle);
51     }
52 
samplerSwizzle(SamplerHandle handle)53     GrSwizzle samplerSwizzle(SamplerHandle handle) const {
54         return this->uniformHandler()->samplerSwizzle(handle);
55     }
56 
texelBufferVariable(TexelBufferHandle handle)57     const GrShaderVar& texelBufferVariable(TexelBufferHandle handle) const {
58         return this->uniformHandler()->texelBufferVariable(handle);
59     }
60 
imageStorageVariable(ImageStorageHandle handle)61     const GrShaderVar& imageStorageVariable(ImageStorageHandle handle) const {
62         return this->uniformHandler()->imageStorageVariable(handle);
63     }
64 
65     // Handles for program uniforms (other than per-effect uniforms)
66     struct BuiltinUniformHandles {
67         UniformHandle       fRTAdjustmentUni;
68 
69         // We use the render target height to provide a y-down frag coord when specifying
70         // origin_upper_left is not supported.
71         UniformHandle       fRTHeightUni;
72     };
73 
74     // Used to add a uniform for the RenderTarget height (used for frag position) without mangling
75     // the name of the uniform inside of a stage.
76     void addRTHeightUniform(const char* name);
77 
78     // Generates a name for a variable. The generated string will be name prefixed by the prefix
79     // char (unless the prefix is '\0'). It also will mangle the name to be stage-specific unless
80     // explicitly asked not to.
81     void nameVariable(SkString* out, char prefix, const char* name, bool mangle = true);
82 
83     virtual GrGLSLUniformHandler* uniformHandler() = 0;
84     virtual const GrGLSLUniformHandler* uniformHandler() const = 0;
85     virtual GrGLSLVaryingHandler* varyingHandler() = 0;
86 
87     // Used for backend customization of the output color and secondary color variables from the
88     // fragment processor. Only used if the outputs are explicitly declared in the shaders
finalizeFragmentOutputColor(GrShaderVar & outputColor)89     virtual void finalizeFragmentOutputColor(GrShaderVar& outputColor) {}
finalizeFragmentSecondaryColor(GrShaderVar & outputColor)90     virtual void finalizeFragmentSecondaryColor(GrShaderVar& outputColor) {}
91 
92     // number of each input/output type in a single allocation block, used by many builders
93     static const int kVarsPerBlock;
94 
95     GrGLSLVertexBuilder         fVS;
96     GrGLSLGeometryBuilder       fGS;
97     GrGLSLFragmentShaderBuilder fFS;
98 
99     int fStageIndex;
100 
101     const GrPipeline&           fPipeline;
102     const GrPrimitiveProcessor& fPrimProc;
103     GrProgramDesc*              fDesc;
104 
105     BuiltinUniformHandles fUniformHandles;
106 
107     GrGLSLPrimitiveProcessor* fGeometryProcessor;
108     GrGLSLXferProcessor* fXferProcessor;
109     GrGLSLFragProcs fFragmentProcessors;
110 
111 protected:
112     explicit GrGLSLProgramBuilder(const GrPipeline&,
113                                   const GrPrimitiveProcessor&,
114                                   GrProgramDesc*);
115 
116     void addFeature(GrShaderFlags shaders, uint32_t featureBit, const char* extensionName);
117 
118     bool emitAndInstallProcs();
119 
120     void cleanupFragmentProcessors();
121 
122     void finalizeShaders();
123 
124 private:
125     // reset is called by program creator between each processor's emit code.  It increments the
126     // stage offset for variable name mangling, and also ensures verfication variables in the
127     // fragment shader are cleared.
reset()128     void reset() {
129         this->addStage();
130         SkDEBUGCODE(fFS.resetVerification();)
131     }
addStage()132     void addStage() { fStageIndex++; }
133 
134     class AutoStageAdvance {
135     public:
AutoStageAdvance(GrGLSLProgramBuilder * pb)136         AutoStageAdvance(GrGLSLProgramBuilder* pb)
137             : fPB(pb) {
138             fPB->reset();
139             // Each output to the fragment processor gets its own code section
140             fPB->fFS.nextStage();
141         }
~AutoStageAdvance()142         ~AutoStageAdvance() {}
143     private:
144         GrGLSLProgramBuilder* fPB;
145     };
146 
147     // Generates a possibly mangled name for a stage variable and writes it to the fragment shader.
148     void nameExpression(SkString*, const char* baseName);
149 
150     void emitAndInstallPrimProc(const GrPrimitiveProcessor&,
151                                 SkString* outputColor,
152                                 SkString* outputCoverage);
153     void emitAndInstallFragProcs(SkString* colorInOut, SkString* coverageInOut);
154     SkString emitAndInstallFragProc(const GrFragmentProcessor&,
155                                     int index,
156                                     int transformedCoordVarsIdx,
157                                     const SkString& input,
158                                     SkString output);
159     void emitAndInstallXferProc(const SkString& colorIn, const SkString& coverageIn);
160     void emitSamplersAndImageStorages(const GrResourceIOProcessor& processor,
161                                       SkTArray<SamplerHandle>* outTexSamplerHandles,
162                                       SkTArray<TexelBufferHandle>* outTexelBufferHandles,
163                                       SkTArray<ImageStorageHandle>* outImageStorageHandles);
164     SamplerHandle emitSampler(GrSLType samplerType, GrPixelConfig, const char* name,
165                               GrShaderFlags visibility);
166     TexelBufferHandle emitTexelBuffer(GrPixelConfig, const char* name, GrShaderFlags visibility);
167     ImageStorageHandle emitImageStorage(const GrResourceIOProcessor::ImageStorageAccess&,
168                                         const char* name);
169     void emitFSOutputSwizzle(bool hasSecondaryOutput);
170     void updateSamplerCounts(GrShaderFlags visibility);
171     bool checkSamplerCounts();
172     bool checkImageStorageCounts();
173 
174 #ifdef SK_DEBUG
175     void verify(const GrPrimitiveProcessor&);
176     void verify(const GrXferProcessor&);
177     void verify(const GrFragmentProcessor&);
178 #endif
179 
180     // These are used to check that we don't excede the allowable number of resources in a shader.
181     // The sampler counts include both normal texure samplers as well as texel buffers.
182     int                         fNumVertexSamplers;
183     int                         fNumGeometrySamplers;
184     int                         fNumFragmentSamplers;
185     int                         fNumVertexImageStorages;
186     int                         fNumGeometryImageStorages;
187     int                         fNumFragmentImageStorages;
188     SkSTArray<4, GrShaderVar>   fTransformedCoordVars;
189 };
190 
191 #endif
192