skvm for compose shaders

Also, move blendmode helpers into SkBlendModePriv.h

Change-Id: I2695c9dabd255b58616e4febb3e53190267cdb3b
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/277061
Commit-Queue: Mike Reed <reed@google.com>
Reviewed-by: Mike Klein <mtklein@google.com>
diff --git a/src/core/SkBlendModePriv.h b/src/core/SkBlendModePriv.h
index b19e565..e42bb4c 100644
--- a/src/core/SkBlendModePriv.h
+++ b/src/core/SkBlendModePriv.h
@@ -11,6 +11,7 @@
 #include "include/core/SkBlendMode.h"
 #include "include/core/SkColor.h"
 #include "include/private/SkColorData.h"
+#include "src/core/SkVM.h"
 
 class SkRasterPipeline;
 
@@ -30,4 +31,9 @@
 const GrXPFactory* SkBlendMode_AsXPFactory(SkBlendMode);
 #endif
 
+namespace skvm {
+    bool BlendModeSupported(SkBlendMode);
+    Color BlendModeProgram(Builder*, SkBlendMode, Color src, Color dst);
+}
+
 #endif
diff --git a/src/core/SkVMBlitter.cpp b/src/core/SkVMBlitter.cpp
index 00d9d8e..e208561 100644
--- a/src/core/SkVMBlitter.cpp
+++ b/src/core/SkVMBlitter.cpp
@@ -15,7 +15,6 @@
 #include "src/core/SkLRUCache.h"
 #include "src/core/SkOpts.h"
 #include "src/core/SkVM.h"
-#include "src/core/SkVMBlitter.h"
 #include "src/shaders/SkColorFilterShader.h"
 
 namespace {
diff --git a/src/core/SkVMBlitter.h b/src/core/SkVMBlitter.h
deleted file mode 100644
index 20c3c5d..0000000
--- a/src/core/SkVMBlitter.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright 2019 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef SkVMBlitter_DEFINED
-#define SkVMBlitter_DEFINED
-
-#include "include/core/SkBlendMode.h"
-#include "src/core/SkVM.h"
-
-namespace skvm {
-    bool BlendModeSupported(SkBlendMode);
-    Color BlendModeProgram(Builder*, SkBlendMode, Color src, Color dst);
-}
-
-#endif
diff --git a/src/shaders/SkComposeShader.cpp b/src/shaders/SkComposeShader.cpp
index ae7ffec..66891e7 100644
--- a/src/shaders/SkComposeShader.cpp
+++ b/src/shaders/SkComposeShader.cpp
@@ -12,6 +12,7 @@
 #include "src/core/SkBlendModePriv.h"
 #include "src/core/SkRasterPipeline.h"
 #include "src/core/SkReadBuffer.h"
+#include "src/core/SkVM.h"
 #include "src/core/SkWriteBuffer.h"
 #include "src/shaders/SkColorShader.h"
 #include "src/shaders/SkComposeShader.h"
@@ -132,6 +133,30 @@
     return true;
 }
 
+bool SkShader_Blend::onProgram(skvm::Builder* p,
+                               const SkMatrix& ctm, const SkMatrix* localM,
+                               SkFilterQuality q, SkColorSpace* cs,
+                               skvm::Uniforms* uniforms, SkArenaAlloc* alloc,
+                               skvm::F32 x, skvm::F32 y,
+                               skvm::F32* r, skvm::F32* g, skvm::F32* b, skvm::F32* a) const {
+    if (!skvm::BlendModeSupported(fMode)) {
+        return false;
+    }
+    skvm::F32 dr, dg, db, da,
+              sr, sg, sb, sa;
+    if (!as_SB(fDst)->program(p, ctm, localM, q, cs, uniforms, alloc, x, y, &dr, &dg, &db, &da) ||
+        !as_SB(fSrc)->program(p, ctm, localM, q, cs, uniforms, alloc, x, y, &sr, &sg, &sb, &sa)) {
+        return false;
+    }
+    auto color = skvm::BlendModeProgram(p, fMode, {sr, sg, sb, sa}, {dr, dg, db, da});
+    *r = color.r;
+    *g = color.g;
+    *b = color.b;
+    *a = color.a;
+    return true;
+}
+
+
 sk_sp<SkFlattenable> SkShader_Lerp::CreateProc(SkReadBuffer& buffer) {
     sk_sp<SkShader> dst(buffer.readShader());
     sk_sp<SkShader> src(buffer.readShader());
@@ -158,6 +183,26 @@
     return true;
 }
 
+bool SkShader_Lerp::onProgram(skvm::Builder* p,
+                              const SkMatrix& ctm, const SkMatrix* localM,
+                              SkFilterQuality q, SkColorSpace* cs,
+                              skvm::Uniforms* uniforms, SkArenaAlloc* alloc,
+                              skvm::F32 x, skvm::F32 y,
+                              skvm::F32* r, skvm::F32* g, skvm::F32* b, skvm::F32* a) const {
+    skvm::F32 dr, dg, db, da,
+              sr, sg, sb, sa;
+    if (!as_SB(fDst)->program(p, ctm, localM, q, cs, uniforms, alloc, x, y, &dr, &dg, &db, &da) ||
+        !as_SB(fSrc)->program(p, ctm, localM, q, cs, uniforms, alloc, x, y, &sr, &sg, &sb, &sa)) {
+        return false;
+    }
+    auto t = p->uniformF(uniforms->pushF(fWeight));
+    *r = p->lerp(dr, sr, t);
+    *g = p->lerp(dg, sg, t);
+    *b = p->lerp(db, sb, t);
+    *a = p->lerp(da, sa, t);
+    return true;
+}
+
 #if SK_SUPPORT_GPU
 
 #include "include/private/GrRecordingContext.h"
diff --git a/src/shaders/SkComposeShader.h b/src/shaders/SkComposeShader.h
index d5c3a2f..bc96a61 100644
--- a/src/shaders/SkComposeShader.h
+++ b/src/shaders/SkComposeShader.h
@@ -28,6 +28,10 @@
     SkShader_Blend(SkReadBuffer&);
     void flatten(SkWriteBuffer&) const override;
     bool onAppendStages(const SkStageRec&) const override;
+    bool onProgram(skvm::Builder*, const SkMatrix& ctm, const SkMatrix* localM,
+                   SkFilterQuality, SkColorSpace* dstCS, skvm::Uniforms*, SkArenaAlloc*,
+                   skvm::F32 x, skvm::F32 y,
+                   skvm::F32* r, skvm::F32* g, skvm::F32* b, skvm::F32* a) const override;
 
 private:
     SK_FLATTENABLE_HOOKS(SkShader_Blend)
@@ -58,6 +62,10 @@
     SkShader_Lerp(SkReadBuffer&);
     void flatten(SkWriteBuffer&) const override;
     bool onAppendStages(const SkStageRec&) const override;
+    bool onProgram(skvm::Builder*, const SkMatrix& ctm, const SkMatrix* localM,
+                   SkFilterQuality, SkColorSpace* dstCS, skvm::Uniforms*, SkArenaAlloc*,
+                   skvm::F32 x, skvm::F32 y,
+                   skvm::F32* r, skvm::F32* g, skvm::F32* b, skvm::F32* a) const override;
 
 private:
     SK_FLATTENABLE_HOOKS(SkShader_Lerp)