Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 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 GrGLProgramBuilder_DEFINED | 8 #ifndef GrGLProgramBuilder_DEFINED |
| 9 #define GrGLProgramBuilder_DEFINED | 9 #define GrGLProgramBuilder_DEFINED |
| 10 | 10 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 61 const char** outName = nullptr) { | 61 const char** outName = nullptr) { |
| 62 return this->addUniformArray(visibility, type, precision, name, 0, outNa me); | 62 return this->addUniformArray(visibility, type, precision, name, 0, outNa me); |
| 63 } | 63 } |
| 64 | 64 |
| 65 virtual UniformHandle addUniformArray( | 65 virtual UniformHandle addUniformArray( |
| 66 uint32_t visibility, | 66 uint32_t visibility, |
| 67 GrSLType type, | 67 GrSLType type, |
| 68 GrSLPrecision precision, | 68 GrSLPrecision precision, |
| 69 const char* name, | 69 const char* name, |
| 70 int arrayCount, | 70 int arrayCount, |
| 71 const char** outName = nullptr) = 0; | 71 const char** outName = nullptr) { |
| 72 return this->internalAddUniformArray(visibility, type, precision, name, true, arrayCount, | |
| 73 outName); | |
| 74 } | |
| 75 | |
| 76 UniformHandle addFragPosUniform(uint32_t visibility, | |
|
joshualitt
2015/11/04 21:50:52
However you want to handle this, it should be priv
egdaniel
2015/11/05 21:49:59
Done.
| |
| 77 GrSLType type, | |
| 78 GrSLPrecision precision, | |
| 79 const char* name, | |
| 80 const char** outName) { | |
| 81 return this->internalAddUniformArray(visibility, type, precision, name, false, 0, outName); | |
| 82 } | |
| 83 | |
| 72 | 84 |
| 73 virtual const GrGLSLShaderVar& getUniformVariable(UniformHandle u) const = 0 ; | 85 virtual const GrGLSLShaderVar& getUniformVariable(UniformHandle u) const = 0 ; |
| 74 | 86 |
| 75 /** | 87 /** |
| 76 * Shortcut for getUniformVariable(u).c_str() | 88 * Shortcut for getUniformVariable(u).c_str() |
| 77 */ | 89 */ |
| 78 virtual const char* getUniformCStr(UniformHandle u) const = 0; | 90 virtual const char* getUniformCStr(UniformHandle u) const = 0; |
| 79 | 91 |
| 80 virtual const GrGLContextInfo& ctxInfo() const = 0; | 92 virtual const GrGLContextInfo& ctxInfo() const = 0; |
| 81 | 93 |
| 82 virtual const GrGLSLCaps* glslCaps() const = 0; | 94 virtual const GrGLSLCaps* glslCaps() const = 0; |
| 83 | 95 |
| 84 virtual GrGLGpu* gpu() const = 0; | 96 virtual GrGLGpu* gpu() const = 0; |
| 85 | 97 |
| 86 /* | 98 /* |
| 87 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE | 99 * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE |
| 88 */ | 100 */ |
| 101 private: | |
| 102 virtual UniformHandle internalAddUniformArray( | |
| 103 uint32_t visibility, | |
| 104 GrSLType type, | |
| 105 GrSLPrecision precision, | |
| 106 const char* name, | |
| 107 bool mangleName, | |
| 108 int arrayCount, | |
| 109 const char** outName) = 0; | |
| 89 }; | 110 }; |
| 90 | 111 |
| 91 // TODO move this into GrGLGPBuilder and move them both out of this file | 112 // TODO move this into GrGLGPBuilder and move them both out of this file |
| 92 class GrGLVarying { | 113 class GrGLVarying { |
| 93 public: | 114 public: |
| 94 bool vsVarying() const { return kVertToFrag_Varying == fVarying || | 115 bool vsVarying() const { return kVertToFrag_Varying == fVarying || |
| 95 kVertToGeo_Varying == fVarying; } | 116 kVertToGeo_Varying == fVarying; } |
| 96 bool fsVarying() const { return kVertToFrag_Varying == fVarying || | 117 bool fsVarying() const { return kVertToFrag_Varying == fVarying || |
| 97 kGeoToFrag_Varying == fVarying; } | 118 kGeoToFrag_Varying == fVarying; } |
| 98 const char* vsOut() const { return fVsOut; } | 119 const char* vsOut() const { return fVsOut; } |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 231 public: | 252 public: |
| 232 typedef GrGpu::DrawArgs DrawArgs; | 253 typedef GrGpu::DrawArgs DrawArgs; |
| 233 /** Generates a shader program. | 254 /** Generates a shader program. |
| 234 * | 255 * |
| 235 * The program implements what is specified in the stages given as input. | 256 * The program implements what is specified in the stages given as input. |
| 236 * After successful generation, the builder result objects are available | 257 * After successful generation, the builder result objects are available |
| 237 * to be used. | 258 * to be used. |
| 238 * @return true if generation was successful. | 259 * @return true if generation was successful. |
| 239 */ | 260 */ |
| 240 static GrGLProgram* CreateProgram(const DrawArgs&, GrGLGpu*); | 261 static GrGLProgram* CreateProgram(const DrawArgs&, GrGLGpu*); |
| 241 | 262 |
|
joshualitt
2015/11/04 21:50:52
This should be private
egdaniel
2015/11/05 21:49:59
Done.
| |
| 242 UniformHandle addUniformArray(uint32_t visibility, | 263 UniformHandle internalAddUniformArray(uint32_t visibility, |
| 243 GrSLType type, | 264 GrSLType type, |
| 244 GrSLPrecision precision, | 265 GrSLPrecision precision, |
| 245 const char* name, | 266 const char* name, |
| 246 int arrayCount, | 267 bool mangleName, |
| 247 const char** outName) override; | 268 int arrayCount, |
| 269 const char** outName) override; | |
| 248 | 270 |
| 249 const GrGLSLShaderVar& getUniformVariable(UniformHandle u) const override { | 271 const GrGLSLShaderVar& getUniformVariable(UniformHandle u) const override { |
| 250 return fUniforms[u.toIndex()].fVariable; | 272 return fUniforms[u.toIndex()].fVariable; |
| 251 } | 273 } |
| 252 | 274 |
| 253 const char* getUniformCStr(UniformHandle u) const override { | 275 const char* getUniformCStr(UniformHandle u) const override { |
| 254 return this->getUniformVariable(u).c_str(); | 276 return this->getUniformVariable(u).c_str(); |
| 255 } | 277 } |
| 256 | 278 |
| 257 const GrGLContextInfo& ctxInfo() const override; | 279 const GrGLContextInfo& ctxInfo() const override; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 293 | 315 |
| 294 GrGLProgramBuilder(GrGLGpu*, const DrawArgs&); | 316 GrGLProgramBuilder(GrGLGpu*, const DrawArgs&); |
| 295 | 317 |
| 296 const GrPrimitiveProcessor& primitiveProcessor() const { return *fArgs.fPrim itiveProcessor; } | 318 const GrPrimitiveProcessor& primitiveProcessor() const { return *fArgs.fPrim itiveProcessor; } |
| 297 const GrPipeline& pipeline() const { return *fArgs.fPipeline; } | 319 const GrPipeline& pipeline() const { return *fArgs.fPipeline; } |
| 298 const GrProgramDesc& desc() const { return *fArgs.fDesc; } | 320 const GrProgramDesc& desc() const { return *fArgs.fDesc; } |
| 299 const GrProgramDesc::KeyHeader& header() const { return fArgs.fDesc->header( ); } | 321 const GrProgramDesc::KeyHeader& header() const { return fArgs.fDesc->header( ); } |
| 300 | 322 |
| 301 // Generates a name for a variable. The generated string will be name prefix ed by the prefix | 323 // Generates a name for a variable. The generated string will be name prefix ed by the prefix |
| 302 // char (unless the prefix is '\0'). It also mangles the name to be stage-sp ecific if we're | 324 // char (unless the prefix is '\0'). It also mangles the name to be stage-sp ecific if we're |
| 303 // generating stage code. | 325 // generating stage code and mangle is true. |
| 304 void nameVariable(SkString* out, char prefix, const char* name); | 326 void nameVariable(SkString* out, char prefix, const char* name, bool mangle = true); |
| 305 // Generates a possibly mangled name for a stage variable and writes it to t he fragment shader. | 327 // Generates a possibly mangled name for a stage variable and writes it to t he fragment shader. |
| 306 // If GrGLSLExpr4 has a valid name then it will use that instead | 328 // If GrGLSLExpr4 has a valid name then it will use that instead |
| 307 void nameExpression(GrGLSLExpr4*, const char* baseName); | 329 void nameExpression(GrGLSLExpr4*, const char* baseName); |
| 308 bool emitAndInstallProcs(GrGLSLExpr4* inputColor, GrGLSLExpr4* inputCoverage ); | 330 bool emitAndInstallProcs(GrGLSLExpr4* inputColor, GrGLSLExpr4* inputCoverage ); |
| 309 void emitAndInstallFragProcs(int procOffset, int numProcs, GrGLSLExpr4* inOu t); | 331 void emitAndInstallFragProcs(int procOffset, int numProcs, GrGLSLExpr4* inOu t); |
| 310 void emitAndInstallProc(const GrFragmentProcessor&, | 332 void emitAndInstallProc(const GrFragmentProcessor&, |
| 311 int index, | 333 int index, |
| 312 const GrGLSLExpr4& input, | 334 const GrGLSLExpr4& input, |
| 313 GrGLSLExpr4* output); | 335 GrGLSLExpr4* output); |
| 314 | 336 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 355 // reset is called by program creator between each processor's emit code. I t increments the | 377 // reset is called by program creator between each processor's emit code. I t increments the |
| 356 // stage offset for variable name mangling, and also ensures verfication var iables in the | 378 // stage offset for variable name mangling, and also ensures verfication var iables in the |
| 357 // fragment shader are cleared. | 379 // fragment shader are cleared. |
| 358 void reset() { | 380 void reset() { |
| 359 this->enterStage(); | 381 this->enterStage(); |
| 360 this->addStage(); | 382 this->addStage(); |
| 361 fFS.reset(); | 383 fFS.reset(); |
| 362 } | 384 } |
| 363 void addStage() { fStageIndex++; } | 385 void addStage() { fStageIndex++; } |
| 364 | 386 |
| 365 // This simple class exits the stage and then restores the stage when it goe s out of scope | |
| 366 class AutoStageRestore { | |
| 367 public: | |
| 368 AutoStageRestore(GrGLProgramBuilder* pb) | |
| 369 : fPB(pb), fOutOfStage(pb->fOutOfStage) { pb->exitStage(); } | |
| 370 ~AutoStageRestore() { fPB->fOutOfStage = fOutOfStage; } | |
| 371 private: | |
| 372 GrGLProgramBuilder* fPB; | |
| 373 bool fOutOfStage; | |
| 374 }; | |
| 375 class AutoStageAdvance { | 387 class AutoStageAdvance { |
| 376 public: | 388 public: |
| 377 AutoStageAdvance(GrGLProgramBuilder* pb) | 389 AutoStageAdvance(GrGLProgramBuilder* pb) |
| 378 : fPB(pb) { | 390 : fPB(pb) { |
| 379 fPB->reset(); | 391 fPB->reset(); |
| 380 // Each output to the fragment processor gets its own code section | 392 // Each output to the fragment processor gets its own code section |
| 381 fPB->fFS.nextStage(); | 393 fPB->fFS.nextStage(); |
| 382 } | 394 } |
| 383 ~AutoStageAdvance() { fPB->exitStage(); } | 395 ~AutoStageAdvance() { fPB->exitStage(); } |
| 384 private: | 396 private: |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 411 GrGLPrimitiveProcessor::TransformsOut fOutCoords; | 423 GrGLPrimitiveProcessor::TransformsOut fOutCoords; |
| 412 SkTArray<UniformHandle> fSamplerUniforms; | 424 SkTArray<UniformHandle> fSamplerUniforms; |
| 413 SeparableVaryingInfoArray fSeparableVaryingInfos; | 425 SeparableVaryingInfoArray fSeparableVaryingInfos; |
| 414 | 426 |
| 415 friend class GrGLShaderBuilder; | 427 friend class GrGLShaderBuilder; |
| 416 friend class GrGLVertexBuilder; | 428 friend class GrGLVertexBuilder; |
| 417 friend class GrGLFragmentShaderBuilder; | 429 friend class GrGLFragmentShaderBuilder; |
| 418 friend class GrGLGeometryBuilder; | 430 friend class GrGLGeometryBuilder; |
| 419 }; | 431 }; |
| 420 #endif | 432 #endif |
| OLD | NEW |