diff --git a/include/effects/SkRuntimeEffect.h b/include/effects/SkRuntimeEffect.h
index 6470126..f965d19 100644
--- a/include/effects/SkRuntimeEffect.h
+++ b/include/effects/SkRuntimeEffect.h
@@ -249,7 +249,6 @@
 #endif
 
     friend class SkRTShader;            // fBaseProgram, fMain
-    friend class SkRuntimeBlender;      //
     friend class SkRuntimeColorFilter;  //
 
     friend class SkFilterColorProgram;
@@ -420,18 +419,4 @@
     using INHERITED = SkRuntimeEffectBuilder<sk_sp<SkShader>>;
 };
 
-/**
- * SkRuntimeBlendBuilder is a utility to simplify creation and uniform setup of runtime blenders.
- */
-class SK_API SkRuntimeBlendBuilder : public SkRuntimeEffectBuilder<sk_sp<SkBlender>> {
-public:
-    explicit SkRuntimeBlendBuilder(sk_sp<SkRuntimeEffect>);
-    ~SkRuntimeBlendBuilder();
-
-    sk_sp<SkBlender> makeBlender();
-
-private:
-    using INHERITED = SkRuntimeEffectBuilder<sk_sp<SkBlender>>;
-};
-
 #endif
diff --git a/src/core/SkRuntimeEffect.cpp b/src/core/SkRuntimeEffect.cpp
index 99c3914..7f35595 100644
--- a/src/core/SkRuntimeEffect.cpp
+++ b/src/core/SkRuntimeEffect.cpp
@@ -1003,64 +1003,6 @@
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class SkRuntimeBlender : public SkBlenderBase {
-public:
-    SkRuntimeBlender(sk_sp<SkRuntimeEffect> effect, sk_sp<SkData> uniforms)
-            : fEffect(std::move(effect))
-            , fUniforms(std::move(uniforms)) {}
-
-    skvm::Color onProgram(skvm::Builder* p, skvm::Color src, skvm::Color dst,
-                          const SkColorInfo& colorInfo, skvm::Uniforms* uniforms,
-                          SkArenaAlloc* alloc) const override {
-        sk_sp<SkData> inputs = get_xformed_uniforms(fEffect.get(), fUniforms,
-                                                    colorInfo.colorSpace());
-        SkASSERT(inputs);
-
-        const size_t uniformCount = fEffect->uniformSize() / 4;
-        std::vector<skvm::Val> uniform;
-        uniform.reserve(uniformCount);
-        for (size_t i = 0; i < uniformCount; i++) {
-            int bits;
-            memcpy(&bits, (const char*)inputs->data() + 4*i, 4);
-            uniform.push_back(p->uniform32(uniforms->push(bits)).id);
-        }
-
-        // Emit the blend function as an SkVM program.
-        skvm::Coord zeroCoord = {p->splat(0.0f), p->splat(0.0f)};
-        return SkSL::ProgramToSkVM(*fEffect->fBaseProgram, fEffect->fMain, p, SkMakeSpan(uniform),
-                                   /*device=*/zeroCoord, /*local=*/zeroCoord,
-                                   src, dst, /*sampleChild=*/nullptr);
-    }
-
-    void flatten(SkWriteBuffer& buffer) const override {
-        buffer.writeString(fEffect->source().c_str());
-        buffer.writeDataAsByteArray(fUniforms.get());
-    }
-
-    SK_FLATTENABLE_HOOKS(SkRuntimeBlender)
-
-private:
-    using INHERITED = SkBlenderBase;
-
-    sk_sp<SkRuntimeEffect> fEffect;
-    sk_sp<SkData> fUniforms;
-};
-
-sk_sp<SkFlattenable> SkRuntimeBlender::CreateProc(SkReadBuffer& buffer) {
-    SkString sksl;
-    buffer.readString(&sksl);
-    sk_sp<SkData> uniforms = buffer.readByteArrayAsData();
-
-    auto effect = SkMakeCachedRuntimeEffect(SkRuntimeEffect::MakeForBlender, std::move(sksl));
-    if (!buffer.validate(effect != nullptr)) {
-        return nullptr;
-    }
-
-    return effect->makeBlender(std::move(uniforms));
-}
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
 sk_sp<SkShader> SkRuntimeEffect::makeShader(sk_sp<SkData> uniforms,
                                             sk_sp<SkShader> childShaders[],
                                             size_t childCount,
@@ -1237,7 +1179,9 @@
     if (uniforms->size() != this->uniformSize() || !fChildren.empty()) {
         return nullptr;
     }
-    return sk_sp<SkBlender>(new SkRuntimeBlender(sk_ref_sp(this), std::move(uniforms)));
+    // TODO(skia:12080): create a runtime blend class
+    SkDEBUGFAIL("not yet implemented");
+    return nullptr;
 }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1272,12 +1216,3 @@
                                       localMatrix,
                                       isOpaque);
 }
-
-SkRuntimeBlendBuilder::SkRuntimeBlendBuilder(sk_sp<SkRuntimeEffect> effect)
-        : INHERITED(std::move(effect)) {}
-
-SkRuntimeBlendBuilder::~SkRuntimeBlendBuilder() = default;
-
-sk_sp<SkBlender> SkRuntimeBlendBuilder::makeBlender() {
-    return this->effect()->makeBlender(this->uniforms());
-}
diff --git a/tests/SkRuntimeEffectTest.cpp b/tests/SkRuntimeEffectTest.cpp
index 69d4579..c2e24ff 100644
--- a/tests/SkRuntimeEffectTest.cpp
+++ b/tests/SkRuntimeEffectTest.cpp
@@ -6,7 +6,6 @@
  */
 
 #include "include/core/SkBitmap.h"
-#include "include/core/SkBlender.h"
 #include "include/core/SkCanvas.h"
 #include "include/core/SkColorFilter.h"
 #include "include/core/SkData.h"
@@ -330,7 +329,7 @@
 
     void test(GrColor TL, GrColor TR, GrColor BL, GrColor BR,
               PreTestFn preTestCallback = nullptr) {
-        auto shader = fBuilder->makeShader(/*localMatrix=*/nullptr, /*isOpaque=*/false);
+        auto shader = fBuilder->makeShader(nullptr, false);
         if (!shader) {
             REPORT_FAILURE(fReporter, "shader", SkString("Effect didn't produce a shader"));
             return;
@@ -500,27 +499,10 @@
     // Test passes if this sequence doesn't assert.  skbug.com/10667
     SkRuntimeShaderBuilder b(std::move(effect));
     b.uniform("x") = 0.0f;
-    auto shader_0 = b.makeShader(/*localMatrix=*/nullptr, /*isOpaque=*/false);
+    auto shader_0 = b.makeShader(nullptr, false);
 
     b.uniform("x") = 1.0f;
-    auto shader_1 = b.makeShader(/*localMatrix=*/nullptr, /*isOpaque=*/true);
-}
-
-DEF_TEST(SkRuntimeBlendBuilderReuse, r) {
-    const char* kSource = R"(
-        uniform half x;
-        half4 main(half4 s, half4 d) { return half4(x); }
-    )";
-
-    sk_sp<SkRuntimeEffect> effect = SkRuntimeEffect::MakeForBlender(SkString(kSource)).effect;
-    REPORTER_ASSERT(r, effect);
-
-    // We should be able to construct multiple SkBlenders in a row without asserting.
-    SkRuntimeBlendBuilder b(std::move(effect));
-    for (float x = 0.0f; x <= 2.0f; x += 2.0f) {
-        b.uniform("x") = x;
-        sk_sp<SkBlender> blender = b.makeBlender();
-    }
+    auto shader_1 = b.makeShader(nullptr, true);
 }
 
 DEF_TEST(SkRuntimeShaderBuilderSetUniforms, r) {
@@ -548,7 +530,8 @@
     REPORTER_ASSERT(r, !b.uniform("offset").set<float>(origin, 3));
 #endif
 
-    auto shader = b.makeShader(/*localMatrix=*/nullptr, /*isOpaque=*/false);
+
+    auto shader = b.makeShader(nullptr, false);
 }
 
 DEF_TEST(SkRuntimeEffectThreaded, r) {
