Chromium Code Reviews| Index: src/gpu/GrDefaultGeoProcFactory.cpp |
| diff --git a/src/gpu/GrDefaultGeoProcFactory.cpp b/src/gpu/GrDefaultGeoProcFactory.cpp |
| index 639a593220c68fbf56b099517084e373434597bc..aaf9125073154d9263a6f465c97d508b7e30115c 100644 |
| --- a/src/gpu/GrDefaultGeoProcFactory.cpp |
| +++ b/src/gpu/GrDefaultGeoProcFactory.cpp |
| @@ -16,6 +16,16 @@ |
| * matrix. It also leaves coverage untouched. Behind the scenes, we may add per vertex color or |
| * local coords. |
| */ |
| + |
| +enum GPFlag { |
| + kPosition_GPFlag = 0x0, // we ALWAYS have position |
|
bsalomon
2015/08/05 16:20:19
Might be nice to line up the = 0x's
joshualitt
2015/08/05 16:32:30
Acknowledged.
|
| + kColor_GPFlag = 0x01, |
| + kLocalCoord_GPFlag = 0x02, |
| + kCoverage_GPFlag= 0x04, |
| + kTransformedLocalCoord_GPFlag = 0x08, |
| + kLastGPFlag = kTransformedLocalCoord_GPFlag |
|
bsalomon
2015/08/05 16:20:19
Is this used?
joshualitt
2015/08/05 16:32:30
Acknowledged.
|
| +}; |
| + |
| class DefaultGeoProc : public GrGeometryProcessor { |
| public: |
| static GrGeometryProcessor* Create(uint32_t gpTypeFlags, |
| @@ -77,10 +87,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 +213,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 +226,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 +261,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 +287,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; |