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

Side by Side Diff: include/gpu/GrFragmentProcessor.h

Issue 1275853005: All child GrFragmentProcs' transforms and textures will be stored in the root GrFragmentProc in pre… (Closed) Base URL: https://skia.googlesource.com/skia@master
Patch Set: child procs keep copy of their arrays Created 5 years, 4 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 unified diff | Download patch
« no previous file with comments | « no previous file | include/gpu/GrPaint.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2014 Google Inc. 2 * Copyright 2014 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef GrFragmentProcessor_DEFINED 8 #ifndef GrFragmentProcessor_DEFINED
9 #define GrFragmentProcessor_DEFINED 9 #define GrFragmentProcessor_DEFINED
10 10
11 #include "GrProcessor.h" 11 #include "GrProcessor.h"
12 #include "GrStagedProcessor.h"
12 13
13 class GrCoordTransform; 14 class GrCoordTransform;
14 class GrGLSLCaps; 15 class GrGLSLCaps;
15 class GrGLFragmentProcessor; 16 class GrGLFragmentProcessor;
16 class GrProcessorKeyBuilder; 17 class GrProcessorKeyBuilder;
17 18
18 /** Provides custom fragment shader code. Fragment processors receive an input c olor (vec4f) and 19 /** Provides custom fragment shader code. Fragment processors receive an input c olor (vec4f) and
19 produce an output color. They may reference textures and uniforms. They may use 20 produce an output color. They may reference textures and uniforms. They may use
20 GrCoordTransforms to receive a transformation of the local coordinates that map from local space 21 GrCoordTransforms to receive a transformation of the local coordinates that map from local space
21 to the fragment being processed. 22 to the fragment being processed.
22 */ 23 */
23 class GrFragmentProcessor : public GrProcessor { 24 class GrFragmentProcessor : public GrProcessor {
24 public: 25 public:
25 GrFragmentProcessor() 26 GrFragmentProcessor()
26 : INHERITED() 27 : INHERITED()
27 , fUsesLocalCoords(false) {} 28 , fUsesLocalCoords(false) {}
28 29
29 /** Returns a new instance of the appropriate *GL* implementation class 30 /** Returns a new instance of the appropriate *GL* implementation class
30 for the given GrFragmentProcessor; caller is responsible for deleting 31 for the given GrFragmentProcessor; caller is responsible for deleting
31 the object. */ 32 the object. */
32 virtual GrGLFragmentProcessor* createGLInstance() const = 0; 33 virtual GrGLFragmentProcessor* createGLInstance() const = 0;
33 34
34 /** Human-meaningful string to identify this GrFragmentProcessor; may be emb edded 35 /** Human-meaningful string to identify this GrFragmentProcessor; may be emb edded
35 in generated shader code. */ 36 in generated shader code. */
36 virtual const char* name() const = 0; 37 virtual const char* name() const = 0;
37 38
38 void getGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) con st { 39 void getGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) con st {
39 this->onGetGLProcessorKey(caps, b); 40 this->onGetGLProcessorKey(caps, b);
40 for (int i = 0; i < fChildProcessors.count(); ++i) { 41 for (int i = 0; i < fChildProcessors.count(); ++i) {
41 fChildProcessors[i]->getGLProcessorKey(caps, b); 42 fChildProcessors[i].processor()->getGLProcessorKey(caps, b);
42 } 43 }
43 } 44 }
44 45
45 int numTransforms() const { return fCoordTransforms.count(); } 46 int numTransforms() const { return fCoordTransforms.count(); }
46 47
47 int numTransformsIncludeChildProcs() const {
48 int numTransforms = fCoordTransforms.count();
49 for (int i = 0; i < fChildProcessors.count(); ++i) {
50 numTransforms += fChildProcessors[i]->numTransformsIncludeChildProcs ();
51 }
52 return numTransforms;
53 }
54
55 /** Returns the coordinate transformation at index. index must be valid acco rding to 48 /** Returns the coordinate transformation at index. index must be valid acco rding to
56 numTransforms(). */ 49 numTransforms(). */
57 const GrCoordTransform& coordTransform(int index) const { return *fCoordTran sforms[index]; } 50 const GrCoordTransform& coordTransform(int index) const { return *fCoordTran sforms[index]; }
58 51
59 const SkTArray<const GrCoordTransform*, true>& coordTransforms() const { 52 const SkTArray<const GrCoordTransform*, true>& coordTransforms() const {
60 return fCoordTransforms; 53 return fCoordTransforms;
61 } 54 }
62 55
63 /** Gather the coord transforms into an array. We use preorder traversal */
64 void gatherCoordTransforms(SkTArray<const GrCoordTransform*, true>* outTrans forms) const { 56 void gatherCoordTransforms(SkTArray<const GrCoordTransform*, true>* outTrans forms) const {
65 SkASSERT(outTransforms); 57 if (!fCoordTransforms.empty()) {
66 outTransforms->push_back_n(fCoordTransforms.count(), fCoordTransforms.be gin()); 58 outTransforms->push_back_n(fCoordTransforms.count(), fCoordTransform s.begin());
67 for (int i = 0; i < fChildProcessors.count(); ++i) {
68 fChildProcessors[i]->gatherCoordTransforms(outTransforms);
69 } 59 }
70 } 60 }
71 61
72 int numChildProcessors() const { return fChildProcessors.count(); } 62 int numChildProcessors() const { return fChildProcessors.count(); }
73 63
74 GrFragmentProcessor* childProcessor(int index) const { return fChildProcesso rs[index]; } 64 const GrFragmentProcessor& childProcessor(int index) const {
75 65 return *fChildProcessors[index].processor();
76 const SkTArray<GrFragmentProcessor*, false>& childProcessors() const {
77 return fChildProcessors;
78 }
79
80 int numTexturesIncludeChildProcs() const {
81 int numTextures = this->numTextures();
82 for (int i = 0; i < fChildProcessors.count(); ++i) {
83 numTextures += fChildProcessors[i]->numTexturesIncludeChildProcs();
84 }
85 return numTextures;
86 } 66 }
87 67
88 /** Do any of the coordtransforms for this processor require local coords? * / 68 /** Do any of the coordtransforms for this processor require local coords? * /
89 bool usesLocalCoords() const { return fUsesLocalCoords; } 69 bool usesLocalCoords() const { return fUsesLocalCoords; }
90 70
91 /** Returns true if this and other processor conservatively draw identically . It can only return 71 /** Returns true if this and other processor conservatively draw identically . It can only return
92 true when the two processor are of the same subclass (i.e. they return t he same object from 72 true when the two processor are of the same subclass (i.e. they return t he same object from
93 from getFactory()). 73 from getFactory()).
94 74
95 A return value of true from isEqual() should not be used to test whether the processor would 75 A return value of true from isEqual() should not be used to test whether the processor would
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 * processor subclass manages the lifetime of the transformations (this func tion only stores a 113 * processor subclass manages the lifetime of the transformations (this func tion only stores a
134 * pointer). The GrCoordTransform is typically a member field of the GrProce ssor subclass. 114 * pointer). The GrCoordTransform is typically a member field of the GrProce ssor subclass.
135 * 115 *
136 * A processor subclass that has multiple methods of construction should alw ays add its coord 116 * A processor subclass that has multiple methods of construction should alw ays add its coord
137 * transforms in a consistent order. The non-virtual implementation of isEqu al() automatically 117 * transforms in a consistent order. The non-virtual implementation of isEqu al() automatically
138 * compares transforms and will assume they line up across the two processor instances. 118 * compares transforms and will assume they line up across the two processor instances.
139 */ 119 */
140 void addCoordTransform(const GrCoordTransform*); 120 void addCoordTransform(const GrCoordTransform*);
141 121
142 /** 122 /**
143 * FragmentProcessor subclasses call this to register any child FragmentProc essors they have. 123 * FragmentProcessor subclasses call this from their constructor to register any child
124 * FragmentProcessors they have.
144 * This is for processors whose shader code will be composed of nested proce ssors whose output 125 * This is for processors whose shader code will be composed of nested proce ssors whose output
145 * colors will be combined somehow to produce its output color. Registering these child 126 * colors will be combined somehow to produce its output color. Registering these child
146 * processors will allow the ProgramBuilder to automatically add their trans formed coords and 127 * processors will allow the ProgramBuilder to automatically handle their tr ansformed coords and
147 * texture accesses and mangle their uniform and output color names and 128 * texture accesses and mangle their uniform and output color names.
148 */ 129 */
149 void registerChildProcessor(GrFragmentProcessor* child); 130 int registerChildProcessor(const GrFragmentProcessor* child);
150 131
151 /** 132 /**
152 * Subclass implements this to support getConstantColorComponents(...). 133 * Subclass implements this to support getConstantColorComponents(...).
153 */ 134 */
154 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const = 0; 135 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const = 0;
155 136
156 private: 137 private:
157 /** Implemented using GLFragmentProcessor::GenKey as described in this class 's comment. */ 138 /** Implemented using GLFragmentProcessor::GenKey as described in this class 's comment. */
158 virtual void onGetGLProcessorKey(const GrGLSLCaps& caps, 139 virtual void onGetGLProcessorKey(const GrGLSLCaps& caps,
159 GrProcessorKeyBuilder* b) const = 0; 140 GrProcessorKeyBuilder* b) const = 0;
160 141
161 /** 142 /**
162 * Subclass implements this to support isEqual(). It will only be called if it is known that 143 * Subclass implements this to support isEqual(). It will only be called if it is known that
163 * the two processors are of the same subclass (i.e. they return the same ob ject from 144 * the two processors are of the same subclass (i.e. they return the same ob ject from
164 * getFactory()). The processor subclass should not compare its coord transf orms as that will 145 * getFactory()). The processor subclass should not compare its coord transf orms as that will
165 * be performed automatically in the non-virtual isEqual(). 146 * be performed automatically in the non-virtual isEqual().
166 */ 147 */
167 virtual bool onIsEqual(const GrFragmentProcessor&) const = 0; 148 virtual bool onIsEqual(const GrFragmentProcessor&) const = 0;
168 149
169 bool hasSameTransforms(const GrFragmentProcessor&) const; 150 bool hasSameTransforms(const GrFragmentProcessor&) const;
170 151
152 bool fUsesLocalCoords;
153
154 /**
155 * This stores the transforms of this proc, followed by all the transforms o f this proc's
156 * children. In other words, each proc stores all the transforms of its subt ree.
157 * The same goes for fTextureAccesses with textures.
158 */
171 SkSTArray<4, const GrCoordTransform*, true> fCoordTransforms; 159 SkSTArray<4, const GrCoordTransform*, true> fCoordTransforms;
172 bool fUsesLocalCoords; 160
173 SkTArray<GrFragmentProcessor*, false> fChildProcessors; 161 SkTArray<GrFragmentStage, false> fChildProcessors;
174 162
175 typedef GrProcessor INHERITED; 163 typedef GrProcessor INHERITED;
176 }; 164 };
177 165
178 #endif 166 #endif
OLDNEW
« no previous file with comments | « no previous file | include/gpu/GrPaint.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698