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

Side by Side Diff: src/gpu/GrPrimitiveProcessor.h

Issue 920863002: A simple change to move a bunch of stuff out of Gr*Geometry.h (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: clang fix Created 5 years, 10 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 | « src/gpu/GrPipelineBuilder.h ('k') | src/gpu/GrPrimitiveProcessor.cpp » ('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 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 GrPrimitiveProcessor_DEFINED
9 #define GrGeometryProcessor_DEFINED 9 #define GrPrimitiveProcessor_DEFINED
10 10
11 #include "GrColor.h" 11 #include "GrColor.h"
12 #include "GrProcessor.h" 12 #include "GrProcessor.h"
13 #include "GrShaderVar.h" 13 #include "GrShaderVar.h"
14 14
15 /* 15 /*
16 * The GrPrimitiveProcessor represents some kind of geometric primitive. This i ncludes the shape 16 * The GrPrimitiveProcessor represents some kind of geometric primitive. This i ncludes the shape
17 * of the primitive and the inherent color of the primitive. The GrPrimitivePro cessor is 17 * of the primitive and the inherent color of the primitive. The GrPrimitivePro cessor is
18 * responsible for providing a color and coverage input into the Ganesh renderin g pipeline. Through 18 * responsible for providing a color and coverage input into the Ganesh renderin g pipeline. Through
19 * optimization, Ganesh may decide a different color, no color, and / or no cove rage are required 19 * optimization, Ganesh may decide a different color, no color, and / or no cove rage are required
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
220 private: 220 private:
221 virtual bool hasExplicitLocalCoords() const = 0; 221 virtual bool hasExplicitLocalCoords() const = 0;
222 222
223 const SkMatrix fViewMatrix; 223 const SkMatrix fViewMatrix;
224 SkMatrix fLocalMatrix; 224 SkMatrix fLocalMatrix;
225 bool fIsPathRendering; 225 bool fIsPathRendering;
226 226
227 typedef GrProcessor INHERITED; 227 typedef GrProcessor INHERITED;
228 }; 228 };
229 229
230 /**
231 * A GrGeometryProcessor is a flexible method for rendering a primitive. The Gr GeometryProcessor
232 * has complete control over vertex attributes and uniforms(aside from the rende r target) but it
233 * must obey the same contract as any GrPrimitiveProcessor, specifically it must emit a color and
234 * coverage into the fragment shader. Where this color and coverage come from i s completely the
235 * responsibility of the GrGeometryProcessor.
236 */
237 class GrGeometryProcessor : public GrPrimitiveProcessor {
238 public:
239 // TODO the Hint can be handled in a much more clean way when we have deferr ed geometry or
240 // atleast bundles
241 GrGeometryProcessor(GrColor color,
242 const SkMatrix& viewMatrix = SkMatrix::I(),
243 const SkMatrix& localMatrix = SkMatrix::I(),
244 bool opaqueVertexColors = false)
245 : INHERITED(viewMatrix, localMatrix, false)
246 , fColor(color)
247 , fOpaqueVertexColors(opaqueVertexColors)
248 , fWillUseGeoShader(false)
249 , fHasVertexColor(false)
250 , fHasLocalCoords(false) {}
251
252 bool willUseGeoShader() const { return fWillUseGeoShader; }
253
254 /*
255 * In an ideal world, two GrGeometryProcessors with the same class id and te xture accesses
256 * would ALWAYS be able to batch together. If two GrGeometryProcesosrs are the same then we
257 * will only keep one of them. The remaining GrGeometryProcessor then updat es its
258 * GrBatchTracker to incorporate the draw information from the GrGeometryPro cessor we discard.
259 * Any bundles associated with the discarded GrGeometryProcessor will be att ached to the
260 * remaining GrGeometryProcessor.
261 */
262 bool canMakeEqual(const GrBatchTracker& mine,
263 const GrPrimitiveProcessor& that,
264 const GrBatchTracker& theirs) const SK_OVERRIDE {
265 if (this->classID() != that.classID() || !this->hasSameTextureAccesses(t hat)) {
266 return false;
267 }
268
269 // TODO let the GPs decide this
270 if (!this->viewMatrix().cheapEqualTo(that.viewMatrix())) {
271 return false;
272 }
273
274 // TODO remove the hint
275 const GrGeometryProcessor& other = that.cast<GrGeometryProcessor>();
276 if (fHasVertexColor && fOpaqueVertexColors != other.fOpaqueVertexColors) {
277 return false;
278 }
279
280 // TODO this equality test should really be broken up, some of this can live on the batch
281 // tracker test and some of this should be in bundles
282 if (!this->onIsEqual(other)) {
283 return false;
284 }
285
286 return this->onCanMakeEqual(mine, other, theirs);
287 }
288
289 // TODO we can remove color from the GrGeometryProcessor base class once we have bundles of
290 // primitive data
291 GrColor color() const { return fColor; }
292
293 // TODO this is a total hack until the gp can do deferred geometry
294 bool hasVertexColor() const { return fHasVertexColor; }
295
296 void getInvariantOutputColor(GrInitInvariantOutput* out) const SK_OVERRIDE;
297 void getInvariantOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRID E;
298
299 protected:
300 /*
301 * An optional simple helper function to determine by what means the GrGeome tryProcessor should
302 * use to provide color. If we are given an override color(ie the given ove rridecolor is NOT
303 * GrColor_ILLEGAL) then we must always emit that color(currently overrides are only supported
304 * via uniform, but with deferred Geometry we could use attributes). Otherw ise, if our color is
305 * ignored then we should not emit a color. Lastly, if we don't have vertex colors then we must
306 * emit a color via uniform
307 * TODO this function changes quite a bit with deferred geometry. There the GrGeometryProcessor
308 * can upload a new color via attribute if needed.
309 */
310 static GrGPInput GetColorInputType(GrColor* color, GrColor primitiveColor,
311 const GrPipelineInfo& init,
312 bool hasVertexColor) {
313 if (init.fColorIgnored) {
314 *color = GrColor_ILLEGAL;
315 return kIgnored_GrGPInput;
316 } else if (GrColor_ILLEGAL != init.fOverrideColor) {
317 *color = init.fOverrideColor;
318 return kUniform_GrGPInput;
319 }
320
321 *color = primitiveColor;
322 if (hasVertexColor) {
323 return kAttribute_GrGPInput;
324 } else {
325 return kUniform_GrGPInput;
326 }
327 }
328
329 /**
330 * Subclasses call this from their constructor to register vertex attributes . Attributes
331 * will be padded to the nearest 4 bytes for performance reasons.
332 * TODO After deferred geometry, we should do all of this inline in Generate Geometry alongside
333 * the struct used to actually populate the attributes. This is all extreme ly fragile, vertex
334 * attributes have to be added in the order they will appear in the struct w hich maps memory.
335 * The processor key should reflect the vertex attributes, or there lack the reof in the
336 * GrGeometryProcessor.
337 */
338 const Attribute& addVertexAttrib(const Attribute& attribute) {
339 SkASSERT(fNumAttribs < kMaxVertexAttribs);
340 fVertexStride += attribute.fOffset;
341 fAttribs[fNumAttribs] = attribute;
342 return fAttribs[fNumAttribs++];
343 }
344
345 void setWillUseGeoShader() { fWillUseGeoShader = true; }
346
347 // TODO hack see above
348 void setHasVertexColor() { fHasVertexColor = true; }
349 void setHasLocalCoords() { fHasLocalCoords = true; }
350
351 virtual void onGetInvariantOutputColor(GrInitInvariantOutput*) const {}
352 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const = 0;
353
354 private:
355 virtual bool onCanMakeEqual(const GrBatchTracker& mine,
356 const GrGeometryProcessor& that,
357 const GrBatchTracker& theirs) const = 0;
358
359 // TODO delete this when we have more advanced equality testing via bundles and the BT
360 virtual bool onIsEqual(const GrGeometryProcessor&) const = 0;
361
362 bool hasExplicitLocalCoords() const SK_OVERRIDE { return fHasLocalCoords; }
363
364 GrColor fColor;
365 bool fOpaqueVertexColors;
366 bool fWillUseGeoShader;
367 bool fHasVertexColor;
368 bool fHasLocalCoords;
369
370 typedef GrPrimitiveProcessor INHERITED;
371 };
372
373 /*
374 * The path equivalent of the GP. For now this just manages color. In the long term we plan on
375 * extending this class to handle all nvpr uniform / varying / program work.
376 */
377 class GrPathProcessor : public GrPrimitiveProcessor {
378 public:
379 static GrPathProcessor* Create(GrColor color,
380 const SkMatrix& viewMatrix = SkMatrix::I(),
381 const SkMatrix& localMatrix = SkMatrix::I()) {
382 return SkNEW_ARGS(GrPathProcessor, (color, viewMatrix, localMatrix));
383 }
384
385 void initBatchTracker(GrBatchTracker*, const GrPipelineInfo&) const SK_OVERR IDE;
386
387 bool canMakeEqual(const GrBatchTracker& mine,
388 const GrPrimitiveProcessor& that,
389 const GrBatchTracker& theirs) const SK_OVERRIDE;
390
391 const char* name() const SK_OVERRIDE { return "PathProcessor"; }
392
393 GrColor color() const { return fColor; }
394
395 void getInvariantOutputColor(GrInitInvariantOutput* out) const SK_OVERRIDE;
396 void getInvariantOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRID E;
397
398 bool willUseGeoShader() const SK_OVERRIDE { return false; }
399
400 virtual void getGLProcessorKey(const GrBatchTracker& bt,
401 const GrGLCaps& caps,
402 GrProcessorKeyBuilder* b) const SK_OVERRIDE;
403
404 virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt,
405 const GrGLCaps& caps) const SK_OVERRIDE;
406
407 protected:
408 GrPathProcessor(GrColor color, const SkMatrix& viewMatrix, const SkMatrix& l ocalMatrix);
409
410 private:
411 bool hasExplicitLocalCoords() const SK_OVERRIDE { return false; }
412
413 GrColor fColor;
414
415 typedef GrPrimitiveProcessor INHERITED;
416 };
417
418 #endif 230 #endif
OLDNEW
« no previous file with comments | « src/gpu/GrPipelineBuilder.h ('k') | src/gpu/GrPrimitiveProcessor.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698