Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(152)

Side by Side Diff: src/gpu/gl/GrGLShaderBuilder.h

Issue 23826002: Rename ShaderType enum to ShaderVisibility (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/gpu/gl/GrGLProgram.cpp ('k') | src/gpu/gl/GrGLShaderBuilder.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2012 Google Inc. 2 * Copyright 2012 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef GrGLShaderBuilder_DEFINED 8 #ifndef GrGLShaderBuilder_DEFINED
9 #define GrGLShaderBuilder_DEFINED 9 #define GrGLShaderBuilder_DEFINED
10 10
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 uint32_t configComponentMask, 64 uint32_t configComponentMask,
65 const char* swizzle, 65 const char* swizzle,
66 int idx) { 66 int idx) {
67 SkASSERT(!this->isInitialized()); 67 SkASSERT(!this->isInitialized());
68 SkASSERT(0 != configComponentMask); 68 SkASSERT(0 != configComponentMask);
69 SkASSERT(!fSamplerUniform.isValid()); 69 SkASSERT(!fSamplerUniform.isValid());
70 70
71 SkASSERT(NULL != builder); 71 SkASSERT(NULL != builder);
72 SkString name; 72 SkString name;
73 name.printf("Sampler%d", idx); 73 name.printf("Sampler%d", idx);
74 fSamplerUniform = builder->addUniform(GrGLShaderBuilder::kFragment_S haderType, 74 fSamplerUniform = builder->addUniform(GrGLShaderBuilder::kFragment_V isibility,
75 kSampler2D_GrSLType, 75 kSampler2D_GrSLType,
76 name.c_str()); 76 name.c_str());
77 SkASSERT(fSamplerUniform.isValid()); 77 SkASSERT(fSamplerUniform.isValid());
78 78
79 fConfigComponentMask = configComponentMask; 79 fConfigComponentMask = configComponentMask;
80 memcpy(fSwizzle, swizzle, 4); 80 memcpy(fSwizzle, swizzle, 4);
81 } 81 }
82 82
83 void init(GrGLShaderBuilder* builder, const GrTextureAccess* access, int idx) { 83 void init(GrGLShaderBuilder* builder, const GrTextureAccess* access, int idx) {
84 SkASSERT(NULL != access); 84 SkASSERT(NULL != access);
85 this->init(builder, 85 this->init(builder,
86 GrPixelConfigComponentMask(access->getTexture()->config() ), 86 GrPixelConfigComponentMask(access->getTexture()->config() ),
87 access->getSwizzle(), 87 access->getSwizzle(),
88 idx); 88 idx);
89 } 89 }
90 90
91 uint32_t fConfigComponentMask; 91 uint32_t fConfigComponentMask;
92 char fSwizzle[5]; 92 char fSwizzle[5];
93 GrGLUniformManager::UniformHandle fSamplerUniform; 93 GrGLUniformManager::UniformHandle fSamplerUniform;
94 94
95 friend class GrGLShaderBuilder; // to call init(). 95 friend class GrGLShaderBuilder; // to call init().
96 }; 96 };
97 97
98 typedef SkTArray<TextureSampler> TextureSamplerArray; 98 typedef SkTArray<TextureSampler> TextureSamplerArray;
99 99
100 enum ShaderType { 100 enum ShaderVisibility {
101 kVertex_ShaderType = 0x1, 101 kVertex_Visibility = 0x1,
102 kGeometry_ShaderType = 0x2, 102 kGeometry_Visibility = 0x2,
103 kFragment_ShaderType = 0x4, 103 kFragment_Visibility = 0x4,
104 }; 104 };
105 105
106 GrGLShaderBuilder(const GrGLContextInfo&, GrGLUniformManager&, const GrGLPro gramDesc&); 106 GrGLShaderBuilder(const GrGLContextInfo&, GrGLUniformManager&, const GrGLPro gramDesc&);
107 107
108 /** 108 /**
109 * Use of these features may require a GLSL extension to be enabled. Shaders may not compile 109 * Use of these features may require a GLSL extension to be enabled. Shaders may not compile
110 * if code is added that uses one of these features without calling enableFe ature() 110 * if code is added that uses one of these features without calling enableFe ature()
111 */ 111 */
112 enum GLSLFeature { 112 enum GLSLFeature {
113 kStandardDerivatives_GLSLFeature = 0, 113 kStandardDerivatives_GLSLFeature = 0,
114 114
115 kLastGLSLFeature = kStandardDerivatives_GLSLFeature 115 kLastGLSLFeature = kStandardDerivatives_GLSLFeature
116 }; 116 };
117 117
118 /** 118 /**
119 * If the feature is supported then true is returned and any necessary #exte nsion declarations 119 * If the feature is supported then true is returned and any necessary #exte nsion declarations
120 * are added to the shaders. If the feature is not supported then false will be returned. 120 * are added to the shaders. If the feature is not supported then false will be returned.
121 */ 121 */
122 bool enableFeature(GLSLFeature); 122 bool enableFeature(GLSLFeature);
123 123
124 /** 124 /**
125 * Called by GrGLEffects to add code to one of the shaders. 125 * Called by GrGLEffects to add code to one of the shaders.
126 */ 126 */
127 void vsCodeAppendf(const char format[], ...) SK_PRINTF_LIKE(2, 3) { 127 void vsCodeAppendf(const char format[], ...) SK_PRINTF_LIKE(2, 3) {
128 va_list args; 128 va_list args;
129 va_start(args, format); 129 va_start(args, format);
130 this->codeAppendf(kVertex_ShaderType, format, args); 130 fVSCode.appendf(format, args);
131 va_end(args); 131 va_end(args);
132 } 132 }
133 133
134 void gsCodeAppendf(const char format[], ...) SK_PRINTF_LIKE(2, 3) { 134 void gsCodeAppendf(const char format[], ...) SK_PRINTF_LIKE(2, 3) {
135 va_list args; 135 va_list args;
136 va_start(args, format); 136 va_start(args, format);
137 this->codeAppendf(kGeometry_ShaderType, format, args); 137 fGSCode.appendf(format, args);
138 va_end(args); 138 va_end(args);
139 } 139 }
140 140
141 void fsCodeAppendf(const char format[], ...) SK_PRINTF_LIKE(2, 3) { 141 void fsCodeAppendf(const char format[], ...) SK_PRINTF_LIKE(2, 3) {
142 va_list args; 142 va_list args;
143 va_start(args, format); 143 va_start(args, format);
144 this->codeAppendf(kFragment_ShaderType, format, args); 144 fFSCode.appendf(format, args);
145 va_end(args); 145 va_end(args);
146 } 146 }
147 147
148 void vsCodeAppend(const char* str) { this->codeAppend(kVertex_ShaderType, st r); } 148 void vsCodeAppend(const char* str) { fVSCode.append(str); }
149 void gsCodeAppend(const char* str) { this->codeAppend(kGeometry_ShaderType, str); } 149 void gsCodeAppend(const char* str) { fGSCode.append(str); }
150 void fsCodeAppend(const char* str) { this->codeAppend(kFragment_ShaderType, str); } 150 void fsCodeAppend(const char* str) { fFSCode.append(str); }
151 151
152 /** Appends a 2D texture sample with projection if necessary. coordType must either be Vec2f or 152 /** Appends a 2D texture sample with projection if necessary. coordType must either be Vec2f or
153 Vec3f. The latter is interpreted as projective texture coords. The vec l ength and swizzle 153 Vec3f. The latter is interpreted as projective texture coords. The vec l ength and swizzle
154 order of the result depends on the GrTextureAccess associated with the T extureSampler. */ 154 order of the result depends on the GrTextureAccess associated with the T extureSampler. */
155 void appendTextureLookup(SkString* out, 155 void appendTextureLookup(SkString* out,
156 const TextureSampler&, 156 const TextureSampler&,
157 const char* coordName, 157 const char* coordName,
158 GrSLType coordType = kVec2f_GrSLType) const; 158 GrSLType coordType = kVec2f_GrSLType) const;
159 159
160 /** Version of above that appends the result to the shader code rather than an SkString. 160 /** Version of above that appends the result to the fragment shader code ins tead.*/
161 Currently the shader type must be kFragment */ 161 void fsAppendTextureLookup(const TextureSampler&,
162 void appendTextureLookup(ShaderType, 162 const char* coordName,
163 const TextureSampler&, 163 GrSLType coordType = kVec2f_GrSLType);
164 const char* coordName,
165 GrSLType coordType = kVec2f_GrSLType);
166 164
167 165
168 /** Does the work of appendTextureLookup and modulates the result by modulat ion. The result is 166 /** Does the work of appendTextureLookup and modulates the result by modulat ion. The result is
169 always a vec4. modulation and the swizzle specified by TextureSampler mu st both be vec4 or 167 always a vec4. modulation and the swizzle specified by TextureSampler mu st both be vec4 or
170 float. If modulation is "" or NULL it this function acts as though appen dTextureLookup were 168 float. If modulation is "" or NULL it this function acts as though appen dTextureLookup were
171 called. */ 169 called. */
172 void appendTextureLookupAndModulate(ShaderType, 170 void fsAppendTextureLookupAndModulate(const char* modulation,
173 const char* modulation, 171 const TextureSampler&,
174 const TextureSampler&, 172 const char* coordName,
175 const char* coordName, 173 GrSLType coordType = kVec2f_GrSLType);
176 GrSLType coordType = kVec2f_GrSLType);
177 174
178 /** Emits a helper function outside of main(). Currently ShaderType must be 175 /** Emits a helper function outside of main() in the fragment shader. */
179 kFragment_ShaderType. */ 176 void fsEmitFunction(GrSLType returnType,
180 void emitFunction(ShaderType shader, 177 const char* name,
181 GrSLType returnType, 178 int argCnt,
182 const char* name, 179 const GrGLShaderVar* args,
183 int argCnt, 180 const char* body,
184 const GrGLShaderVar* args, 181 SkString* outName);
185 const char* body,
186 SkString* outName);
187 182
188 /** Generates a EffectKey for the shader code based on the texture access pa rameters and the 183 /** Generates a EffectKey for the shader code based on the texture access pa rameters and the
189 capabilities of the GL context. This is useful for keying the shader pr ograms that may 184 capabilities of the GL context. This is useful for keying the shader pr ograms that may
190 have multiple representations, based on the type/format of textures used . */ 185 have multiple representations, based on the type/format of textures used . */
191 static GrBackendEffectFactory::EffectKey KeyForTextureAccess(const GrTexture Access&, 186 static GrBackendEffectFactory::EffectKey KeyForTextureAccess(const GrTexture Access&,
192 const GrGLCaps& ); 187 const GrGLCaps& );
193 188
194 typedef uint8_t DstReadKey; 189 typedef uint8_t DstReadKey;
195 typedef uint8_t FragPosKey; 190 typedef uint8_t FragPosKey;
196 191
197 /** Returns a key for adding code to read the copy-of-dst color in service of effects that 192 /** Returns a key for adding code to read the copy-of-dst color in service of effects that
198 require reading the dst. It must not return 0 because 0 indicates that there is no dst 193 require reading the dst. It must not return 0 because 0 indicates that there is no dst
199 copy read at all (in which case this function should not be called). */ 194 copy read at all (in which case this function should not be called). */
200 static DstReadKey KeyForDstRead(const GrTexture* dstCopy, const GrGLCaps&); 195 static DstReadKey KeyForDstRead(const GrTexture* dstCopy, const GrGLCaps&);
201 196
202 /** Returns a key for reading the fragment location. This should only be cal led if there is an 197 /** Returns a key for reading the fragment location. This should only be cal led if there is an
203 effect that will requires the fragment position. If the fragment positio n is not required, 198 effect that will requires the fragment position. If the fragment positio n is not required,
204 the key is 0. */ 199 the key is 0. */
205 static FragPosKey KeyForFragmentPosition(const GrRenderTarget* dst, const Gr GLCaps&); 200 static FragPosKey KeyForFragmentPosition(const GrRenderTarget* dst, const Gr GLCaps&);
206 201
207 /** If texture swizzling is available using tex parameters then it is prefer red over mangling 202 /** If texture swizzling is available using tex parameters then it is prefer red over mangling
208 the generated shader code. This potentially allows greater reuse of cach ed shaders. */ 203 the generated shader code. This potentially allows greater reuse of cach ed shaders. */
209 static const GrGLenum* GetTexParamSwizzle(GrPixelConfig config, const GrGLCa ps& caps); 204 static const GrGLenum* GetTexParamSwizzle(GrPixelConfig config, const GrGLCa ps& caps);
210 205
211 /** Add a uniform variable to the current program, that has visibility in on e or more shaders. 206 /** Add a uniform variable to the current program, that has visibility in on e or more shaders.
212 visibility is a bitfield of ShaderType values indicating from which shad ers the uniform 207 visibility is a bitfield of ShaderVisibility values indicating from whic h shaders the
213 should be accessible. At least one bit must be set. Geometry shader unif orms are not 208 uniform should be accessible. At least one bit must be set. Geometry sha der uniforms are not
214 supported at this time. The actual uniform name will be mangled. If outN ame is not NULL then 209 supported at this time. The actual uniform name will be mangled. If outN ame is not NULL then
215 it will refer to the final uniform name after return. Use the addUniform Array variant to add 210 it will refer to the final uniform name after return. Use the addUniform Array variant to add
216 an array of uniforms. 211 an array of uniforms.
217 */ 212 */
218 GrGLUniformManager::UniformHandle addUniform(uint32_t visibility, 213 GrGLUniformManager::UniformHandle addUniform(uint32_t visibility,
219 GrSLType type, 214 GrSLType type,
220 const char* name, 215 const char* name,
221 const char** outName = NULL) { 216 const char** outName = NULL) {
222 return this->addUniformArray(visibility, type, name, GrGLShaderVar::kNon Array, outName); 217 return this->addUniformArray(visibility, type, name, GrGLShaderVar::kNon Array, outName);
223 } 218 }
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 */ 268 */
274 bool hasExplicitLocalCoords() const { return (fLocalCoordsVar != fPositionVa r); } 269 bool hasExplicitLocalCoords() const { return (fLocalCoordsVar != fPositionVa r); }
275 270
276 /** 271 /**
277 * Interfaces used by GrGLProgram. 272 * Interfaces used by GrGLProgram.
278 * TODO: Hide these from the GrEffects using friend or splitting this into t wo related classes. 273 * TODO: Hide these from the GrEffects using friend or splitting this into t wo related classes.
279 * Also, GrGLProgram's shader string construction should be moved to this cl ass. 274 * Also, GrGLProgram's shader string construction should be moved to this cl ass.
280 */ 275 */
281 276
282 /** Called after building is complete to get the final shader string. */ 277 /** Called after building is complete to get the final shader string. */
283 void getShader(ShaderType, SkString*) const; 278 void vsGetShader(SkString*) const;
279 void gsGetShader(SkString*) const;
280 void fsGetShader(SkString*) const;
284 281
285 /** 282 /**
286 * Adds code for effects. effectStages contains the effects to add. effectKe ys[i] is the key 283 * Adds code for effects. effectStages contains the effects to add. effectKe ys[i] is the key
287 * generated from effectStages[i]. An entry in effectStages can be NULL, in which case it is 284 * generated from effectStages[i]. An entry in effectStages can be NULL, in which case it is
288 * skipped. Moreover, if the corresponding key is GrGLEffect::NoEffectKey th en it is skipped. 285 * skipped. Moreover, if the corresponding key is GrGLEffect::NoEffectKey th en it is skipped.
289 * inOutFSColor specifies the input color to the first stage and is updated to be the 286 * inOutFSColor specifies the input color to the first stage and is updated to be the
290 * output color of the last stage. fsInOutColorKnownValue specifies whether the input color 287 * output color of the last stage. fsInOutColorKnownValue specifies whether the input color
291 * has a known constant value and is updated to refer to the status of the o utput color. 288 * has a known constant value and is updated to refer to the status of the o utput color.
292 * The handles to texture samplers for effectStage[i] are added to effectSam plerHandles[i]. The 289 * The handles to texture samplers for effectStage[i] are added to effectSam plerHandles[i]. The
293 * glEffects array is updated to contain the GrGLEffect generated for each e ntry in 290 * glEffects array is updated to contain the GrGLEffect generated for each e ntry in
(...skipping 29 matching lines...) Expand all
323 return fEffectAttributes; 320 return fEffectAttributes;
324 } 321 }
325 const SkString* getEffectAttributeName(int attributeIndex) const; 322 const SkString* getEffectAttributeName(int attributeIndex) const;
326 323
327 // TODO: Make this do all the compiling, linking, etc. 324 // TODO: Make this do all the compiling, linking, etc.
328 void finished(GrGLuint programID); 325 void finished(GrGLuint programID);
329 326
330 const GrGLContextInfo& ctxInfo() const { return fCtxInfo; } 327 const GrGLContextInfo& ctxInfo() const { return fCtxInfo; }
331 328
332 private: 329 private:
333 void codeAppendf(ShaderType type, const char format[], va_list args);
334 void codeAppend(ShaderType type, const char* str);
335
336 typedef GrTAllocator<GrGLShaderVar> VarArray; 330 typedef GrTAllocator<GrGLShaderVar> VarArray;
337 331
338 void appendDecls(const VarArray&, SkString*) const; 332 void appendDecls(const VarArray&, SkString*) const;
339 void appendUniformDecls(ShaderType, SkString*) const; 333 void appendUniformDecls(ShaderVisibility, SkString*) const;
340 334
341 typedef GrGLUniformManager::BuilderUniform BuilderUniform; 335 typedef GrGLUniformManager::BuilderUniform BuilderUniform;
342 GrGLUniformManager::BuilderUniformArray fUniforms; 336 GrGLUniformManager::BuilderUniformArray fUniforms;
343 337
344 // TODO: Everything below here private. 338 // TODO: Everything below here private.
345 public: 339 public:
346 340
347 VarArray fVSAttrs; 341 VarArray fVSAttrs;
348 VarArray fVSOutputs; 342 VarArray fVSOutputs;
349 VarArray fGSInputs; 343 VarArray fGSInputs;
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 /** 401 /**
408 * Features that should only be enabled by GrGLShaderBuilder itself. 402 * Features that should only be enabled by GrGLShaderBuilder itself.
409 */ 403 */
410 enum GLSLPrivateFeature { 404 enum GLSLPrivateFeature {
411 kFragCoordConventions_GLSLPrivateFeature = kLastGLSLFeature + 1, 405 kFragCoordConventions_GLSLPrivateFeature = kLastGLSLFeature + 1,
412 kEXTShaderFramebufferFetch_GLSLPrivateFeature, 406 kEXTShaderFramebufferFetch_GLSLPrivateFeature,
413 kNVShaderFramebufferFetch_GLSLPrivateFeature, 407 kNVShaderFramebufferFetch_GLSLPrivateFeature,
414 }; 408 };
415 bool enablePrivateFeature(GLSLPrivateFeature); 409 bool enablePrivateFeature(GLSLPrivateFeature);
416 410
417 // If we ever have VS/GS features we can expand this to take a bitmask of Sh aderType and track 411 // If we ever have VS/GS features we can expand this to take a bitmask of Sh aderVisibility and
418 // the enables separately for each shader. 412 // track the enables separately for each shader.
419 void addFSFeature(uint32_t featureBit, const char* extensionName); 413 void addFSFeature(uint32_t featureBit, const char* extensionName);
420 414
421 // Generates a name for a variable. The generated string will be name prefix ed by the prefix 415 // Generates a name for a variable. The generated string will be name prefix ed by the prefix
422 // char (unless the prefix is '\0'). It also mangles the name to be stage-sp ecific if we're 416 // char (unless the prefix is '\0'). It also mangles the name to be stage-sp ecific if we're
423 // generating stage code. 417 // generating stage code.
424 void nameVariable(SkString* out, char prefix, const char* name); 418 void nameVariable(SkString* out, char prefix, const char* name);
425 419
426 // Interpretation of DstReadKey when generating code 420 // Interpretation of DstReadKey when generating code
427 enum { 421 enum {
428 kNoDstRead_DstReadKey = 0, 422 kNoDstRead_DstReadKey = 0,
(...skipping 30 matching lines...) Expand all
459 bool fTopLeftFragPosRead; 453 bool fTopLeftFragPosRead;
460 454
461 SkSTArray<10, AttributePair, true> fEffectAttributes; 455 SkSTArray<10, AttributePair, true> fEffectAttributes;
462 456
463 GrGLShaderVar* fPositionVar; 457 GrGLShaderVar* fPositionVar;
464 GrGLShaderVar* fLocalCoordsVar; 458 GrGLShaderVar* fLocalCoordsVar;
465 459
466 }; 460 };
467 461
468 #endif 462 #endif
OLDNEW
« no previous file with comments | « src/gpu/gl/GrGLProgram.cpp ('k') | src/gpu/gl/GrGLShaderBuilder.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698