blob: 9f7ee9e0155faa1324e426a0787bb5506fdc3121 [file] [log] [blame]
Brian Salomonc0d79e52019-04-10 15:02:11 -04001/*
2 * Copyright 2019 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// Ignores its own input color and invokes 'fp' with a constant color
9// The constant color can either be specified as a literal or as a
10// uniform, controlled by useUniform.
11
12in fragmentProcessor fp;
13layout(key) in bool useUniform;
14layout(when=useUniform, ctype=SkPMColor4f) in uniform half4 uniformColor;
15layout(when=!useUniform, key, ctype=SkPMColor4f) in half4 literalColor;
16
17@make {
18 static std::unique_ptr<GrFragmentProcessor> Make(std::unique_ptr<GrFragmentProcessor> fp,
19 const SkPMColor4f& color,
20 bool useUniform = true) {
21 return std::unique_ptr<GrFragmentProcessor>(
22 new GrOverrideInputFragmentProcessor(std::move(fp), useUniform, color, color));
23 }
24}
25
26@class {
27 static OptimizationFlags OptFlags(const std::unique_ptr<GrFragmentProcessor>& fp,
28 const SkPMColor4f& color) {
29 auto childFlags = ProcessorOptimizationFlags(fp.get());
30 auto flags = kNone_OptimizationFlags;
31 if (childFlags & kConstantOutputForConstantInput_OptimizationFlag) {
32 flags |= kConstantOutputForConstantInput_OptimizationFlag;
33 }
34 if ((childFlags & kPreservesOpaqueInput_OptimizationFlag) && color.isOpaque()) {
35 flags |= kPreservesOpaqueInput_OptimizationFlag;
36 }
37 return flags;
38 }
39
40 SkPMColor4f constantOutputForConstantInput(const SkPMColor4f& input) const override {
41 return ConstantOutputForConstantInput(this->childProcessor(0), uniformColor);
42 }
43}
44
45@optimizationFlags { OptFlags(fp, useUniform ? uniformColor : literalColor) }
46
47void main() {
48 half4 constColor;
49 @if(useUniform) {
50 constColor = uniformColor;
51 } else {
52 constColor = literalColor;
53 }
54 sk_OutColor = process(fp, constColor);
55}