Index: src/gpu/GrDefaultGeoProcFactory.cpp |
diff --git a/src/gpu/GrDefaultGeoProcFactory.cpp b/src/gpu/GrDefaultGeoProcFactory.cpp |
index 639a593220c68fbf56b099517084e373434597bc..f8d30f8395e2ed3f218f26315f92eb4dd7ea040f 100644 |
--- a/src/gpu/GrDefaultGeoProcFactory.cpp |
+++ b/src/gpu/GrDefaultGeoProcFactory.cpp |
@@ -16,6 +16,14 @@ |
* matrix. It also leaves coverage untouched. Behind the scenes, we may add per vertex color or |
* local coords. |
*/ |
+ |
+enum GPFlag { |
+ kColor_GPFlag = 0x1, |
+ kLocalCoord_GPFlag = 0x2, |
+ kCoverage_GPFlag= 0x4, |
+ kTransformedLocalCoord_GPFlag = 0x8, |
+}; |
+ |
class DefaultGeoProc : public GrGeometryProcessor { |
public: |
static GrGeometryProcessor* Create(uint32_t gpTypeFlags, |
@@ -77,10 +85,14 @@ public: |
this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix(), |
&fViewMatrixUniform); |
- if (gp.inLocalCoords()) { |
+ if (gp.hasExplicitLocalCoords()) { |
// emit transforms with explicit local coords |
this->emitTransforms(pb, gpArgs->fPositionVar, gp.inLocalCoords()->fName, |
gp.localMatrix(), args.fTransformsIn, args.fTransformsOut); |
+ } else if(gp.hasTransformedLocalCoords()) { |
+ // transforms have already been applied to vertex attributes on the cpu |
+ this->emitTransforms(pb, gp.inLocalCoords()->fName, |
+ args.fTransformsIn, args.fTransformsOut); |
} else { |
// emit transforms with position |
this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, |
@@ -199,9 +211,11 @@ private: |
, fLocalCoordsWillBeRead(localCoordsWillBeRead) |
, fCoverageWillBeIgnored(coverageWillBeIgnored) { |
this->initClassID<DefaultGeoProc>(); |
- bool hasColor = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kColor_GPType); |
- bool hasLocalCoord = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kLocalCoord_GPType); |
- bool hasCoverage = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kCoverage_GPType); |
+ bool hasColor = SkToBool(gpTypeFlags & kColor_GPFlag); |
+ bool hasExplicitLocalCoords = SkToBool(gpTypeFlags & kLocalCoord_GPFlag); |
+ bool hasTransformedLocalCoords = SkToBool(gpTypeFlags & kTransformedLocalCoord_GPFlag); |
+ bool hasLocalCoord = hasExplicitLocalCoords || hasTransformedLocalCoords; |
+ bool hasCoverage = SkToBool(gpTypeFlags & kCoverage_GPFlag); |
fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType, |
kHigh_GrSLPrecision)); |
if (hasColor) { |
@@ -210,7 +224,12 @@ private: |
if (hasLocalCoord) { |
fInLocalCoords = &this->addVertexAttrib(Attribute("inLocalCoord", |
kVec2f_GrVertexAttribType)); |
- this->setHasLocalCoords(); |
+ if (hasExplicitLocalCoords) { |
+ this->setHasExplicitLocalCoords(); |
+ } else { |
+ SkASSERT(hasTransformedLocalCoords); |
+ this->setHasTransformedLocalCoords(); |
+ } |
} |
if (hasCoverage) { |
fInCoverage = &this->addVertexAttrib(Attribute("inCoverage", |
@@ -240,13 +259,16 @@ GR_DEFINE_GEOMETRY_PROCESSOR_TEST(DefaultGeoProc); |
GrGeometryProcessor* DefaultGeoProc::TestCreate(GrProcessorTestData* d) { |
uint32_t flags = 0; |
if (d->fRandom->nextBool()) { |
- flags |= GrDefaultGeoProcFactory::kColor_GPType; |
+ flags |= kColor_GPFlag; |
+ } |
+ if (d->fRandom->nextBool()) { |
+ flags |= kCoverage_GPFlag; |
} |
if (d->fRandom->nextBool()) { |
- flags |= GrDefaultGeoProcFactory::kCoverage_GPType; |
+ flags |= kLocalCoord_GPFlag; |
} |
if (d->fRandom->nextBool()) { |
- flags |= GrDefaultGeoProcFactory::kLocalCoord_GPType; |
+ flags |= kTransformedLocalCoord_GPFlag; |
} |
return DefaultGeoProc::Create(flags, |
@@ -263,9 +285,11 @@ const GrGeometryProcessor* GrDefaultGeoProcFactory::Create(const Color& color, |
const LocalCoords& localCoords, |
const SkMatrix& viewMatrix) { |
uint32_t flags = 0; |
- flags |= color.fType == Color::kAttribute_Type ? kColor_GPType : 0; |
- flags |= coverage.fType == Coverage::kAttribute_Type ? kCoverage_GPType : 0; |
- flags |= localCoords.fType == LocalCoords::kHasExplicit_Type ? kLocalCoord_GPType : 0; |
+ flags |= color.fType == Color::kAttribute_Type ? kColor_GPFlag : 0; |
+ flags |= coverage.fType == Coverage::kAttribute_Type ? kCoverage_GPFlag : 0; |
+ flags |= localCoords.fType == LocalCoords::kHasExplicit_Type ? kLocalCoord_GPFlag : 0; |
+ flags |= localCoords.fType == LocalCoords::kHasTransformed_Type ? |
+ kTransformedLocalCoord_GPFlag : 0; |
uint8_t inCoverage = coverage.fCoverage; |
bool coverageWillBeIgnored = coverage.fType == Coverage::kNone_Type; |