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/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"