Index: src/gpu/gl/builders/GrGLFragmentShaderBuilder.h |
diff --git a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h |
index 38d569e734189f552713d4ba07160ba2672ab897..fdf685cc09bcc32c28e2eec296979b170861eaad 100644 |
--- a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h |
+++ b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h |
@@ -7,18 +7,16 @@ |
#ifndef GrGLFragmentShaderBuilder_DEFINED |
#define GrGLFragmentShaderBuilder_DEFINED |
-#include "GrGLShaderBuilder.h" |
-class GrGLProgramBuilder; |
+#include "GrGLShaderBuilder.h" |
/* |
- * This base class encapsulates the functionality which all GrProcessors are allowed to use in their |
- * fragment shader |
+ * This base class encapsulates the functionality which the GP uses to build fragment shaders |
*/ |
-class GrGLProcessorFragmentShaderBuilder : public GrGLShaderBuilder { |
+class GrGLGPFragmentBuilder : public GrGLShaderBuilder { |
public: |
- GrGLProcessorFragmentShaderBuilder(GrGLProgramBuilder* program) : INHERITED(program) {} |
- virtual ~GrGLProcessorFragmentShaderBuilder() {} |
+ GrGLGPFragmentBuilder(GrGLProgramBuilder* program) : INHERITED(program) {} |
+ virtual ~GrGLGPFragmentBuilder() {} |
/** |
* Use of these features may require a GLSL extension to be enabled. Shaders may not compile |
* if code is added that uses one of these features without calling enableFeature() |
@@ -53,20 +51,23 @@ private: |
/* |
* Fragment processor's, in addition to all of the above, may need to use dst color so they use |
- * this builder to create their shader |
+ * this builder to create their shader. Because this is the only shader builder the FP sees, we |
+ * just call it FPShaderBuilder |
*/ |
-class GrGLFragmentProcessorShaderBuilder : public GrGLProcessorFragmentShaderBuilder { |
+class GrGLFPFragmentBuilder : public GrGLGPFragmentBuilder { |
public: |
- GrGLFragmentProcessorShaderBuilder(GrGLProgramBuilder* program) : INHERITED(program) {} |
+ GrGLFPFragmentBuilder(GrGLProgramBuilder* program) : INHERITED(program) {} |
+ |
/** Returns the variable name that holds the color of the destination pixel. This may be NULL if |
no effect advertised that it will read the destination. */ |
virtual const char* dstColor() = 0; |
private: |
- typedef GrGLProcessorFragmentShaderBuilder INHERITED; |
+ typedef GrGLGPFragmentBuilder INHERITED; |
}; |
-class GrGLFragmentShaderBuilder : public GrGLFragmentProcessorShaderBuilder { |
+// TODO rename to Fragment Builder |
+class GrGLFragmentShaderBuilder : public GrGLFPFragmentBuilder { |
public: |
typedef uint8_t DstReadKey; |
typedef uint8_t FragPosKey; |
@@ -83,39 +84,42 @@ public: |
GrGLFragmentShaderBuilder(GrGLProgramBuilder* program, const GrGLProgramDesc& desc); |
- virtual const char* dstColor() SK_OVERRIDE; |
- |
+ // true public interface, defined explicitly in the abstract interfaces above |
virtual bool enableFeature(GLSLFeature) SK_OVERRIDE; |
- |
virtual SkString ensureFSCoords2D(const GrGLProcessor::TransformedCoordsArray& coords, |
int index) SK_OVERRIDE; |
- |
virtual const char* fragmentPosition() SK_OVERRIDE; |
+ virtual const char* dstColor() SK_OVERRIDE; |
+ |
+ // Private public interface, used by GrGLProgramBuilder to build a fragment shader |
+ void emitCodeToReadDstTexture(); |
+ void enableCustomOutput(); |
+ void enableSecondaryOutput(); |
+ const char* getPrimaryColorOutputName() const; |
+ const char* getSecondaryColorOutputName() const; |
+ void enableSecondaryOutput(const GrGLSLExpr4& inputColor, const GrGLSLExpr4& inputCoverage); |
+ void combineColorAndCoverage(const GrGLSLExpr4& inputColor, const GrGLSLExpr4& inputCoverage); |
+ bool compileAndAttachShaders(GrGLuint programId, SkTDArray<GrGLuint>* shaderIds) const; |
+ void bindFragmentShaderLocations(GrGLuint programID); |
-private: |
/* |
- * An internal call for GrGLFullProgramBuilder to use to add varyings to the vertex shader |
+ * An internal call for GrGLProgramBuilder to use to add varyings to the vertex shader |
*/ |
void addVarying(GrSLType type, |
const char* name, |
const char** fsInName, |
GrGLShaderVar::Precision fsPrecision = GrGLShaderVar::kDefault_Precision); |
- /* |
- * Private functions used by GrGLProgramBuilder for compilation |
- */ |
- void bindProgramLocations(GrGLuint programId); |
- bool compileAndAttachShaders(GrGLuint programId, SkTDArray<GrGLuint>* shaderIds) const; |
- void emitCodeBeforeEffects(); |
- void emitCodeAfterEffects(const GrGLSLExpr4& inputColor, const GrGLSLExpr4& inputCoverage); |
- |
- /** Enables using the secondary color output and returns the name of the var in which it is |
- to be stored */ |
- const char* enableSecondaryOutput(); |
- |
- /** Gets the name of the primary color output. */ |
- const char* getColorOutputName() const; |
+ // As GLProcessors emit code, there are some conditions we need to verify. We use the below |
+ // state to track this. The reset call is called per processor emitted. |
+ bool hasReadDstColor() const { return fHasReadDstColor; } |
+ bool hasReadFragmentPosition() const { return fHasReadFragmentPosition; } |
+ void reset() { |
+ fHasReadDstColor = false; |
+ fHasReadFragmentPosition = false; |
+ } |
+private: |
/** |
* Features that should only be enabled by GrGLFragmentShaderBuilder itself. |
*/ |
@@ -132,21 +136,29 @@ private: |
kTopLeftOrigin_DstReadKeyBit = 0x4, // Set if dst-copy origin is top-left. |
}; |
+ // Interpretation of FragPosKey when generating code |
enum { |
kNoFragPosRead_FragPosKey = 0, // The fragment positition will not be needed. |
kTopLeftFragPosRead_FragPosKey = 0x1,// Read frag pos relative to top-left. |
kBottomLeftFragPosRead_FragPosKey = 0x2,// Read frag pos relative to bottom-left. |
}; |
+ static const char* kDstCopyColorName; |
+ |
bool fHasCustomColorOutput; |
bool fHasSecondaryOutput; |
bool fSetupFragPosition; |
bool fTopLeftFragPosRead; |
+ // some state to verify shaders and effects are consistent, this is reset between effects by |
+ // the program creator |
+ bool fHasReadDstColor; |
+ bool fHasReadFragmentPosition; |
+ |
+ friend class GrGLNvprProgramBuilder; |
friend class GrGLProgramBuilder; |
- friend class GrGLFullProgramBuilder; |
- typedef GrGLFragmentProcessorShaderBuilder INHERITED; |
+ typedef GrGLFPFragmentBuilder INHERITED; |
}; |
#endif |