This CL wires up the backend portion necessary for sending transformed coords via vertex attributes.
BUG=skia:
Review URL: https://codereview.chromium.org/1243583002
diff --git a/src/gpu/GrDefaultGeoProcFactory.cpp b/src/gpu/GrDefaultGeoProcFactory.cpp
index 639a593..f8d30f8 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 @@
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 @@
, 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 @@
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 @@
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 |= GrDefaultGeoProcFactory::kCoverage_GPType;
+ flags |= kCoverage_GPFlag;
}
if (d->fRandom->nextBool()) {
- flags |= GrDefaultGeoProcFactory::kLocalCoord_GPType;
+ flags |= kLocalCoord_GPFlag;
+ }
+ if (d->fRandom->nextBool()) {
+ flags |= kTransformedLocalCoord_GPFlag;
}
return DefaultGeoProc::Create(flags,
@@ -263,9 +285,11 @@
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;