Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(18)

Unified Diff: include/gpu/GrFragmentProcessor.h

Issue 2365943003: Stop aggregating texture/buffer access objects in GrFragmentProcessor parents. (Closed)
Patch Set: Readd base class, rebase Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/effects/gradients/SkGradientShader.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: include/gpu/GrFragmentProcessor.h
diff --git a/include/gpu/GrFragmentProcessor.h b/include/gpu/GrFragmentProcessor.h
index 270ee16515a61508e5bcb464099c70651335ea7e..d7011f826c84bb1e0eb3a246cdd1f363208bd73f 100644
--- a/include/gpu/GrFragmentProcessor.h
+++ b/include/gpu/GrFragmentProcessor.h
@@ -67,9 +67,7 @@ public:
GrFragmentProcessor()
: INHERITED()
, fUsesDistanceVectorField(false)
- , fUsesLocalCoords(false)
- , fNumTexturesExclChildren(0)
- , fNumBuffersExclChildren(0) {}
+ , fUsesLocalCoords(false) {}
~GrFragmentProcessor() override;
@@ -82,10 +80,6 @@ public:
}
}
- int numTexturesExclChildren() const { return fNumTexturesExclChildren; }
-
- int numBuffersExclChildren() const { return fNumBuffersExclChildren; }
-
int numCoordTransforms() const { return fCoordTransforms.count(); }
/** Returns the coordinate transformation at index. index must be valid according to
@@ -96,12 +90,6 @@ public:
return fCoordTransforms;
}
- void gatherCoordTransforms(SkTArray<const GrCoordTransform*, true>* outTransforms) const {
- if (!fCoordTransforms.empty()) {
- outTransforms->push_back_n(fCoordTransforms.count(), fCoordTransforms.begin());
- }
- }
-
int numChildProcessors() const { return fChildProcessors.count(); }
const GrFragmentProcessor& childProcessor(int index) const { return *fChildProcessors[index]; }
@@ -136,7 +124,7 @@ public:
/**
* 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); }
@@ -148,18 +136,41 @@ public:
};
/**
- * 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.
+ * Iterates over all the Ts owned by a GrFragmentProcessor and its children or over all the Ts
+ * owned by the forest of GrFragmentProcessors in a GrPipeline. FPs are visited in the same
+ * order as Iter and each of an FP's Ts are visited in order.
*/
- class CoordTransformIter : public SkNoncopyable {
+ template <typename T, typename BASE,
+ int (BASE::*COUNT)() const,
+ const T& (BASE::*GET)(int) const>
+ class FPItemIter : public SkNoncopyable {
public:
- explicit CoordTransformIter(const GrPipeline& pipeline)
+ explicit FPItemIter(const GrFragmentProcessor* fp)
+ : fCurrFP(nullptr)
+ , fCTIdx(0)
+ , fFPIter(fp) {
+ fCurrFP = fFPIter.next();
+ }
+ explicit FPItemIter(const GrPipeline& pipeline)
: fCurrFP(nullptr)
, fCTIdx(0)
, fFPIter(pipeline) {
fCurrFP = fFPIter.next();
}
- const GrCoordTransform* next();
+
+ const T* next() {
+ if (!fCurrFP) {
+ return nullptr;
+ }
+ while (fCTIdx == (fCurrFP->*COUNT)()) {
+ fCTIdx = 0;
+ fCurrFP = fFPIter.next();
+ if (!fCurrFP) {
+ return nullptr;
+ }
+ }
+ return &(fCurrFP->*GET)(fCTIdx++);
+ }
private:
const GrFragmentProcessor* fCurrFP;
@@ -167,6 +178,16 @@ public:
GrFragmentProcessor::Iter fFPIter;
};
+ using CoordTransformIter = FPItemIter<GrCoordTransform,
+ GrFragmentProcessor,
+ &GrFragmentProcessor::numCoordTransforms,
+ &GrFragmentProcessor::coordTransform>;
+
+ using TextureAccessIter = FPItemIter<GrTextureAccess,
+ GrProcessor,
+ &GrProcessor::numTextures,
+ &GrProcessor::textureAccess>;
+
protected:
void addTextureAccess(const GrTextureAccess* textureAccess) override;
void addBufferAccess(const GrBufferAccess*) override;
@@ -241,33 +262,6 @@ private:
SkSTArray<4, const GrCoordTransform*, true> fCoordTransforms;
/**
- * 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 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]
- * / \
- * / \
- * (B) (D)
- * [b1,b2,c1] [d1,e1,e2,e3,f1,f2]
- * / / \
- * / / \
- * (C) (E) (F)
- * [c1] [e1,e2,e3] [f1,f2]
- *
- * The same goes for buffer accesses.
- */
- int fNumTexturesExclChildren;
- int fNumBuffersExclChildren;
-
- /**
* This is not SkSTArray<1, sk_sp<GrFragmentProcessor>> because this class holds strong
* references until notifyRefCntIsZero and then it holds pending executions.
*/
« no previous file with comments | « no previous file | src/effects/gradients/SkGradientShader.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698