From a7d61a65ee7f7b2a2f6fce59faaca0762cef4c67 Mon Sep 17 00:00:00 2001 From: Joe Gregorio Date: Tue, 17 Jan 2017 19:20:54 +0000 Subject: Revert "Continue making Ganesh use absolute texture coordinates" This reverts commit 4493a9dc9df8cf306a974bde7e0e9c5470ebcdc9. Reason for revert: Continuing failures https://luci-milo.appspot.com/swarming/task/33c693c3539a1410 Change-Id: Id371d6df6a875a5f6872f4ebd91b08a354d949de Reviewed-on: https://skia-review.googlesource.com/7125 Commit-Queue: Joe Gregorio Reviewed-by: Joe Gregorio --- src/gpu/GrBlurUtils.cpp | 6 ++++-- src/gpu/GrContext.cpp | 10 +++++++--- src/gpu/GrCoordTransform.cpp | 10 +++++++--- src/gpu/GrFragmentProcessor.cpp | 2 +- src/gpu/GrSWMaskHelper.cpp | 6 ++++-- src/gpu/GrTextureAdjuster.cpp | 1 + src/gpu/GrTextureMaker.cpp | 4 +++- src/gpu/GrTextureProducer.cpp | 9 ++++++++- src/gpu/GrTextureToYUVPlanes.cpp | 4 ++-- src/gpu/GrYUVProvider.cpp | 2 +- src/gpu/SkGpuDevice.cpp | 12 ++++++++++-- src/gpu/effects/Gr1DKernelEffect.h | 2 +- src/gpu/effects/GrBicubicEffect.cpp | 3 ++- src/gpu/effects/GrConfigConversionEffect.cpp | 2 +- src/gpu/effects/GrMatrixConvolutionEffect.cpp | 2 +- src/gpu/effects/GrYUVEffect.cpp | 23 ++++++++++++----------- src/gpu/glsl/GrGLSLPrimitiveProcessor.cpp | 5 ----- 17 files changed, 65 insertions(+), 38 deletions(-) (limited to 'src/gpu') diff --git a/src/gpu/GrBlurUtils.cpp b/src/gpu/GrBlurUtils.cpp index 61290b0fdf..23a3c6ce0b 100644 --- a/src/gpu/GrBlurUtils.cpp +++ b/src/gpu/GrBlurUtils.cpp @@ -46,8 +46,10 @@ static bool draw_mask(GrRenderTargetContext* renderTargetContext, return false; } - SkMatrix matrix = SkMatrix::MakeTrans(-SkIntToScalar(maskRect.fLeft), - -SkIntToScalar(maskRect.fTop)); + 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()); matrix.preConcat(viewMatrix); paint.addCoverageFragmentProcessor(GrSimpleTextureEffect::Make(maskTex, nullptr, matrix)); diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp index 1e2bdc7eee..12560584ba 100644 --- a/src/gpu/GrContext.cpp +++ b/src/gpu/GrContext.cpp @@ -308,8 +308,10 @@ bool GrContext::writeSurfacePixels(GrSurface* surface, SkColorSpace* dstColorSpa SkAutoSTMalloc<128 * 128, uint32_t> tmpPixels(0); if (tempTexture) { sk_sp fp; + SkMatrix textureMatrix; + textureMatrix.setIDiv(tempTexture->width(), tempTexture->height()); if (applyPremulToSrc) { - fp = this->createUPMToPMEffect(tempTexture.get(), tempDrawInfo.fSwizzle, SkMatrix::I()); + fp = this->createUPMToPMEffect(tempTexture.get(), tempDrawInfo.fSwizzle, textureMatrix); // If premultiplying was the only reason for the draw, fall back to a straight write. if (!fp) { if (GrGpu::kCallerPrefersDraw_DrawPreference == drawPreference) { @@ -323,7 +325,7 @@ bool GrContext::writeSurfacePixels(GrSurface* surface, SkColorSpace* dstColorSpa if (!fp) { fp = GrConfigConversionEffect::Make(tempTexture.get(), tempDrawInfo.fSwizzle, GrConfigConversionEffect::kNone_PMConversion, - SkMatrix::I()); + textureMatrix); if (!fp) { return false; } @@ -461,7 +463,9 @@ bool GrContext::readSurfacePixels(GrSurface* src, SkColorSpace* srcColorSpace, tempDrawInfo.fTempSurfaceDesc.fSampleCnt, tempDrawInfo.fTempSurfaceDesc.fOrigin); if (tempRTC) { - SkMatrix textureMatrix = SkMatrix::MakeTrans(SkIntToScalar(left), SkIntToScalar(top)); + SkMatrix textureMatrix; + textureMatrix.setTranslate(SkIntToScalar(left), SkIntToScalar(top)); + textureMatrix.postIDiv(src->width(), src->height()); sk_sp fp; if (unpremul) { fp = this->createPMToUPMEffect(src->asTexture(), tempDrawInfo.fSwizzle, diff --git a/src/gpu/GrCoordTransform.cpp b/src/gpu/GrCoordTransform.cpp index 4afd0efbce..63d91a810f 100644 --- a/src/gpu/GrCoordTransform.cpp +++ b/src/gpu/GrCoordTransform.cpp @@ -11,13 +11,11 @@ #include "GrGpu.h" void GrCoordTransform::reset(const SkMatrix& m, const GrTexture* texture, - GrSamplerParams::FilterMode filter, bool normalize) { + GrSamplerParams::FilterMode filter) { 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 @@ -54,3 +52,9 @@ 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 8a710e5c5f..977974d78d 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).hasSameEffectAs(that.coordTransform(i))) { + if (this->coordTransform(i) != that.coordTransform(i)) { return false; } } diff --git a/src/gpu/GrSWMaskHelper.cpp b/src/gpu/GrSWMaskHelper.cpp index 5dbbaf0c61..240f9f9c3c 100644 --- a/src/gpu/GrSWMaskHelper.cpp +++ b/src/gpu/GrSWMaskHelper.cpp @@ -176,8 +176,10 @@ 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 = SkMatrix::MakeTrans(SkIntToScalar(-textureOriginInDeviceSpace.fX), - SkIntToScalar(-textureOriginInDeviceSpace.fY)); + SkMatrix maskMatrix; + maskMatrix.setIDiv(texture->width(), texture->height()); + maskMatrix.preTranslate(SkIntToScalar(-textureOriginInDeviceSpace.fX), + SkIntToScalar(-textureOriginInDeviceSpace.fY)); maskMatrix.preConcat(viewMatrix); std::unique_ptr op = GrRectOpFactory::MakeNonAAFill(paint.getColor(), SkMatrix::I(), dstRect, nullptr, &invert); diff --git a/src/gpu/GrTextureAdjuster.cpp b/src/gpu/GrTextureAdjuster.cpp index db9bbde2e5..7142ab9bac 100644 --- a/src/gpu/GrTextureAdjuster.cpp +++ b/src/gpu/GrTextureAdjuster.cpp @@ -156,6 +156,7 @@ sk_sp GrTextureAdjuster::createFragmentProcessor( } SkASSERT(kNoDomain_DomainMode == domainMode || (domain.fLeft <= domain.fRight && domain.fTop <= domain.fBottom)); + textureMatrix.postIDiv(texture->width(), texture->height()); sk_sp 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 cc6c703dc2..37272be4c9 100644 --- a/src/gpu/GrTextureMaker.cpp +++ b/src/gpu/GrTextureMaker.cpp @@ -87,10 +87,12 @@ sk_sp GrTextureMaker::createFragmentProcessor( texture->width(), texture->height(), nullptr, fmForDetermineDomain, &domain); SkASSERT(kTightCopy_DomainMode != domainMode); + SkMatrix normalizedTextureMatrix = textureMatrix; + normalizedTextureMatrix.postIDiv(texture->width(), texture->height()); sk_sp colorSpaceXform = GrColorSpaceXform::Make(texColorSpace.get(), dstColorSpace); return CreateFragmentProcessorForDomainAndFilter(texture.get(), std::move(colorSpaceXform), - textureMatrix, domainMode, domain, + normalizedTextureMatrix, domainMode, domain, filterOrNullForBicubic); } diff --git a/src/gpu/GrTextureProducer.cpp b/src/gpu/GrTextureProducer.cpp index 496dbb2d0b..0adae8c750 100644 --- a/src/gpu/GrTextureProducer.cpp +++ b/src/gpu/GrTextureProducer.cpp @@ -52,9 +52,16 @@ 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(inputTexture->width(), inputTexture->height()); + localRect = SkRect::MakeWH(1.f, 1.f); } SkRect dstRect = SkRect::MakeIWH(copyParams.fWidth, copyParams.fHeight); diff --git a/src/gpu/GrTextureToYUVPlanes.cpp b/src/gpu/GrTextureToYUVPlanes.cpp index 132b680626..b9252fa733 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; - SkScalar yScale = SkIntToScalar(src->height()) / dstH; + SkScalar xScale = SkIntToScalar(src->width()) / dstW / src->width(); + SkScalar yScale = SkIntToScalar(src->height()) / dstH / src->height(); 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 2f75d92b46..1330cfea34 100644 --- a/src/gpu/GrYUVProvider.cpp +++ b/src/gpu/GrYUVProvider.cpp @@ -146,7 +146,7 @@ sk_sp 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 25ad78176a..1dec0f6371 100644 --- a/src/gpu/SkGpuDevice.cpp +++ b/src/gpu/SkGpuDevice.cpp @@ -1048,8 +1048,13 @@ void SkGpuDevice::drawBitmapTile(const SkBitmap& bitmap, sk_sp 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. - SkMatrix texMatrix = SkMatrix::MakeRectToRect(dstRect, srcRect, SkMatrix::kFill_ScaleToFit); + texMatrix.setRectToRect(dstRect, srcRect, SkMatrix::kFill_ScaleToFit); + texMatrix.postScale(iw, ih); // Construct a GrPaint by setting the bitmap texture as the first effect and then configuring // the rest from the SkPaint. @@ -1195,7 +1200,10 @@ void SkGpuDevice::drawSpecial(const SkDraw& draw, SkMatrix::I(), SkRect::Make(SkIRect::MakeXYWH( left + offset.fX, top + offset.fY, subset.width(), subset.height())), - SkRect::Make(subset)); + SkRect::MakeXYWH(SkIntToScalar(subset.fLeft) / texture->width(), + SkIntToScalar(subset.fTop) / texture->height(), + SkIntToScalar(subset.width()) / texture->width(), + SkIntToScalar(subset.height()) / texture->height())); } void SkGpuDevice::drawBitmapRect(const SkDraw& draw, const SkBitmap& bitmap, diff --git a/src/gpu/effects/Gr1DKernelEffect.h b/src/gpu/effects/Gr1DKernelEffect.h index 29e0e5dec2..d7402e8c45 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, SkMatrix::I()) + : INHERITED(texture, nullptr, GrCoordTransform::MakeDivByTextureWHMatrix(texture)) , fDirection(direction) , fRadius(radius) {} diff --git a/src/gpu/effects/GrBicubicEffect.cpp b/src/gpu/effects/GrBicubicEffect.cpp index 07d1c53011..50a2a5d3e4 100644 --- a/src/gpu/effects/GrBicubicEffect.cpp +++ b/src/gpu/effects/GrBicubicEffect.cpp @@ -181,7 +181,8 @@ sk_sp GrBicubicEffect::TestCreate(GrProcessorTestData* d) { static const SkShader::TileMode kClampClamp[] = { SkShader::kClamp_TileMode, SkShader::kClamp_TileMode }; return GrBicubicEffect::Make(d->fTextures[texIdx], colorSpaceXform, - SkMatrix::I(), kClampClamp); + GrCoordTransform::MakeDivByTextureWHMatrix(d->fTextures[texIdx]), + kClampClamp); } ////////////////////////////////////////////////////////////////////////////// diff --git a/src/gpu/effects/GrConfigConversionEffect.cpp b/src/gpu/effects/GrConfigConversionEffect.cpp index e6b3b28535..8405fcbaf7 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(kSize, kSize); + static const SkRect kSrcRect = SkRect::MakeIWH(1, 1); // 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 01fc6cec9c..8b98d0b32f 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, SkMatrix::I()), + : INHERITED(texture, nullptr, GrCoordTransform::MakeDivByTextureWHMatrix(texture)), 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 41bab180ba..6d1fac2f32 100644 --- a/src/gpu/effects/GrYUVEffect.cpp +++ b/src/gpu/effects/GrYUVEffect.cpp @@ -66,17 +66,18 @@ public: GrTexture* vTexture, const SkISize sizes[3], SkYUVColorSpace colorSpace, bool nv12) { SkScalar w[3], h[3]; - 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]) - }; + 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]); 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 f39fff2a07..24f21ffe7a 100644 --- a/src/gpu/glsl/GrGLSLPrimitiveProcessor.cpp +++ b/src/gpu/glsl/GrGLSLPrimitiveProcessor.cpp @@ -16,11 +16,6 @@ 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); -- cgit v1.2.3