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));
+}