Remove modulation by input color in GrTextureEffect

Most internal users of GrTextureEffect do not want this behavior. For
situations where we do (as part of paint conversion, actual image draws,
etc...) make that modulation explicit as part of the FP tree.

Bug: skia:10139
Change-Id: Ia975e1eb063c6852ad7fba9557d7ac7122eaf53b
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/303026
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: Michael Ludwig <michaelludwig@google.com>
diff --git a/src/gpu/GrClipStackClip.cpp b/src/gpu/GrClipStackClip.cpp
index 89ac423..5ae70cf 100644
--- a/src/gpu/GrClipStackClip.cpp
+++ b/src/gpu/GrClipStackClip.cpp
@@ -25,6 +25,7 @@
 #include "src/gpu/GrStyle.h"
 #include "src/gpu/GrTextureProxy.h"
 #include "src/gpu/effects/GrRRectEffect.h"
+#include "src/gpu/effects/GrXfermodeFragmentProcessor.h"
 #include "src/gpu/effects/generated/GrDeviceSpaceEffect.h"
 #include "src/gpu/geometry/GrStyledShape.h"
 
@@ -76,6 +77,7 @@
     auto domain = subset.makeInset(0.5, 0.5);
     auto fp = GrTextureEffect::MakeSubset(std::move(mask), kPremul_SkAlphaType, m, samplerState,
                                           subset, domain, caps);
+    fp = GrXfermodeFragmentProcessor::Make(std::move(fp), nullptr, SkBlendMode::kModulate);
     return GrDeviceSpaceEffect::Make(std::move(fp));
 }
 
diff --git a/src/gpu/SkGpuDevice_drawTexture.cpp b/src/gpu/SkGpuDevice_drawTexture.cpp
index bc3d325..ad9569d 100644
--- a/src/gpu/SkGpuDevice_drawTexture.cpp
+++ b/src/gpu/SkGpuDevice_drawTexture.cpp
@@ -25,6 +25,7 @@
 #include "src/gpu/SkGr.h"
 #include "src/gpu/effects/GrBicubicEffect.h"
 #include "src/gpu/effects/GrTextureEffect.h"
+#include "src/gpu/effects/GrXfermodeFragmentProcessor.h"
 #include "src/gpu/geometry/GrStyledShape.h"
 #include "src/image/SkImage_Base.h"
 
@@ -470,6 +471,9 @@
     } else {
         fp = producer->createFragmentProcessor(textureMatrix, subset, domain, {wm, fm});
     }
+    if (fp) {
+        fp = GrXfermodeFragmentProcessor::Make(std::move(fp), nullptr, SkBlendMode::kModulate);
+    }
     fp = GrColorSpaceXformEffect::Make(std::move(fp),
                                        producer->colorSpace(), producer->alphaType(),
                                        rtc->colorInfo().colorSpace(), kPremul_SkAlphaType);
diff --git a/src/gpu/effects/GrBicubicEffect.cpp b/src/gpu/effects/GrBicubicEffect.cpp
index 0b6b94f..4a2b23e 100644
--- a/src/gpu/effects/GrBicubicEffect.cpp
+++ b/src/gpu/effects/GrBicubicEffect.cpp
@@ -132,7 +132,7 @@
                     "bicubicColor.rgb = max(half3(0.0), min(bicubicColor.rgb, bicubicColor.aaa));");
             break;
     }
-    fragBuilder->codeAppendf("%s = bicubicColor * %s;", args.fOutputColor, args.fInputColor);
+    fragBuilder->codeAppendf("%s = bicubicColor;", args.fOutputColor);
 }
 
 std::unique_ptr<GrFragmentProcessor> GrBicubicEffect::Make(GrSurfaceProxyView view,
diff --git a/src/gpu/effects/GrTextureEffect.cpp b/src/gpu/effects/GrTextureEffect.cpp
index a99c45e..d28ea77 100644
--- a/src/gpu/effects/GrTextureEffect.cpp
+++ b/src/gpu/effects/GrTextureEffect.cpp
@@ -321,13 +321,9 @@
             fNormUni = args.fUniformHandler->addUniform(&te, kFragment_GrShaderFlag,
                                                         kFloat4_GrSLType, "norm", &norm);
             SkString coordString = SkStringPrintf("%s * %s.zw", args.fSampleCoord, norm);
-            fb->appendTextureLookupAndBlend(args.fInputColor,
-                                            SkBlendMode::kModulate,
-                                            fSamplerHandle,
-                                            coordString.c_str());
+            fb->appendTextureLookup(fSamplerHandle, coordString.c_str());
         } else {
-            fb->appendTextureLookupAndBlend(args.fInputColor, SkBlendMode::kModulate,
-                                            fSamplerHandle, args.fSampleCoord);
+            fb->appendTextureLookup(fSamplerHandle, args.fSampleCoord);
         }
         fb->codeAppendf(";");
     } else {
@@ -682,7 +678,7 @@
                     "}",
                     subsetName, subsetName, borderName);
         }
-        fb->codeAppendf("%s = %s * textureColor;", args.fOutputColor, args.fInputColor);
+        fb->codeAppendf("%s = textureColor;", args.fOutputColor);
     }
 }
 
diff --git a/src/gpu/ops/GrTextureOp.cpp b/src/gpu/ops/GrTextureOp.cpp
index dd16675..982ec51 100644
--- a/src/gpu/ops/GrTextureOp.cpp
+++ b/src/gpu/ops/GrTextureOp.cpp
@@ -30,6 +30,7 @@
 #include "src/gpu/GrTexturePriv.h"
 #include "src/gpu/GrTextureProxy.h"
 #include "src/gpu/SkGr.h"
+#include "src/gpu/effects/GrXfermodeFragmentProcessor.h"
 #include "src/gpu/effects/generated/GrClampFragmentProcessor.h"
 #include "src/gpu/geometry/GrQuad.h"
 #include "src/gpu/geometry/GrQuadBuffer.h"
@@ -1066,6 +1067,7 @@
         } else {
             fp = GrTextureEffect::Make(std::move(proxyView), alphaType, SkMatrix::I(), filter);
         }
+        fp = GrXfermodeFragmentProcessor::Make(std::move(fp), nullptr, SkBlendMode::kModulate);
         fp = GrColorSpaceXformEffect::Make(std::move(fp), std::move(textureXform));
         if (saturate == GrTextureOp::Saturate::kYes) {
             fp = GrClampFragmentProcessor::Make(std::move(fp), /*clampToPremul=*/false);
diff --git a/src/shaders/SkImageShader.cpp b/src/shaders/SkImageShader.cpp
index fcb0990..626a218 100755
--- a/src/shaders/SkImageShader.cpp
+++ b/src/shaders/SkImageShader.cpp
@@ -248,6 +248,7 @@
 #include "src/gpu/SkGr.h"
 #include "src/gpu/effects/GrBicubicEffect.h"
 #include "src/gpu/effects/GrTextureEffect.h"
+#include "src/gpu/effects/GrXfermodeFragmentProcessor.h"
 
 std::unique_ptr<GrFragmentProcessor> SkImageShader::asFragmentProcessor(
         const GrFPArgs& args) const {
@@ -312,7 +313,9 @@
     } else {
         fp = producer->createFragmentProcessor(lmInverse, nullptr, nullptr, {wmX, wmY, fm});
     }
-
+    if (fp) {
+        fp = GrXfermodeFragmentProcessor::Make(std::move(fp), nullptr, SkBlendMode::kModulate);
+    }
     fp = GrColorSpaceXformEffect::Make(std::move(fp), fImage->colorSpace(), producer->alphaType(),
                                        args.fDstColorInfo->colorSpace(), kPremul_SkAlphaType);
     if (!fp) {