1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2023 Google LLC 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrPerlinNoise2Effect_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrPerlinNoise2Effect_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkAlphaType.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMatrix.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSamplingOptions.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/SkSLSampleUsage.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrFragmentProcessor.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProcessorUnitTest.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSamplerState.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxyView.h" 22*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/effects/GrTextureEffect.h" 23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/glsl/GrGLSLProgramDataManager.h" 24*c8dee2aaSAndroid Build Coastguard Worker #include "src/shaders/SkPerlinNoiseShaderImpl.h" 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 27*c8dee2aaSAndroid Build Coastguard Worker #include <utility> 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu { 30*c8dee2aaSAndroid Build Coastguard Worker class KeyBuilder; 31*c8dee2aaSAndroid Build Coastguard Worker } 32*c8dee2aaSAndroid Build Coastguard Worker struct GrShaderCaps; 33*c8dee2aaSAndroid Build Coastguard Worker enum class SkPerlinNoiseShaderType; 34*c8dee2aaSAndroid Build Coastguard Worker 35*c8dee2aaSAndroid Build Coastguard Worker class GrPerlinNoise2Effect : public GrFragmentProcessor { 36*c8dee2aaSAndroid Build Coastguard Worker public: Make(SkPerlinNoiseShaderType type,int numOctaves,bool stitchTiles,std::unique_ptr<SkPerlinNoiseShader::PaintingData> paintingData,GrSurfaceProxyView permutationsView,GrSurfaceProxyView noiseView,const GrCaps & caps)37*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<GrFragmentProcessor> Make( 38*c8dee2aaSAndroid Build Coastguard Worker SkPerlinNoiseShaderType type, 39*c8dee2aaSAndroid Build Coastguard Worker int numOctaves, 40*c8dee2aaSAndroid Build Coastguard Worker bool stitchTiles, 41*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkPerlinNoiseShader::PaintingData> paintingData, 42*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView permutationsView, 43*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView noiseView, 44*c8dee2aaSAndroid Build Coastguard Worker const GrCaps& caps) { 45*c8dee2aaSAndroid Build Coastguard Worker static constexpr GrSamplerState kRepeatXSampler = {GrSamplerState::WrapMode::kRepeat, 46*c8dee2aaSAndroid Build Coastguard Worker GrSamplerState::WrapMode::kClamp, 47*c8dee2aaSAndroid Build Coastguard Worker GrSamplerState::Filter::kNearest}; 48*c8dee2aaSAndroid Build Coastguard Worker auto permutationsFP = GrTextureEffect::Make(std::move(permutationsView), 49*c8dee2aaSAndroid Build Coastguard Worker kPremul_SkAlphaType, 50*c8dee2aaSAndroid Build Coastguard Worker SkMatrix::I(), 51*c8dee2aaSAndroid Build Coastguard Worker kRepeatXSampler, 52*c8dee2aaSAndroid Build Coastguard Worker caps); 53*c8dee2aaSAndroid Build Coastguard Worker auto noiseFP = GrTextureEffect::Make( 54*c8dee2aaSAndroid Build Coastguard Worker std::move(noiseView), kPremul_SkAlphaType, SkMatrix::I(), kRepeatXSampler, caps); 55*c8dee2aaSAndroid Build Coastguard Worker 56*c8dee2aaSAndroid Build Coastguard Worker return std::unique_ptr<GrFragmentProcessor>( 57*c8dee2aaSAndroid Build Coastguard Worker new GrPerlinNoise2Effect(type, 58*c8dee2aaSAndroid Build Coastguard Worker numOctaves, 59*c8dee2aaSAndroid Build Coastguard Worker stitchTiles, 60*c8dee2aaSAndroid Build Coastguard Worker std::move(paintingData), 61*c8dee2aaSAndroid Build Coastguard Worker std::move(permutationsFP), 62*c8dee2aaSAndroid Build Coastguard Worker std::move(noiseFP))); 63*c8dee2aaSAndroid Build Coastguard Worker } 64*c8dee2aaSAndroid Build Coastguard Worker name()65*c8dee2aaSAndroid Build Coastguard Worker const char* name() const override { return "PerlinNoise"; } 66*c8dee2aaSAndroid Build Coastguard Worker clone()67*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrFragmentProcessor> clone() const override { 68*c8dee2aaSAndroid Build Coastguard Worker return std::unique_ptr<GrFragmentProcessor>(new GrPerlinNoise2Effect(*this)); 69*c8dee2aaSAndroid Build Coastguard Worker } 70*c8dee2aaSAndroid Build Coastguard Worker stitchData()71*c8dee2aaSAndroid Build Coastguard Worker const SkPerlinNoiseShader::StitchData& stitchData() const { 72*c8dee2aaSAndroid Build Coastguard Worker return fPaintingData->fStitchDataInit; 73*c8dee2aaSAndroid Build Coastguard Worker } 74*c8dee2aaSAndroid Build Coastguard Worker type()75*c8dee2aaSAndroid Build Coastguard Worker SkPerlinNoiseShaderType type() const { return fType; } stitchTiles()76*c8dee2aaSAndroid Build Coastguard Worker bool stitchTiles() const { return fStitchTiles; } baseFrequency()77*c8dee2aaSAndroid Build Coastguard Worker const SkVector& baseFrequency() const { return fPaintingData->fBaseFrequency; } numOctaves()78*c8dee2aaSAndroid Build Coastguard Worker int numOctaves() const { return fNumOctaves; } 79*c8dee2aaSAndroid Build Coastguard Worker 80*c8dee2aaSAndroid Build Coastguard Worker private: 81*c8dee2aaSAndroid Build Coastguard Worker class Impl : public ProgramImpl { 82*c8dee2aaSAndroid Build Coastguard Worker public: 83*c8dee2aaSAndroid Build Coastguard Worker SkString emitHelper(EmitArgs& args); 84*c8dee2aaSAndroid Build Coastguard Worker void emitCode(EmitArgs&) override; 85*c8dee2aaSAndroid Build Coastguard Worker 86*c8dee2aaSAndroid Build Coastguard Worker private: 87*c8dee2aaSAndroid Build Coastguard Worker void onSetData(const GrGLSLProgramDataManager&, const GrFragmentProcessor&) override; 88*c8dee2aaSAndroid Build Coastguard Worker 89*c8dee2aaSAndroid Build Coastguard Worker GrGLSLProgramDataManager::UniformHandle fStitchDataUni; 90*c8dee2aaSAndroid Build Coastguard Worker GrGLSLProgramDataManager::UniformHandle fBaseFrequencyUni; 91*c8dee2aaSAndroid Build Coastguard Worker }; 92*c8dee2aaSAndroid Build Coastguard Worker onMakeProgramImpl()93*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<ProgramImpl> onMakeProgramImpl() const override { 94*c8dee2aaSAndroid Build Coastguard Worker return std::make_unique<Impl>(); 95*c8dee2aaSAndroid Build Coastguard Worker } 96*c8dee2aaSAndroid Build Coastguard Worker 97*c8dee2aaSAndroid Build Coastguard Worker void onAddToKey(const GrShaderCaps& caps, skgpu::KeyBuilder* b) const override; 98*c8dee2aaSAndroid Build Coastguard Worker onIsEqual(const GrFragmentProcessor & sBase)99*c8dee2aaSAndroid Build Coastguard Worker bool onIsEqual(const GrFragmentProcessor& sBase) const override { 100*c8dee2aaSAndroid Build Coastguard Worker const GrPerlinNoise2Effect& s = sBase.cast<GrPerlinNoise2Effect>(); 101*c8dee2aaSAndroid Build Coastguard Worker return fType == s.fType && 102*c8dee2aaSAndroid Build Coastguard Worker fPaintingData->fBaseFrequency == s.fPaintingData->fBaseFrequency && 103*c8dee2aaSAndroid Build Coastguard Worker fNumOctaves == s.fNumOctaves && fStitchTiles == s.fStitchTiles && 104*c8dee2aaSAndroid Build Coastguard Worker fPaintingData->fStitchDataInit == s.fPaintingData->fStitchDataInit; 105*c8dee2aaSAndroid Build Coastguard Worker } 106*c8dee2aaSAndroid Build Coastguard Worker GrPerlinNoise2Effect(SkPerlinNoiseShaderType type,int numOctaves,bool stitchTiles,std::unique_ptr<SkPerlinNoiseShader::PaintingData> paintingData,std::unique_ptr<GrFragmentProcessor> permutationsFP,std::unique_ptr<GrFragmentProcessor> noiseFP)107*c8dee2aaSAndroid Build Coastguard Worker GrPerlinNoise2Effect(SkPerlinNoiseShaderType type, 108*c8dee2aaSAndroid Build Coastguard Worker int numOctaves, 109*c8dee2aaSAndroid Build Coastguard Worker bool stitchTiles, 110*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkPerlinNoiseShader::PaintingData> paintingData, 111*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrFragmentProcessor> permutationsFP, 112*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrFragmentProcessor> noiseFP) 113*c8dee2aaSAndroid Build Coastguard Worker : GrFragmentProcessor(kGrPerlinNoise2Effect_ClassID, kNone_OptimizationFlags) 114*c8dee2aaSAndroid Build Coastguard Worker , fType(type) 115*c8dee2aaSAndroid Build Coastguard Worker , fNumOctaves(numOctaves) 116*c8dee2aaSAndroid Build Coastguard Worker , fStitchTiles(stitchTiles) 117*c8dee2aaSAndroid Build Coastguard Worker , fPaintingData(std::move(paintingData)) { 118*c8dee2aaSAndroid Build Coastguard Worker this->registerChild(std::move(permutationsFP), SkSL::SampleUsage::Explicit()); 119*c8dee2aaSAndroid Build Coastguard Worker this->registerChild(std::move(noiseFP), SkSL::SampleUsage::Explicit()); 120*c8dee2aaSAndroid Build Coastguard Worker this->setUsesSampleCoordsDirectly(); 121*c8dee2aaSAndroid Build Coastguard Worker } 122*c8dee2aaSAndroid Build Coastguard Worker GrPerlinNoise2Effect(const GrPerlinNoise2Effect & that)123*c8dee2aaSAndroid Build Coastguard Worker GrPerlinNoise2Effect(const GrPerlinNoise2Effect& that) 124*c8dee2aaSAndroid Build Coastguard Worker : GrFragmentProcessor(that) 125*c8dee2aaSAndroid Build Coastguard Worker , fType(that.fType) 126*c8dee2aaSAndroid Build Coastguard Worker , fNumOctaves(that.fNumOctaves) 127*c8dee2aaSAndroid Build Coastguard Worker , fStitchTiles(that.fStitchTiles) 128*c8dee2aaSAndroid Build Coastguard Worker , fPaintingData(new SkPerlinNoiseShader::PaintingData(*that.fPaintingData)) {} 129*c8dee2aaSAndroid Build Coastguard Worker 130*c8dee2aaSAndroid Build Coastguard Worker GR_DECLARE_FRAGMENT_PROCESSOR_TEST 131*c8dee2aaSAndroid Build Coastguard Worker 132*c8dee2aaSAndroid Build Coastguard Worker SkPerlinNoiseShaderType fType; 133*c8dee2aaSAndroid Build Coastguard Worker int fNumOctaves; 134*c8dee2aaSAndroid Build Coastguard Worker bool fStitchTiles; 135*c8dee2aaSAndroid Build Coastguard Worker 136*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkPerlinNoiseShader::PaintingData> fPaintingData; 137*c8dee2aaSAndroid Build Coastguard Worker }; 138*c8dee2aaSAndroid Build Coastguard Worker 139*c8dee2aaSAndroid Build Coastguard Worker #endif 140