diff --git a/src/gpu/effects/GrDisableColorXP.cpp b/src/gpu/effects/GrDisableColorXP.cpp
index dfbf903..3ed4ba6 100644
--- a/src/gpu/effects/GrDisableColorXP.cpp
+++ b/src/gpu/effects/GrDisableColorXP.cpp
@@ -19,36 +19,23 @@
  */
 class DisableColorXP : public GrXferProcessor {
 public:
-    DisableColorXP()
-    : INHERITED(kDisableColorXP_ClassID) {}
-
-    const char* name() const override { return "Disable Color"; }
-
-    GrGLSLXferProcessor* createGLSLInstance() const override;
+    DisableColorXP() : INHERITED(kDisableColorXP_ClassID) {}
 
 private:
-
-    void onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override;
-
-    void onGetBlendInfo(GrXferProcessor::BlendInfo* blendInfo) const override;
-
-    bool onIsEqual(const GrXferProcessor& xpBase) const override {
-        return true;
+    const char* name() const override { return "Disable Color"; }
+    bool onIsEqual(const GrXferProcessor& xpBase) const override { return true; }
+    void onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override {
+        return;  // No key.
     }
+    void onGetBlendInfo(GrXferProcessor::BlendInfo* blendInfo) const override {
+        blendInfo->fWriteColor = false;
+    }
+    GrGLSLXferProcessor* createGLSLInstance() const override;
 
     typedef GrXferProcessor INHERITED;
 };
 
-///////////////////////////////////////////////////////////////////////////////
-
 class GLDisableColorXP : public GrGLSLXferProcessor {
-public:
-    GLDisableColorXP(const GrProcessor&) {}
-
-    ~GLDisableColorXP() override {}
-
-    static void GenKey(const GrProcessor&, const GrShaderCaps&, GrProcessorKeyBuilder*) {}
-
 private:
     void emitOutputsForBlendState(const EmitArgs& args) override {
         if (args.fShaderCaps->mustWriteToFragColor()) {
@@ -72,26 +59,12 @@
     typedef GrGLSLXferProcessor INHERITED;
 };
 
-///////////////////////////////////////////////////////////////////////////////
-
-void DisableColorXP::onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const {
-    GLDisableColorXP::GenKey(*this, caps, b);
+GrGLSLXferProcessor* DisableColorXP::createGLSLInstance() const {
+    return new GLDisableColorXP();
 }
 
-GrGLSLXferProcessor* DisableColorXP::createGLSLInstance() const { return new GLDisableColorXP(*this); }
-
-void DisableColorXP::onGetBlendInfo(GrXferProcessor::BlendInfo* blendInfo) const {
-    blendInfo->fWriteColor = false;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-sk_sp<const GrXferProcessor> GrDisableColorXPFactory::makeXferProcessor(
-        const GrProcessorAnalysisColor&,
-        GrProcessorAnalysisCoverage,
-        bool hasMixedSamples,
-        const GrCaps& caps,
-        GrClampType clampType) const {
-    return sk_sp<const GrXferProcessor>(new DisableColorXP);
+sk_sp<const GrXferProcessor> GrDisableColorXPFactory::MakeXferProcessor() {
+    return sk_make_sp<DisableColorXP>();
 }
 
 GR_DEFINE_XP_FACTORY_TEST(GrDisableColorXPFactory);
diff --git a/src/gpu/effects/GrDisableColorXP.h b/src/gpu/effects/GrDisableColorXP.h
index 5e52264..622e9fc 100644
--- a/src/gpu/effects/GrDisableColorXP.h
+++ b/src/gpu/effects/GrDisableColorXP.h
@@ -23,24 +23,25 @@
 #endif
 class GrDisableColorXPFactory : public GrXPFactory {
 public:
-    static const GrXPFactory* Get();
+    static const GrDisableColorXPFactory* Get();
+
+    static sk_sp<const GrXferProcessor> MakeXferProcessor();
 
 private:
     constexpr GrDisableColorXPFactory() {}
 
-    AnalysisProperties analysisProperties(const GrProcessorAnalysisColor&,
-                                          const GrProcessorAnalysisCoverage&,
-                                          const GrCaps&,
-                                          GrClampType) const override {
+    AnalysisProperties analysisProperties(
+            const GrProcessorAnalysisColor&, const GrProcessorAnalysisCoverage&, const GrCaps&,
+            GrClampType) const override {
         return AnalysisProperties::kCompatibleWithCoverageAsAlpha |
                AnalysisProperties::kIgnoresInputColor;
     }
 
-    sk_sp<const GrXferProcessor> makeXferProcessor(const GrProcessorAnalysisColor&,
-                                                   GrProcessorAnalysisCoverage,
-                                                   bool hasMixedSamples,
-                                                   const GrCaps&,
-                                                   GrClampType) const override;
+    sk_sp<const GrXferProcessor> makeXferProcessor(
+            const GrProcessorAnalysisColor&, GrProcessorAnalysisCoverage, bool hasMixedSamples,
+            const GrCaps&, GrClampType) const override {
+        return MakeXferProcessor();
+    }
 
     GR_DECLARE_XP_FACTORY_TEST
 
@@ -53,7 +54,7 @@
 #pragma clang diagnostic pop
 #endif
 
-inline const GrXPFactory* GrDisableColorXPFactory::Get() {
+inline const GrDisableColorXPFactory* GrDisableColorXPFactory::Get() {
     // If this is constructed as static constexpr by cl.exe (2015 SP2) the vtable is null.
 #ifdef SK_BUILD_FOR_WIN
     static const GrDisableColorXPFactory gDisableColorXPFactory;
