diff options
Diffstat (limited to 'src/gpu/GrAAConvexPathRenderer.cpp')
-rw-r--r-- | src/gpu/GrAAConvexPathRenderer.cpp | 81 |
1 files changed, 32 insertions, 49 deletions
diff --git a/src/gpu/GrAAConvexPathRenderer.cpp b/src/gpu/GrAAConvexPathRenderer.cpp index 0d909b1dc6..1b7efefd07 100644 --- a/src/gpu/GrAAConvexPathRenderer.cpp +++ b/src/gpu/GrAAConvexPathRenderer.cpp @@ -525,8 +525,9 @@ static void create_vertices(const SegmentArray& segments, class QuadEdgeEffect : public GrGeometryProcessor { public: - static GrGeometryProcessor* Create(GrColor color, const SkMatrix& localMatrix) { - return SkNEW_ARGS(QuadEdgeEffect, (color, localMatrix)); + static GrGeometryProcessor* Create(GrColor color, const SkMatrix& localMatrix, + bool usesLocalCoords) { + return SkNEW_ARGS(QuadEdgeEffect, (color, localMatrix, usesLocalCoords)); } virtual ~QuadEdgeEffect() {} @@ -536,7 +537,9 @@ public: const Attribute* inPosition() const { return fInPosition; } const Attribute* inQuadEdge() const { return fInQuadEdge; } GrColor color() const { return fColor; } + bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } const SkMatrix& localMatrix() const { return fLocalMatrix; } + bool usesLocalCoords() const { return fUsesLocalCoords; } class GLProcessor : public GrGLGeometryProcessor { public: @@ -556,11 +559,10 @@ public: args.fPB->addVarying("QuadEdge", &v); vsBuilder->codeAppendf("%s = %s;", v.vsOut(), qe.inQuadEdge()->fName); - const BatchTracker& local = args.fBT.cast<BatchTracker>(); - // Setup pass through color - this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, NULL, - &fColorUniform); + if (!qe.colorIgnored()) { + this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); + } // Setup position this->setupPosition(pb, gpArgs, qe.inPosition()->fName); @@ -598,22 +600,22 @@ public: const GrBatchTracker& bt, const GrGLSLCaps&, GrProcessorKeyBuilder* b) { - const BatchTracker& local = bt.cast<BatchTracker>(); const QuadEdgeEffect& qee = gp.cast<QuadEdgeEffect>(); - uint32_t key = local.fInputColorType << 16; - key |= local.fUsesLocalCoords && qee.localMatrix().hasPerspective() ? 0x1 : 0x0; + uint32_t key = 0; + key |= qee.usesLocalCoords() && qee.localMatrix().hasPerspective() ? 0x1 : 0x0; + key |= qee.colorIgnored() ? 0x2 : 0x0; b->add32(key); } virtual void setData(const GrGLProgramDataManager& pdman, const GrPrimitiveProcessor& gp, const GrBatchTracker& bt) override { - const BatchTracker& local = bt.cast<BatchTracker>(); - if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { + const QuadEdgeEffect& qe = gp.cast<QuadEdgeEffect>(); + if (qe.color() != fColor) { GrGLfloat c[4]; - GrColorToRGBAFloat(local.fColor, c); + GrColorToRGBAFloat(qe.color(), c); pdman.set4fv(fColorUniform, 1, c); - fColor = local.fColor; + fColor = qe.color(); } } @@ -642,31 +644,21 @@ public: return SkNEW_ARGS(GLProcessor, (*this, bt)); } - void initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const override { - BatchTracker* local = bt->cast<BatchTracker>(); - local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false); - local->fUsesLocalCoords = init.fUsesLocalCoords; - } - private: - QuadEdgeEffect(GrColor color, const SkMatrix& localMatrix) + QuadEdgeEffect(GrColor color, const SkMatrix& localMatrix, bool usesLocalCoords) : fColor(color) - , fLocalMatrix(localMatrix) { + , fLocalMatrix(localMatrix) + , fUsesLocalCoords(usesLocalCoords) { this->initClassID<QuadEdgeEffect>(); fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType)); fInQuadEdge = &this->addVertexAttrib(Attribute("inQuadEdge", kVec4f_GrVertexAttribType)); } - struct BatchTracker { - GrGPInput fInputColorType; - GrColor fColor; - bool fUsesLocalCoords; - }; - const Attribute* fInPosition; const Attribute* fInQuadEdge; GrColor fColor; SkMatrix fLocalMatrix; + bool fUsesLocalCoords; GR_DECLARE_GEOMETRY_PROCESSOR_TEST; @@ -682,7 +674,8 @@ GrGeometryProcessor* QuadEdgeEffect::TestCreate(SkRandom* random, // Doesn't work without derivative instructions. return caps.shaderCaps()->shaderDerivativeSupport() ? QuadEdgeEffect::Create(GrRandomColor(random), - GrTest::TestMatrix(random)) : NULL; + GrTest::TestMatrix(random), + random->nextBool()) : NULL; } /////////////////////////////////////////////////////////////////////////////// @@ -732,13 +725,16 @@ static void extract_verts(const GrAAConvexTessellator& tess, } static const GrGeometryProcessor* create_fill_gp(bool tweakAlphaForCoverage, - const SkMatrix& localMatrix) { + const SkMatrix& localMatrix, + bool usesLocalCoords, + bool coverageIgnored) { uint32_t flags = GrDefaultGeoProcFactory::kColor_GPType; if (!tweakAlphaForCoverage) { flags |= GrDefaultGeoProcFactory::kCoverage_GPType; } - return GrDefaultGeoProcFactory::Create(flags, GrColor_WHITE, SkMatrix::I(), localMatrix); + return GrDefaultGeoProcFactory::Create(flags, GrColor_WHITE, usesLocalCoords, coverageIgnored, + SkMatrix::I(), localMatrix); } class AAConvexPathBatch : public GrBatch { @@ -791,18 +787,12 @@ public: // Setup GrGeometryProcessor SkAutoTUnref<const GrGeometryProcessor> gp( - create_fill_gp(canTweakAlphaForCoverage, invert)); + create_fill_gp(canTweakAlphaForCoverage, invert, + this->usesLocalCoords(), + this->coverageIgnored())); batchTarget->initDraw(gp, pipeline); - // TODO remove this when batch is everywhere - GrPipelineInfo init; - init.fColorIgnored = fBatch.fColorIgnored; - init.fOverrideColor = GrColor_ILLEGAL; - init.fCoverageIgnored = fBatch.fCoverageIgnored; - init.fUsesLocalCoords = this->usesLocalCoords(); - gp->initBatchTracker(batchTarget->currentBatchTracker(), init); - size_t vertexStride = gp->getVertexStride(); SkASSERT(canTweakAlphaForCoverage ? @@ -870,19 +860,11 @@ public: } // Setup GrGeometryProcessor - SkAutoTUnref<GrGeometryProcessor> quadProcessor(QuadEdgeEffect::Create(this->color(), - invert)); + SkAutoTUnref<GrGeometryProcessor> quadProcessor( + QuadEdgeEffect::Create(this->color(), invert, this->usesLocalCoords())); batchTarget->initDraw(quadProcessor, pipeline); - // TODO remove this when batch is everywhere - GrPipelineInfo init; - init.fColorIgnored = fBatch.fColorIgnored; - init.fOverrideColor = GrColor_ILLEGAL; - init.fCoverageIgnored = fBatch.fCoverageIgnored; - init.fUsesLocalCoords = this->usesLocalCoords(); - quadProcessor->initBatchTracker(batchTarget->currentBatchTracker(), init); - // TODO generate all segments for all paths and use one vertex buffer for (int i = 0; i < instanceCount; i++) { Geometry& args = fGeoData[i]; @@ -991,6 +973,7 @@ private: bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; } bool canTweakAlphaForCoverage() const { return fBatch.fCanTweakAlphaForCoverage; } const SkMatrix& viewMatrix() const { return fGeoData[0].fViewMatrix; } + bool coverageIgnored() const { return fBatch.fCoverageIgnored; } struct BatchTracker { GrColor fColor; |