blob: ede2218d13c2324d13881f6bb207e799c78a1683 [file] [log] [blame]
robertphillipsf7142e72016-04-18 07:20:05 -07001/*
Ethan Nicholas9fb036f2017-07-05 16:19:09 -04002 * Copyright 2017 Google Inc.
robertphillipsf7142e72016-04-18 07:20:05 -07003 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Ethan Nicholas9fb036f2017-07-05 16:19:09 -04008/*
9 * This file was autogenerated from GrAlphaThresholdFragmentProcessor.fp; do not modify.
10 */
robertphillipsf7142e72016-04-18 07:20:05 -070011#include "GrAlphaThresholdFragmentProcessor.h"
Ethan Nicholasceb4d482017-07-10 15:40:20 -040012#if SK_SUPPORT_GPU
robertphillipsf7142e72016-04-18 07:20:05 -070013
Ethan Nicholas9fb036f2017-07-05 16:19:09 -040014 inline GrFragmentProcessor::OptimizationFlags GrAlphaThresholdFragmentProcessor::optFlags(
15 float outerThreshold) {
16 if (outerThreshold >= 1.0) {
17 return kPreservesOpaqueInput_OptimizationFlag |
18 kCompatibleWithCoverageAsAlpha_OptimizationFlag;
19 } else {
20 return kCompatibleWithCoverageAsAlpha_OptimizationFlag;
21 }
22 }
Brian Osman6fb592e2016-10-03 13:15:12 -040023#include "glsl/GrGLSLColorSpaceXformHelper.h"
robertphillipsf7142e72016-04-18 07:20:05 -070024#include "glsl/GrGLSLFragmentProcessor.h"
25#include "glsl/GrGLSLFragmentShaderBuilder.h"
Ethan Nicholas9fb036f2017-07-05 16:19:09 -040026#include "glsl/GrGLSLProgramBuilder.h"
27#include "SkSLCPP.h"
28#include "SkSLUtil.h"
29class GrGLSLAlphaThresholdFragmentProcessor : public GrGLSLFragmentProcessor {
robertphillipsf7142e72016-04-18 07:20:05 -070030public:
Ethan Nicholas9fb036f2017-07-05 16:19:09 -040031 GrGLSLAlphaThresholdFragmentProcessor() {}
32 void emitCode(EmitArgs& args) override {
33 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
34 const GrAlphaThresholdFragmentProcessor& _outer = args.fFp.cast<GrAlphaThresholdFragmentProcessor>();
35 (void) _outer;
36 fColorSpaceHelper.emitCode(args.fUniformHandler, _outer.colorXform().get());
37 fInnerThresholdVar = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kFloat_GrSLType, kDefault_GrSLPrecision, "innerThreshold");
38 fOuterThresholdVar = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kFloat_GrSLType, kDefault_GrSLPrecision, "outerThreshold");
39 SkSL::String sk_TransformedCoords2D_0 = fragBuilder->ensureCoords2D(args.fTransformedCoords[0]);
40 SkSL::String sk_TransformedCoords2D_1 = fragBuilder->ensureCoords2D(args.fTransformedCoords[1]);
Ethan Nicholasceb4d482017-07-10 15:40:20 -040041 fragBuilder->codeAppendf("vec4 _tmp0;\nvec4 color = (_tmp0 = texture(%s, %s).%s , %s != mat4(1.0) ? vec4(clamp((%s * vec4(_tmp0.xyz, 1.0)).xyz, 0.0, _tmp0.w), _tmp0.w) : _tmp0);\nvec4 mask_color = texture(%s, %s).%s;\nif (mask_color.w < 0.5) {\n if (color.w > %s) {\n float scale = %s / color.w;\n color.xyz *= scale;\n color.w = %s;\n }\n} else if (color.w < %s) {\n float scale = %s / max(0.001, color.w);\n color.xyz *= scale;\n color.w = %s;\n}\n%s = color;\n", fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[0]).c_str(), sk_TransformedCoords2D_0.c_str(), fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[0]).c_str(), fColorSpaceHelper.isValid() ? args.fUniformHandler->getUniformCStr(fColorSpaceHelper.gamutXformUniform()) : "mat4(1.0)", fColorSpaceHelper.isValid() ? args.fUniformHandler->getUniformCStr(fColorSpaceHelper.gamutXformUniform()) : "mat4(1.0)", fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[1]).c_str(), sk_TransformedCoords2D_1.c_str(), fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[1]).c_str(), args.fUniformHandler->getUniformCStr(fOuterThresholdVar), args.fUniformHandler->getUniformCStr(fOuterThresholdVar), args.fUniformHandler->getUniformCStr(fOuterThresholdVar), args.fUniformHandler->getUniformCStr(fInnerThresholdVar), args.fUniformHandler->getUniformCStr(fInnerThresholdVar), args.fUniformHandler->getUniformCStr(fInnerThresholdVar), args.fOutputColor);
Brian Osman6fb592e2016-10-03 13:15:12 -040042 }
robertphillipsf7142e72016-04-18 07:20:05 -070043private:
Ethan Nicholas9fb036f2017-07-05 16:19:09 -040044 void onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& _proc) override {
45 const GrAlphaThresholdFragmentProcessor& _outer = _proc.cast<GrAlphaThresholdFragmentProcessor>();
46 {
47 if (fColorSpaceHelper.isValid()) {
48 fColorSpaceHelper.setData(pdman, _outer.colorXform().get());
49 }
50 pdman.set1f(fInnerThresholdVar, _outer.innerThreshold());
51 pdman.set1f(fOuterThresholdVar, _outer.outerThreshold());
52 }
Brian Osman6fb592e2016-10-03 13:15:12 -040053 }
Ethan Nicholas9fb036f2017-07-05 16:19:09 -040054 UniformHandle fImageVar;
55 UniformHandle fMaskVar;
56 UniformHandle fInnerThresholdVar;
57 UniformHandle fOuterThresholdVar;
58 GrGLSLColorSpaceXformHelper fColorSpaceHelper;
59};
60GrGLSLFragmentProcessor* GrAlphaThresholdFragmentProcessor::onCreateGLSLInstance() const {
61 return new GrGLSLAlphaThresholdFragmentProcessor();
robertphillipsf7142e72016-04-18 07:20:05 -070062}
Ethan Nicholas9fb036f2017-07-05 16:19:09 -040063void GrAlphaThresholdFragmentProcessor::onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const {
64 b->add32(GrColorSpaceXform::XformKey(fColorXform.get()));
65}
66bool GrAlphaThresholdFragmentProcessor::onIsEqual(const GrFragmentProcessor& other) const {
67 const GrAlphaThresholdFragmentProcessor& that = other.cast<GrAlphaThresholdFragmentProcessor>();
68 (void) that;
69 if (fImage != that.fImage) return false;
70 if (fColorXform != that.fColorXform) return false;
71 if (fMask != that.fMask) return false;
72 if (fInnerThreshold != that.fInnerThreshold) return false;
73 if (fOuterThreshold != that.fOuterThreshold) return false;
74 return true;
75}
robertphillipsf7142e72016-04-18 07:20:05 -070076GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrAlphaThresholdFragmentProcessor);
Hal Canary6f6961e2017-01-31 13:50:44 -050077#if GR_TEST_UTILS
Ethan Nicholas9fb036f2017-07-05 16:19:09 -040078sk_sp<GrFragmentProcessor> GrAlphaThresholdFragmentProcessor::TestCreate(GrProcessorTestData* testData) {
79
80 sk_sp<GrTextureProxy> bmpProxy = testData->textureProxy(GrProcessorUnitTest::kSkiaPMTextureIdx);
81 sk_sp<GrTextureProxy> maskProxy = testData->textureProxy(GrProcessorUnitTest::kAlphaTextureIdx);
82
83 float innerThresh = testData->fRandom->nextUScalar1() * .99f + 0.005f;
84 float outerThresh = testData->fRandom->nextUScalar1() * .99f + 0.005f;
robertphillipsf7142e72016-04-18 07:20:05 -070085 const int kMaxWidth = 1000;
86 const int kMaxHeight = 1000;
Ethan Nicholas9fb036f2017-07-05 16:19:09 -040087 uint32_t width = testData->fRandom->nextULessThan(kMaxWidth);
88 uint32_t height = testData->fRandom->nextULessThan(kMaxHeight);
89 uint32_t x = testData->fRandom->nextULessThan(kMaxWidth - width);
90 uint32_t y = testData->fRandom->nextULessThan(kMaxHeight - height);
robertphillipsf7142e72016-04-18 07:20:05 -070091 SkIRect bounds = SkIRect::MakeXYWH(x, y, width, height);
Ethan Nicholas9fb036f2017-07-05 16:19:09 -040092 sk_sp<GrColorSpaceXform> colorSpaceXform = GrTest::TestColorXform(testData->fRandom);
93 return GrAlphaThresholdFragmentProcessor::Make(
94 std::move(bmpProxy),
95 colorSpaceXform,
96 std::move(maskProxy),
97 innerThresh, outerThresh,
98 bounds);
robertphillipsf7142e72016-04-18 07:20:05 -070099}
Hal Canary6f6961e2017-01-31 13:50:44 -0500100#endif
Ethan Nicholasceb4d482017-07-10 15:40:20 -0400101#endif