OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 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 GrGeometryProcessor_DEFINED | 8 #ifndef GrGeometryProcessor_DEFINED |
9 #define GrGeometryProcessor_DEFINED | 9 #define GrGeometryProcessor_DEFINED |
10 | 10 |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
114 /* | 114 /* |
115 * We always call canMakeEqual before makeEqual so there is no need to do an y kind of equality | 115 * We always call canMakeEqual before makeEqual so there is no need to do an y kind of equality |
116 * testing here | 116 * testing here |
117 * TODO make this pure virtual when primProcs can actually use it | 117 * TODO make this pure virtual when primProcs can actually use it |
118 */ | 118 */ |
119 virtual void makeEqual(GrBatchTracker*, const GrBatchTracker&) const {} | 119 virtual void makeEqual(GrBatchTracker*, const GrBatchTracker&) const {} |
120 | 120 |
121 virtual void getInvariantOutputColor(GrInitInvariantOutput* out) const = 0; | 121 virtual void getInvariantOutputColor(GrInitInvariantOutput* out) const = 0; |
122 virtual void getInvariantOutputCoverage(GrInitInvariantOutput* out) const = 0; | 122 virtual void getInvariantOutputCoverage(GrInitInvariantOutput* out) const = 0; |
123 | 123 |
124 // Only the GrGeometryProcessor subclass actually has a geo shader or vertex attributes, but | |
125 // we put these calls on the base class to prevent having to cast | |
126 virtual bool willUseGeoShader() const = 0; | |
127 | |
128 /* | |
129 * This is a safeguard to prevent GrPrimitiveProcessor's from going beyond p latform specific | |
130 * attribute limits. This number can almost certainly be raised if required. | |
131 */ | |
132 static const int kMaxVertexAttribs = 6; | |
133 | |
134 struct GrAttribute { | |
bsalomon
2015/01/13 14:31:44
Should just be "Attribute" if it is nested inside
| |
135 GrAttribute(const char* name, GrVertexAttribType type) | |
136 : fName(name) | |
137 , fType(type) | |
138 , fOffset(SkAlign4(GrVertexAttribTypeSize(type))) {} | |
139 const char* fName; | |
140 GrVertexAttribType fType; | |
141 size_t fOffset; | |
142 }; | |
143 | |
144 typedef SkTArray<GrAttribute, true> VertexAttribArray; | |
145 | |
146 const VertexAttribArray& getAttribs() const { return fAttribs; } | |
147 | |
148 // Returns the vertex stride of the GP. A common use case is to request geo metry from a | |
149 // drawtarget based off of the stride, and to populate this memory using an implicit array of | |
150 // structs. In this case, it is best to assert the vertexstride == sizeof(V ertexStruct). | |
151 size_t getVertexStride() const { return fVertexStride; } | |
152 | |
124 /** | 153 /** |
125 * Gets a transformKey from an array of coord transforms | 154 * Gets a transformKey from an array of coord transforms |
126 */ | 155 */ |
127 uint32_t getTransformKey(const SkTArray<const GrCoordTransform*, true>&) con st; | 156 uint32_t getTransformKey(const SkTArray<const GrCoordTransform*, true>&) con st; |
128 | 157 |
129 /** | 158 /** |
130 * Sets a unique key on the GrProcessorKeyBuilder that is directly associate d with this geometry | 159 * Sets a unique key on the GrProcessorKeyBuilder that is directly associate d with this geometry |
131 * processor's GL backend implementation. | 160 * processor's GL backend implementation. |
132 */ | 161 */ |
133 virtual void getGLProcessorKey(const GrBatchTracker& bt, | 162 virtual void getGLProcessorKey(const GrBatchTracker& bt, |
134 const GrGLCaps& caps, | 163 const GrGLCaps& caps, |
135 GrProcessorKeyBuilder* b) const = 0; | 164 GrProcessorKeyBuilder* b) const = 0; |
136 | 165 |
137 | 166 |
138 /** Returns a new instance of the appropriate *GL* implementation class | 167 /** Returns a new instance of the appropriate *GL* implementation class |
139 for the given GrProcessor; caller is responsible for deleting | 168 for the given GrProcessor; caller is responsible for deleting |
140 the object. */ | 169 the object. */ |
141 virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt, | 170 virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt, |
142 const GrGLCaps& caps) const = 0; | 171 const GrGLCaps& caps) const = 0; |
143 | 172 |
144 protected: | 173 protected: |
145 GrPrimitiveProcessor(const SkMatrix& viewMatrix, const SkMatrix& localMatrix ) | 174 GrPrimitiveProcessor(const SkMatrix& viewMatrix, const SkMatrix& localMatrix ) |
146 : fViewMatrix(viewMatrix) | 175 : fVertexStride(0) |
176 , fViewMatrix(viewMatrix) | |
147 , fLocalMatrix(localMatrix) {} | 177 , fLocalMatrix(localMatrix) {} |
148 | 178 |
149 /* | 179 /* |
150 * CanCombineOutput will return true if two draws are 'batchable' from a col or perspective. | 180 * CanCombineOutput will return true if two draws are 'batchable' from a col or perspective. |
151 * TODO remove this when GPs can upgrade to attribute color | 181 * TODO remove this when GPs can upgrade to attribute color |
152 */ | 182 */ |
153 static bool CanCombineOutput(GrGPInput left, GrColor lColor, GrGPInput right , GrColor rColor) { | 183 static bool CanCombineOutput(GrGPInput left, GrColor lColor, GrGPInput right , GrColor rColor) { |
154 if (left != right) { | 184 if (left != right) { |
155 return false; | 185 return false; |
156 } | 186 } |
(...skipping 12 matching lines...) Expand all Loading... | |
169 if (leftUsesLocalCoords != rightUsesLocalCoords) { | 199 if (leftUsesLocalCoords != rightUsesLocalCoords) { |
170 return false; | 200 return false; |
171 } | 201 } |
172 | 202 |
173 if (leftUsesLocalCoords && !left.localMatrix().cheapEqualTo(right.localM atrix())) { | 203 if (leftUsesLocalCoords && !left.localMatrix().cheapEqualTo(right.localM atrix())) { |
174 return false; | 204 return false; |
175 } | 205 } |
176 return true; | 206 return true; |
177 } | 207 } |
178 | 208 |
209 SkSTArray<kMaxVertexAttribs, GrAttribute, true> fAttribs; | |
bsalomon
2015/01/13 14:31:45
If it's really capped why not just
Attribute fAtt
| |
210 size_t fVertexStride; | |
211 | |
179 private: | 212 private: |
180 virtual bool hasExplicitLocalCoords() const = 0; | 213 virtual bool hasExplicitLocalCoords() const = 0; |
181 | 214 |
182 SkMatrix fViewMatrix; | 215 SkMatrix fViewMatrix; |
183 SkMatrix fLocalMatrix; | 216 SkMatrix fLocalMatrix; |
184 | 217 |
185 typedef GrProcessor INHERITED; | 218 typedef GrProcessor INHERITED; |
186 }; | 219 }; |
187 | 220 |
188 /** | 221 /** |
189 * A GrGeometryProcessor is a flexible method for rendering a primitive. The Gr GeometryProcessor | 222 * A GrGeometryProcessor is a flexible method for rendering a primitive. The Gr GeometryProcessor |
190 * has complete control over vertex attributes and uniforms(aside from the rende r target) but it | 223 * has complete control over vertex attributes and uniforms(aside from the rende r target) but it |
191 * must obey the same contract as any GrPrimitiveProcessor, specifically it must emit a color and | 224 * must obey the same contract as any GrPrimitiveProcessor, specifically it must emit a color and |
192 * coverage into the fragment shader. Where this color and coverage come from i s completely the | 225 * coverage into the fragment shader. Where this color and coverage come from i s completely the |
193 * responsibility of the GrGeometryProcessor. | 226 * responsibility of the GrGeometryProcessor. |
194 */ | 227 */ |
195 class GrGeometryProcessor : public GrPrimitiveProcessor { | 228 class GrGeometryProcessor : public GrPrimitiveProcessor { |
196 public: | 229 public: |
197 // TODO the Hint can be handled in a much more clean way when we have deferr ed geometry or | 230 // TODO the Hint can be handled in a much more clean way when we have deferr ed geometry or |
198 // atleast bundles | 231 // atleast bundles |
199 GrGeometryProcessor(GrColor color, | 232 GrGeometryProcessor(GrColor color, |
200 const SkMatrix& viewMatrix = SkMatrix::I(), | 233 const SkMatrix& viewMatrix = SkMatrix::I(), |
201 const SkMatrix& localMatrix = SkMatrix::I(), | 234 const SkMatrix& localMatrix = SkMatrix::I(), |
202 bool opaqueVertexColors = false) | 235 bool opaqueVertexColors = false) |
203 : INHERITED(viewMatrix, localMatrix) | 236 : INHERITED(viewMatrix, localMatrix) |
204 , fVertexStride(0) | |
205 , fColor(color) | 237 , fColor(color) |
206 , fOpaqueVertexColors(opaqueVertexColors) | 238 , fOpaqueVertexColors(opaqueVertexColors) |
207 , fWillUseGeoShader(false) | 239 , fWillUseGeoShader(false) |
208 , fHasVertexColor(false) | 240 , fHasVertexColor(false) |
209 , fHasLocalCoords(false) {} | 241 , fHasLocalCoords(false) {} |
210 | 242 |
211 /* | |
212 * This is a safeguard to prevent GPs from going beyond platform specific at tribute limits. | |
213 * This number can almost certainly be raised if required. | |
214 */ | |
215 static const int kMaxVertexAttribs = 6; | |
216 | |
217 struct GrAttribute { | |
218 GrAttribute(const char* name, GrVertexAttribType type) | |
219 : fName(name) | |
220 , fType(type) | |
221 , fOffset(SkAlign4(GrVertexAttribTypeSize(type))) {} | |
222 const char* fName; | |
223 GrVertexAttribType fType; | |
224 size_t fOffset; | |
225 }; | |
226 | |
227 typedef SkTArray<GrAttribute, true> VertexAttribArray; | |
228 | |
229 const VertexAttribArray& getAttribs() const { return fAttribs; } | |
230 | |
231 // Returns the vertex stride of the GP. A common use case is to request geo metry from a | |
232 // drawtarget based off of the stride, and to populate this memory using an implicit array of | |
233 // structs. In this case, it is best to assert the vertexstride == sizeof(V ertexStruct). | |
234 size_t getVertexStride() const { return fVertexStride; } | |
235 | |
236 bool willUseGeoShader() const { return fWillUseGeoShader; } | 243 bool willUseGeoShader() const { return fWillUseGeoShader; } |
237 | 244 |
238 /* | 245 /* |
239 * In an ideal world, two GrGeometryProcessors with the same class id and te xture accesses | 246 * In an ideal world, two GrGeometryProcessors with the same class id and te xture accesses |
240 * would ALWAYS be able to batch together. If two GrGeometryProcesosrs are the same then we | 247 * would ALWAYS be able to batch together. If two GrGeometryProcesosrs are the same then we |
241 * will only keep one of them. The remaining GrGeometryProcessor then updat es its | 248 * will only keep one of them. The remaining GrGeometryProcessor then updat es its |
242 * GrBatchTracker to incorporate the draw information from the GrGeometryPro cessor we discard. | 249 * GrBatchTracker to incorporate the draw information from the GrGeometryPro cessor we discard. |
243 * Any bundles associated with the discarded GrGeometryProcessor will be att ached to the | 250 * Any bundles associated with the discarded GrGeometryProcessor will be att ached to the |
244 * remaining GrGeometryProcessor. | 251 * remaining GrGeometryProcessor. |
245 */ | 252 */ |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
335 private: | 342 private: |
336 virtual bool onCanMakeEqual(const GrBatchTracker& mine, | 343 virtual bool onCanMakeEqual(const GrBatchTracker& mine, |
337 const GrGeometryProcessor& that, | 344 const GrGeometryProcessor& that, |
338 const GrBatchTracker& theirs) const = 0; | 345 const GrBatchTracker& theirs) const = 0; |
339 | 346 |
340 // TODO delete this when we have more advanced equality testing via bundles and the BT | 347 // TODO delete this when we have more advanced equality testing via bundles and the BT |
341 virtual bool onIsEqual(const GrGeometryProcessor&) const = 0; | 348 virtual bool onIsEqual(const GrGeometryProcessor&) const = 0; |
342 | 349 |
343 bool hasExplicitLocalCoords() const SK_OVERRIDE { return fHasLocalCoords; } | 350 bool hasExplicitLocalCoords() const SK_OVERRIDE { return fHasLocalCoords; } |
344 | 351 |
345 SkSTArray<kMaxVertexAttribs, GrAttribute, true> fAttribs; | |
346 size_t fVertexStride; | |
347 GrColor fColor; | 352 GrColor fColor; |
348 bool fOpaqueVertexColors; | 353 bool fOpaqueVertexColors; |
349 bool fWillUseGeoShader; | 354 bool fWillUseGeoShader; |
350 bool fHasVertexColor; | 355 bool fHasVertexColor; |
351 bool fHasLocalCoords; | 356 bool fHasLocalCoords; |
352 | 357 |
353 typedef GrPrimitiveProcessor INHERITED; | 358 typedef GrPrimitiveProcessor INHERITED; |
354 }; | 359 }; |
355 | 360 |
356 /* | 361 /* |
(...skipping 14 matching lines...) Expand all Loading... | |
371 const GrPrimitiveProcessor& that, | 376 const GrPrimitiveProcessor& that, |
372 const GrBatchTracker& theirs) const SK_OVERRIDE; | 377 const GrBatchTracker& theirs) const SK_OVERRIDE; |
373 | 378 |
374 const char* name() const SK_OVERRIDE { return "PathProcessor"; } | 379 const char* name() const SK_OVERRIDE { return "PathProcessor"; } |
375 | 380 |
376 GrColor color() const { return fColor; } | 381 GrColor color() const { return fColor; } |
377 | 382 |
378 void getInvariantOutputColor(GrInitInvariantOutput* out) const SK_OVERRIDE; | 383 void getInvariantOutputColor(GrInitInvariantOutput* out) const SK_OVERRIDE; |
379 void getInvariantOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRID E; | 384 void getInvariantOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRID E; |
380 | 385 |
386 bool willUseGeoShader() const SK_OVERRIDE { return false; } | |
387 | |
381 virtual void getGLProcessorKey(const GrBatchTracker& bt, | 388 virtual void getGLProcessorKey(const GrBatchTracker& bt, |
382 const GrGLCaps& caps, | 389 const GrGLCaps& caps, |
383 GrProcessorKeyBuilder* b) const SK_OVERRIDE; | 390 GrProcessorKeyBuilder* b) const SK_OVERRIDE; |
384 | 391 |
385 virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt, | 392 virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt, |
386 const GrGLCaps& caps) const SK_OVERRIDE; | 393 const GrGLCaps& caps) const SK_OVERRIDE; |
387 | 394 |
388 protected: | 395 protected: |
389 GrPathProcessor(GrColor color, const SkMatrix& viewMatrix, const SkMatrix& l ocalMatrix); | 396 GrPathProcessor(GrColor color, const SkMatrix& viewMatrix, const SkMatrix& l ocalMatrix); |
390 | 397 |
391 private: | 398 private: |
392 bool hasExplicitLocalCoords() const SK_OVERRIDE { return false; } | 399 bool hasExplicitLocalCoords() const SK_OVERRIDE { return false; } |
393 | 400 |
394 GrColor fColor; | 401 GrColor fColor; |
395 | 402 |
396 typedef GrPrimitiveProcessor INHERITED; | 403 typedef GrPrimitiveProcessor INHERITED; |
397 }; | 404 }; |
398 | 405 |
399 #endif | 406 #endif |
OLD | NEW |