Reland "SkMixerColorFilter GPU impl"

This reverts commit c2949ec67b92e455edd58e470564023c37df6e7a.

Reason for revert: not related to crossfade

Original change's description:
> Revert "SkMixerColorFilter GPU impl"
> 
> This reverts commit e80f7eb9d6a15d42827108700990291d3efb5995.
> 
> Reason for revert: break crossfade in chrome roll?
> 
> Original change's description:
> > SkMixerColorFilter GPU impl
> > 
> > Bug: skia:
> > Change-Id: Ia1e25e0c99737d9720c17f92f0d76a1cb7897ea8
> > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/193163
> > Commit-Queue: Florin Malita <fmalita@chromium.org>
> > Reviewed-by: Brian Salomon <bsalomon@google.com>
> 
> TBR=bsalomon@google.com,ethannicholas@google.com,fmalita@chromium.org,reed@google.com
> 
> Change-Id: Ib9464fcabc649b95ba131146690d6208af728436
> No-Presubmit: true
> No-Tree-Checks: true
> No-Try: true
> Bug: skia:
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/197760
> Reviewed-by: Mike Reed <reed@google.com>
> Commit-Queue: Mike Reed <reed@google.com>

TBR=bsalomon@google.com,ethannicholas@google.com,fmalita@chromium.org,reed@google.com

Change-Id: Ie96e80e153aeab16c4ea35d5f1350372060228aa
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: skia:
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/197763
Reviewed-by: Florin Malita <fmalita@chromium.org>
Commit-Queue: Florin Malita <fmalita@chromium.org>
diff --git a/src/gpu/effects/GrMixerEffect.cpp b/src/gpu/effects/GrMixerEffect.cpp
new file mode 100644
index 0000000..6e79f51
--- /dev/null
+++ b/src/gpu/effects/GrMixerEffect.cpp
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2019 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/**************************************************************************************************
+ *** This file was autogenerated from GrMixerEffect.fp; do not modify.
+ **************************************************************************************************/
+#include "GrMixerEffect.h"
+#include "glsl/GrGLSLFragmentProcessor.h"
+#include "glsl/GrGLSLFragmentShaderBuilder.h"
+#include "glsl/GrGLSLProgramBuilder.h"
+#include "GrTexture.h"
+#include "SkSLCPP.h"
+#include "SkSLUtil.h"
+class GrGLSLMixerEffect : public GrGLSLFragmentProcessor {
+public:
+    GrGLSLMixerEffect() {}
+    void emitCode(EmitArgs& args) override {
+        GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
+        const GrMixerEffect& _outer = args.fFp.cast<GrMixerEffect>();
+        (void)_outer;
+        auto weight = _outer.weight();
+        (void)weight;
+        fWeightVar = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kHalf_GrSLType,
+                                                      kDefault_GrSLPrecision, "weight");
+        SkString _input0 = SkStringPrintf("%s", args.fInputColor);
+        SkString _child0("_child0");
+        this->emitChild(_outer.fp0_index(), _input0.c_str(), &_child0, args);
+        fragBuilder->codeAppendf("half4 in0 = %s;", _child0.c_str());
+        SkString _input1 = SkStringPrintf("%s", args.fInputColor);
+        SkString _child1("_child1");
+        if (_outer.fp1_index() >= 0) {
+            this->emitChild(_outer.fp1_index(), _input1.c_str(), &_child1, args);
+        } else {
+            fragBuilder->codeAppendf("half4 %s;", _child1.c_str());
+        }
+        fragBuilder->codeAppendf("\nhalf4 in1 = %s ? %s : %s;\n%s = mix(in0, in1, %s);\n",
+                                 _outer.fp1_index() >= 0 ? "true" : "false", _child1.c_str(),
+                                 args.fInputColor, args.fOutputColor,
+                                 args.fUniformHandler->getUniformCStr(fWeightVar));
+    }
+
+private:
+    void onSetData(const GrGLSLProgramDataManager& pdman,
+                   const GrFragmentProcessor& _proc) override {
+        const GrMixerEffect& _outer = _proc.cast<GrMixerEffect>();
+        { pdman.set1f(fWeightVar, (_outer.weight())); }
+    }
+    UniformHandle fWeightVar;
+};
+GrGLSLFragmentProcessor* GrMixerEffect::onCreateGLSLInstance() const {
+    return new GrGLSLMixerEffect();
+}
+void GrMixerEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps,
+                                          GrProcessorKeyBuilder* b) const {}
+bool GrMixerEffect::onIsEqual(const GrFragmentProcessor& other) const {
+    const GrMixerEffect& that = other.cast<GrMixerEffect>();
+    (void)that;
+    if (fWeight != that.fWeight) return false;
+    return true;
+}
+GrMixerEffect::GrMixerEffect(const GrMixerEffect& src)
+        : INHERITED(kGrMixerEffect_ClassID, src.optimizationFlags())
+        , fFp0_index(src.fFp0_index)
+        , fFp1_index(src.fFp1_index)
+        , fWeight(src.fWeight) {
+    this->registerChildProcessor(src.childProcessor(fFp0_index).clone());
+    if (fFp1_index >= 0) {
+        this->registerChildProcessor(src.childProcessor(fFp1_index).clone());
+    }
+}
+std::unique_ptr<GrFragmentProcessor> GrMixerEffect::clone() const {
+    return std::unique_ptr<GrFragmentProcessor>(new GrMixerEffect(*this));
+}