aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/GrGeometryProcessor.h
diff options
context:
space:
mode:
authorGravatar joshualitt <joshualitt@chromium.org>2015-01-14 08:12:47 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-01-14 08:12:47 -0800
commit71c9260e6fa1798ad1e41b2c2ae9b3cce08bb610 (patch)
tree6dcf4f549ee113669d8becc37c83225fcba36ba5 /src/gpu/GrGeometryProcessor.h
parent95145a9d3e0be24769c4c4e3810058e08b06fd3b (diff)
More changes to bring together path / geo procs
Diffstat (limited to 'src/gpu/GrGeometryProcessor.h')
-rw-r--r--src/gpu/GrGeometryProcessor.h79
1 files changed, 48 insertions, 31 deletions
diff --git a/src/gpu/GrGeometryProcessor.h b/src/gpu/GrGeometryProcessor.h
index 074fffcfb0..43b6a7e31a 100644
--- a/src/gpu/GrGeometryProcessor.h
+++ b/src/gpu/GrGeometryProcessor.h
@@ -121,6 +121,41 @@ public:
virtual void getInvariantOutputColor(GrInitInvariantOutput* out) const = 0;
virtual void getInvariantOutputCoverage(GrInitInvariantOutput* out) const = 0;
+ // Only the GrGeometryProcessor subclass actually has a geo shader or vertex attributes, but
+ // we put these calls on the base class to prevent having to cast
+ virtual bool willUseGeoShader() const = 0;
+
+ /*
+ * This is a safeguard to prevent GrPrimitiveProcessor's from going beyond platform specific
+ * attribute limits. This number can almost certainly be raised if required.
+ */
+ static const int kMaxVertexAttribs = 6;
+
+ struct Attribute {
+ Attribute()
+ : fName(NULL)
+ , fType(kFloat_GrVertexAttribType)
+ , fOffset(0) {}
+ Attribute(const char* name, GrVertexAttribType type)
+ : fName(name)
+ , fType(type)
+ , fOffset(SkAlign4(GrVertexAttribTypeSize(type))) {}
+ const char* fName;
+ GrVertexAttribType fType;
+ size_t fOffset;
+ };
+
+ int numAttribs() const { return fNumAttribs; }
+ const Attribute& getAttrib(int index) const {
+ SkASSERT(index < fNumAttribs);
+ return fAttribs[index];
+ }
+
+ // Returns the vertex stride of the GP. A common use case is to request geometry from a
+ // drawtarget based off of the stride, and to populate this memory using an implicit array of
+ // structs. In this case, it is best to assert the vertexstride == sizeof(VertexStruct).
+ size_t getVertexStride() const { return fVertexStride; }
+
/**
* Gets a transformKey from an array of coord transforms
*/
@@ -143,7 +178,9 @@ public:
protected:
GrPrimitiveProcessor(const SkMatrix& viewMatrix, const SkMatrix& localMatrix)
- : fViewMatrix(viewMatrix)
+ : fNumAttribs(0)
+ , fVertexStride(0)
+ , fViewMatrix(viewMatrix)
, fLocalMatrix(localMatrix) {}
/*
@@ -176,6 +213,10 @@ protected:
return true;
}
+ Attribute fAttribs[kMaxVertexAttribs];
+ int fNumAttribs;
+ size_t fVertexStride;
+
private:
virtual bool hasExplicitLocalCoords() const = 0;
@@ -201,38 +242,12 @@ public:
const SkMatrix& localMatrix = SkMatrix::I(),
bool opaqueVertexColors = false)
: INHERITED(viewMatrix, localMatrix)
- , fVertexStride(0)
, fColor(color)
, fOpaqueVertexColors(opaqueVertexColors)
, fWillUseGeoShader(false)
, fHasVertexColor(false)
, fHasLocalCoords(false) {}
- /*
- * This is a safeguard to prevent GPs from going beyond platform specific attribute limits.
- * This number can almost certainly be raised if required.
- */
- static const int kMaxVertexAttribs = 6;
-
- struct GrAttribute {
- GrAttribute(const char* name, GrVertexAttribType type)
- : fName(name)
- , fType(type)
- , fOffset(SkAlign4(GrVertexAttribTypeSize(type))) {}
- const char* fName;
- GrVertexAttribType fType;
- size_t fOffset;
- };
-
- typedef SkTArray<GrAttribute, true> VertexAttribArray;
-
- const VertexAttribArray& getAttribs() const { return fAttribs; }
-
- // Returns the vertex stride of the GP. A common use case is to request geometry from a
- // drawtarget based off of the stride, and to populate this memory using an implicit array of
- // structs. In this case, it is best to assert the vertexstride == sizeof(VertexStruct).
- size_t getVertexStride() const { return fVertexStride; }
-
bool willUseGeoShader() const { return fWillUseGeoShader; }
/*
@@ -318,9 +333,11 @@ protected:
* The processor key should reflect the vertex attributes, or there lack thereof in the
* GrGeometryProcessor.
*/
- const GrAttribute& addVertexAttrib(const GrAttribute& attribute) {
+ const Attribute& addVertexAttrib(const Attribute& attribute) {
+ SkASSERT(fNumAttribs < kMaxVertexAttribs);
fVertexStride += attribute.fOffset;
- return fAttribs.push_back(attribute);
+ fAttribs[fNumAttribs] = attribute;
+ return fAttribs[fNumAttribs++];
}
void setWillUseGeoShader() { fWillUseGeoShader = true; }
@@ -342,8 +359,6 @@ private:
bool hasExplicitLocalCoords() const SK_OVERRIDE { return fHasLocalCoords; }
- SkSTArray<kMaxVertexAttribs, GrAttribute, true> fAttribs;
- size_t fVertexStride;
GrColor fColor;
bool fOpaqueVertexColors;
bool fWillUseGeoShader;
@@ -378,6 +393,8 @@ public:
void getInvariantOutputColor(GrInitInvariantOutput* out) const SK_OVERRIDE;
void getInvariantOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRIDE;
+ bool willUseGeoShader() const SK_OVERRIDE { return false; }
+
virtual void getGLProcessorKey(const GrBatchTracker& bt,
const GrGLCaps& caps,
GrProcessorKeyBuilder* b) const SK_OVERRIDE;