blob: d57631cf5f1ec211a668bdaf63388b32927e4b53 [file] [log] [blame]
Michael Ludwig0495f7a2018-09-12 15:23:33 -04001/*
2 * Copyright 2018 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8/**************************************************************************************************
9 *** This file was autogenerated from GrDualIntervalGradientColorizer.fp; do not modify.
10 **************************************************************************************************/
11#include "GrDualIntervalGradientColorizer.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050012
John Stiles45f5b032020-07-27 17:31:29 -040013#include "src/core/SkUtils.h"
Greg Daniel456f9b52020-03-05 19:14:18 +000014#include "src/gpu/GrTexture.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050015#include "src/gpu/glsl/GrGLSLFragmentProcessor.h"
16#include "src/gpu/glsl/GrGLSLFragmentShaderBuilder.h"
17#include "src/gpu/glsl/GrGLSLProgramBuilder.h"
18#include "src/sksl/SkSLCPP.h"
19#include "src/sksl/SkSLUtil.h"
Michael Ludwig0495f7a2018-09-12 15:23:33 -040020class GrGLSLDualIntervalGradientColorizer : public GrGLSLFragmentProcessor {
21public:
22 GrGLSLDualIntervalGradientColorizer() {}
23 void emitCode(EmitArgs& args) override {
Mike Kleind6ab77a2019-03-21 08:18:24 -050024 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
Michael Ludwig0495f7a2018-09-12 15:23:33 -040025 const GrDualIntervalGradientColorizer& _outer =
26 args.fFp.cast<GrDualIntervalGradientColorizer>();
27 (void)_outer;
Ethan Nicholasbcd51e82019-04-09 10:40:41 -040028 auto scale01 = _outer.scale01;
Michael Ludwig0495f7a2018-09-12 15:23:33 -040029 (void)scale01;
Ethan Nicholasbcd51e82019-04-09 10:40:41 -040030 auto bias01 = _outer.bias01;
Michael Ludwig0495f7a2018-09-12 15:23:33 -040031 (void)bias01;
Ethan Nicholasbcd51e82019-04-09 10:40:41 -040032 auto scale23 = _outer.scale23;
Michael Ludwig0495f7a2018-09-12 15:23:33 -040033 (void)scale23;
Ethan Nicholasbcd51e82019-04-09 10:40:41 -040034 auto bias23 = _outer.bias23;
Michael Ludwig0495f7a2018-09-12 15:23:33 -040035 (void)bias23;
Ethan Nicholasbcd51e82019-04-09 10:40:41 -040036 auto threshold = _outer.threshold;
Michael Ludwig0495f7a2018-09-12 15:23:33 -040037 (void)threshold;
Ethan Nicholas16464c32020-04-06 13:53:05 -040038 scale01Var = args.fUniformHandler->addUniform(&_outer, kFragment_GrShaderFlag,
39 kFloat4_GrSLType, "scale01");
40 bias01Var = args.fUniformHandler->addUniform(&_outer, kFragment_GrShaderFlag,
41 kFloat4_GrSLType, "bias01");
42 scale23Var = args.fUniformHandler->addUniform(&_outer, kFragment_GrShaderFlag,
43 kFloat4_GrSLType, "scale23");
44 bias23Var = args.fUniformHandler->addUniform(&_outer, kFragment_GrShaderFlag,
45 kFloat4_GrSLType, "bias23");
46 thresholdVar = args.fUniformHandler->addUniform(&_outer, kFragment_GrShaderFlag,
47 kHalf_GrSLType, "threshold");
Michael Ludwig0495f7a2018-09-12 15:23:33 -040048 fragBuilder->codeAppendf(
John Stiles6d3996c2020-07-31 12:33:31 -040049 R"SkSL(half t = half(%s.x);
John Stiles50819422020-06-18 13:00:38 -040050float4 scale, bias;
51if (t < %s) {
52 scale = %s;
53 bias = %s;
54} else {
55 scale = %s;
56 bias = %s;
57}
58%s = half4(float(t) * scale + bias);
59)SkSL",
John Stiles6d3996c2020-07-31 12:33:31 -040060 args.fSampleCoord, args.fUniformHandler->getUniformCStr(thresholdVar),
Ethan Nicholasbcd51e82019-04-09 10:40:41 -040061 args.fUniformHandler->getUniformCStr(scale01Var),
62 args.fUniformHandler->getUniformCStr(bias01Var),
63 args.fUniformHandler->getUniformCStr(scale23Var),
64 args.fUniformHandler->getUniformCStr(bias23Var), args.fOutputColor);
Michael Ludwig0495f7a2018-09-12 15:23:33 -040065 }
66
67private:
68 void onSetData(const GrGLSLProgramDataManager& pdman,
Mike Kleind6ab77a2019-03-21 08:18:24 -050069 const GrFragmentProcessor& _proc) override {
Michael Ludwig0495f7a2018-09-12 15:23:33 -040070 const GrDualIntervalGradientColorizer& _outer =
71 _proc.cast<GrDualIntervalGradientColorizer>();
72 {
Ethan Nicholasbcd51e82019-04-09 10:40:41 -040073 const SkPMColor4f& scale01Value = _outer.scale01;
74 if (scale01Prev != scale01Value) {
75 scale01Prev = scale01Value;
76 pdman.set4fv(scale01Var, 1, scale01Value.vec());
Michael Ludwig0495f7a2018-09-12 15:23:33 -040077 }
Ethan Nicholasbcd51e82019-04-09 10:40:41 -040078 const SkPMColor4f& bias01Value = _outer.bias01;
79 if (bias01Prev != bias01Value) {
80 bias01Prev = bias01Value;
81 pdman.set4fv(bias01Var, 1, bias01Value.vec());
Michael Ludwig0495f7a2018-09-12 15:23:33 -040082 }
Ethan Nicholasbcd51e82019-04-09 10:40:41 -040083 const SkPMColor4f& scale23Value = _outer.scale23;
84 if (scale23Prev != scale23Value) {
85 scale23Prev = scale23Value;
86 pdman.set4fv(scale23Var, 1, scale23Value.vec());
Michael Ludwig0495f7a2018-09-12 15:23:33 -040087 }
Ethan Nicholasbcd51e82019-04-09 10:40:41 -040088 const SkPMColor4f& bias23Value = _outer.bias23;
89 if (bias23Prev != bias23Value) {
90 bias23Prev = bias23Value;
91 pdman.set4fv(bias23Var, 1, bias23Value.vec());
Michael Ludwig0495f7a2018-09-12 15:23:33 -040092 }
Ethan Nicholasbcd51e82019-04-09 10:40:41 -040093 float thresholdValue = _outer.threshold;
94 if (thresholdPrev != thresholdValue) {
95 thresholdPrev = thresholdValue;
96 pdman.set1f(thresholdVar, thresholdValue);
Michael Ludwig0495f7a2018-09-12 15:23:33 -040097 }
98 }
99 }
Ethan Nicholasbcd51e82019-04-09 10:40:41 -0400100 SkPMColor4f scale01Prev = {SK_FloatNaN, SK_FloatNaN, SK_FloatNaN, SK_FloatNaN};
101 SkPMColor4f bias01Prev = {SK_FloatNaN, SK_FloatNaN, SK_FloatNaN, SK_FloatNaN};
102 SkPMColor4f scale23Prev = {SK_FloatNaN, SK_FloatNaN, SK_FloatNaN, SK_FloatNaN};
103 SkPMColor4f bias23Prev = {SK_FloatNaN, SK_FloatNaN, SK_FloatNaN, SK_FloatNaN};
104 float thresholdPrev = SK_FloatNaN;
105 UniformHandle scale01Var;
106 UniformHandle bias01Var;
107 UniformHandle scale23Var;
108 UniformHandle bias23Var;
109 UniformHandle thresholdVar;
Michael Ludwig0495f7a2018-09-12 15:23:33 -0400110};
111GrGLSLFragmentProcessor* GrDualIntervalGradientColorizer::onCreateGLSLInstance() const {
112 return new GrGLSLDualIntervalGradientColorizer();
113}
Mike Kleind6ab77a2019-03-21 08:18:24 -0500114void GrDualIntervalGradientColorizer::onGetGLSLProcessorKey(const GrShaderCaps& caps,
Michael Ludwig0495f7a2018-09-12 15:23:33 -0400115 GrProcessorKeyBuilder* b) const {}
116bool GrDualIntervalGradientColorizer::onIsEqual(const GrFragmentProcessor& other) const {
117 const GrDualIntervalGradientColorizer& that = other.cast<GrDualIntervalGradientColorizer>();
118 (void)that;
Ethan Nicholasbcd51e82019-04-09 10:40:41 -0400119 if (scale01 != that.scale01) return false;
120 if (bias01 != that.bias01) return false;
121 if (scale23 != that.scale23) return false;
122 if (bias23 != that.bias23) return false;
123 if (threshold != that.threshold) return false;
Michael Ludwig0495f7a2018-09-12 15:23:33 -0400124 return true;
125}
126GrDualIntervalGradientColorizer::GrDualIntervalGradientColorizer(
127 const GrDualIntervalGradientColorizer& src)
128 : INHERITED(kGrDualIntervalGradientColorizer_ClassID, src.optimizationFlags())
Ethan Nicholasbcd51e82019-04-09 10:40:41 -0400129 , scale01(src.scale01)
130 , bias01(src.bias01)
131 , scale23(src.scale23)
132 , bias23(src.bias23)
Brian Osman12c5d292020-07-13 16:11:35 -0400133 , threshold(src.threshold) {
134 this->cloneAndRegisterAllChildProcessors(src);
John Stiles6d3996c2020-07-31 12:33:31 -0400135 this->setUsesSampleCoordsDirectly();
Brian Osman12c5d292020-07-13 16:11:35 -0400136}
Michael Ludwig0495f7a2018-09-12 15:23:33 -0400137std::unique_ptr<GrFragmentProcessor> GrDualIntervalGradientColorizer::clone() const {
John Stilesfbd050b2020-08-03 13:21:46 -0400138 return std::make_unique<GrDualIntervalGradientColorizer>(*this);
Michael Ludwig0495f7a2018-09-12 15:23:33 -0400139}
John Stiles8d9bf642020-08-12 15:07:45 -0400140#if GR_TEST_UTILS
John Stiles47b4e222020-08-12 09:56:50 -0400141SkString GrDualIntervalGradientColorizer::dumpInfo() const {
142 return SkStringPrintf(
143 "DualIntervalGradientColorizer(scale01=float4(%f, %f, %f, %f), bias01=float4(%f, %f, "
144 "%f, %f), scale23=float4(%f, %f, %f, %f), bias23=float4(%f, %f, %f, %f), threshold=%f)",
145 scale01.fR, scale01.fG, scale01.fB, scale01.fA, bias01.fR, bias01.fG, bias01.fB,
146 bias01.fA, scale23.fR, scale23.fG, scale23.fB, scale23.fA, bias23.fR, bias23.fG,
147 bias23.fB, bias23.fA, threshold);
148}
149#endif
Michael Ludwig0495f7a2018-09-12 15:23:33 -0400150
Brian Osman021ed512018-10-16 15:19:44 -0400151std::unique_ptr<GrFragmentProcessor> GrDualIntervalGradientColorizer::Make(const SkPMColor4f& c0,
152 const SkPMColor4f& c1,
153 const SkPMColor4f& c2,
154 const SkPMColor4f& c3,
Michael Ludwig0495f7a2018-09-12 15:23:33 -0400155 float threshold) {
156 // Derive scale and biases from the 4 colors and threshold
Mike Kleind6ab77a2019-03-21 08:18:24 -0500157 auto vc0 = Sk4f::Load(c0.vec());
158 auto vc1 = Sk4f::Load(c1.vec());
Michael Ludwig0495f7a2018-09-12 15:23:33 -0400159 auto scale01 = (vc1 - vc0) / threshold;
160 // bias01 = c0
161
Mike Kleind6ab77a2019-03-21 08:18:24 -0500162 auto vc2 = Sk4f::Load(c2.vec());
163 auto vc3 = Sk4f::Load(c3.vec());
Michael Ludwig0495f7a2018-09-12 15:23:33 -0400164 auto scale23 = (vc3 - vc2) / (1 - threshold);
Mike Kleind6ab77a2019-03-21 08:18:24 -0500165 auto bias23 = vc2 - threshold * scale23;
Michael Ludwig0495f7a2018-09-12 15:23:33 -0400166
Mike Kleind6ab77a2019-03-21 08:18:24 -0500167 return std::unique_ptr<GrFragmentProcessor>(new GrDualIntervalGradientColorizer(
168 {scale01[0], scale01[1], scale01[2], scale01[3]}, c0,
169 {scale23[0], scale23[1], scale23[2], scale23[3]},
170 {bias23[0], bias23[1], bias23[2], bias23[3]}, threshold));
Michael Ludwig0495f7a2018-09-12 15:23:33 -0400171}