diff options
author | Robert Phillips <robertphillips@google.com> | 2017-08-24 17:47:23 +0000 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-08-24 17:56:30 +0000 |
commit | e253831ee0f3f85c5143e5ac39325400b145106f (patch) | |
tree | 84c13b8a445992289e0b2ca6c7335a9315e892f2 /src/gpu/effects/GrDistanceFieldGeoProc.cpp | |
parent | 01a6a619d96d4b396d6f911722ffae862acdcbe6 (diff) |
Revert "Switch atlas clients over to using absolute texture coordinates"
This reverts commit e84c087e621978e6d298b8ca950521601a0366cb.
Reason for revert: ANGLE is unhappy
Original change's description:
> Switch atlas clients over to using absolute texture coordinates
>
> This is a prerequisite for being able to resize the atlas with impunity.
>
> Change-Id: I509816c8d6f38fbc92fa39aeab303b42ab09f58b
> Reviewed-on: https://skia-review.googlesource.com/37560
> Reviewed-by: Robert Phillips <robertphillips@google.com>
> Commit-Queue: Robert Phillips <robertphillips@google.com>
TBR=egdaniel@google.com,jvanverth@google.com,robertphillips@google.com,brianosman@google.com
Change-Id: I329efd642c22e11a5c576a4632fc557759b200d5
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://skia-review.googlesource.com/38400
Reviewed-by: Robert Phillips <robertphillips@google.com>
Commit-Queue: Robert Phillips <robertphillips@google.com>
Diffstat (limited to 'src/gpu/effects/GrDistanceFieldGeoProc.cpp')
-rw-r--r-- | src/gpu/effects/GrDistanceFieldGeoProc.cpp | 249 |
1 files changed, 112 insertions, 137 deletions
diff --git a/src/gpu/effects/GrDistanceFieldGeoProc.cpp b/src/gpu/effects/GrDistanceFieldGeoProc.cpp index 37b1113a5a..8dd2fa617a 100644 --- a/src/gpu/effects/GrDistanceFieldGeoProc.cpp +++ b/src/gpu/effects/GrDistanceFieldGeoProc.cpp @@ -23,12 +23,11 @@ class GrGLDistanceFieldA8TextGeoProc : public GrGLSLGeometryProcessor { public: GrGLDistanceFieldA8TextGeoProc() - : fViewMatrix(SkMatrix::InvalidMatrix()) - #ifdef SK_GAMMA_APPLY_TO_A8 - , fDistanceAdjust(-1.0f) - #endif - , fAtlasSize({0,0}) { - } + : fViewMatrix(SkMatrix::InvalidMatrix()) +#ifdef SK_GAMMA_APPLY_TO_A8 + , fDistanceAdjust(-1.0f) +#endif + {} void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ const GrDistanceFieldA8TextGeoProc& dfTexEffect = @@ -42,12 +41,6 @@ public: // emit attributes varyingHandler->emitAttributes(dfTexEffect); - const char* atlasSizeInvName; - fAtlasSizeInvUniform = uniformHandler->addUniform(kVertex_GrShaderFlag, - kVec2f_GrSLType, - kHigh_GrSLPrecision, - "AtlasSizeInv", - &atlasSizeInvName); #ifdef SK_GAMMA_APPLY_TO_A8 // adjust based on gamma const char* distanceAdjustUniName = nullptr; @@ -77,17 +70,8 @@ public: args.fFPCoordTransformHandler); // add varyings + GrGLSLVertToFrag recipScale(kFloat_GrSLType); GrGLSLVertToFrag uv(kVec2f_GrSLType); - varyingHandler->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision); - vertBuilder->codeAppendf("%s = %s * %s;", uv.vsOut(), - dfTexEffect.inTextureCoords()->fName, - atlasSizeInvName); - - GrGLSLVertToFrag st(kVec2f_GrSLType); - varyingHandler->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision); - vertBuilder->codeAppendf("%s = %s;", st.vsOut(), - dfTexEffect.inTextureCoords()->fName); - bool isUniformScale = (dfTexEffect.getFlags() & kUniformScale_DistanceFieldEffectMask) == kUniformScale_DistanceFieldEffectMask; bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_DistanceFieldEffectFlag); @@ -95,14 +79,29 @@ public: SkToBool(dfTexEffect.getFlags() & kGammaCorrect_DistanceFieldEffectFlag); bool isAliased = SkToBool(dfTexEffect.getFlags() & kAliased_DistanceFieldEffectFlag); + varyingHandler->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision); + vertBuilder->codeAppendf("%s = %s;", uv.vsOut(), dfTexEffect.inTextureCoords()->fName); + + // compute numbers to be hardcoded to convert texture coordinates from float to int + SkASSERT(dfTexEffect.numTextureSamplers() == 1); + GrTexture* atlas = dfTexEffect.textureSampler(0).peekTexture(); + SkASSERT(atlas && SkIsPow2(atlas->width()) && SkIsPow2(atlas->height())); + + GrGLSLVertToFrag st(kVec2f_GrSLType); + varyingHandler->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision); + vertBuilder->codeAppendf("%s = float2(%d, %d) * %s;", st.vsOut(), + atlas->width(), atlas->height(), + dfTexEffect.inTextureCoords()->fName); // Use highp to work around aliasing issues fragBuilder->codeAppendf("highp float2 uv = %s;\n", uv.fsIn()); - fragBuilder->codeAppend("float texColor = "); - fragBuilder->appendTextureLookup(args.fTexSamplers[0], "uv", kVec2f_GrSLType); - fragBuilder->codeAppend(".r;"); - fragBuilder->codeAppend("float distance = " + fragBuilder->codeAppend("\tfloat texColor = "); + fragBuilder->appendTextureLookup(args.fTexSamplers[0], + "uv", + kVec2f_GrSLType); + fragBuilder->codeAppend(".r;\n"); + fragBuilder->codeAppend("\tfloat distance = " SK_DistanceFieldMultiplier "*(texColor - " SK_DistanceFieldThreshold ");"); #ifdef SK_GAMMA_APPLY_TO_A8 // adjust width based on gamma @@ -178,15 +177,15 @@ public: void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& proc, FPCoordTransformIter&& transformIter) override { - const GrDistanceFieldA8TextGeoProc& dfa8gp = proc.cast<GrDistanceFieldA8TextGeoProc>(); - #ifdef SK_GAMMA_APPLY_TO_A8 - float distanceAdjust = dfa8gp.getDistanceAdjust(); + const GrDistanceFieldA8TextGeoProc& dfTexEffect = proc.cast<GrDistanceFieldA8TextGeoProc>(); + float distanceAdjust = dfTexEffect.getDistanceAdjust(); if (distanceAdjust != fDistanceAdjust) { - fDistanceAdjust = distanceAdjust; pdman.set1f(fDistanceAdjustUni, distanceAdjust); + fDistanceAdjust = distanceAdjust; } #endif + const GrDistanceFieldA8TextGeoProc& dfa8gp = proc.cast<GrDistanceFieldA8TextGeoProc>(); if (!dfa8gp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfa8gp.viewMatrix())) { fViewMatrix = dfa8gp.viewMatrix(); @@ -194,16 +193,6 @@ public: 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())); - - if (fAtlasSize.fWidth != atlas->width() || fAtlasSize.fHeight != atlas->height()) { - fAtlasSize.set(atlas->width(), atlas->height()); - pdman.set2f(fAtlasSizeInvUniform, 1.0f / atlas->width(), 1.0f / atlas->height()); - } - this->setTransformDataHelper(SkMatrix::I(), pdman, &transformIter); } @@ -214,6 +203,14 @@ public: uint32_t key = dfTexEffect.getFlags(); key |= ComputePosKey(dfTexEffect.viewMatrix()) << 16; b->add32(key); + + // Currently we hardcode numbers to convert atlas coordinates to normalized floating point + SkASSERT(gp.numTextureSamplers() == 1); + GrTextureProxy* atlas = gp.textureSampler(0).proxy(); + if (atlas) { + b->add32(atlas->width()); + b->add32(atlas->height()); + } } private: @@ -223,8 +220,6 @@ private: float fDistanceAdjust; UniformHandle fDistanceAdjustUni; #endif - SkISize fAtlasSize; - UniformHandle fAtlasSizeInvUniform; typedef GrGLSLGeometryProcessor INHERITED; }; @@ -254,7 +249,7 @@ GrDistanceFieldA8TextGeoProc::GrDistanceFieldA8TextGeoProc(GrColor color, fInPosition = &this->addVertexAttrib("inPosition", kVec2f_GrVertexAttribType, kHigh_GrSLPrecision); fInColor = &this->addVertexAttrib("inColor", kVec4ub_GrVertexAttribType); - fInTextureCoords = &this->addVertexAttrib("inTextureCoords", kVec2us_uint_GrVertexAttribType, + fInTextureCoords = &this->addVertexAttrib("inTextureCoords", kVec2us_GrVertexAttribType, kHigh_GrSLPrecision); this->addTextureSampler(&fTextureSampler); } @@ -313,9 +308,8 @@ sk_sp<GrGeometryProcessor> GrDistanceFieldA8TextGeoProc::TestCreate(GrProcessorT class GrGLDistanceFieldPathGeoProc : public GrGLSLGeometryProcessor { public: GrGLDistanceFieldPathGeoProc() - : fViewMatrix(SkMatrix::InvalidMatrix()) - , fAtlasSize({0,0}) { - } + : fViewMatrix(SkMatrix::InvalidMatrix()) + , fTextureSize(SkISize::Make(-1, -1)) {} void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ const GrDistanceFieldPathGeoProc& dfTexEffect = args.fGP.cast<GrDistanceFieldPathGeoProc>(); @@ -329,26 +323,12 @@ public: // emit attributes varyingHandler->emitAttributes(dfTexEffect); - const char* atlasSizeInvName; - fAtlasSizeInvUniform = uniformHandler->addUniform(kVertex_GrShaderFlag, - kVec2f_GrSLType, - kHigh_GrSLPrecision, - "AtlasSizeInv", - &atlasSizeInvName); - - GrGLSLVertToFrag uv(kVec2f_GrSLType); - varyingHandler->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision); - vertBuilder->codeAppendf("%s = %s * %s;", uv.vsOut(), - dfTexEffect.inTextureCoords()->fName, - atlasSizeInvName); - - GrGLSLVertToFrag st(kVec2f_GrSLType); - varyingHandler->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision); - vertBuilder->codeAppendf("%s = %s;", st.vsOut(), - dfTexEffect.inTextureCoords()->fName); + GrGLSLVertToFrag v(kVec2f_GrSLType); + varyingHandler->addVarying("TextureCoords", &v, kHigh_GrSLPrecision); // setup pass through color varyingHandler->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputColor); + vertBuilder->codeAppendf("%s = %s;", v.vsOut(), dfTexEffect.inTextureCoords()->fName); // Setup position this->writeOutputPosition(vertBuilder, @@ -366,15 +346,23 @@ public: dfTexEffect.inPosition()->fName, args.fFPCoordTransformHandler); + const char* textureSizeUniName = nullptr; + fTextureSizeUni = uniformHandler->addUniform(kFragment_GrShaderFlag, + kVec2f_GrSLType, kDefault_GrSLPrecision, + "TextureSize", &textureSizeUniName); + // Use highp to work around aliasing issues - fragBuilder->codeAppendf("highp float2 uv = %s;", uv.fsIn()); + fragBuilder->codeAppendf("highp float2 uv = %s;", v.fsIn()); fragBuilder->codeAppend("float texColor = "); - fragBuilder->appendTextureLookup(args.fTexSamplers[0], "uv", kVec2f_GrSLType); + fragBuilder->appendTextureLookup(args.fTexSamplers[0], + "uv", + kVec2f_GrSLType); fragBuilder->codeAppend(".r;"); fragBuilder->codeAppend("float distance = " SK_DistanceFieldMultiplier "*(texColor - " SK_DistanceFieldThreshold ");"); + fragBuilder->codeAppendf("highp float2 st = uv*%s;", textureSizeUniName); fragBuilder->codeAppend("float afwidth;"); bool isUniformScale = (dfTexEffect.getFlags() & kUniformScale_DistanceFieldEffectMask) == kUniformScale_DistanceFieldEffectMask; @@ -388,12 +376,10 @@ public: // this gives us a smooth step across approximately one fragment #ifdef SK_VULKAN - fragBuilder->codeAppendf("afwidth = abs(" SK_DistanceFieldAAFactor "*dFdx(%s.x));", - st.fsIn()); + fragBuilder->codeAppend("afwidth = abs(" SK_DistanceFieldAAFactor "*dFdx(st.x));"); #else // We use the y gradient because there is a bug in the Mali 400 in the x direction. - fragBuilder->codeAppendf("afwidth = abs(" SK_DistanceFieldAAFactor "*dFdy(%s.y));", - st.fsIn()); + fragBuilder->codeAppend("afwidth = abs(" SK_DistanceFieldAAFactor "*dFdy(st.y));"); #endif } else if (isSimilarity) { // For similarity transform, we adjust the effect of the transformation on the distance @@ -402,10 +388,10 @@ public: // this gives us a smooth step across approximately one fragment #ifdef SK_VULKAN - fragBuilder->codeAppendf("float st_grad_len = length(dFdx(%s));", st.fsIn()); + fragBuilder->codeAppend("float st_grad_len = length(dFdx(st));"); #else // We use the y gradient because there is a bug in the Mali 400 in the x direction. - fragBuilder->codeAppendf("float st_grad_len = length(dFdy(%s));", st.fsIn()); + fragBuilder->codeAppend("float st_grad_len = length(dFdy(st));"); #endif fragBuilder->codeAppend("afwidth = abs(" SK_DistanceFieldAAFactor "*st_grad_len);"); } else { @@ -422,8 +408,8 @@ public: fragBuilder->codeAppend("dist_grad = dist_grad*inversesqrt(dg_len2);"); fragBuilder->codeAppend("}"); - fragBuilder->codeAppendf("float2 Jdx = dFdx(%s);", st.fsIn()); - fragBuilder->codeAppendf("float2 Jdy = dFdy(%s);", st.fsIn()); + fragBuilder->codeAppend("float2 Jdx = dFdx(st);"); + fragBuilder->codeAppend("float2 Jdy = dFdy(st);"); fragBuilder->codeAppend("float2 grad = float2(dist_grad.x*Jdx.x + dist_grad.y*Jdy.x,"); fragBuilder->codeAppend(" dist_grad.x*Jdx.y + dist_grad.y*Jdy.y);"); @@ -445,6 +431,17 @@ public: void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& proc, FPCoordTransformIter&& transformIter) override { + SkASSERT(fTextureSizeUni.isValid()); + + GrTexture* texture = proc.textureSampler(0).peekTexture(); + + if (texture->width() != fTextureSize.width() || + texture->height() != fTextureSize.height()) { + fTextureSize = SkISize::Make(texture->width(), texture->height()); + pdman.set2f(fTextureSizeUni, + SkIntToScalar(fTextureSize.width()), + SkIntToScalar(fTextureSize.height())); + } const GrDistanceFieldPathGeoProc& dfpgp = proc.cast<GrDistanceFieldPathGeoProc>(); @@ -454,16 +451,6 @@ public: GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); } - - SkASSERT(dfpgp.numTextureSamplers() == 1); - GrTexture* atlas = dfpgp.textureSampler(0).peekTexture(); - SkASSERT(atlas && SkIsPow2(atlas->width()) && SkIsPow2(atlas->height())); - - if (fAtlasSize.fWidth != atlas->width() || fAtlasSize.fHeight != atlas->height()) { - fAtlasSize.set(atlas->width(), atlas->height()); - pdman.set2f(fAtlasSizeInvUniform, 1.0f / atlas->width(), 1.0f / atlas->height()); - } - this->setTransformDataHelper(SkMatrix::I(), pdman, &transformIter); } @@ -478,11 +465,10 @@ public: } private: - SkMatrix fViewMatrix; + UniformHandle fTextureSizeUni; UniformHandle fViewMatrixUniform; - - SkISize fAtlasSize; - UniformHandle fAtlasSizeInvUniform; + SkMatrix fViewMatrix; + SkISize fTextureSize; typedef GrGLSLGeometryProcessor INHERITED; }; @@ -505,7 +491,7 @@ GrDistanceFieldPathGeoProc::GrDistanceFieldPathGeoProc(GrColor color, fInPosition = &this->addVertexAttrib("inPosition", kVec2f_GrVertexAttribType, kHigh_GrSLPrecision); fInColor = &this->addVertexAttrib("inColor", kVec4ub_GrVertexAttribType); - fInTextureCoords = &this->addVertexAttrib("inTextureCoords", kVec2us_uint_GrVertexAttribType); + fInTextureCoords = &this->addVertexAttrib("inTextureCoords", kVec2us_GrVertexAttribType); this->addTextureSampler(&fTextureSampler); } @@ -561,8 +547,7 @@ sk_sp<GrGeometryProcessor> GrDistanceFieldPathGeoProc::TestCreate(GrProcessorTes class GrGLDistanceFieldLCDTextGeoProc : public GrGLSLGeometryProcessor { public: GrGLDistanceFieldLCDTextGeoProc() - : fViewMatrix(SkMatrix::InvalidMatrix()) - , fAtlasSize({0,0}) { + : fViewMatrix(SkMatrix::InvalidMatrix()) { fDistanceAdjust = GrDistanceFieldLCDTextGeoProc::DistanceAdjust::Make(1.0f, 1.0f, 1.0f); } @@ -577,13 +562,6 @@ public: // emit attributes varyingHandler->emitAttributes(dfTexEffect); - const char* atlasSizeInvName; - fAtlasSizeInvUniform = uniformHandler->addUniform(kVertex_GrShaderFlag, - kVec2f_GrSLType, - kHigh_GrSLPrecision, - "AtlasSizeInv", - &atlasSizeInvName); - GrGLSLPPFragmentBuilder* fragBuilder = args.fFragBuilder; // setup pass through color @@ -606,36 +584,39 @@ public: args.fFPCoordTransformHandler); // set up varyings + bool isUniformScale = (dfTexEffect.getFlags() & kUniformScale_DistanceFieldEffectMask) == + kUniformScale_DistanceFieldEffectMask; + bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_DistanceFieldEffectFlag); + bool isGammaCorrect = + SkToBool(dfTexEffect.getFlags() & kGammaCorrect_DistanceFieldEffectFlag); + GrGLSLVertToFrag recipScale(kFloat_GrSLType); GrGLSLVertToFrag uv(kVec2f_GrSLType); varyingHandler->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision); - vertBuilder->codeAppendf("%s = %s * %s;", uv.vsOut(), - dfTexEffect.inTextureCoords()->fName, - atlasSizeInvName); + vertBuilder->codeAppendf("%s = %s;", uv.vsOut(), dfTexEffect.inTextureCoords()->fName); + + // compute numbers to be hardcoded to convert texture coordinates from float to int + SkASSERT(dfTexEffect.numTextureSamplers() == 1); + GrTexture* atlas = dfTexEffect.textureSampler(0).peekTexture(); + SkASSERT(atlas && SkIsPow2(atlas->width()) && SkIsPow2(atlas->height())); GrGLSLVertToFrag st(kVec2f_GrSLType); varyingHandler->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision); - vertBuilder->codeAppendf("%s = %s;", st.vsOut(), + vertBuilder->codeAppendf("%s = float2(%d, %d) * %s;", st.vsOut(), + atlas->width(), atlas->height(), dfTexEffect.inTextureCoords()->fName); - GrGLSLVertToFrag delta(kFloat_GrSLType); - varyingHandler->addVarying("Delta", &delta, kHigh_GrSLPrecision); - if (dfTexEffect.getFlags() & kBGR_DistanceFieldEffectFlag) { - vertBuilder->codeAppendf("%s = -%s.x/3.0;", delta.vsOut(), atlasSizeInvName); - } else { - vertBuilder->codeAppendf("%s = %s.x/3.0;", delta.vsOut(), atlasSizeInvName); - } - // add frag shader code - bool isUniformScale = (dfTexEffect.getFlags() & kUniformScale_DistanceFieldEffectMask) == - kUniformScale_DistanceFieldEffectMask; - bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_DistanceFieldEffectFlag); - bool isGammaCorrect = - SkToBool(dfTexEffect.getFlags() & kGammaCorrect_DistanceFieldEffectFlag); // create LCD offset adjusted by inverse of transform // Use highp to work around aliasing issues fragBuilder->codeAppendf("highp float2 uv = %s;\n", uv.fsIn()); + SkScalar lcdDelta = 1.0f / (3.0f * atlas->width()); + if (dfTexEffect.getFlags() & kBGR_DistanceFieldEffectFlag) { + fragBuilder->codeAppendf("highp float delta = -%.*f;\n", SK_FLT_DECIMAL_DIG, lcdDelta); + } else { + fragBuilder->codeAppendf("highp float delta = %.*f;\n", SK_FLT_DECIMAL_DIG, lcdDelta); + } if (isUniformScale) { #ifdef SK_VULKAN fragBuilder->codeAppendf("float st_grad_len = abs(dFdx(%s.x));", st.fsIn()); @@ -643,19 +624,18 @@ public: // We use the y gradient because there is a bug in the Mali 400 in the x direction. fragBuilder->codeAppendf("float st_grad_len = abs(dFdy(%s.y));", st.fsIn()); #endif - fragBuilder->codeAppendf("float2 offset = float2(st_grad_len*%s, 0.0);", delta.fsIn()); + fragBuilder->codeAppend("float2 offset = float2(st_grad_len*delta, 0.0);"); } else if (isSimilarity) { // For a similarity matrix with rotation, the gradient will not be aligned // with the texel coordinate axes, so we need to calculate it. #ifdef SK_VULKAN fragBuilder->codeAppendf("float2 st_grad = dFdx(%s);", st.fsIn()); - fragBuilder->codeAppendf("float2 offset = %s*st_grad;", delta.fsIn()); + fragBuilder->codeAppend("float2 offset = delta*st_grad;"); #else // We use dFdy because of a Mali 400 bug, and rotate -90 degrees to // get the gradient in the x direction. fragBuilder->codeAppendf("float2 st_grad = dFdy(%s);", st.fsIn()); - fragBuilder->codeAppendf("float2 offset = %s*float2(st_grad.y, -st_grad.x);", - delta.fsIn()); + fragBuilder->codeAppend("float2 offset = delta*float2(st_grad.y, -st_grad.x);"); #endif fragBuilder->codeAppend("float st_grad_len = length(st_grad);"); } else { @@ -663,7 +643,7 @@ public: fragBuilder->codeAppend("float2 Jdx = dFdx(st);"); fragBuilder->codeAppend("float2 Jdy = dFdy(st);"); - fragBuilder->codeAppendf("float2 offset = %s*Jdx;", delta.fsIn()); + fragBuilder->codeAppend("float2 offset = delta*Jdx;"); } // green is distance to uv center @@ -762,16 +742,6 @@ public: 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())); - - if (fAtlasSize.fWidth != atlas->width() || fAtlasSize.fHeight != atlas->height()) { - fAtlasSize.set(atlas->width(), atlas->height()); - pdman.set2f(fAtlasSizeInvUniform, 1.0f / atlas->width(), 1.0f / atlas->height()); - } - this->setTransformDataHelper(SkMatrix::I(), pdman, &transformIter); } @@ -783,17 +753,22 @@ public: uint32_t key = dfTexEffect.getFlags(); key |= ComputePosKey(dfTexEffect.viewMatrix()) << 16; b->add32(key); + + // Currently we hardcode numbers to convert atlas coordinates to normalized floating point + SkASSERT(gp.numTextureSamplers() == 1); + GrTextureProxy* atlas = gp.textureSampler(0).proxy(); + if (atlas) { + b->add32(atlas->width()); + b->add32(atlas->height()); + } } private: - SkMatrix fViewMatrix; - UniformHandle fViewMatrixUniform; - + SkMatrix fViewMatrix; + UniformHandle fViewMatrixUniform; + UniformHandle fColorUniform; GrDistanceFieldLCDTextGeoProc::DistanceAdjust fDistanceAdjust; - UniformHandle fDistanceAdjustUni; - - SkISize fAtlasSize; - UniformHandle fAtlasSizeInvUniform; + UniformHandle fDistanceAdjustUni; typedef GrGLSLGeometryProcessor INHERITED; }; @@ -816,7 +791,7 @@ GrDistanceFieldLCDTextGeoProc::GrDistanceFieldLCDTextGeoProc( fInPosition = &this->addVertexAttrib("inPosition", kVec2f_GrVertexAttribType, kHigh_GrSLPrecision); fInColor = &this->addVertexAttrib("inColor", kVec4ub_GrVertexAttribType); - fInTextureCoords = &this->addVertexAttrib("inTextureCoords", kVec2us_uint_GrVertexAttribType, + fInTextureCoords = &this->addVertexAttrib("inTextureCoords", kVec2us_GrVertexAttribType, kHigh_GrSLPrecision); this->addTextureSampler(&fTextureSampler); } |