Index: include/gpu/GrFragmentProcessor.h |
diff --git a/include/gpu/GrFragmentProcessor.h b/include/gpu/GrFragmentProcessor.h |
index 6864702b600fb443bb3cacd1922424b295ce00c1..270ee16515a61508e5bcb464099c70651335ea7e 100644 |
--- a/include/gpu/GrFragmentProcessor.h |
+++ b/include/gpu/GrFragmentProcessor.h |
@@ -14,6 +14,7 @@ class GrCoordTransform; |
class GrGLSLCaps; |
class GrGLSLFragmentProcessor; |
class GrInvariantOutput; |
+class GrPipeline; |
class GrProcessorKeyBuilder; |
/** Provides custom fragment shader code. Fragment processors receive an input color (vec4f) and |
@@ -68,8 +69,7 @@ public: |
, fUsesDistanceVectorField(false) |
, fUsesLocalCoords(false) |
, fNumTexturesExclChildren(0) |
- , fNumBuffersExclChildren(0) |
- , fNumTransformsExclChildren(0) {} |
+ , fNumBuffersExclChildren(0) {} |
~GrFragmentProcessor() override; |
@@ -86,9 +86,7 @@ public: |
int numBuffersExclChildren() const { return fNumBuffersExclChildren; } |
- int numTransformsExclChildren() const { return fNumTransformsExclChildren; } |
- |
- int numTransforms() const { return fCoordTransforms.count(); } |
+ int numCoordTransforms() const { return fCoordTransforms.count(); } |
/** Returns the coordinate transformation at index. index must be valid according to |
numTransforms(). */ |
@@ -135,6 +133,40 @@ public: |
this->onComputeInvariantOutput(inout); |
} |
+ /** |
+ * Pre-order traversal of a FP hierarchy, or of the forest of FPs in a GrPipeline. In the latter |
+ * case the tree rooted at each FP in the GrPipeline is visited successively. |
+ * */ |
+ class Iter : public SkNoncopyable { |
+ public: |
+ explicit Iter(const GrFragmentProcessor* fp) { fFPStack.push_back(fp); } |
+ explicit Iter(const GrPipeline& pipeline); |
+ const GrFragmentProcessor* next(); |
+ |
+ private: |
+ SkSTArray<4, const GrFragmentProcessor*, true> fFPStack; |
+ }; |
+ |
+ /** |
+ * Iterates over all the GrCoordTransforms in a GrPipeline's GrFragmentProcessors. FPs are |
+ * visited in the same order as Iter and each of an FP's coord transforms are visited linearly. |
+ */ |
+ class CoordTransformIter : public SkNoncopyable { |
+ public: |
+ explicit CoordTransformIter(const GrPipeline& pipeline) |
+ : fCurrFP(nullptr) |
+ , fCTIdx(0) |
+ , fFPIter(pipeline) { |
+ fCurrFP = fFPIter.next(); |
+ } |
+ const GrCoordTransform* next(); |
+ |
+ private: |
+ const GrFragmentProcessor* fCurrFP; |
+ int fCTIdx; |
+ GrFragmentProcessor::Iter fFPIter; |
+ }; |
+ |
protected: |
void addTextureAccess(const GrTextureAccess* textureAccess) override; |
void addBufferAccess(const GrBufferAccess*) override; |
@@ -206,15 +238,18 @@ private: |
bool fUsesLocalCoords; |
+ SkSTArray<4, const GrCoordTransform*, true> fCoordTransforms; |
+ |
/** |
- * fCoordTransforms stores the transforms of this proc, followed by all the transforms of this |
- * proc's children. In other words, each proc stores all the transforms of its subtree as if |
+ * A processor stores the texture accesses of this proc, followed by all the accesses of this |
+ * proc's children. In other words, each proc stores all the accesses of its subtree as if |
* they were collected using preorder traversal. |
* |
* Example: |
* Suppose we have frag proc A, who has two children B and D. B has a child C, and D has |
- * two children E and F. Suppose procs A, B, C, D, E, F have 1, 2, 1, 1, 3, 2 transforms |
- * respectively. The following shows what the fCoordTransforms array of each proc would contain: |
+ * two children E and F. Suppose procs A, B, C, D, E, F have 1, 2, 1, 1, 3, 2 accesses |
+ * respectively. The following shows what the array of each proc's texture accesses would |
+ * contain: |
* |
* (A) |
* [a1,b1,b2,c1,d1,e1,e2,e3,f1,f2] |
@@ -227,12 +262,10 @@ private: |
* (C) (E) (F) |
* [c1] [e1,e2,e3] [f1,f2] |
* |
- * The same goes for fTextureAccesses with textures. |
+ * The same goes for buffer accesses. |
*/ |
- SkSTArray<4, const GrCoordTransform*, true> fCoordTransforms; |
int fNumTexturesExclChildren; |
int fNumBuffersExclChildren; |
- int fNumTransformsExclChildren; |
/** |
* This is not SkSTArray<1, sk_sp<GrFragmentProcessor>> because this class holds strong |