diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt
index e671525..43bdc29 100644
--- a/RELEASE_NOTES.txt
+++ b/RELEASE_NOTES.txt
@@ -9,6 +9,9 @@
   * Removed SkPaint::getHash
     https://review.skia.org/419336
 
+  * Removed SkShaders::Lerp. It was unused (and easy to replicate with SkRuntimeEffect).
+    https://review.skia.org/419796
+
 * * *
 
 Milestone 92
diff --git a/gm/colorfilterimagefilter.cpp b/gm/colorfilterimagefilter.cpp
index cf1b1a6..3a9a51c 100644
--- a/gm/colorfilterimagefilter.cpp
+++ b/gm/colorfilterimagefilter.cpp
@@ -232,45 +232,3 @@
         canvas->translate(0, 150);
     }
 }
-
-template <typename Maker> void do_mixershader(SkCanvas* canvas, Maker&& maker) {
-    auto shaderA = GetResourceAsImage("images/mandrill_128.png")->makeShader(SkSamplingOptions());
-    const SkColor colors[] = { SK_ColorGREEN, 0 };
-    auto shaderB = SkGradientShader::MakeRadial({60, 60}, 55, colors, nullptr, 2,
-                                                SkTileMode::kClamp,
-                                                SkGradientShader::kInterpolateColorsInPremul_Flag,
-                                                nullptr);
-    const SkBlendMode modes[] = {
-        SkBlendMode::kSrc, SkBlendMode::kModulate, SkBlendMode::kColorBurn, SkBlendMode::kPlus,
-        SkBlendMode::kDstATop,
-    };
-    SkPaint paint;
-    SkRect r = SkRect::MakeWH(120, 120);
-
-    canvas->translate(10, 10);
-    for (auto mode : modes) {
-        canvas->save();
-        const int count = 6;
-        for (int x = 0; x < count; ++x) {
-            const float t = x * 1.0f / (count - 1);
-            paint.setShader(maker(shaderA, shaderB, mode, t));
-            canvas->drawRect(r, paint);
-            canvas->translate(r.width() + 10, 0);
-        }
-        canvas->restore();
-        canvas->translate(0, r.height() + 20);
-    }
-}
-
-DEF_SIMPLE_GM(mixershader, canvas, 800, 700) {
-    do_mixershader(canvas, [](sk_sp<SkShader> a, sk_sp<SkShader> b, SkBlendMode mode, float t) {
-        auto sh = SkShaders::Blend(mode, a, b);
-        return SkShaders::Lerp(t, a, sh);
-    });
-}
-
-DEF_SIMPLE_GM(mixershader2, canvas, 800, 700) {
-    do_mixershader(canvas, [](sk_sp<SkShader> a, sk_sp<SkShader> b, SkBlendMode mode, float t) {
-        return SkShaders::Lerp(t, a, SkShaders::Blend(mode, a, b));
-    });
-}
diff --git a/include/core/SkShader.h b/include/core/SkShader.h
index 94fc40a..eccb545 100644
--- a/include/core/SkShader.h
+++ b/include/core/SkShader.h
@@ -138,7 +138,6 @@
     static sk_sp<SkShader> Color(SkColor);
     static sk_sp<SkShader> Color(const SkColor4f&, sk_sp<SkColorSpace>);
     static sk_sp<SkShader> Blend(SkBlendMode mode, sk_sp<SkShader> dst, sk_sp<SkShader> src);
-    static sk_sp<SkShader> Lerp(float t, sk_sp<SkShader> dst, sk_sp<SkShader> src);
 
 private:
     SkShaders() = delete;
diff --git a/modules/canvaskit/CHANGELOG.md b/modules/canvaskit/CHANGELOG.md
index 0587fd6..519005a 100644
--- a/modules/canvaskit/CHANGELOG.md
+++ b/modules/canvaskit/CHANGELOG.md
@@ -21,6 +21,9 @@
    but can be an array, a TypedArray, or a MallocObj.
  - `CanvasKit.*Builder` have all been removed. Clients should use Malloc instead.
 
+### Removed
+ - `CanvasKit.Shader.MakeLerp`, the same effect can be easily generated with `RuntimeEffect`
+
 ### Known Bugs
  - On legacy (non-ANGLE) SwiftShader, certain paths that require tessellation may not be drawn
    correctly when using a WebGL-backed surface. (skbug.com/11965)
diff --git a/modules/canvaskit/canvaskit_bindings.cpp b/modules/canvaskit/canvaskit_bindings.cpp
index ee2b268..bce3796 100644
--- a/modules/canvaskit/canvaskit_bindings.cpp
+++ b/modules/canvaskit/canvaskit_bindings.cpp
@@ -1584,7 +1584,6 @@
                 return SkShaders::Color(ptrToSkColor4f(cPtr), colorSpace);
             })
         )
-        .class_function("MakeLerp", select_overload<sk_sp<SkShader>(float, sk_sp<SkShader>, sk_sp<SkShader>)>(&SkShaders::Lerp))
         .class_function("MakeFractalNoise", optional_override([](
                                                 SkScalar baseFreqX, SkScalar baseFreqY,
                                                 int numOctaves, SkScalar seed,
diff --git a/modules/canvaskit/externs.js b/modules/canvaskit/externs.js
index 51484b8..0db23d8 100644
--- a/modules/canvaskit/externs.js
+++ b/modules/canvaskit/externs.js
@@ -636,7 +636,6 @@
     MakeBlend: function() {},
     MakeColor: function() {},
     MakeFractalNoise: function() {},
-    MakeLerp: function() {},
     MakeLinearGradient: function() {},
     MakeRadialGradient: function() {},
     MakeSweepGradient: function() {},
diff --git a/modules/canvaskit/interface.js b/modules/canvaskit/interface.js
index 7883665..c10aed0 100644
--- a/modules/canvaskit/interface.js
+++ b/modules/canvaskit/interface.js
@@ -884,7 +884,6 @@
   // TODO(kjlubick) remove deprecated names.
   CanvasKit.Shader.Blend = CanvasKit.Shader.MakeBlend;
   CanvasKit.Shader.Color = CanvasKit.Shader.MakeColor;
-  CanvasKit.Shader.Lerp = CanvasKit.Shader.MakeLerp;
 
   CanvasKit.Shader.MakeLinearGradient = function(start, end, colors, pos, mode, localMatrix, flags, colorSpace) {
     colorSpace = colorSpace || null;
diff --git a/modules/canvaskit/npm_build/types/canvaskit-wasm-tests.ts b/modules/canvaskit/npm_build/types/canvaskit-wasm-tests.ts
index c83d12f..a46c07a 100644
--- a/modules/canvaskit/npm_build/types/canvaskit-wasm-tests.ts
+++ b/modules/canvaskit/npm_build/types/canvaskit-wasm-tests.ts
@@ -717,7 +717,6 @@
     const s1 = CK.Shader.MakeColor([0.8, 0.2, 0.5, 0.9], // $ExpectType Shader
                                  CK.ColorSpace.SRGB);
     const s2 = CK.Shader.MakeBlend(CK.BlendMode.Src, s1, s1); // $ExpectType Shader
-    const s3 = CK.Shader.MakeLerp(0.3, s1, s2); // $ExpectType Shader
     const s4 = CK.Shader.MakeLinearGradient(// $ExpectType Shader
         [0, 0], [50, 100],
         Float32Array.of(
diff --git a/modules/canvaskit/npm_build/types/index.d.ts b/modules/canvaskit/npm_build/types/index.d.ts
index 397aaf2..4f4a154 100644
--- a/modules/canvaskit/npm_build/types/index.d.ts
+++ b/modules/canvaskit/npm_build/types/index.d.ts
@@ -3364,14 +3364,6 @@
                      tileW: number, tileH: number): Shader;
 
     /**
-     * Returns a shader is a linear interpolation combines the given shaders with a BlendMode.
-     * @param t - range of [0.0, 1.0], indicating how far we should be between one and two.
-     * @param one
-     * @param two
-     */
-    MakeLerp(t: number, one: Shader, two: Shader): Shader;
-
-    /**
      * Returns a shader that generates a linear gradient between the two specified points.
      * See SkGradientShader.h for more.
      * @param start
diff --git a/modules/canvaskit/tests/core.spec.js b/modules/canvaskit/tests/core.spec.js
index 4f5797e..056a4db 100644
--- a/modules/canvaskit/tests/core.spec.js
+++ b/modules/canvaskit/tests/core.spec.js
@@ -944,7 +944,6 @@
     gm('combined_shaders', (canvas) => {
         const rShader = CanvasKit.Shader.Color(CanvasKit.Color(255, 0, 0, 1.0)); // deprecated
         const gShader = CanvasKit.Shader.MakeColor(CanvasKit.Color(0, 255, 0, 0.6));
-        const bShader = CanvasKit.Shader.MakeColor(CanvasKit.Color(0, 0, 255, 1.0));
 
         const rgShader = CanvasKit.Shader.MakeBlend(CanvasKit.BlendMode.SrcOver, rShader, gShader);
 
@@ -952,15 +951,9 @@
         p.setShader(rgShader);
         canvas.drawPaint(p);
 
-        const gbShader = CanvasKit.Shader.MakeLerp(0.5, gShader, bShader);
-
-        p.setShader(gbShader);
-        canvas.drawRect(CanvasKit.LTRBRect(5, 100, 300, 400), p);
         rShader.delete();
         gShader.delete();
-        bShader.delete();
         rgShader.delete();
-        gbShader.delete();
         p.delete();
     });
 
diff --git a/src/shaders/SkComposeShader.cpp b/src/shaders/SkComposeShader.cpp
index 8edc0be..010c9cd 100644
--- a/src/shaders/SkComposeShader.cpp
+++ b/src/shaders/SkComposeShader.cpp
@@ -51,34 +51,6 @@
     return sk_sp<SkShader>(new SkShader_Blend(mode, std::move(dst), std::move(src)));
 }
 
-sk_sp<SkShader> SkShaders::Lerp(float weight, sk_sp<SkShader> dst, sk_sp<SkShader> src) {
-    if (SkScalarIsNaN(weight)) {
-        return nullptr;
-    }
-    if (dst == src || weight <= 0) {
-        return dst;
-    }
-    if (weight >= 1) {
-        return src;
-    }
-
-    sk_sp<SkRuntimeEffect> effect = SkMakeCachedRuntimeEffect(
-        SkRuntimeEffect::MakeForShader,
-        "uniform shader a;"
-        "uniform shader b;"
-        "uniform half w;"
-        "half4 main(float2 xy) { return mix(sample(a, xy), sample(b, xy), w); }"
-    );
-    SkASSERT(effect);
-
-    sk_sp<SkShader> inputs[] = {dst, src};
-    return effect->makeShader(SkData::MakeWithCopy(&weight, sizeof(weight)),
-                              inputs,
-                              SK_ARRAY_COUNT(inputs),
-                              nullptr,
-                              false);
-}
-
 ///////////////////////////////////////////////////////////////////////////////
 
 static bool append_shader_or_paint(const SkStageRec& rec, SkShader* shader) {
