183d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas/*
283d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas * Copyright 2017 Google Inc.
383d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas *
483d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas * Use of this source code is governed by a BSD-style license that can be
583d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas * found in the LICENSE file.
683d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas */
783d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas
8130fb3f7aac19e40eddfc8fa85a9b39e7c99a7e8Ethan Nicholas/**************************************************************************************************
9130fb3f7aac19e40eddfc8fa85a9b39e7c99a7e8Ethan Nicholas *** This file was autogenerated from GrCircleEffect.fp; do not modify.
10130fb3f7aac19e40eddfc8fa85a9b39e7c99a7e8Ethan Nicholas **************************************************************************************************/
1183d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas#include "GrCircleEffect.h"
1283d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas#if SK_SUPPORT_GPU
1383d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas#include "glsl/GrGLSLFragmentProcessor.h"
1483d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas#include "glsl/GrGLSLFragmentShaderBuilder.h"
1583d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas#include "glsl/GrGLSLProgramBuilder.h"
162d5f9b3d58e07ac8a8df17f4c0321cb65f255e69Ethan Nicholas#include "GrTexture.h"
1783d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas#include "SkSLCPP.h"
1883d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas#include "SkSLUtil.h"
1983d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholasclass GrGLSLCircleEffect : public GrGLSLFragmentProcessor {
2083d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholaspublic:
2183d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas    GrGLSLCircleEffect() {}
2283d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas    void emitCode(EmitArgs& args) override {
2383d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas        GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
2483d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas        const GrCircleEffect& _outer = args.fFp.cast<GrCircleEffect>();
25b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas        (void)_outer;
26823994624aa5e805e16833ecd3d748fc769a164dEthan Nicholas        auto edgeType = _outer.edgeType();
27823994624aa5e805e16833ecd3d748fc769a164dEthan Nicholas        (void)edgeType;
28823994624aa5e805e16833ecd3d748fc769a164dEthan Nicholas        auto center = _outer.center();
29823994624aa5e805e16833ecd3d748fc769a164dEthan Nicholas        (void)center;
30823994624aa5e805e16833ecd3d748fc769a164dEthan Nicholas        auto radius = _outer.radius();
31823994624aa5e805e16833ecd3d748fc769a164dEthan Nicholas        (void)radius;
32b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas        prevRadius = -1.0;
33f7b8820dc813d1eb0b6b43fe4581dded0da38cafEthan Nicholas        fCircleVar = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kHalf4_GrSLType,
34b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas                                                      kDefault_GrSLPrecision, "circle");
35b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas        fragBuilder->codeAppendf(
36f7b8820dc813d1eb0b6b43fe4581dded0da38cafEthan Nicholas                "half2 prevCenter;\nhalf prevRadius = %f;\nhalf d;\n@if (%d == 2 || %d == 3) {\n   "
378aa4569c139a7a7ac38c62b25e3af40309cc2ee2Ethan Nicholas                " d = (float(length((%s.xy - half2(sk_FragCoord.xy)) * %s.w)) - 1.0) * %s.z;\n} "
388aa4569c139a7a7ac38c62b25e3af40309cc2ee2Ethan Nicholas                "else {\n    d = half((1.0 - float(length((%s.xy - half2(sk_FragCoord.xy)) * "
398aa4569c139a7a7ac38c62b25e3af40309cc2ee2Ethan Nicholas                "%s.w))) * float(%s.z));\n}\n@if ((%d == 1 || %d == 3) || %d == 4) {\n    d = "
408aa4569c139a7a7ac38c62b25e3af40309cc2ee2Ethan Nicholas                "half(clamp(float(d), 0.0, 1.0));\n} else {\n    d = half(float(d) > 0.5 ? 1.0 : "
418aa4569c139a7a7ac38c62b25e3af40309cc2ee2Ethan Nicholas                "0.0);\n}\n%s = %s * d;\n",
42aae47c878b83ab6d9742d92a6fa47e762f6b9204Ethan Nicholas                prevRadius, (int)_outer.edgeType(), (int)_outer.edgeType(),
43b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas                args.fUniformHandler->getUniformCStr(fCircleVar),
44b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas                args.fUniformHandler->getUniformCStr(fCircleVar),
45b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas                args.fUniformHandler->getUniformCStr(fCircleVar),
46b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas                args.fUniformHandler->getUniformCStr(fCircleVar),
47b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas                args.fUniformHandler->getUniformCStr(fCircleVar),
48aae47c878b83ab6d9742d92a6fa47e762f6b9204Ethan Nicholas                args.fUniformHandler->getUniformCStr(fCircleVar), (int)_outer.edgeType(),
49aae47c878b83ab6d9742d92a6fa47e762f6b9204Ethan Nicholas                (int)_outer.edgeType(), (int)_outer.edgeType(), args.fOutputColor,
50f7b8820dc813d1eb0b6b43fe4581dded0da38cafEthan Nicholas                args.fInputColor ? args.fInputColor : "half4(1)");
5183d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas    }
52b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas
5383d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholasprivate:
54b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas    void onSetData(const GrGLSLProgramDataManager& pdman,
55b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas                   const GrFragmentProcessor& _proc) override {
5683d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas        const GrCircleEffect& _outer = _proc.cast<GrCircleEffect>();
5783d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas        auto edgeType = _outer.edgeType();
58b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas        (void)edgeType;
5983d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas        auto center = _outer.center();
60b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas        (void)center;
6183d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas        auto radius = _outer.radius();
62b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas        (void)radius;
6383d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas        UniformHandle& circle = fCircleVar;
64b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas        (void)circle;
6583d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas
66b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas        if (radius != prevRadius || center != prevCenter) {
67b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas            SkScalar effectiveRadius = radius;
680f3c73220a25eba9bf11583db3d0f76a2c4f6331Ethan Nicholas            if (GrProcessorEdgeTypeIsInverseFill((GrClipEdgeType)edgeType)) {
69b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas                effectiveRadius -= 0.5f;
706574921253197338f879130ed99fb9ce483976deBrian Salomon                // When the radius is 0.5 effectiveRadius is 0 which causes an inf * 0 in the
716574921253197338f879130ed99fb9ce483976deBrian Salomon                // shader.
726574921253197338f879130ed99fb9ce483976deBrian Salomon                effectiveRadius = SkTMax(0.001f, effectiveRadius);
73b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas            } else {
74b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas                effectiveRadius += 0.5f;
75b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas            }
76b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas            pdman.set4f(circle, center.fX, center.fY, effectiveRadius,
77b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas                        SkScalarInvert(effectiveRadius));
78b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas            prevCenter = center;
79b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas            prevRadius = radius;
8083d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas        }
8183d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas    }
82e9d172af84fff5d76e19180a0c2b7b3cc51e90a2Ethan Nicholas    SkPoint prevCenter = half2(0);
83e9d172af84fff5d76e19180a0c2b7b3cc51e90a2Ethan Nicholas    float prevRadius = 0;
8483d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas    UniformHandle fCircleVar;
8583d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas};
8683d118550f7237d25e7e096cc968dbb9a06678a3Ethan NicholasGrGLSLFragmentProcessor* GrCircleEffect::onCreateGLSLInstance() const {
8783d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas    return new GrGLSLCircleEffect();
8883d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas}
89b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholasvoid GrCircleEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps,
90b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas                                           GrProcessorKeyBuilder* b) const {
91aae47c878b83ab6d9742d92a6fa47e762f6b9204Ethan Nicholas    b->add32((int32_t)fEdgeType);
9283d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas}
9383d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholasbool GrCircleEffect::onIsEqual(const GrFragmentProcessor& other) const {
9483d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas    const GrCircleEffect& that = other.cast<GrCircleEffect>();
95b7e8c3b52a306357ecd08d00170062137ec641d4Ethan Nicholas    (void)that;
9683d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas    if (fEdgeType != that.fEdgeType) return false;
9783d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas    if (fCenter != that.fCenter) return false;
9883d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas    if (fRadius != that.fRadius) return false;
9983d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas    return true;
10083d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas}
101f57c0d67611186ba74179b53b421e64b63a579c7Ethan NicholasGrCircleEffect::GrCircleEffect(const GrCircleEffect& src)
102abff956455637b12eab374fd44b99e1338799113Ethan Nicholas        : INHERITED(kGrCircleEffect_ClassID, src.optimizationFlags())
103f57c0d67611186ba74179b53b421e64b63a579c7Ethan Nicholas        , fEdgeType(src.fEdgeType)
104f57c0d67611186ba74179b53b421e64b63a579c7Ethan Nicholas        , fCenter(src.fCenter)
105abff956455637b12eab374fd44b99e1338799113Ethan Nicholas        , fRadius(src.fRadius) {}
106aff329b8e9b239bca1d93b13a914fbef45ccf7feBrian Salomonstd::unique_ptr<GrFragmentProcessor> GrCircleEffect::clone() const {
107aff329b8e9b239bca1d93b13a914fbef45ccf7feBrian Salomon    return std::unique_ptr<GrFragmentProcessor>(new GrCircleEffect(*this));
108f57c0d67611186ba74179b53b421e64b63a579c7Ethan Nicholas}
10983d118550f7237d25e7e096cc968dbb9a06678a3Ethan NicholasGR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrCircleEffect);
11083d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas#if GR_TEST_UTILS
111aff329b8e9b239bca1d93b13a914fbef45ccf7feBrian Salomonstd::unique_ptr<GrFragmentProcessor> GrCircleEffect::TestCreate(GrProcessorTestData* testData) {
11283d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas    SkPoint center;
11383d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas    center.fX = testData->fRandom->nextRangeScalar(0.f, 1000.f);
11483d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas    center.fY = testData->fRandom->nextRangeScalar(0.f, 1000.f);
1156574921253197338f879130ed99fb9ce483976deBrian Salomon    SkScalar radius = testData->fRandom->nextRangeF(1.f, 1000.f);
1160f3c73220a25eba9bf11583db3d0f76a2c4f6331Ethan Nicholas    GrClipEdgeType et;
11783d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas    do {
1181706f842086c089ebc496dfc7f45c959e5eda01eEthan Nicholas        et = (GrClipEdgeType)testData->fRandom->nextULessThan(kGrClipEdgeTypeCnt);
1191706f842086c089ebc496dfc7f45c959e5eda01eEthan Nicholas    } while (GrClipEdgeType::kHairlineAA == et);
120aae47c878b83ab6d9742d92a6fa47e762f6b9204Ethan Nicholas    return GrCircleEffect::Make(et, center, radius);
12183d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas}
12283d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas#endif
12383d118550f7237d25e7e096cc968dbb9a06678a3Ethan Nicholas#endif
124