GrMagnifierEffect uses child for src

Bug: skia:10139

Change-Id: I07b95233c7a7892be8b70e7b640c71ce438545f1
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/296803
Reviewed-by: Michael Ludwig <michaelludwig@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
diff --git a/src/gpu/effects/generated/GrMagnifierEffect.cpp b/src/gpu/effects/generated/GrMagnifierEffect.cpp
index 0746fbf..aabcb15 100644
--- a/src/gpu/effects/generated/GrMagnifierEffect.cpp
+++ b/src/gpu/effects/generated/GrMagnifierEffect.cpp
@@ -65,14 +65,11 @@
                 args.fUniformHandler->getUniformCStr(boundsUniformVar),
                 args.fUniformHandler->getUniformCStr(xInvInsetVar),
                 args.fUniformHandler->getUniformCStr(yInvInsetVar));
-        fragBuilder->codeAppendf(
-                "d.y), 1.0);\n}\n%s = sample(%s, mix(coord, zoom_coord, weight)).%s;\n",
-                args.fOutputColor,
-                fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[0]),
-                fragBuilder->getProgramBuilder()
-                        ->samplerSwizzle(args.fTexSamplers[0])
-                        .asString()
-                        .c_str());
+        fragBuilder->codeAppendf("d.y), 1.0);\n}");
+        SkString _sample1112;
+        SkString _coords1112("mix(coord, zoom_coord, weight)");
+        _sample1112 = this->invokeChild(_outer.src_index, args, _coords1112.c_str());
+        fragBuilder->codeAppendf("\n%s = %s;\n", args.fOutputColor, _sample1112.c_str());
     }
 
 private:
@@ -85,9 +82,6 @@
             pdman.set1f(xInvInsetVar, (_outer.xInvInset));
             pdman.set1f(yInvInsetVar, (_outer.yInvInset));
         }
-        const GrSurfaceProxyView& srcView = _outer.textureSampler(0).view();
-        GrTexture& src = *srcView.proxy()->peekTexture();
-        (void)src;
         auto bounds = _outer.bounds;
         (void)bounds;
         UniformHandle& boundsUniform = boundsUniformVar;
@@ -105,32 +99,9 @@
         UniformHandle& offset = offsetVar;
         (void)offset;
 
-        SkScalar invW = 1.0f / src.width();
-        SkScalar invH = 1.0f / src.height();
-
-        {
-            SkScalar y = srcRect.y() * invH;
-            if (srcView.origin() != kTopLeft_GrSurfaceOrigin) {
-                y = 1.0f - (srcRect.height() / bounds.height()) - y;
-            }
-
-            pdman.set2f(offset, srcRect.x() * invW, y);
-        }
-
-        {
-            SkScalar y = bounds.y() * invH;
-            SkScalar hSign = 1.f;
-            if (srcView.origin() != kTopLeft_GrSurfaceOrigin) {
-                y = 1.0f - bounds.y() * invH;
-                hSign = -1.f;
-            }
-
-            pdman.set4f(boundsUniform,
-                        bounds.x() * invW,
-                        y,
-                        SkIntToScalar(src.width()) / bounds.width(),
-                        hSign * SkIntToScalar(src.height()) / bounds.height());
-        }
+        pdman.set2f(offset, srcRect.x(), srcRect.y());
+        pdman.set4f(
+                boundsUniform, bounds.x(), bounds.y(), 1.f / bounds.width(), 1.f / bounds.height());
     }
     UniformHandle boundsUniformVar;
     UniformHandle offsetVar;
@@ -147,7 +118,6 @@
 bool GrMagnifierEffect::onIsEqual(const GrFragmentProcessor& other) const {
     const GrMagnifierEffect& that = other.cast<GrMagnifierEffect>();
     (void)that;
-    if (src != that.src) return false;
     if (bounds != that.bounds) return false;
     if (srcRect != that.srcRect) return false;
     if (xInvZoom != that.xInvZoom) return false;
@@ -158,27 +128,22 @@
 }
 GrMagnifierEffect::GrMagnifierEffect(const GrMagnifierEffect& src)
         : INHERITED(kGrMagnifierEffect_ClassID, src.optimizationFlags())
-        , srcCoordTransform(src.srcCoordTransform)
-        , src(src.src)
+        , fCoordTransform0(src.fCoordTransform0)
         , bounds(src.bounds)
         , srcRect(src.srcRect)
         , xInvZoom(src.xInvZoom)
         , yInvZoom(src.yInvZoom)
         , xInvInset(src.xInvInset)
         , yInvInset(src.yInvInset) {
-    this->setTextureSamplerCnt(1);
-    this->addCoordTransform(&srcCoordTransform);
+    { src_index = this->cloneAndRegisterChildProcessor(src.childProcessor(src.src_index)); }
+    this->addCoordTransform(&fCoordTransform0);
 }
 std::unique_ptr<GrFragmentProcessor> GrMagnifierEffect::clone() const {
     return std::unique_ptr<GrFragmentProcessor>(new GrMagnifierEffect(*this));
 }
-const GrFragmentProcessor::TextureSampler& GrMagnifierEffect::onTextureSampler(int index) const {
-    return IthTextureSampler(index, src);
-}
 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrMagnifierEffect);
 #if GR_TEST_UTILS
 std::unique_ptr<GrFragmentProcessor> GrMagnifierEffect::TestCreate(GrProcessorTestData* d) {
-    auto[view, ct, at] = d->randomView();
     const int kMaxWidth = 200;
     const int kMaxHeight = 200;
     const SkScalar kMaxInset = 20.0f;
@@ -189,7 +154,8 @@
     SkIRect bounds = SkIRect::MakeWH(SkIntToScalar(kMaxWidth), SkIntToScalar(kMaxHeight));
     SkRect srcRect = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height));
 
-    auto effect = GrMagnifierEffect::Make(std::move(view),
+    auto src = GrProcessorUnitTest::MakeChildFP(d);
+    auto effect = GrMagnifierEffect::Make(std::move(src),
                                           bounds,
                                           srcRect,
                                           srcRect.width() / bounds.width(),
diff --git a/src/gpu/effects/generated/GrMagnifierEffect.h b/src/gpu/effects/generated/GrMagnifierEffect.h
index 7d4f03e..33b604e 100644
--- a/src/gpu/effects/generated/GrMagnifierEffect.h
+++ b/src/gpu/effects/generated/GrMagnifierEffect.h
@@ -19,7 +19,7 @@
 
 class GrMagnifierEffect : public GrFragmentProcessor {
 public:
-    static std::unique_ptr<GrFragmentProcessor> Make(GrSurfaceProxyView src,
+    static std::unique_ptr<GrFragmentProcessor> Make(std::unique_ptr<GrFragmentProcessor> src,
                                                      SkIRect bounds,
                                                      SkRect srcRect,
                                                      float xInvZoom,
@@ -32,8 +32,8 @@
     GrMagnifierEffect(const GrMagnifierEffect& src);
     std::unique_ptr<GrFragmentProcessor> clone() const override;
     const char* name() const override { return "MagnifierEffect"; }
-    GrCoordTransform srcCoordTransform;
-    TextureSampler src;
+    GrCoordTransform fCoordTransform0;
+    int src_index = -1;
     SkIRect bounds;
     SkRect srcRect;
     float xInvZoom;
@@ -42,7 +42,7 @@
     float yInvInset;
 
 private:
-    GrMagnifierEffect(GrSurfaceProxyView src,
+    GrMagnifierEffect(std::unique_ptr<GrFragmentProcessor> src,
                       SkIRect bounds,
                       SkRect srcRect,
                       float xInvZoom,
@@ -50,21 +50,21 @@
                       float xInvInset,
                       float yInvInset)
             : INHERITED(kGrMagnifierEffect_ClassID, kNone_OptimizationFlags)
-            , srcCoordTransform(SkMatrix::I(), src.proxy(), src.origin())
-            , src(std::move(src))
+            , fCoordTransform0(SkMatrix::I())
             , bounds(bounds)
             , srcRect(srcRect)
             , xInvZoom(xInvZoom)
             , yInvZoom(yInvZoom)
             , xInvInset(xInvInset)
             , yInvInset(yInvInset) {
-        this->setTextureSamplerCnt(1);
-        this->addCoordTransform(&srcCoordTransform);
+        SkASSERT(src);
+        src->setSampledWithExplicitCoords();
+        src_index = this->registerChildProcessor(std::move(src));
+        this->addCoordTransform(&fCoordTransform0);
     }
     GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
     void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
     bool onIsEqual(const GrFragmentProcessor&) const override;
-    const TextureSampler& onTextureSampler(int) const override;
     GR_DECLARE_FRAGMENT_PROCESSOR_TEST
     typedef GrFragmentProcessor INHERITED;
 };