diff options
author | Greg Daniel <egdaniel@google.com> | 2017-12-18 15:50:34 +0000 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-12-18 21:50:26 +0000 |
commit | f226e66d75374e370f3ae2c6895bc689670e9e18 (patch) | |
tree | b1e38311a08f7294f366fe3e89c4ba231f3be600 /src/gpu/effects/GrDistanceFieldGeoProc.cpp | |
parent | de71572f650005e36d4fc2fe95fb5677a25ae4f6 (diff) |
Revert "Transform vertices for distance field glyphs on CPU."
This reverts commit 0215e39d7e415d0530231df6ad20d5f215c72152.
Reason for revert: break intel 540 and HD2000 intel release bots on gltestthreading gm dftext_blob_pers
Original change's description:
> Transform vertices for distance field glyphs on CPU.
>
> This allows batching of DF draws with different view matrices.
>
> For perspective matrices this means the transformed position vertex
> attribute must have w values. Currently, non-perspective DF draws still
> use 2 component positions, though this could be changed in the future.
> Consequently, perspective draws can batch with other perspective draws
> but not non-perspective draws.
>
> Adds a GM to test batching and reusing the same blobs with both perspective
> and non-perspective matrices.
>
> Change-Id: I0e42c5449ebf3a5a54025dbcdec824d904d5bd9e
> Reviewed-on: https://skia-review.googlesource.com/79900
> Commit-Queue: Brian Salomon <bsalomon@google.com>
> Reviewed-by: Jim Van Verth <jvanverth@google.com>
TBR=jvanverth@google.com,bsalomon@google.com
# Not skipping CQ checks because original CL landed > 1 day ago.
Change-Id: Idc658d9263976d5b5e00a5026c5d6d3c8f4bdc2d
Reviewed-on: https://skia-review.googlesource.com/86560
Commit-Queue: Greg Daniel <egdaniel@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
Diffstat (limited to 'src/gpu/effects/GrDistanceFieldGeoProc.cpp')
-rw-r--r-- | src/gpu/effects/GrDistanceFieldGeoProc.cpp | 150 |
1 files changed, 90 insertions, 60 deletions
diff --git a/src/gpu/effects/GrDistanceFieldGeoProc.cpp b/src/gpu/effects/GrDistanceFieldGeoProc.cpp index b8548bb4db..2747f55119 100644 --- a/src/gpu/effects/GrDistanceFieldGeoProc.cpp +++ b/src/gpu/effects/GrDistanceFieldGeoProc.cpp @@ -6,6 +6,7 @@ */ #include "GrDistanceFieldGeoProc.h" + #include "GrAtlasedShaderHelpers.h" #include "GrTexture.h" #include "SkDistanceFieldGen.h" @@ -22,7 +23,13 @@ class GrGLDistanceFieldA8TextGeoProc : public GrGLSLGeometryProcessor { public: - GrGLDistanceFieldA8TextGeoProc() = default; + GrGLDistanceFieldA8TextGeoProc() + : fViewMatrix(SkMatrix::InvalidMatrix()) + #ifdef SK_GAMMA_APPLY_TO_A8 + , fDistanceAdjust(-1.0f) + #endif + , fAtlasSize({0,0}) { + } void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ const GrDistanceFieldA8TextGeoProc& dfTexEffect = @@ -54,14 +61,18 @@ public: varyingHandler->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputColor); // Setup position - gpArgs->fPositionVar = dfTexEffect.inPosition()->asShaderVar(); + this->writeOutputPosition(vertBuilder, + uniformHandler, + gpArgs, + dfTexEffect.inPosition()->fName, + dfTexEffect.viewMatrix(), + &fViewMatrixUniform); // emit transforms this->emitTransforms(vertBuilder, varyingHandler, uniformHandler, dfTexEffect.inPosition()->asShaderVar(), - dfTexEffect.localMatrix(), args.fFPCoordTransformHandler); // add varyings @@ -171,6 +182,13 @@ public: } #endif + if (!dfa8gp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfa8gp.viewMatrix())) { + fViewMatrix = dfa8gp.viewMatrix(); + float viewMatrix[3 * 3]; + GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); + pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); + } + SkASSERT(dfa8gp.numTextureSamplers() >= 1); GrTexture* atlas = dfa8gp.textureSampler(0).peekTexture(); SkASSERT(atlas && SkIsPow2(atlas->width()) && SkIsPow2(atlas->height())); @@ -180,7 +198,7 @@ public: pdman.set2f(fAtlasSizeInvUniform, 1.0f / atlas->width(), 1.0f / atlas->height()); } - this->setTransformDataHelper(dfa8gp.localMatrix(), pdman, &transformIter); + this->setTransformDataHelper(SkMatrix::I(), pdman, &transformIter); } static inline void GenKey(const GrGeometryProcessor& gp, @@ -188,16 +206,19 @@ public: GrProcessorKeyBuilder* b) { const GrDistanceFieldA8TextGeoProc& dfTexEffect = gp.cast<GrDistanceFieldA8TextGeoProc>(); uint32_t key = dfTexEffect.getFlags(); + key |= ComputePosKey(dfTexEffect.viewMatrix()) << 16; b->add32(key); b->add32(dfTexEffect.numTextureSamplers()); } private: + SkMatrix fViewMatrix; + UniformHandle fViewMatrixUniform; #ifdef SK_GAMMA_APPLY_TO_A8 - float fDistanceAdjust = -1.f; + float fDistanceAdjust; UniformHandle fDistanceAdjustUni; #endif - SkISize fAtlasSize = {0, 0}; + SkISize fAtlasSize; UniformHandle fAtlasSizeInvUniform; typedef GrGLSLGeometryProcessor INHERITED; @@ -206,28 +227,26 @@ private: /////////////////////////////////////////////////////////////////////////////// GrDistanceFieldA8TextGeoProc::GrDistanceFieldA8TextGeoProc( - GrColor color, - const sk_sp<GrTextureProxy> proxies[kMaxTextures], - const GrSamplerState& params, + GrColor color, + const SkMatrix& viewMatrix, + const sk_sp<GrTextureProxy> proxies[kMaxTextures], + const GrSamplerState& params, #ifdef SK_GAMMA_APPLY_TO_A8 - float distanceAdjust, + float distanceAdjust, #endif - uint32_t flags, - const SkMatrix& localMatrix) + uint32_t flags, + bool usesLocalCoords) : INHERITED(kGrDistanceFieldA8TextGeoProc_ClassID) , fColor(color) + , fViewMatrix(viewMatrix) #ifdef SK_GAMMA_APPLY_TO_A8 , fDistanceAdjust(distanceAdjust) #endif , fFlags(flags & kNonLCD_DistanceFieldEffectMask) , fInColor(nullptr) - , fLocalMatrix(localMatrix) { + , fUsesLocalCoords(usesLocalCoords) { SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); - if (flags & kPerspective_DistanceFieldEffectFlag) { - fInPosition = &this->addVertexAttrib("inPosition", kFloat3_GrVertexAttribType); - } else { - fInPosition = &this->addVertexAttrib("inPosition", kFloat2_GrVertexAttribType); - } + fInPosition = &this->addVertexAttrib("inPosition", kFloat2_GrVertexAttribType); fInColor = &this->addVertexAttrib("inColor", kUByte4_norm_GrVertexAttribType); fInTextureCoords = &this->addVertexAttrib("inTextureCoords", kUShort2_GrVertexAttribType); for (int i = 0; i < kMaxTextures; ++i) { @@ -284,16 +303,14 @@ sk_sp<GrGeometryProcessor> GrDistanceFieldA8TextGeoProc::TestCreate(GrProcessorT if (flags & kSimilarity_DistanceFieldEffectFlag) { flags |= d->fRandom->nextBool() ? kScaleOnly_DistanceFieldEffectFlag : 0; } - SkMatrix localMatrix = GrTest::TestMatrix(d->fRandom); - GrColor color = GrRandomColor(d->fRandom); - float lum = d->fRandom->nextF(); - return GrDistanceFieldA8TextGeoProc::Make(color, - proxies, + + return GrDistanceFieldA8TextGeoProc::Make(GrRandomColor(d->fRandom), + GrTest::TestMatrix(d->fRandom), proxies, samplerState, #ifdef SK_GAMMA_APPLY_TO_A8 - lum, + d->fRandom->nextF(), #endif - flags, localMatrix); + flags, d->fRandom->nextBool()); } #endif @@ -307,8 +324,7 @@ public: } void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ - const GrDistanceFieldPathGeoProc& dfPathEffect = - args.fGP.cast<GrDistanceFieldPathGeoProc>(); + const GrDistanceFieldPathGeoProc& dfTexEffect = args.fGP.cast<GrDistanceFieldPathGeoProc>(); GrGLSLPPFragmentBuilder* fragBuilder = args.fFragBuilder; @@ -317,7 +333,7 @@ public: GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; // emit attributes - varyingHandler->emitAttributes(dfPathEffect); + varyingHandler->emitAttributes(dfTexEffect); const char* atlasSizeInvName; fAtlasSizeInvUniform = uniformHandler->addUniform(kVertex_GrShaderFlag, @@ -329,55 +345,55 @@ public: GrGLSLVarying uv(kFloat2_GrSLType); GrGLSLVarying texIdx(kHalf_GrSLType); GrGLSLVarying st(kFloat2_GrSLType); - append_index_uv_varyings(args, dfPathEffect.inTextureCoords()->fName, atlasSizeInvName, &uv, - &texIdx, &st); + append_index_uv_varyings(args, dfTexEffect.inTextureCoords()->fName, atlasSizeInvName, + &uv, &texIdx, &st); // setup pass through color - varyingHandler->addPassThroughAttribute(dfPathEffect.inColor(), args.fOutputColor); + varyingHandler->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputColor); - if (dfPathEffect.matrix().hasPerspective()) { + if (dfTexEffect.matrix().hasPerspective()) { // Setup position this->writeOutputPosition(vertBuilder, uniformHandler, gpArgs, - dfPathEffect.inPosition()->fName, - dfPathEffect.matrix(), + dfTexEffect.inPosition()->fName, + dfTexEffect.matrix(), &fMatrixUniform); // emit transforms this->emitTransforms(vertBuilder, varyingHandler, uniformHandler, - dfPathEffect.inPosition()->asShaderVar(), + dfTexEffect.inPosition()->asShaderVar(), args.fFPCoordTransformHandler); } else { // Setup position - this->writeOutputPosition(vertBuilder, gpArgs, dfPathEffect.inPosition()->fName); + this->writeOutputPosition(vertBuilder, gpArgs, dfTexEffect.inPosition()->fName); // emit transforms this->emitTransforms(vertBuilder, varyingHandler, uniformHandler, - dfPathEffect.inPosition()->asShaderVar(), - dfPathEffect.matrix(), + dfTexEffect.inPosition()->asShaderVar(), + dfTexEffect.matrix(), args.fFPCoordTransformHandler); } // Use highp to work around aliasing issues fragBuilder->codeAppendf("float2 uv = %s;", uv.fsIn()); fragBuilder->codeAppend("half4 texColor;"); - append_multitexture_lookup(args, dfPathEffect.numTextureSamplers(), texIdx, "uv", - "texColor"); + append_multitexture_lookup(args, dfTexEffect.numTextureSamplers(), + texIdx, "uv", "texColor"); fragBuilder->codeAppend("half distance = " SK_DistanceFieldMultiplier "*(texColor.r - " SK_DistanceFieldThreshold ");"); fragBuilder->codeAppend("half afwidth;"); - bool isUniformScale = (dfPathEffect.getFlags() & kUniformScale_DistanceFieldEffectMask) == - kUniformScale_DistanceFieldEffectMask; - bool isSimilarity = SkToBool(dfPathEffect.getFlags() & kSimilarity_DistanceFieldEffectFlag); + bool isUniformScale = (dfTexEffect.getFlags() & kUniformScale_DistanceFieldEffectMask) == + kUniformScale_DistanceFieldEffectMask; + bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_DistanceFieldEffectFlag); bool isGammaCorrect = - SkToBool(dfPathEffect.getFlags() & kGammaCorrect_DistanceFieldEffectFlag); + SkToBool(dfTexEffect.getFlags() & kGammaCorrect_DistanceFieldEffectFlag); if (isUniformScale) { // For uniform scale, we adjust for the effect of the transformation on the distance // by using the length of the gradient of the t coordinate in the y direction. @@ -573,7 +589,9 @@ sk_sp<GrGeometryProcessor> GrDistanceFieldPathGeoProc::TestCreate(GrProcessorTes class GrGLDistanceFieldLCDTextGeoProc : public GrGLSLGeometryProcessor { public: - GrGLDistanceFieldLCDTextGeoProc() : fAtlasSize({0, 0}) { + GrGLDistanceFieldLCDTextGeoProc() + : fViewMatrix(SkMatrix::InvalidMatrix()) + , fAtlasSize({0,0}) { fDistanceAdjust = GrDistanceFieldLCDTextGeoProc::DistanceAdjust::Make(1.0f, 1.0f, 1.0f); } @@ -601,14 +619,18 @@ public: varyingHandler->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputColor); // Setup position - gpArgs->fPositionVar = dfTexEffect.inPosition()->asShaderVar(); + this->writeOutputPosition(vertBuilder, + uniformHandler, + gpArgs, + dfTexEffect.inPosition()->fName, + dfTexEffect.viewMatrix(), + &fViewMatrixUniform); // emit transforms this->emitTransforms(vertBuilder, varyingHandler, uniformHandler, dfTexEffect.inPosition()->asShaderVar(), - dfTexEffect.localMatrix(), args.fFPCoordTransformHandler); // set up varyings @@ -756,6 +778,13 @@ public: fDistanceAdjust = wa; } + if (!dflcd.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dflcd.viewMatrix())) { + fViewMatrix = dflcd.viewMatrix(); + float viewMatrix[3 * 3]; + GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); + pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); + } + SkASSERT(dflcd.numTextureSamplers() >= 1); GrTexture* atlas = dflcd.textureSampler(0).peekTexture(); SkASSERT(atlas && SkIsPow2(atlas->width()) && SkIsPow2(atlas->height())); @@ -764,7 +793,8 @@ public: fAtlasSize.set(atlas->width(), atlas->height()); pdman.set2f(fAtlasSizeInvUniform, 1.0f / atlas->width(), 1.0f / atlas->height()); } - this->setTransformDataHelper(dflcd.localMatrix(), pdman, &transformIter); + + this->setTransformDataHelper(SkMatrix::I(), pdman, &transformIter); } static inline void GenKey(const GrGeometryProcessor& gp, @@ -773,11 +803,15 @@ public: const GrDistanceFieldLCDTextGeoProc& dfTexEffect = gp.cast<GrDistanceFieldLCDTextGeoProc>(); uint32_t key = dfTexEffect.getFlags(); + key |= ComputePosKey(dfTexEffect.viewMatrix()) << 16; b->add32(key); b->add32(dfTexEffect.numTextureSamplers()); } private: + SkMatrix fViewMatrix; + UniformHandle fViewMatrixUniform; + GrDistanceFieldLCDTextGeoProc::DistanceAdjust fDistanceAdjust; UniformHandle fDistanceAdjustUni; @@ -790,22 +824,19 @@ private: /////////////////////////////////////////////////////////////////////////////// GrDistanceFieldLCDTextGeoProc::GrDistanceFieldLCDTextGeoProc( GrColor color, + const SkMatrix& viewMatrix, const sk_sp<GrTextureProxy> proxies[kMaxTextures], const GrSamplerState& params, DistanceAdjust distanceAdjust, - uint32_t flags, - const SkMatrix& localMatrix) + uint32_t flags, bool usesLocalCoords) : INHERITED(kGrDistanceFieldLCDTextGeoProc_ClassID) , fColor(color) + , fViewMatrix(viewMatrix) , fDistanceAdjust(distanceAdjust) , fFlags(flags & kLCD_DistanceFieldEffectMask) - , fLocalMatrix(localMatrix) { + , fUsesLocalCoords(usesLocalCoords) { SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_DistanceFieldEffectFlag)); - if (fFlags & kPerspective_DistanceFieldEffectFlag) { - fInPosition = &this->addVertexAttrib("inPosition", kFloat3_GrVertexAttribType); - } else { - fInPosition = &this->addVertexAttrib("inPosition", kFloat2_GrVertexAttribType); - } + fInPosition = &this->addVertexAttrib("inPosition", kFloat2_GrVertexAttribType); fInColor = &this->addVertexAttrib("inColor", kUByte4_norm_GrVertexAttribType); fInTextureCoords = &this->addVertexAttrib("inTextureCoords", kUShort2_GrVertexAttribType); for (int i = 0; i < kMaxTextures; ++i) { @@ -862,9 +893,8 @@ sk_sp<GrGeometryProcessor> GrDistanceFieldLCDTextGeoProc::TestCreate(GrProcessor flags |= d->fRandom->nextBool() ? kScaleOnly_DistanceFieldEffectFlag : 0; } flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; - GrColor color = GrRandomColor(d->fRandom); - SkMatrix localMatrix = GrTest::TestMatrix(d->fRandom); - return GrDistanceFieldLCDTextGeoProc::Make(color, proxies, samplerState, wa, flags, - localMatrix); + return GrDistanceFieldLCDTextGeoProc::Make(GrRandomColor(d->fRandom), + GrTest::TestMatrix(d->fRandom), proxies, + samplerState, wa, flags, d->fRandom->nextBool()); } #endif |