Index: src/gpu/glsl/GrGLSLFragmentShaderBuilder.h |
diff --git a/src/gpu/glsl/GrGLSLFragmentShaderBuilder.h b/src/gpu/glsl/GrGLSLFragmentShaderBuilder.h |
index a437a194ca2c228a61ac148b0a43aa8e6de3bc21..4dab6f2a09bd2582fc30576c8331f27c0569b062 100644 |
--- a/src/gpu/glsl/GrGLSLFragmentShaderBuilder.h |
+++ b/src/gpu/glsl/GrGLSLFragmentShaderBuilder.h |
@@ -16,17 +16,14 @@ class GrRenderTarget; |
class GrGLSLVarying; |
/* |
- * This base class encapsulates the functionality which the GP uses to build fragment shaders |
+ * This base class encapsulates the common functionality which all processors use to build fragment |
+ * shaders. |
*/ |
class GrGLSLFragmentBuilder : public GrGLSLShaderBuilder { |
public: |
- GrGLSLFragmentBuilder(GrGLSLProgramBuilder* program) |
- : INHERITED(program) |
- , fHasCustomColorOutput(false) |
- , fHasSecondaryOutput(false) { |
- fSubstageIndices.push_back(0); |
- } |
+ GrGLSLFragmentBuilder(GrGLSLProgramBuilder* program) : INHERITED(program) {} |
virtual ~GrGLSLFragmentBuilder() {} |
+ |
/** |
* 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() |
@@ -54,74 +51,65 @@ public: |
is in device space (e.g. 0,0 is the top left and pixel centers are at half-integers). */ |
virtual const char* fragmentPosition() = 0; |
- /** |
- * Fragment procs with child procs should call these functions before/after calling emitCode |
- * on a child proc. |
- */ |
- void onBeforeChildProcEmitCode(); |
- void onAfterChildProcEmitCode(); |
- |
- const SkString& getMangleString() const { return fMangleString; } |
- |
- bool hasCustomColorOutput() const { return fHasCustomColorOutput; } |
- bool hasSecondaryOutput() const { return fHasSecondaryOutput; } |
- |
+ // TODO: remove this method. |
void declAppendf(const char* fmt, ...); |
-protected: |
- bool fHasCustomColorOutput; |
- bool fHasSecondaryOutput; |
- |
private: |
- /* |
- * State that tracks which child proc in the proc tree is currently emitting code. This is |
- * used to update the fMangleString, which is used to mangle the names of uniforms and functions |
- * emitted by the proc. fSubstageIndices is a stack: its count indicates how many levels deep |
- * we are in the tree, and its second-to-last value is the index of the child proc at that |
- * level which is currently emitting code. For example, if fSubstageIndices = [3, 1, 2, 0], that |
- * means we're currently emitting code for the base proc's 3rd child's 1st child's 2nd child. |
- */ |
- SkTArray<int> fSubstageIndices; |
+ typedef GrGLSLShaderBuilder INHERITED; |
+}; |
- /* |
- * The mangle string is used to mangle the names of uniforms/functions emitted by the child |
- * procs so no duplicate uniforms/functions appear in the generated shader program. The mangle |
- * string is simply based on fSubstageIndices. For example, if fSubstageIndices = [3, 1, 2, 0], |
- * then the manglestring will be "_c3_c1_c2", and any uniform/function emitted by that proc will |
- * have "_c3_c1_c2" appended to its name, which can be interpreted as "base proc's 3rd child's |
- * 1st child's 2nd child". |
+/* |
+ * This class is used by fragment processors to build their fragment code. |
+ */ |
+class GrGLSLFPFragmentBuilder : virtual public GrGLSLFragmentBuilder { |
+public: |
+ /** Appease the compiler; the derived class initializes GrGLSLFragmentBuilder. */ |
+ GrGLSLFPFragmentBuilder() : GrGLSLFragmentBuilder(nullptr) {} |
+ |
+ /** |
+ * Fragment procs with child procs should call these functions before/after calling emitCode |
+ * on a child proc. |
*/ |
- SkString fMangleString; |
+ virtual void onBeforeChildProcEmitCode() = 0; |
+ virtual void onAfterChildProcEmitCode() = 0; |
- friend class GrGLPathProcessor; |
+ virtual const SkString& getMangleString() const = 0; |
+}; |
- typedef GrGLSLShaderBuilder INHERITED; |
+/* |
+ * This class is used by primitive processors to build their fragment code. |
+ */ |
+class GrGLSLPPFragmentBuilder : public GrGLSLFPFragmentBuilder { |
+public: |
+ /** Appease the compiler; the derived class initializes GrGLSLFragmentBuilder. */ |
+ GrGLSLPPFragmentBuilder() : GrGLSLFragmentBuilder(nullptr) {} |
}; |
/* |
- * 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. Because this is the only shader builder the FP sees, we |
- * just call it FPShaderBuilder |
+ * This class is used by Xfer processors to build their fragment code. |
*/ |
-class GrGLSLXPFragmentBuilder : public GrGLSLFragmentBuilder { |
+class GrGLSLXPFragmentBuilder : virtual public GrGLSLFragmentBuilder { |
public: |
- GrGLSLXPFragmentBuilder(GrGLSLProgramBuilder* program) : INHERITED(program) {} |
+ /** Appease the compiler; the derived class initializes GrGLSLFragmentBuilder. */ |
+ GrGLSLXPFragmentBuilder() : GrGLSLFragmentBuilder(nullptr) {} |
+ |
+ virtual bool hasCustomColorOutput() const = 0; |
+ virtual bool hasSecondaryOutput() const = 0; |
- /** Returns the variable name that holds the color of the destination pixel. This may be nullptr if |
- no effect advertised that it will read the destination. */ |
+ /** Returns the variable name that holds the color of the destination pixel. This may be nullptr |
+ * if no effect advertised that it will read the destination. */ |
virtual const char* dstColor() = 0; |
/** Adds any necessary layout qualifiers in order to legalize the supplied blend equation with |
this shader. It is only legal to call this method with an advanced blend equation, and only |
if these equations are supported. */ |
virtual void enableAdvancedBlendEquationIfNeeded(GrBlendEquation) = 0; |
- |
-private: |
- typedef GrGLSLFragmentBuilder INHERITED; |
}; |
-// TODO rename to Fragment Builder |
-class GrGLSLFragmentShaderBuilder : public GrGLSLXPFragmentBuilder { |
+/* |
+ * This class implements the various fragment builder interfaces. |
+ */ |
+class GrGLSLFragmentShaderBuilder : public GrGLSLPPFragmentBuilder, public GrGLSLXPFragmentBuilder { |
public: |
typedef uint8_t FragPosKey; |
@@ -132,13 +120,21 @@ public: |
GrGLSLFragmentShaderBuilder(GrGLSLProgramBuilder* program, uint8_t fragPosKey); |
- // true public interface, defined explicitly in the abstract interfaces above |
+ // Shared GrGLSLFragmentBuilder interface. |
bool enableFeature(GLSLFeature) override; |
virtual SkString ensureFSCoords2D(const GrGLSLTransformedCoordsArray& coords, |
int index) override; |
const char* fragmentPosition() override; |
- const char* dstColor() override; |
+ // GrGLSLFPFragmentBuilder interface. |
+ const SkString& getMangleString() const override { return fMangleString; } |
+ void onBeforeChildProcEmitCode() override; |
+ void onAfterChildProcEmitCode() override; |
+ |
+ // GrGLSLXPFragmentBuilder interface. |
+ bool hasCustomColorOutput() const override { return fHasCustomColorOutput; } |
+ bool hasSecondaryOutput() const override { return fHasSecondaryOutput; } |
+ const char* dstColor() override; |
void enableAdvancedBlendEquationIfNeeded(GrBlendEquation) override; |
private: |
@@ -176,9 +172,31 @@ private: |
static const char* kDstTextureColorName; |
+ /* |
+ * State that tracks which child proc in the proc tree is currently emitting code. This is |
+ * used to update the fMangleString, which is used to mangle the names of uniforms and functions |
+ * emitted by the proc. fSubstageIndices is a stack: its count indicates how many levels deep |
+ * we are in the tree, and its second-to-last value is the index of the child proc at that |
+ * level which is currently emitting code. For example, if fSubstageIndices = [3, 1, 2, 0], that |
+ * means we're currently emitting code for the base proc's 3rd child's 1st child's 2nd child. |
+ */ |
+ SkTArray<int> fSubstageIndices; |
+ |
+ /* |
+ * The mangle string is used to mangle the names of uniforms/functions emitted by the child |
+ * procs so no duplicate uniforms/functions appear in the generated shader program. The mangle |
+ * string is simply based on fSubstageIndices. For example, if fSubstageIndices = [3, 1, 2, 0], |
+ * then the manglestring will be "_c3_c1_c2", and any uniform/function emitted by that proc will |
+ * have "_c3_c1_c2" appended to its name, which can be interpreted as "base proc's 3rd child's |
+ * 1st child's 2nd child". |
+ */ |
+ SkString fMangleString; |
+ |
bool fSetupFragPosition; |
bool fTopLeftFragPosRead; |
+ bool fHasCustomColorOutput; |
int fCustomColorOutputIndex; |
+ bool fHasSecondaryOutput; |
// some state to verify shaders and effects are consistent, this is reset between effects by |
// the program creator |
@@ -187,8 +205,6 @@ private: |
friend class GrGLSLProgramBuilder; |
friend class GrGLProgramBuilder; |
- |
- typedef GrGLSLXPFragmentBuilder INHERITED; |
}; |
#endif |