| 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;
 | 
| 
 |