diff options
author | Robert Phillips <robertphillips@google.com> | 2017-01-17 11:52:21 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-01-17 17:28:58 +0000 |
commit | 4493a9dc9df8cf306a974bde7e0e9c5470ebcdc9 (patch) | |
tree | cc6315711d78a8192d16ae4251b5bb683993b1fd | |
parent | 4075ec80e1c36e414e57746c772298be3b49a74e (diff) |
Continue making Ganesh use absolute texture coordinates
The idea here is that the GrCoordTransform will actually hold a GrTextureProxy (rather than a GrTexture) and then, in GrGLSLPrimitiveProcessor::GetTransformMatrix, use the instantiated width & height (when uploading the transform matrix)
Change-Id: Ibac3a540fcb1967ceef571157d41c1937acfadf8
Reviewed-on: https://skia-review.googlesource.com/6977
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Robert Phillips <robertphillips@google.com>
35 files changed, 118 insertions, 161 deletions
diff --git a/gm/texdata.cpp b/gm/texdata.cpp index 8520d28b12..372ff5dc11 100644 --- a/gm/texdata.cpp +++ b/gm/texdata.cpp @@ -97,10 +97,7 @@ DEF_SIMPLE_GM_BG(texdata, canvas, 2 * S, 2 * S, SK_ColorBLACK) { } else { vm.reset(); } - SkMatrix tm; - tm = vm; - tm.postIDiv(2*S, 2*S); - paint.addColorTextureProcessor(texture, nullptr, tm); + paint.addColorTextureProcessor(texture, nullptr, vm); renderTargetContext->drawRect(clip, GrPaint(paint), GrAA::kNo, vm, SkRect::MakeWH(2 * S, 2 * S)); diff --git a/gm/texturedomaineffect.cpp b/gm/texturedomaineffect.cpp index 32042aab84..cc3e1c9e3d 100644 --- a/gm/texturedomaineffect.cpp +++ b/gm/texturedomaineffect.cpp @@ -89,11 +89,10 @@ protected: } SkTArray<SkMatrix> textureMatrices; - textureMatrices.push_back().setIDiv(texture->width(), texture->height()); - textureMatrices.push_back() = textureMatrices[0]; - textureMatrices.back().postScale(1.5f, 0.85f); - textureMatrices.push_back() = textureMatrices[0]; - textureMatrices.back().preRotate(45.f, texture->width() / 2.f, texture->height() / 2.f); + textureMatrices.push_back() = SkMatrix::I(); + textureMatrices.push_back() = SkMatrix::MakeScale(1.5f, 0.85f); + textureMatrices.push_back(); + textureMatrices.back().setRotate(45.f, texture->width() / 2.f, texture->height() / 2.f); const SkIRect texelDomains[] = { fBmp.bounds(), diff --git a/include/gpu/GrCoordTransform.h b/include/gpu/GrCoordTransform.h index 1f1cac7505..5c16c89679 100644 --- a/include/gpu/GrCoordTransform.h +++ b/include/gpu/GrCoordTransform.h @@ -20,7 +20,11 @@ */ class GrCoordTransform : SkNoncopyable { public: - GrCoordTransform() { SkDEBUGCODE(fInProcessor = false); } + GrCoordTransform() + : fTexture(nullptr) + , fNormalize(false) { + SkDEBUGCODE(fInProcessor = false); + } /** * Create a transformation that maps [0, 1] to a texture's boundaries. The precision is inferred @@ -30,7 +34,7 @@ public: GrCoordTransform(const GrTexture* texture, GrSamplerParams::FilterMode filter) { SkASSERT(texture); SkDEBUGCODE(fInProcessor = false); - this->reset(texture, filter); + this->reset(SkMatrix::I(), texture, filter); } /** @@ -52,18 +56,23 @@ public: this->reset(m, precision); } - void reset(const GrTexture* texture, GrSamplerParams::FilterMode filter) { + void reset(const SkMatrix&, const GrTexture*, GrSamplerParams::FilterMode filter, + bool normalize = true); + + void reset(const SkMatrix& m, GrSLPrecision precision = kDefault_GrSLPrecision) { SkASSERT(!fInProcessor); - SkASSERT(texture); - this->reset(MakeDivByTextureWHMatrix(texture), texture, filter); + fMatrix = m; + fTexture = nullptr; + fNormalize = false; + fReverseY = false; + fPrecision = precision; } - void reset(const SkMatrix&, const GrTexture*, GrSamplerParams::FilterMode filter); - void reset(const SkMatrix& m, GrSLPrecision precision = kDefault_GrSLPrecision); - GrCoordTransform& operator= (const GrCoordTransform& that) { SkASSERT(!fInProcessor); fMatrix = that.fMatrix; + fTexture = that.fTexture; + fNormalize = that.fNormalize; fReverseY = that.fReverseY; fPrecision = that.fPrecision; return *this; @@ -78,29 +87,38 @@ public: return &fMatrix; } - bool operator==(const GrCoordTransform& that) const { - return fMatrix.cheapEqualTo(that.fMatrix) && - fReverseY == that.fReverseY && - fPrecision == that.fPrecision; + bool hasSameEffectAs(const GrCoordTransform& that) const { + if (fNormalize != that.fNormalize || + fReverseY != that.fReverseY || + fPrecision != that.fPrecision || + !fMatrix.cheapEqualTo(that.fMatrix)) { + return false; + } + + if (fNormalize) { + SkASSERT(fTexture && that.fTexture); + return fTexture->width() == that.fTexture->width() && + fTexture->height() == that.fTexture->height(); + } + + return true; } - bool operator!=(const GrCoordTransform& that) const { return !(*this == that); } - const SkMatrix& getMatrix() const { return fMatrix; } + const GrTexture* texture() const { return fTexture; } + bool normalize() const { return fNormalize; } bool reverseY() const { return fReverseY; } GrSLPrecision precision() const { return fPrecision; } - /** Useful for effects that want to insert a texture matrix that is implied by the texture - dimensions */ - static inline SkMatrix MakeDivByTextureWHMatrix(const GrTexture* texture) { - SkASSERT(texture); - SkMatrix mat; - (void)mat.setIDiv(texture->width(), texture->height()); - return mat; - } - private: + // The textures' effect is to optionally normalize the final matrix, so a blind + // equality check could be misleading + bool operator==(const GrCoordTransform& that) const; + bool operator!=(const GrCoordTransform& that) const; + SkMatrix fMatrix; + const GrTexture* fTexture; + bool fNormalize; bool fReverseY; GrSLPrecision fPrecision; typedef SkNoncopyable INHERITED; diff --git a/src/core/SkGpuBlurUtils.cpp b/src/core/SkGpuBlurUtils.cpp index b3b523a498..6ac5abe49c 100644 --- a/src/core/SkGpuBlurUtils.cpp +++ b/src/core/SkGpuBlurUtils.cpp @@ -262,10 +262,6 @@ sk_sp<GrRenderTargetContext> GaussianBlur(GrContext* context, for (int i = 1; i < scaleFactorX || i < scaleFactorY; i *= 2) { GrPaint paint; paint.setGammaCorrect(dstRenderTargetContext->isGammaCorrect()); - // TODO: this matrix relies on the final instantiated size of the texture. This - // will have to be deferred for TextureProxys - SkMatrix matrix; - matrix.setIDiv(srcTexture->width(), srcTexture->height()); SkIRect dstRect(srcRect); if (srcBounds && i == 1) { SkRect domain = SkRect::Make(*srcBounds); @@ -274,7 +270,7 @@ sk_sp<GrRenderTargetContext> GaussianBlur(GrContext* context, sk_sp<GrFragmentProcessor> fp(GrTextureDomainEffect::Make( srcTexture.get(), nullptr, - matrix, + SkMatrix::I(), domain, GrTextureDomain::kDecal_Mode, GrSamplerParams::kBilerp_FilterMode)); @@ -283,7 +279,7 @@ sk_sp<GrRenderTargetContext> GaussianBlur(GrContext* context, srcOffset.set(0, 0); } else { GrSamplerParams params(SkShader::kClamp_TileMode, GrSamplerParams::kBilerp_FilterMode); - paint.addColorTextureProcessor(srcTexture.get(), nullptr, matrix, params); + paint.addColorTextureProcessor(srcTexture.get(), nullptr, SkMatrix::I(), params); } paint.setPorterDuffXPFactory(SkBlendMode::kSrc); shrink_irect_by_2(&dstRect, i < scaleFactorX, i < scaleFactorY); @@ -369,12 +365,7 @@ sk_sp<GrRenderTargetContext> GaussianBlur(GrContext* context, return nullptr; } - // TODO: this matrix relies on the final instantiated size of the texture. This - // will have to be deferred for TextureProxys - SkMatrix matrix; - matrix.setIDiv(tex->width(), tex->height()); - - paint.addColorTextureProcessor(tex.get(), nullptr, matrix, params); + paint.addColorTextureProcessor(tex.get(), nullptr, SkMatrix::I(), params); paint.setPorterDuffXPFactory(SkBlendMode::kSrc); SkIRect dstRect(srcRect); diff --git a/src/core/SkMatrix.cpp b/src/core/SkMatrix.cpp index a05ae0a177..390ebe08de 100644 --- a/src/core/SkMatrix.cpp +++ b/src/core/SkMatrix.cpp @@ -1038,7 +1038,7 @@ void SkMatrix::Affine_vpts(const SkMatrix& m, SkPoint dst[], const SkPoint src[] const SkMatrix::MapPtsProc SkMatrix::gMapPtsProcs[] = { SkMatrix::Identity_pts, SkMatrix::Trans_pts, - SkMatrix::Scale_pts, SkMatrix::Scale_pts, + SkMatrix::Scale_pts, SkMatrix::Scale_pts, SkMatrix::Affine_vpts, SkMatrix::Affine_vpts, SkMatrix::Affine_vpts, SkMatrix::Affine_vpts, // repeat the persp proc 8 times diff --git a/src/effects/GrAlphaThresholdFragmentProcessor.cpp b/src/effects/GrAlphaThresholdFragmentProcessor.cpp index afafe08279..a259607444 100644 --- a/src/effects/GrAlphaThresholdFragmentProcessor.cpp +++ b/src/effects/GrAlphaThresholdFragmentProcessor.cpp @@ -32,12 +32,6 @@ sk_sp<GrFragmentProcessor> GrAlphaThresholdFragmentProcessor::Make( bounds)); } -static SkMatrix make_div_and_translate_matrix(GrTexture* texture, int x, int y) { - SkMatrix matrix = GrCoordTransform::MakeDivByTextureWHMatrix(texture); - matrix.preTranslate(SkIntToScalar(x), SkIntToScalar(y)); - return matrix; -} - GrAlphaThresholdFragmentProcessor::GrAlphaThresholdFragmentProcessor( GrTexture* texture, sk_sp<GrColorSpaceXform> colorSpaceXform, @@ -47,11 +41,11 @@ GrAlphaThresholdFragmentProcessor::GrAlphaThresholdFragmentProcessor( const SkIRect& bounds) : fInnerThreshold(innerThreshold) , fOuterThreshold(outerThreshold) - , fImageCoordTransform(GrCoordTransform::MakeDivByTextureWHMatrix(texture), texture, - GrSamplerParams::kNone_FilterMode) + , fImageCoordTransform(SkMatrix::I(), texture, GrSamplerParams::kNone_FilterMode) , fImageTextureSampler(texture) , fColorSpaceXform(std::move(colorSpaceXform)) - , fMaskCoordTransform(make_div_and_translate_matrix(maskTexture, -bounds.x(), -bounds.y()), + , fMaskCoordTransform(SkMatrix::MakeTrans(SkIntToScalar(-bounds.x()), + SkIntToScalar(-bounds.y())), maskTexture, GrSamplerParams::kNone_FilterMode) , fMaskTextureSampler(maskTexture) { diff --git a/src/effects/SkArithmeticImageFilter.cpp b/src/effects/SkArithmeticImageFilter.cpp index 3e4d48fe65..d33a9dc562 100644 --- a/src/effects/SkArithmeticImageFilter.cpp +++ b/src/effects/SkArithmeticImageFilter.cpp @@ -348,10 +348,8 @@ sk_sp<SkSpecialImage> ArithmeticImageFilterImpl::filterImageGPU( sk_sp<GrFragmentProcessor> bgFP; if (backgroundTex) { - SkMatrix backgroundMatrix; - backgroundMatrix.setIDiv(backgroundTex->width(), backgroundTex->height()); - backgroundMatrix.preTranslate(-SkIntToScalar(backgroundOffset.fX), - -SkIntToScalar(backgroundOffset.fY)); + SkMatrix backgroundMatrix = SkMatrix::MakeTrans(-SkIntToScalar(backgroundOffset.fX), + -SkIntToScalar(backgroundOffset.fY)); sk_sp<GrColorSpaceXform> bgXform = GrColorSpaceXform::Make(background->getColorSpace(), outputProperties.colorSpace()); bgFP = GrTextureDomainEffect::Make( @@ -364,10 +362,8 @@ sk_sp<SkSpecialImage> ArithmeticImageFilterImpl::filterImageGPU( } if (foregroundTex) { - SkMatrix foregroundMatrix; - foregroundMatrix.setIDiv(foregroundTex->width(), foregroundTex->height()); - foregroundMatrix.preTranslate(-SkIntToScalar(foregroundOffset.fX), - -SkIntToScalar(foregroundOffset.fY)); + SkMatrix foregroundMatrix = SkMatrix::MakeTrans(-SkIntToScalar(foregroundOffset.fX), + -SkIntToScalar(foregroundOffset.fY)); sk_sp<GrColorSpaceXform> fgXform = GrColorSpaceXform::Make(foreground->getColorSpace(), outputProperties.colorSpace()); sk_sp<GrFragmentProcessor> foregroundFP; diff --git a/src/effects/SkBlurMaskFilter.cpp b/src/effects/SkBlurMaskFilter.cpp index fa4cb33c3b..70afd910da 100644 --- a/src/effects/SkBlurMaskFilter.cpp +++ b/src/effects/SkBlurMaskFilter.cpp @@ -1520,10 +1520,9 @@ sk_sp<GrTextureProxy> SkBlurMaskFilterImpl::filterMaskGPU(GrContext* context, if (!isNormalBlur) { GrPaint paint; - SkMatrix matrix; - matrix.setIDiv(src->width(), src->height()); // Blend pathTexture over blurTexture. - paint.addCoverageFragmentProcessor(GrSimpleTextureEffect::Make(src, nullptr, matrix)); + paint.addCoverageFragmentProcessor( + GrSimpleTextureEffect::Make(src, nullptr, SkMatrix::I())); if (kInner_SkBlurStyle == fBlurStyle) { // inner: dst = dst * src paint.setCoverageSetOpXPFactory(SkRegion::kIntersect_Op); diff --git a/src/effects/SkDisplacementMapEffect.cpp b/src/effects/SkDisplacementMapEffect.cpp index 28483bd57a..0d3940317f 100644 --- a/src/effects/SkDisplacementMapEffect.cpp +++ b/src/effects/SkDisplacementMapEffect.cpp @@ -336,9 +336,8 @@ sk_sp<SkSpecialImage> SkDisplacementMapEffect::onFilterImage(SkSpecialImage* sou return nullptr; } - SkMatrix offsetMatrix = GrCoordTransform::MakeDivByTextureWHMatrix(displTexture.get()); - offsetMatrix.preTranslate(SkIntToScalar(colorOffset.fX - displOffset.fX), - SkIntToScalar(colorOffset.fY - displOffset.fY)); + SkMatrix offsetMatrix = SkMatrix::MakeTrans(SkIntToScalar(colorOffset.fX - displOffset.fX), + SkIntToScalar(colorOffset.fY - displOffset.fY)); SkColorSpace* colorSpace = ctx.outputProperties().colorSpace(); sk_sp<GrColorSpaceXform> colorSpaceXform = GrColorSpaceXform::Make(color->getColorSpace(), colorSpace); diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp index 1d710bf1f2..67ded34659 100644 --- a/src/effects/SkLightingImageFilter.cpp +++ b/src/effects/SkLightingImageFilter.cpp @@ -1707,7 +1707,7 @@ GrLightingEffect::GrLightingEffect(GrTexture* texture, const SkMatrix& matrix, BoundaryMode boundaryMode, const SkIRect* srcBounds) - : INHERITED(texture, nullptr, GrCoordTransform::MakeDivByTextureWHMatrix(texture)) + : INHERITED(texture, nullptr, SkMatrix::I()) , fLight(light) , fSurfaceScale(surfaceScale) , fFilterMatrix(matrix) diff --git a/src/effects/SkMagnifierImageFilter.cpp b/src/effects/SkMagnifierImageFilter.cpp index 2b045322eb..c8b32aee70 100644 --- a/src/effects/SkMagnifierImageFilter.cpp +++ b/src/effects/SkMagnifierImageFilter.cpp @@ -71,8 +71,7 @@ private: float yInvZoom, float xInvInset, float yInvInset) - : INHERITED(texture, std::move(colorSpaceXform), - GrCoordTransform::MakeDivByTextureWHMatrix(texture)) + : INHERITED(texture, std::move(colorSpaceXform), SkMatrix::I()) , fBounds(bounds) , fXOffset(xOffset) , fYOffset(yOffset) diff --git a/src/effects/SkPerlinNoiseShader.cpp b/src/effects/SkPerlinNoiseShader.cpp index dc3d9a690d..f5a8b87b9a 100644 --- a/src/effects/SkPerlinNoiseShader.cpp +++ b/src/effects/SkPerlinNoiseShader.cpp @@ -515,7 +515,6 @@ public: bool stitchTiles() const { return fStitchTiles; } const SkVector& baseFrequency() const { return fPaintingData->fBaseFrequency; } int numOctaves() const { return fNumOctaves; } - const SkMatrix& matrix() const { return fCoordTransform.getMatrix(); } private: GrGLSLFragmentProcessor* onCreateGLSLInstance() const override { @@ -546,6 +545,7 @@ private: GrTexture* permutationsTexture, GrTexture* noiseTexture, const SkMatrix& matrix) : fType(type) + , fCoordTransform(matrix) , fNumOctaves(numOctaves) , fStitchTiles(stitchTiles) , fPermutationsSampler(permutationsTexture) @@ -554,7 +554,6 @@ private: this->initClassID<GrPerlinNoiseEffect>(); this->addTextureSampler(&fPermutationsSampler); this->addTextureSampler(&fNoiseSampler); - fCoordTransform.reset(matrix); this->addCoordTransform(&fCoordTransform); } diff --git a/src/effects/SkXfermodeImageFilter.cpp b/src/effects/SkXfermodeImageFilter.cpp index 7f91df3ab5..c52eebadc6 100644 --- a/src/effects/SkXfermodeImageFilter.cpp +++ b/src/effects/SkXfermodeImageFilter.cpp @@ -249,10 +249,8 @@ sk_sp<SkSpecialImage> SkXfermodeImageFilter_Base::filterImageGPU( sk_sp<GrFragmentProcessor> bgFP; if (backgroundTex) { - SkMatrix backgroundMatrix; - backgroundMatrix.setIDiv(backgroundTex->width(), backgroundTex->height()); - backgroundMatrix.preTranslate(-SkIntToScalar(backgroundOffset.fX), - -SkIntToScalar(backgroundOffset.fY)); + SkMatrix backgroundMatrix = SkMatrix::MakeTrans(-SkIntToScalar(backgroundOffset.fX), + -SkIntToScalar(backgroundOffset.fY)); sk_sp<GrColorSpaceXform> bgXform = GrColorSpaceXform::Make(background->getColorSpace(), outputProperties.colorSpace()); bgFP = GrTextureDomainEffect::Make( @@ -266,10 +264,8 @@ sk_sp<SkSpecialImage> SkXfermodeImageFilter_Base::filterImageGPU( } if (foregroundTex) { - SkMatrix foregroundMatrix; - foregroundMatrix.setIDiv(foregroundTex->width(), foregroundTex->height()); - foregroundMatrix.preTranslate(-SkIntToScalar(foregroundOffset.fX), - -SkIntToScalar(foregroundOffset.fY)); + SkMatrix foregroundMatrix = SkMatrix::MakeTrans(-SkIntToScalar(foregroundOffset.fX), + -SkIntToScalar(foregroundOffset.fY)); sk_sp<GrColorSpaceXform> fgXform = GrColorSpaceXform::Make(foreground->getColorSpace(), outputProperties.colorSpace()); sk_sp<GrFragmentProcessor> foregroundFP; diff --git a/src/effects/gradients/SkGradientShader.cpp b/src/effects/gradients/SkGradientShader.cpp index ca64cb77e1..1d2c01e185 100644 --- a/src/effects/gradients/SkGradientShader.cpp +++ b/src/effects/gradients/SkGradientShader.cpp @@ -1659,14 +1659,17 @@ GrGradientEffect::GrGradientEffect(const CreateArgs& args) { fRow = fAtlas->lockRow(bitmap); if (-1 != fRow) { fYCoord = fAtlas->getYOffset(fRow)+SK_ScalarHalf*fAtlas->getNormalizedTexelHeight(); - fCoordTransform.reset(*args.fMatrix, fAtlas->getTexture(), params.filterMode()); + // This is 1/2 places where auto-normalization is disabled + fCoordTransform.reset(*args.fMatrix, fAtlas->getTexture(), + params.filterMode(), false); fTextureSampler.reset(fAtlas->getTexture(), params); } else { sk_sp<GrTexture> texture(GrRefCachedBitmapTexture(args.fContext, bitmap, params)); if (!texture) { return; } - fCoordTransform.reset(*args.fMatrix, texture.get(), params.filterMode()); + // This is 2/2 places where auto-normalization is disabled + fCoordTransform.reset(*args.fMatrix, texture.get(), params.filterMode(), false); fTextureSampler.reset(texture.get(), params); fYCoord = SK_ScalarHalf; } diff --git a/src/gpu/GrBlurUtils.cpp b/src/gpu/GrBlurUtils.cpp index 23a3c6ce0b..61290b0fdf 100644 --- a/src/gpu/GrBlurUtils.cpp +++ b/src/gpu/GrBlurUtils.cpp @@ -46,10 +46,8 @@ static bool draw_mask(GrRenderTargetContext* renderTargetContext, return false; } - SkMatrix matrix; - matrix.setTranslate(-SkIntToScalar(maskRect.fLeft), -SkIntToScalar(maskRect.fTop)); - // TODO: this divide relies on the instantiated texture's size! - matrix.postIDiv(maskTex->width(), maskTex->height()); + SkMatrix matrix = SkMatrix::MakeTrans(-SkIntToScalar(maskRect.fLeft), + -SkIntToScalar(maskRect.fTop)); matrix.preConcat(viewMatrix); paint.addCoverageFragmentProcessor(GrSimpleTextureEffect::Make(maskTex, nullptr, matrix)); diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp index 12560584ba..1e2bdc7eee 100644 --- a/src/gpu/GrContext.cpp +++ b/src/gpu/GrContext.cpp @@ -308,10 +308,8 @@ bool GrContext::writeSurfacePixels(GrSurface* surface, SkColorSpace* dstColorSpa SkAutoSTMalloc<128 * 128, uint32_t> tmpPixels(0); if (tempTexture) { sk_sp<GrFragmentProcessor> fp; - SkMatrix textureMatrix; - textureMatrix.setIDiv(tempTexture->width(), tempTexture->height()); if (applyPremulToSrc) { - fp = this->createUPMToPMEffect(tempTexture.get(), tempDrawInfo.fSwizzle, textureMatrix); + fp = this->createUPMToPMEffect(tempTexture.get(), tempDrawInfo.fSwizzle, SkMatrix::I()); // If premultiplying was the only reason for the draw, fall back to a straight write. if (!fp) { if (GrGpu::kCallerPrefersDraw_DrawPreference == drawPreference) { @@ -325,7 +323,7 @@ bool GrContext::writeSurfacePixels(GrSurface* surface, SkColorSpace* dstColorSpa if (!fp) { fp = GrConfigConversionEffect::Make(tempTexture.get(), tempDrawInfo.fSwizzle, GrConfigConversionEffect::kNone_PMConversion, - textureMatrix); + SkMatrix::I()); if (!fp) { return false; } @@ -463,9 +461,7 @@ bool GrContext::readSurfacePixels(GrSurface* src, SkColorSpace* srcColorSpace, tempDrawInfo.fTempSurfaceDesc.fSampleCnt, tempDrawInfo.fTempSurfaceDesc.fOrigin); if (tempRTC) { - SkMatrix textureMatrix; - textureMatrix.setTranslate(SkIntToScalar(left), SkIntToScalar(top)); - textureMatrix.postIDiv(src->width(), src->height()); + SkMatrix textureMatrix = SkMatrix::MakeTrans(SkIntToScalar(left), SkIntToScalar(top)); sk_sp<GrFragmentProcessor> fp; if (unpremul) { fp = this->createPMToUPMEffect(src->asTexture(), tempDrawInfo.fSwizzle, diff --git a/src/gpu/GrCoordTransform.cpp b/src/gpu/GrCoordTransform.cpp index 63d91a810f..4afd0efbce 100644 --- a/src/gpu/GrCoordTransform.cpp +++ b/src/gpu/GrCoordTransform.cpp @@ -11,11 +11,13 @@ #include "GrGpu.h" void GrCoordTransform::reset(const SkMatrix& m, const GrTexture* texture, - GrSamplerParams::FilterMode filter) { + GrSamplerParams::FilterMode filter, bool normalize) { SkASSERT(texture); SkASSERT(!fInProcessor); fMatrix = m; + fTexture = texture; + fNormalize = normalize; fReverseY = kBottomLeft_GrSurfaceOrigin == texture->origin(); // Always start at kDefault. Then if precisions differ we see if the precision needs to be @@ -52,9 +54,3 @@ void GrCoordTransform::reset(const SkMatrix& m, const GrTexture* texture, } } -void GrCoordTransform::reset(const SkMatrix& m, GrSLPrecision precision) { - SkASSERT(!fInProcessor); - fMatrix = m; - fReverseY = false; - fPrecision = precision; -} diff --git a/src/gpu/GrFragmentProcessor.cpp b/src/gpu/GrFragmentProcessor.cpp index 977974d78d..8a710e5c5f 100644 --- a/src/gpu/GrFragmentProcessor.cpp +++ b/src/gpu/GrFragmentProcessor.cpp @@ -92,7 +92,7 @@ bool GrFragmentProcessor::hasSameTransforms(const GrFragmentProcessor& that) con } int count = this->numCoordTransforms(); for (int i = 0; i < count; ++i) { - if (this->coordTransform(i) != that.coordTransform(i)) { + if (!this->coordTransform(i).hasSameEffectAs(that.coordTransform(i))) { return false; } } diff --git a/src/gpu/GrSWMaskHelper.cpp b/src/gpu/GrSWMaskHelper.cpp index 240f9f9c3c..5dbbaf0c61 100644 --- a/src/gpu/GrSWMaskHelper.cpp +++ b/src/gpu/GrSWMaskHelper.cpp @@ -176,10 +176,8 @@ void GrSWMaskHelper::DrawToTargetWithShapeMask(GrTexture* texture, // We use device coords to compute the texture coordinates. We take the device coords and apply // a translation so that the top-left of the device bounds maps to 0,0, and then a scaling // matrix to normalized coords. - SkMatrix maskMatrix; - maskMatrix.setIDiv(texture->width(), texture->height()); - maskMatrix.preTranslate(SkIntToScalar(-textureOriginInDeviceSpace.fX), - SkIntToScalar(-textureOriginInDeviceSpace.fY)); + SkMatrix maskMatrix = SkMatrix::MakeTrans(SkIntToScalar(-textureOriginInDeviceSpace.fX), + SkIntToScalar(-textureOriginInDeviceSpace.fY)); maskMatrix.preConcat(viewMatrix); std::unique_ptr<GrDrawOp> op = GrRectOpFactory::MakeNonAAFill(paint.getColor(), SkMatrix::I(), dstRect, nullptr, &invert); diff --git a/src/gpu/GrTextureAdjuster.cpp b/src/gpu/GrTextureAdjuster.cpp index 7142ab9bac..db9bbde2e5 100644 --- a/src/gpu/GrTextureAdjuster.cpp +++ b/src/gpu/GrTextureAdjuster.cpp @@ -156,7 +156,6 @@ sk_sp<GrFragmentProcessor> GrTextureAdjuster::createFragmentProcessor( } SkASSERT(kNoDomain_DomainMode == domainMode || (domain.fLeft <= domain.fRight && domain.fTop <= domain.fBottom)); - textureMatrix.postIDiv(texture->width(), texture->height()); sk_sp<GrColorSpaceXform> colorSpaceXform = GrColorSpaceXform::Make(fColorSpace, dstColorSpace); return CreateFragmentProcessorForDomainAndFilter(texture.get(), std::move(colorSpaceXform), diff --git a/src/gpu/GrTextureMaker.cpp b/src/gpu/GrTextureMaker.cpp index 37272be4c9..cc6c703dc2 100644 --- a/src/gpu/GrTextureMaker.cpp +++ b/src/gpu/GrTextureMaker.cpp @@ -87,12 +87,10 @@ sk_sp<GrFragmentProcessor> GrTextureMaker::createFragmentProcessor( texture->width(), texture->height(), nullptr, fmForDetermineDomain, &domain); SkASSERT(kTightCopy_DomainMode != domainMode); - SkMatrix normalizedTextureMatrix = textureMatrix; - normalizedTextureMatrix.postIDiv(texture->width(), texture->height()); sk_sp<GrColorSpaceXform> colorSpaceXform = GrColorSpaceXform::Make(texColorSpace.get(), dstColorSpace); return CreateFragmentProcessorForDomainAndFilter(texture.get(), std::move(colorSpaceXform), - normalizedTextureMatrix, domainMode, domain, + textureMatrix, domainMode, domain, filterOrNullForBicubic); } diff --git a/src/gpu/GrTextureProducer.cpp b/src/gpu/GrTextureProducer.cpp index 0adae8c750..496dbb2d0b 100644 --- a/src/gpu/GrTextureProducer.cpp +++ b/src/gpu/GrTextureProducer.cpp @@ -52,16 +52,9 @@ GrTexture* GrTextureProducer::CopyOnGpu(GrTexture* inputTexture, const SkIRect* SkRect localRect; if (subset) { - SkScalar sx = SK_Scalar1 / inputTexture->width(); - SkScalar sy = SK_Scalar1 / inputTexture->height(); - localRect = SkRect::Make(*subset); - localRect.fLeft *= sx; - localRect.fTop *= sy; - localRect.fRight *= sx; - localRect.fBottom *= sy; } else { - localRect = SkRect::MakeWH(1.f, 1.f); + localRect = SkRect::MakeWH(inputTexture->width(), inputTexture->height()); } SkRect dstRect = SkRect::MakeIWH(copyParams.fWidth, copyParams.fHeight); diff --git a/src/gpu/GrTextureToYUVPlanes.cpp b/src/gpu/GrTextureToYUVPlanes.cpp index b9252fa733..132b680626 100644 --- a/src/gpu/GrTextureToYUVPlanes.cpp +++ b/src/gpu/GrTextureToYUVPlanes.cpp @@ -22,8 +22,8 @@ namespace { static bool convert_texture(GrTexture* src, GrRenderTargetContext* dst, int dstW, int dstH, SkYUVColorSpace colorSpace, MakeFPProc proc) { - SkScalar xScale = SkIntToScalar(src->width()) / dstW / src->width(); - SkScalar yScale = SkIntToScalar(src->height()) / dstH / src->height(); + SkScalar xScale = SkIntToScalar(src->width()) / dstW; + SkScalar yScale = SkIntToScalar(src->height()) / dstH; GrSamplerParams::FilterMode filter; if (dstW == src->width() && dstW == src->height()) { filter = GrSamplerParams::kNone_FilterMode; diff --git a/src/gpu/GrYUVProvider.cpp b/src/gpu/GrYUVProvider.cpp index 1330cfea34..2f75d92b46 100644 --- a/src/gpu/GrYUVProvider.cpp +++ b/src/gpu/GrYUVProvider.cpp @@ -146,7 +146,7 @@ sk_sp<GrTexture> GrYUVProvider::refAsTexture(GrContext* ctx, paint.setPorterDuffXPFactory(SkBlendMode::kSrc); const SkRect r = SkRect::MakeIWH(yuvInfo.fSizeInfo.fSizes[SkYUVSizeInfo::kY].fWidth, - yuvInfo.fSizeInfo.fSizes[SkYUVSizeInfo::kY].fHeight); + yuvInfo.fSizeInfo.fSizes[SkYUVSizeInfo::kY].fHeight); renderTargetContext->drawRect(GrNoClip(), std::move(paint), GrAA::kNo, SkMatrix::I(), r); diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp index 1dec0f6371..25ad78176a 100644 --- a/src/gpu/SkGpuDevice.cpp +++ b/src/gpu/SkGpuDevice.cpp @@ -1048,13 +1048,8 @@ void SkGpuDevice::drawBitmapTile(const SkBitmap& bitmap, sk_sp<GrColorSpaceXform> colorSpaceXform = GrColorSpaceXform::Make(bitmap.colorSpace(), fRenderTargetContext->getColorSpace()); - SkScalar iw = 1.f / texture->width(); - SkScalar ih = 1.f / texture->height(); - - SkMatrix texMatrix; // Compute a matrix that maps the rect we will draw to the src rect. - texMatrix.setRectToRect(dstRect, srcRect, SkMatrix::kFill_ScaleToFit); - texMatrix.postScale(iw, ih); + SkMatrix texMatrix = SkMatrix::MakeRectToRect(dstRect, srcRect, SkMatrix::kFill_ScaleToFit); // Construct a GrPaint by setting the bitmap texture as the first effect and then configuring // the rest from the SkPaint. @@ -1200,10 +1195,7 @@ void SkGpuDevice::drawSpecial(const SkDraw& draw, SkMatrix::I(), SkRect::Make(SkIRect::MakeXYWH( left + offset.fX, top + offset.fY, subset.width(), subset.height())), - SkRect::MakeXYWH(SkIntToScalar(subset.fLeft) / texture->width(), - SkIntToScalar(subset.fTop) / texture->height(), - SkIntToScalar(subset.width()) / texture->width(), - SkIntToScalar(subset.height()) / texture->height())); + SkRect::Make(subset)); } void SkGpuDevice::drawBitmapRect(const SkDraw& draw, const SkBitmap& bitmap, diff --git a/src/gpu/effects/Gr1DKernelEffect.h b/src/gpu/effects/Gr1DKernelEffect.h index d7402e8c45..29e0e5dec2 100644 --- a/src/gpu/effects/Gr1DKernelEffect.h +++ b/src/gpu/effects/Gr1DKernelEffect.h @@ -31,7 +31,7 @@ public: Gr1DKernelEffect(GrTexture* texture, Direction direction, int radius) - : INHERITED(texture, nullptr, GrCoordTransform::MakeDivByTextureWHMatrix(texture)) + : INHERITED(texture, nullptr, SkMatrix::I()) , fDirection(direction) , fRadius(radius) {} diff --git a/src/gpu/effects/GrBicubicEffect.cpp b/src/gpu/effects/GrBicubicEffect.cpp index 50a2a5d3e4..07d1c53011 100644 --- a/src/gpu/effects/GrBicubicEffect.cpp +++ b/src/gpu/effects/GrBicubicEffect.cpp @@ -181,8 +181,7 @@ sk_sp<GrFragmentProcessor> GrBicubicEffect::TestCreate(GrProcessorTestData* d) { static const SkShader::TileMode kClampClamp[] = { SkShader::kClamp_TileMode, SkShader::kClamp_TileMode }; return GrBicubicEffect::Make(d->fTextures[texIdx], colorSpaceXform, - GrCoordTransform::MakeDivByTextureWHMatrix(d->fTextures[texIdx]), - kClampClamp); + SkMatrix::I(), kClampClamp); } ////////////////////////////////////////////////////////////////////////////// diff --git a/src/gpu/effects/GrConfigConversionEffect.cpp b/src/gpu/effects/GrConfigConversionEffect.cpp index 8405fcbaf7..e6b3b28535 100644 --- a/src/gpu/effects/GrConfigConversionEffect.cpp +++ b/src/gpu/effects/GrConfigConversionEffect.cpp @@ -216,7 +216,7 @@ void GrConfigConversionEffect::TestForPreservingPMConversions(GrContext* context *upmToPMRule = kConversionRules[i][1]; static const SkRect kDstRect = SkRect::MakeIWH(kSize, kSize); - static const SkRect kSrcRect = SkRect::MakeIWH(1, 1); + static const SkRect kSrcRect = SkRect::MakeIWH(kSize, kSize); // We do a PM->UPM draw from dataTex to readTex and read the data. Then we do a UPM->PM draw // from readTex to tempTex followed by a PM->UPM draw to readTex and finally read the data. // We then verify that two reads produced the same values. diff --git a/src/gpu/effects/GrMatrixConvolutionEffect.cpp b/src/gpu/effects/GrMatrixConvolutionEffect.cpp index 8b98d0b32f..01fc6cec9c 100644 --- a/src/gpu/effects/GrMatrixConvolutionEffect.cpp +++ b/src/gpu/effects/GrMatrixConvolutionEffect.cpp @@ -156,7 +156,7 @@ GrMatrixConvolutionEffect::GrMatrixConvolutionEffect(GrTexture* texture, const SkIPoint& kernelOffset, GrTextureDomain::Mode tileMode, bool convolveAlpha) - : INHERITED(texture, nullptr, GrCoordTransform::MakeDivByTextureWHMatrix(texture)), + : INHERITED(texture, nullptr, SkMatrix::I()), fKernelSize(kernelSize), fGain(SkScalarToFloat(gain)), fBias(SkScalarToFloat(bias) / 255.0f), diff --git a/src/gpu/effects/GrYUVEffect.cpp b/src/gpu/effects/GrYUVEffect.cpp index 6d1fac2f32..41bab180ba 100644 --- a/src/gpu/effects/GrYUVEffect.cpp +++ b/src/gpu/effects/GrYUVEffect.cpp @@ -66,18 +66,17 @@ public: GrTexture* vTexture, const SkISize sizes[3], SkYUVColorSpace colorSpace, bool nv12) { SkScalar w[3], h[3]; - w[0] = SkIntToScalar(sizes[0].fWidth) / SkIntToScalar(yTexture->width()); - h[0] = SkIntToScalar(sizes[0].fHeight) / SkIntToScalar(yTexture->height()); - w[1] = SkIntToScalar(sizes[1].fWidth) / SkIntToScalar(uTexture->width()); - h[1] = SkIntToScalar(sizes[1].fHeight) / SkIntToScalar(uTexture->height()); - w[2] = SkIntToScalar(sizes[2].fWidth) / SkIntToScalar(vTexture->width()); - h[2] = SkIntToScalar(sizes[2].fHeight) / SkIntToScalar(vTexture->height()); - SkMatrix yuvMatrix[3]; - yuvMatrix[0] = GrCoordTransform::MakeDivByTextureWHMatrix(yTexture); - yuvMatrix[1] = yuvMatrix[0]; - yuvMatrix[1].preScale(w[1] / w[0], h[1] / h[0]); - yuvMatrix[2] = yuvMatrix[0]; - yuvMatrix[2].preScale(w[2] / w[0], h[2] / h[0]); + w[0] = SkIntToScalar(sizes[0].fWidth); + h[0] = SkIntToScalar(sizes[0].fHeight); + w[1] = SkIntToScalar(sizes[1].fWidth); + h[1] = SkIntToScalar(sizes[1].fHeight); + w[2] = SkIntToScalar(sizes[2].fWidth); + h[2] = SkIntToScalar(sizes[2].fHeight); + const SkMatrix yuvMatrix[3] = { + SkMatrix::I(), + SkMatrix::MakeScale(w[1] / w[0], h[1] / h[0]), + SkMatrix::MakeScale(w[2] / w[0], h[2] / h[0]) + }; GrSamplerParams::FilterMode uvFilterMode = ((sizes[1].fWidth != sizes[0].fWidth) || (sizes[1].fHeight != sizes[0].fHeight) || diff --git a/src/gpu/glsl/GrGLSLPrimitiveProcessor.cpp b/src/gpu/glsl/GrGLSLPrimitiveProcessor.cpp index 24f21ffe7a..f39fff2a07 100644 --- a/src/gpu/glsl/GrGLSLPrimitiveProcessor.cpp +++ b/src/gpu/glsl/GrGLSLPrimitiveProcessor.cpp @@ -16,6 +16,11 @@ SkMatrix GrGLSLPrimitiveProcessor::GetTransformMatrix(const SkMatrix& localMatri const GrCoordTransform& coordTransform) { SkMatrix combined; combined.setConcat(coordTransform.getMatrix(), localMatrix); + if (coordTransform.normalize()) { + SkASSERT(coordTransform.texture()); + combined.postIDiv(coordTransform.texture()->width(), coordTransform.texture()->height()); + } + if (coordTransform.reverseY()) { // combined.postScale(1,-1); // combined.postTranslate(0,1); diff --git a/src/image/SkImageShader.cpp b/src/image/SkImageShader.cpp index 5b79fb1d9e..50cc3c4cd9 100644 --- a/src/image/SkImageShader.cpp +++ b/src/image/SkImageShader.cpp @@ -144,8 +144,6 @@ void SkImageShader::toString(SkString* str) const { #include "effects/GrSimpleTextureEffect.h" sk_sp<GrFragmentProcessor> SkImageShader::asFragmentProcessor(const AsFPArgs& args) const { - SkMatrix matrix; - matrix.setIDiv(fImage->width(), fImage->height()); SkMatrix lmInverse; if (!this->getLocalMatrix().invert(&lmInverse)) { @@ -158,7 +156,6 @@ sk_sp<GrFragmentProcessor> SkImageShader::asFragmentProcessor(const AsFPArgs& ar } lmInverse.postConcat(inv); } - matrix.preConcat(lmInverse); SkShader::TileMode tm[] = { fTileModeX, fTileModeY }; @@ -182,10 +179,10 @@ sk_sp<GrFragmentProcessor> SkImageShader::asFragmentProcessor(const AsFPArgs& ar args.fDstColorSpace); sk_sp<GrFragmentProcessor> inner; if (doBicubic) { - inner = GrBicubicEffect::Make(texture.get(), std::move(colorSpaceXform), matrix, tm); + inner = GrBicubicEffect::Make(texture.get(), std::move(colorSpaceXform), lmInverse, tm); } else { inner = GrSimpleTextureEffect::Make(texture.get(), std::move(colorSpaceXform), - matrix, params); + lmInverse, params); } if (GrPixelConfigIsAlphaOnly(texture->config())) { diff --git a/tests/IntTextureTest.cpp b/tests/IntTextureTest.cpp index a3e17bf644..3edd4cc986 100644 --- a/tests/IntTextureTest.cpp +++ b/tests/IntTextureTest.cpp @@ -207,9 +207,8 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(IntTexture, reporter, ctxInfo) { }; for (auto filter : kNamedFilters) { - SkMatrix m; - m.setIDiv(kS, kS); - sk_sp<GrFragmentProcessor> fp(GrSimpleTextureEffect::Make(texture.get(), nullptr, m, + sk_sp<GrFragmentProcessor> fp(GrSimpleTextureEffect::Make(texture.get(), nullptr, + SkMatrix::I(), filter.fMode)); REPORTER_ASSERT(reporter, fp); if (!fp) { diff --git a/tests/RectangleTextureTest.cpp b/tests/RectangleTextureTest.cpp index a0c5409142..6d075df203 100644 --- a/tests/RectangleTextureTest.cpp +++ b/tests/RectangleTextureTest.cpp @@ -107,14 +107,12 @@ static void test_basic_draw(skiatest::Reporter* reporter, GrContext* context, context->makeRenderTargetContext(SkBackingFit::kExact, rectangleTexture->width(), rectangleTexture->height(), rectangleTexture->config(), nullptr)); - SkMatrix m; - m.setIDiv(rectangleTexture->width(), rectangleTexture->height()); for (auto filter : {GrSamplerParams::kNone_FilterMode, GrSamplerParams::kBilerp_FilterMode, GrSamplerParams::kMipMap_FilterMode}) { rtContext->clear(nullptr, 0xDDCCBBAA, true); - sk_sp<GrFragmentProcessor> fp(GrSimpleTextureEffect::Make(rectangleTexture, - nullptr, m, filter)); + sk_sp<GrFragmentProcessor> fp(GrSimpleTextureEffect::Make(rectangleTexture, nullptr, + SkMatrix::I(), filter)); GrPaint paint; paint.setPorterDuffXPFactory(SkBlendMode::kSrc); paint.addColorFragmentProcessor(std::move(fp)); diff --git a/tests/SRGBMipMapTest.cpp b/tests/SRGBMipMapTest.cpp index 79d86911ff..22d68903eb 100644 --- a/tests/SRGBMipMapTest.cpp +++ b/tests/SRGBMipMapTest.cpp @@ -132,7 +132,7 @@ DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(SRGBMipMaps, reporter, ctxInfo) { GrPaint paint; paint.setPorterDuffXPFactory(SkBlendMode::kSrc); GrSamplerParams mipMapParams(SkShader::kRepeat_TileMode, GrSamplerParams::kMipMap_FilterMode); - paint.addColorTextureProcessor(texture.get(), nullptr, SkMatrix::MakeScale(0.5f), mipMapParams); + paint.addColorTextureProcessor(texture.get(), nullptr, SkMatrix::MakeScale(rtS), mipMapParams); // 1) Draw texture to S32 surface (should generate/use sRGB mips) paint.setGammaCorrect(true); |