| Index: src/gpu/GrDefaultGeoProcFactory.cpp
|
| diff --git a/src/gpu/GrDefaultGeoProcFactory.cpp b/src/gpu/GrDefaultGeoProcFactory.cpp
|
| index 55b3a1f9ef4853e4627c1b98750234a26f9d18cf..6dbf71e0d89930fff7f1969d82a1a335412f36b4 100644
|
| --- a/src/gpu/GrDefaultGeoProcFactory.cpp
|
| +++ b/src/gpu/GrDefaultGeoProcFactory.cpp
|
| @@ -24,16 +24,12 @@
|
| GrColor color,
|
| const SkMatrix& viewMatrix,
|
| const SkMatrix& localMatrix,
|
| - bool usesLocalCoords,
|
| - bool coverageIgnored,
|
| uint8_t coverage) {
|
| return SkNEW_ARGS(DefaultGeoProc, (gpTypeFlags,
|
| color,
|
| viewMatrix,
|
| localMatrix,
|
| - coverage,
|
| - usesLocalCoords,
|
| - coverageIgnored));
|
| + coverage));
|
| }
|
|
|
| const char* name() const override { return "DefaultGeometryProcessor"; }
|
| @@ -43,14 +39,30 @@
|
| const Attribute* inLocalCoords() const { return fInLocalCoords; }
|
| const Attribute* inCoverage() const { return fInCoverage; }
|
| GrColor color() const { return fColor; }
|
| - bool colorIgnored() const { return GrColor_ILLEGAL == fColor; }
|
| - bool hasVertexColor() const { return SkToBool(fInColor); }
|
| const SkMatrix& viewMatrix() const { return fViewMatrix; }
|
| const SkMatrix& localMatrix() const { return fLocalMatrix; }
|
| - bool usesLocalCoords() const { return fUsesLocalCoords; }
|
| uint8_t coverage() const { return fCoverage; }
|
| - bool coverageIgnored() const { return fCoverageIgnored; }
|
| - bool hasVertexCoverage() const { return SkToBool(fInCoverage); }
|
| +
|
| + void initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const override {
|
| + BatchTracker* local = bt->cast<BatchTracker>();
|
| + local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init,
|
| + SkToBool(fInColor));
|
| +
|
| + bool hasVertexCoverage = SkToBool(fInCoverage) && !init.fCoverageIgnored;
|
| + bool covIsSolidWhite = !hasVertexCoverage && 0xff == this->coverage();
|
| + if (init.fCoverageIgnored) {
|
| + local->fInputCoverageType = kIgnored_GrGPInput;
|
| + } else if (covIsSolidWhite) {
|
| + local->fInputCoverageType = kAllOnes_GrGPInput;
|
| + } else if (hasVertexCoverage) {
|
| + SkASSERT(fInCoverage);
|
| + local->fInputCoverageType = kAttribute_GrGPInput;
|
| + } else {
|
| + local->fInputCoverageType = kUniform_GrGPInput;
|
| + local->fCoverage = this->coverage();
|
| + }
|
| + local->fUsesLocalCoords = init.fUsesLocalCoords;
|
| + }
|
|
|
| class GLProcessor : public GrGLGeometryProcessor {
|
| public:
|
| @@ -62,19 +74,14 @@
|
| GrGLGPBuilder* pb = args.fPB;
|
| GrGLVertexBuilder* vsBuilder = pb->getVertexShaderBuilder();
|
| GrGLFragmentBuilder* fs = args.fPB->getFragmentShaderBuilder();
|
| + const BatchTracker& local = args.fBT.cast<BatchTracker>();
|
|
|
| // emit attributes
|
| vsBuilder->emitAttributes(gp);
|
|
|
| // Setup pass through color
|
| - if (!gp.colorIgnored()) {
|
| - if (gp.hasVertexColor()) {
|
| - pb->addPassThroughAttribute(gp.inColor(), args.fOutputColor);
|
| - } else {
|
| - this->setupUniformColor(pb, args.fOutputColor, &fColorUniform);
|
| - }
|
| - }
|
| -
|
| + this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, gp.inColor(),
|
| + &fColorUniform);
|
| // Setup position
|
| this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix());
|
|
|
| @@ -89,22 +96,21 @@
|
| }
|
|
|
| // Setup coverage as pass through
|
| - if (!gp.coverageIgnored()) {
|
| - if (gp.hasVertexCoverage()) {
|
| - fs->codeAppendf("float alpha = 1.0;");
|
| - args.fPB->addPassThroughAttribute(gp.inCoverage(), "alpha");
|
| - fs->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage);
|
| - } else if (gp.coverage() == 0xff) {
|
| - fs->codeAppendf("%s = vec4(1);", args.fOutputCoverage);
|
| - } else {
|
| - const char* fragCoverage;
|
| - fCoverageUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility,
|
| - kFloat_GrSLType,
|
| - kDefault_GrSLPrecision,
|
| - "Coverage",
|
| - &fragCoverage);
|
| - fs->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, fragCoverage);
|
| - }
|
| + if (kUniform_GrGPInput == local.fInputCoverageType) {
|
| + const char* fragCoverage;
|
| + fCoverageUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility,
|
| + kFloat_GrSLType,
|
| + kDefault_GrSLPrecision,
|
| + "Coverage",
|
| + &fragCoverage);
|
| + fs->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, fragCoverage);
|
| + } else if (kAttribute_GrGPInput == local.fInputCoverageType) {
|
| + SkASSERT(gp.inCoverage());
|
| + fs->codeAppendf("float alpha = 1.0;");
|
| + args.fPB->addPassThroughAttribute(gp.inCoverage(), "alpha");
|
| + fs->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage);
|
| + } else if (kAllOnes_GrGPInput == local.fInputCoverageType) {
|
| + fs->codeAppendf("%s = vec4(1);", args.fOutputCoverage);
|
| }
|
| }
|
|
|
| @@ -113,13 +119,10 @@
|
| const GrGLSLCaps&,
|
| GrProcessorKeyBuilder* b) {
|
| const DefaultGeoProc& def = gp.cast<DefaultGeoProc>();
|
| + const BatchTracker& local = bt.cast<BatchTracker>();
|
| uint32_t key = def.fFlags;
|
| - key |= def.colorIgnored() << 8;
|
| - key |= def.coverageIgnored() << 9;
|
| - key |= def.hasVertexColor() << 10;
|
| - key |= def.hasVertexCoverage() << 11;
|
| - key |= def.coverage() == 0xff ? 0x1 << 12 : 0;
|
| - key |= def.usesLocalCoords() && def.localMatrix().hasPerspective() ? 0x1 << 24 : 0x0;
|
| + key |= local.fInputColorType << 8 | local.fInputCoverageType << 16;
|
| + key |= local.fUsesLocalCoords && def.localMatrix().hasPerspective() ? 0x1 << 24 : 0x0;
|
| key |= ComputePosKey(def.viewMatrix()) << 25;
|
| b->add32(key);
|
| }
|
| @@ -130,16 +133,16 @@
|
| const DefaultGeoProc& dgp = gp.cast<DefaultGeoProc>();
|
| this->setUniformViewMatrix(pdman, dgp.viewMatrix());
|
|
|
| - if (dgp.color() != fColor && !dgp.hasVertexColor()) {
|
| + const BatchTracker& local = bt.cast<BatchTracker>();
|
| + if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) {
|
| GrGLfloat c[4];
|
| - GrColorToRGBAFloat(dgp.color(), c);
|
| + GrColorToRGBAFloat(local.fColor, c);
|
| pdman.set4fv(fColorUniform, 1, c);
|
| - fColor = dgp.color();
|
| - }
|
| -
|
| - if (dgp.coverage() != fCoverage && !dgp.hasVertexCoverage()) {
|
| - pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(dgp.coverage()));
|
| - fCoverage = dgp.coverage();
|
| + fColor = local.fColor;
|
| + }
|
| + if (kUniform_GrGPInput == local.fInputCoverageType && local.fCoverage != fCoverage) {
|
| + pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(local.fCoverage));
|
| + fCoverage = local.fCoverage;
|
| }
|
| }
|
|
|
| @@ -175,9 +178,7 @@
|
| GrColor color,
|
| const SkMatrix& viewMatrix,
|
| const SkMatrix& localMatrix,
|
| - uint8_t coverage,
|
| - bool usesLocalCoords,
|
| - bool coverageIgnored)
|
| + uint8_t coverage)
|
| : fInPosition(NULL)
|
| , fInColor(NULL)
|
| , fInLocalCoords(NULL)
|
| @@ -186,9 +187,7 @@
|
| , fViewMatrix(viewMatrix)
|
| , fLocalMatrix(localMatrix)
|
| , fCoverage(coverage)
|
| - , fFlags(gpTypeFlags)
|
| - , fUsesLocalCoords(usesLocalCoords)
|
| - , fCoverageIgnored(coverageIgnored) {
|
| + , fFlags(gpTypeFlags) {
|
| this->initClassID<DefaultGeoProc>();
|
| bool hasColor = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kColor_GPType);
|
| bool hasLocalCoord = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kLocalCoord_GPType);
|
| @@ -199,7 +198,7 @@
|
| }
|
| if (hasLocalCoord) {
|
| fInLocalCoords = &this->addVertexAttrib(Attribute("inLocalCoord",
|
| - kVec2f_GrVertexAttribType));
|
| + kVec2f_GrVertexAttribType));
|
| this->setHasLocalCoords();
|
| }
|
| if (hasCoverage) {
|
| @@ -207,6 +206,14 @@
|
| kFloat_GrVertexAttribType));
|
| }
|
| }
|
| +
|
| + struct BatchTracker {
|
| + GrGPInput fInputColorType;
|
| + GrGPInput fInputCoverageType;
|
| + GrColor fColor;
|
| + GrColor fCoverage;
|
| + bool fUsesLocalCoords;
|
| + };
|
|
|
| const Attribute* fInPosition;
|
| const Attribute* fInColor;
|
| @@ -217,8 +224,6 @@
|
| SkMatrix fLocalMatrix;
|
| uint8_t fCoverage;
|
| uint32_t fFlags;
|
| - bool fUsesLocalCoords;
|
| - bool fCoverageIgnored;
|
|
|
| GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
|
|
|
| @@ -246,15 +251,11 @@
|
| GrRandomColor(random),
|
| GrTest::TestMatrix(random),
|
| GrTest::TestMatrix(random),
|
| - random->nextBool(),
|
| - random->nextBool(),
|
| GrRandomCoverage(random));
|
| }
|
|
|
| const GrGeometryProcessor* GrDefaultGeoProcFactory::Create(uint32_t gpTypeFlags,
|
| GrColor color,
|
| - bool usesLocalCoords,
|
| - bool coverageIgnored,
|
| const SkMatrix& viewMatrix,
|
| const SkMatrix& localMatrix,
|
| uint8_t coverage) {
|
| @@ -262,7 +263,5 @@
|
| color,
|
| viewMatrix,
|
| localMatrix,
|
| - usesLocalCoords,
|
| - coverageIgnored,
|
| coverage);
|
| }
|
|
|