Reland "Base Gradient FP Refactor"
This reverts commit 1ea5656a285bcfef445d6f69eaab477e68595b54.
Reason for revert: Fixed google3 build failure
Original change's description:
> Revert "Base Gradient FP Refactor"
>
> This reverts commit 10f7a1e07554a362aef979d32ba288a009bdff90.
>
> Reason for revert: broke google3 roll
> Original change's description:
> > Base Gradient FP Refactor
> >
> > --
> >
> > Redefines how gradients will be written in the GPU back-end:
> >
> > They are split into three fragment processor components: master, layout, and colorizer.
> > The layout FP is responsible for converting the fragment position into an interpolant value, t.
> > Each high-level gradient--such as linear, radial, etc.--are implemented solely in a layout FP.
> > The colorizer FP is responsible for converting t into a color.
> > The master FP invokes the layout, clamps t into the proper domain, and then invokes the colorizer.
> > GrGradientShader provides factory functions to create FP graphs from SkGradientShader instances.
> > This pattern is documented in gpu/gradients/README.md.
> >
> > Goals for current CL
> > ====================
> >
> > Outline the FP components by providing .fp implementations for the simplest gradients.
> > Defines a two-color single interval colorizer and a linear gradient layout, and the master effect.
> > A MakeLinear() factory function is provided that can convert SkGradientShaders that fit these constraints.
> > SkLinearGradient first attempts to use the new system, falling back to the original GrGradientEffect.
> >
> > Future CLs
> > ==========
> >
> > To keep the CL reviews manageable, additional dependent CLs will be added that gradually replace past functionality.
> > A CL for each layout will be defined.
> > CLs for the different analytic colorizer cases and the textured gradient case will be defined.
> > Once the new system supports all current layouts and colorizer capabilities, all old GPU gradient code will be removed.
> > After this clean-up, analytic colorization can hopefully be expanded to reduce the usage of textured gradients.
> >
> > Bug: skia:
> > Change-Id: Iafe7b8b4071491a71c473babcd7bedda659150c1
> > Reviewed-on: https://skia-review.googlesource.com/148120
> > Commit-Queue: Michael Ludwig <michaelludwig@google.com>
> > Reviewed-by: Brian Salomon <bsalomon@google.com>
>
> TBR=bsalomon@google.com,michaelludwig@google.com
>
> Change-Id: Ib735e323795ac8874cb00b007a915786b50517a6
> No-Presubmit: true
> No-Tree-Checks: true
> No-Try: true
> Bug: skia:
> Reviewed-on: https://skia-review.googlesource.com/153600
> Reviewed-by: Cary Clark <caryclark@google.com>
> Commit-Queue: Cary Clark <caryclark@google.com>
TBR=bsalomon@google.com,caryclark@google.com,michaelludwig@google.com
Change-Id: Ibf6ffbcb1af0dfbdac7317151aeb08f18f84c7fd
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: skia:
Reviewed-on: https://skia-review.googlesource.com/153887
Commit-Queue: Michael Ludwig <michaelludwig@google.com>
Reviewed-by: Michael Ludwig <michaelludwig@google.com>
diff --git a/src/gpu/gradients/GrClampedGradientEffect.cpp b/src/gpu/gradients/GrClampedGradientEffect.cpp
new file mode 100644
index 0000000..4c8b3a1
--- /dev/null
+++ b/src/gpu/gradients/GrClampedGradientEffect.cpp
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2018 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 GrClampedGradientEffect.fp; do not modify.
+ **************************************************************************************************/
+#include "GrClampedGradientEffect.h"
+#include "glsl/GrGLSLFragmentProcessor.h"
+#include "glsl/GrGLSLFragmentShaderBuilder.h"
+#include "glsl/GrGLSLProgramBuilder.h"
+#include "GrTexture.h"
+#include "SkSLCPP.h"
+#include "SkSLUtil.h"
+class GrGLSLClampedGradientEffect : public GrGLSLFragmentProcessor {
+public:
+ GrGLSLClampedGradientEffect() {}
+ void emitCode(EmitArgs& args) override {
+ GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
+ const GrClampedGradientEffect& _outer = args.fFp.cast<GrClampedGradientEffect>();
+ (void)_outer;
+ auto leftBorderColor = _outer.leftBorderColor();
+ (void)leftBorderColor;
+ auto rightBorderColor = _outer.rightBorderColor();
+ (void)rightBorderColor;
+ fLeftBorderColorVar = args.fUniformHandler->addUniform(
+ kFragment_GrShaderFlag, kHalf4_GrSLType, kDefault_GrSLPrecision, "leftBorderColor");
+ fRightBorderColorVar =
+ args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kHalf4_GrSLType,
+ kDefault_GrSLPrecision, "rightBorderColor");
+ SkString _child1("_child1");
+ this->emitChild(1, &_child1, args);
+ fragBuilder->codeAppendf(
+ "half4 t = %s;\nif (t.x < 0.0) {\n %s = %s;\n} else if (float(t.x) > 1.0) {\n "
+ " %s = %s;\n} else {",
+ _child1.c_str(), args.fOutputColor,
+ args.fUniformHandler->getUniformCStr(fLeftBorderColorVar), args.fOutputColor,
+ args.fUniformHandler->getUniformCStr(fRightBorderColorVar));
+ SkString _input0("t");
+ SkString _child0("_child0");
+ this->emitChild(0, _input0.c_str(), &_child0, args);
+ fragBuilder->codeAppendf("\n %s = %s;\n}\n", args.fOutputColor, _child0.c_str());
+ }
+
+private:
+ void onSetData(const GrGLSLProgramDataManager& pdman,
+ const GrFragmentProcessor& _proc) override {
+ const GrClampedGradientEffect& _outer = _proc.cast<GrClampedGradientEffect>();
+ {
+ const GrColor4f& leftBorderColorValue = _outer.leftBorderColor();
+ if (fLeftBorderColorPrev != leftBorderColorValue) {
+ fLeftBorderColorPrev = leftBorderColorValue;
+ pdman.set4fv(fLeftBorderColorVar, 1, leftBorderColorValue.fRGBA);
+ }
+ const GrColor4f& rightBorderColorValue = _outer.rightBorderColor();
+ if (fRightBorderColorPrev != rightBorderColorValue) {
+ fRightBorderColorPrev = rightBorderColorValue;
+ pdman.set4fv(fRightBorderColorVar, 1, rightBorderColorValue.fRGBA);
+ }
+ }
+ }
+ GrColor4f fLeftBorderColorPrev = GrColor4f::kIllegalConstructor;
+ GrColor4f fRightBorderColorPrev = GrColor4f::kIllegalConstructor;
+ UniformHandle fLeftBorderColorVar;
+ UniformHandle fRightBorderColorVar;
+};
+GrGLSLFragmentProcessor* GrClampedGradientEffect::onCreateGLSLInstance() const {
+ return new GrGLSLClampedGradientEffect();
+}
+void GrClampedGradientEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps,
+ GrProcessorKeyBuilder* b) const {}
+bool GrClampedGradientEffect::onIsEqual(const GrFragmentProcessor& other) const {
+ const GrClampedGradientEffect& that = other.cast<GrClampedGradientEffect>();
+ (void)that;
+ if (fLeftBorderColor != that.fLeftBorderColor) return false;
+ if (fRightBorderColor != that.fRightBorderColor) return false;
+ return true;
+}
+GrClampedGradientEffect::GrClampedGradientEffect(const GrClampedGradientEffect& src)
+ : INHERITED(kGrClampedGradientEffect_ClassID, src.optimizationFlags())
+ , fLeftBorderColor(src.fLeftBorderColor)
+ , fRightBorderColor(src.fRightBorderColor) {
+ this->registerChildProcessor(src.childProcessor(0).clone());
+ this->registerChildProcessor(src.childProcessor(1).clone());
+}
+std::unique_ptr<GrFragmentProcessor> GrClampedGradientEffect::clone() const {
+ return std::unique_ptr<GrFragmentProcessor>(new GrClampedGradientEffect(*this));
+}