Index: src/gpu/gl/builders/GrGLProgramBuilder.h |
diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.h b/src/gpu/gl/builders/GrGLProgramBuilder.h |
index e1525c42efca2cbfdf00f6baf62e25d46d4e0856..3ec66cb611227eb2995ffa94bf78a5d8f6aa9409 100644 |
--- a/src/gpu/gl/builders/GrGLProgramBuilder.h |
+++ b/src/gpu/gl/builders/GrGLProgramBuilder.h |
@@ -68,7 +68,11 @@ public: |
GrSLPrecision precision, |
const char* name, |
int arrayCount, |
- const char** outName = nullptr) = 0; |
+ const char** outName = nullptr) { |
+ return this->internalAddUniformArray(visibility, type, precision, name, true, arrayCount, |
+ outName); |
+ } |
+ |
virtual const GrGLSLShaderVar& getUniformVariable(UniformHandle u) const = 0; |
@@ -86,6 +90,15 @@ public: |
/* |
* *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE |
*/ |
+private: |
+ virtual UniformHandle internalAddUniformArray( |
+ uint32_t visibility, |
+ GrSLType type, |
+ GrSLPrecision precision, |
+ const char* name, |
+ bool mangleName, |
+ int arrayCount, |
+ const char** outName) = 0; |
}; |
// TODO move this into GrGLGPBuilder and move them both out of this file |
@@ -239,13 +252,6 @@ public: |
*/ |
static GrGLProgram* CreateProgram(const DrawArgs&, GrGLGpu*); |
- UniformHandle addUniformArray(uint32_t visibility, |
- GrSLType type, |
- GrSLPrecision precision, |
- const char* name, |
- int arrayCount, |
- const char** outName) override; |
- |
const GrGLSLShaderVar& getUniformVariable(UniformHandle u) const override { |
return fUniforms[u.toIndex()].fVariable; |
} |
@@ -298,10 +304,29 @@ protected: |
const GrProgramDesc& desc() const { return *fArgs.fDesc; } |
const GrProgramDesc::KeyHeader& header() const { return fArgs.fDesc->header(); } |
+ UniformHandle internalAddUniformArray(uint32_t visibility, |
+ GrSLType type, |
+ GrSLPrecision precision, |
+ const char* name, |
+ bool mangleName, |
+ int arrayCount, |
+ const char** outName) override; |
+ |
+ // Used to add a uniform for frag position without mangling the name of the uniform inside of a |
+ // stage. |
+ UniformHandle addFragPosUniform(uint32_t visibility, |
+ GrSLType type, |
+ GrSLPrecision precision, |
+ const char* name, |
+ const char** outName) { |
+ SkDebugf("in my frag pos thing\n"); |
+ return this->internalAddUniformArray(visibility, type, precision, name, false, 0, outName); |
+ } |
+ |
// Generates a name for a variable. The generated string will be name prefixed by the prefix |
- // char (unless the prefix is '\0'). It also mangles the name to be stage-specific if we're |
- // generating stage code. |
- void nameVariable(SkString* out, char prefix, const char* name); |
+ // char (unless the prefix is '\0'). It also will mangle the name to be stage-specific unless |
+ // explicitly asked not to. |
+ void nameVariable(SkString* out, char prefix, const char* name, bool mangle = true); |
// Generates a possibly mangled name for a stage variable and writes it to the fragment shader. |
// If GrGLSLExpr4 has a valid name then it will use that instead |
void nameExpression(GrGLSLExpr4*, const char* baseName); |
@@ -356,22 +381,11 @@ protected: |
// stage offset for variable name mangling, and also ensures verfication variables in the |
// fragment shader are cleared. |
void reset() { |
- this->enterStage(); |
this->addStage(); |
fFS.reset(); |
} |
void addStage() { fStageIndex++; } |
- // This simple class exits the stage and then restores the stage when it goes out of scope |
- class AutoStageRestore { |
- public: |
- AutoStageRestore(GrGLProgramBuilder* pb) |
- : fPB(pb), fOutOfStage(pb->fOutOfStage) { pb->exitStage(); } |
- ~AutoStageRestore() { fPB->fOutOfStage = fOutOfStage; } |
- private: |
- GrGLProgramBuilder* fPB; |
- bool fOutOfStage; |
- }; |
class AutoStageAdvance { |
public: |
AutoStageAdvance(GrGLProgramBuilder* pb) |
@@ -380,12 +394,10 @@ protected: |
// Each output to the fragment processor gets its own code section |
fPB->fFS.nextStage(); |
} |
- ~AutoStageAdvance() { fPB->exitStage(); } |
+ ~AutoStageAdvance() {} |
private: |
GrGLProgramBuilder* fPB; |
}; |
- void exitStage() { fOutOfStage = true; } |
- void enterStage() { fOutOfStage = false; } |
int stageIndex() const { return fStageIndex; } |
const char* rtAdjustment() const { return "rtAdjustment"; } |
@@ -397,7 +409,6 @@ protected: |
GrGLVertexBuilder fVS; |
GrGLGeometryBuilder fGS; |
GrGLFragmentShaderBuilder fFS; |
- bool fOutOfStage; |
int fStageIndex; |
GrGLInstalledGeoProc* fGeometryProcessor; |