Chromium Code Reviews| Index: include/gpu/GrFragmentProcessor.h |
| diff --git a/include/gpu/GrFragmentProcessor.h b/include/gpu/GrFragmentProcessor.h |
| index 6864702b600fb443bb3cacd1922424b295ce00c1..84d6082cc169eec4d37e386c99d927437fae2385 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); |
| } |
| + /** |
|
robertphillips
2016/09/15 20:44:30
or a the ?
bsalomon
2016/09/15 20:55:52
should be "or of the forest of FPs..."
|
| + * Pre-order traversal of a FP hierarchy, or a 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 |