Index: src/gpu/gl/builders/GrGLProgramBuilder.h |
diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.h b/src/gpu/gl/builders/GrGLProgramBuilder.h |
index 00193efc452f4da7ef27ab6c226cbc19c26a6d1e..deb3708bd16e96e39824e0249309178f1ba35cca 100644 |
--- a/src/gpu/gl/builders/GrGLProgramBuilder.h |
+++ b/src/gpu/gl/builders/GrGLProgramBuilder.h |
@@ -84,11 +84,14 @@ public: |
* to be used. |
* @return true if generation was successful. |
*/ |
- bool genProgram(const GrEffectStage* inColorStages[], |
- const GrEffectStage* inCoverageStages[]); |
- // Below are the results of the shader generation. |
+ bool genProgram(const GrEffectStage* inGeometryProcessor, |
+ const GrEffectStage* inColorStages[], |
+ const GrEffectStage* inCoverageStages[]); |
+ GrGLProgramEffects* getGeometryProcessor() const { |
+ SkASSERT(fProgramID); return fGeometryProcessor.get(); |
+ } |
GrGLProgramEffects* getColorEffects() const { SkASSERT(fProgramID); return fColorEffects.get(); } |
GrGLProgramEffects* getCoverageEffects() const { SkASSERT(fProgramID); return fCoverageEffects.get(); } |
const BuiltinUniformHandles& getBuiltinUniformHandles() const { |
@@ -165,6 +168,7 @@ protected: |
void appendDecls(const VarArray&, SkString*) const; |
void appendUniformDecls(ShaderVisibility, SkString*) const; |
+ SkAutoTUnref<GrGLProgramEffects> fGeometryProcessor; |
SkAutoTUnref<GrGLProgramEffects> fColorEffects; |
SkAutoTUnref<GrGLProgramEffects> fCoverageEffects; |
BuiltinUniformHandles fUniformHandles; |
@@ -173,7 +177,7 @@ protected: |
GrGLuint fProgramID; |
GrGLFragmentShaderBuilder fFS; |
SeparableVaryingInfoArray fSeparableVaryingInfos; |
-private: |
+ |
class CodeStage : SkNoncopyable { |
public: |
CodeStage() : fNextIndex(0), fCurrentIndex(-1), fEffectStage(NULL) {} |
@@ -224,6 +228,7 @@ private: |
int fCurrentIndex; |
const GrEffectStage* fEffectStage; |
} fCodeStage; |
+private: |
/** |
* The base class will emit the fragment code that precedes the per-effect code and then call |
@@ -232,7 +237,14 @@ private: |
* |
* The subclass can modify the initial color or coverage |
*/ |
- virtual void emitCodeBeforeEffects(GrGLSLExpr4* color, GrGLSLExpr4* coverage) = 0; |
+ virtual void emitCodeBeforeEffects(GrGLSLExpr4* color, |
+ GrGLSLExpr4* coverage) = 0; |
+ |
+ /* |
+ * Full shader builder needs to emit code after the color stages and before the coverage stages |
+ */ |
+ virtual void emitGeometryProcessor(const GrEffectStage* geometryProcessor, |
+ GrGLSLExpr4* coverage) = 0; |
/** |
* Adds code for effects and returns a GrGLProgramEffects* object. The caller is responsible for |
@@ -297,13 +309,30 @@ public: |
GrGLVertexShaderBuilder* getVertexShaderBuilder() { return &fVS; } |
private: |
- virtual void emitCodeBeforeEffects(GrGLSLExpr4* color, GrGLSLExpr4* coverage) SK_OVERRIDE; |
+ virtual void emitCodeBeforeEffects(GrGLSLExpr4* color, |
+ GrGLSLExpr4* coverage) SK_OVERRIDE; |
+ |
+ virtual void emitGeometryProcessor(const GrEffectStage* geometryProcessor, |
+ GrGLSLExpr4* coverage) SK_OVERRIDE; |
virtual GrGLProgramEffects* createAndEmitEffects(const GrEffectStage* effectStages[], |
int effectCnt, |
const GrGLProgramDesc::EffectKeyProvider&, |
GrGLSLExpr4* inOutFSColor) SK_OVERRIDE; |
+ /* |
+ * These functions are temporary and will eventually operate not on effects but on |
+ * geometry processors |
+ */ |
+ void createAndEmitEffect(GrGLProgramEffectsBuilder*, |
+ const GrEffectStage* effectStage, |
+ const GrGLProgramDesc::EffectKeyProvider&, |
+ GrGLSLExpr4* inOutFSColor); |
+ |
+ GrGLProgramEffects* createAndEmitEffect(const GrEffectStage* geometryProcessor, |
+ const GrGLProgramDesc::EffectKeyProvider&, |
+ GrGLSLExpr4* inOutFSColor); |
+ |
virtual void emitCodeAfterEffects() SK_OVERRIDE; |
virtual bool compileAndAttachShaders(GrGLuint programId, |
@@ -326,7 +355,13 @@ public: |
int addTexCoordSets(int count); |
private: |
- virtual void emitCodeBeforeEffects(GrGLSLExpr4* color, GrGLSLExpr4* coverage) SK_OVERRIDE {} |
+ virtual void emitCodeBeforeEffects(GrGLSLExpr4* color, |
+ GrGLSLExpr4* coverage) SK_OVERRIDE {} |
+ |
+ virtual void emitGeometryProcessor(const GrEffectStage* geometryProcessor, |
+ GrGLSLExpr4* coverage) SK_OVERRIDE { |
+ SkASSERT(NULL == geometryProcessor); |
+ } |
virtual GrGLProgramEffects* createAndEmitEffects(const GrEffectStage* effectStages[], |
int effectCnt, |