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