diff options
author | Jim Van Verth <jvanverth@google.com> | 2017-10-12 10:18:44 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-10-12 14:41:12 +0000 |
commit | 5698c8a8a0dcce3bdabab3551f068bda61d741a3 (patch) | |
tree | e59206036f7352843b0e33976a19808348b2e127 /src/gpu/effects/GrDistanceFieldGeoProc.cpp | |
parent | 7f9b215695aae262797758b2e2a7b1d35fbe584f (diff) |
Batch better in GrSmallPathRenderer and add perspective support.
Minor optimization to text regen also snuck in.
Bug: skia:
Change-Id: I0c5d97defdcf60b9ce663548c056db0e8bf7149b
Reviewed-on: https://skia-review.googlesource.com/57942
Commit-Queue: Jim Van Verth <jvanverth@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
Diffstat (limited to 'src/gpu/effects/GrDistanceFieldGeoProc.cpp')
-rw-r--r-- | src/gpu/effects/GrDistanceFieldGeoProc.cpp | 82 |
1 files changed, 49 insertions, 33 deletions
diff --git a/src/gpu/effects/GrDistanceFieldGeoProc.cpp b/src/gpu/effects/GrDistanceFieldGeoProc.cpp index 6cffd9d465..5ee5715b29 100644 --- a/src/gpu/effects/GrDistanceFieldGeoProc.cpp +++ b/src/gpu/effects/GrDistanceFieldGeoProc.cpp @@ -320,7 +320,7 @@ sk_sp<GrGeometryProcessor> GrDistanceFieldA8TextGeoProc::TestCreate(GrProcessorT class GrGLDistanceFieldPathGeoProc : public GrGLSLGeometryProcessor { public: GrGLDistanceFieldPathGeoProc() - : fViewMatrix(SkMatrix::InvalidMatrix()) + : fMatrix(SkMatrix::InvalidMatrix()) , fAtlasSize({0,0}) { } @@ -352,21 +352,35 @@ public: // setup pass through color varyingHandler->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputColor); - // Setup position - this->writeOutputPosition(vertBuilder, - uniformHandler, - gpArgs, - dfTexEffect.inPosition()->fName, - dfTexEffect.viewMatrix(), - &fViewMatrixUniform); - - // emit transforms - this->emitTransforms(vertBuilder, - varyingHandler, - uniformHandler, - gpArgs->fPositionVar, - dfTexEffect.inPosition()->fName, - args.fFPCoordTransformHandler); + if (dfTexEffect.matrix().hasPerspective()) { + // Setup position + this->writeOutputPosition(vertBuilder, + uniformHandler, + gpArgs, + dfTexEffect.inPosition()->fName, + dfTexEffect.matrix(), + &fMatrixUniform); + + // emit transforms + this->emitTransforms(vertBuilder, + varyingHandler, + uniformHandler, + gpArgs->fPositionVar, + dfTexEffect.inPosition()->fName, + args.fFPCoordTransformHandler); + } else { + // Setup position + this->writeOutputPosition(vertBuilder, gpArgs, dfTexEffect.inPosition()->fName); + + // emit transforms + this->emitTransforms(vertBuilder, + varyingHandler, + uniformHandler, + gpArgs->fPositionVar, + dfTexEffect.inPosition()->fName, + dfTexEffect.matrix(), + args.fFPCoordTransformHandler); + } // Use highp to work around aliasing issues fragBuilder->codeAppendf("float2 uv = %s;", uv.fsIn()); @@ -450,11 +464,11 @@ public: const GrDistanceFieldPathGeoProc& dfpgp = proc.cast<GrDistanceFieldPathGeoProc>(); - if (!dfpgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfpgp.viewMatrix())) { - fViewMatrix = dfpgp.viewMatrix(); - float viewMatrix[3 * 3]; - GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); - pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); + if (dfpgp.matrix().hasPerspective() && !fMatrix.cheapEqualTo(dfpgp.matrix())) { + fMatrix = dfpgp.matrix(); + float matrix[3 * 3]; + GrGLSLGetMatrix<3>(matrix, fMatrix); + pdman.setMatrix3f(fMatrixUniform, matrix); } SkASSERT(dfpgp.numTextureSamplers() >= 1); @@ -466,7 +480,11 @@ public: pdman.set2f(fAtlasSizeInvUniform, 1.0f / atlas->width(), 1.0f / atlas->height()); } - this->setTransformDataHelper(SkMatrix::I(), pdman, &transformIter); + if (dfpgp.matrix().hasPerspective()) { + this->setTransformDataHelper(SkMatrix::I(), pdman, &transformIter); + } else { + this->setTransformDataHelper(dfpgp.matrix(), pdman, &transformIter); + } } static inline void GenKey(const GrGeometryProcessor& gp, @@ -475,14 +493,15 @@ public: const GrDistanceFieldPathGeoProc& dfTexEffect = gp.cast<GrDistanceFieldPathGeoProc>(); uint32_t key = dfTexEffect.getFlags(); - key |= ComputePosKey(dfTexEffect.viewMatrix()) << 16; + key |= ComputePosKey(dfTexEffect.matrix()) << 16; b->add32(key); + b->add32(dfTexEffect.matrix().hasPerspective()); b->add32(dfTexEffect.numTextureSamplers()); } private: - SkMatrix fViewMatrix; - UniformHandle fViewMatrixUniform; + SkMatrix fMatrix; // view matrix if perspective, local matrix otherwise + UniformHandle fMatrixUniform; SkISize fAtlasSize; UniformHandle fAtlasSizeInvUniform; @@ -493,17 +512,15 @@ private: /////////////////////////////////////////////////////////////////////////////// GrDistanceFieldPathGeoProc::GrDistanceFieldPathGeoProc( GrColor color, - const SkMatrix& viewMatrix, + const SkMatrix& matrix, const sk_sp<GrTextureProxy> proxies[kMaxTextures], const GrSamplerState& params, - uint32_t flags, - bool usesLocalCoords) + uint32_t flags) : INHERITED(kGrDistanceFieldPathGeoProc_ClassID) , fColor(color) - , fViewMatrix(viewMatrix) + , fMatrix(matrix) , fFlags(flags & kNonLCD_DistanceFieldEffectMask) - , fInColor(nullptr) - , fUsesLocalCoords(usesLocalCoords) { + , fInColor(nullptr) { SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); fInPosition = &this->addVertexAttrib("inPosition", kFloat2_GrVertexAttribType); fInColor = &this->addVertexAttrib("inColor", kUByte4_norm_GrVertexAttribType); @@ -567,8 +584,7 @@ sk_sp<GrGeometryProcessor> GrDistanceFieldPathGeoProc::TestCreate(GrProcessorTes GrTest::TestMatrix(d->fRandom), proxies, samplerState, - flags, - d->fRandom->nextBool()); + flags); } #endif |