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 GrFragmentProcessors_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrFragmentProcessors_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkRuntimeEffect.h" 12*c8dee2aaSAndroid Build Coastguard Worker 13*c8dee2aaSAndroid Build Coastguard Worker #include <tuple> 14*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker class GrColorInfo; 17*c8dee2aaSAndroid Build Coastguard Worker class GrFragmentProcessor; 18*c8dee2aaSAndroid Build Coastguard Worker class GrRecordingContext; 19*c8dee2aaSAndroid Build Coastguard Worker class SkBlenderBase; 20*c8dee2aaSAndroid Build Coastguard Worker class SkColorFilter; 21*c8dee2aaSAndroid Build Coastguard Worker class SkMaskFilter; 22*c8dee2aaSAndroid Build Coastguard Worker class SkMatrix; 23*c8dee2aaSAndroid Build Coastguard Worker class SkSurfaceProps; 24*c8dee2aaSAndroid Build Coastguard Worker class SkShader; 25*c8dee2aaSAndroid Build Coastguard Worker struct GrFPArgs; 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker using GrFPResult = std::tuple<bool, std::unique_ptr<GrFragmentProcessor>>; 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker namespace SkShaders { 30*c8dee2aaSAndroid Build Coastguard Worker class MatrixRec; 31*c8dee2aaSAndroid Build Coastguard Worker } 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Worker namespace GrFragmentProcessors { 34*c8dee2aaSAndroid Build Coastguard Worker /** 35*c8dee2aaSAndroid Build Coastguard Worker * Returns a GrFragmentProcessor that implements this blend for the Ganesh GPU backend. 36*c8dee2aaSAndroid Build Coastguard Worker * The GrFragmentProcessor expects premultiplied inputs and returns a premultiplied output. 37*c8dee2aaSAndroid Build Coastguard Worker */ 38*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrFragmentProcessor> Make(const SkBlenderBase*, 39*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrFragmentProcessor> srcFP, 40*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrFragmentProcessor> dstFP, 41*c8dee2aaSAndroid Build Coastguard Worker const GrFPArgs& fpArgs); 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker /** 44*c8dee2aaSAndroid Build Coastguard Worker * Returns a GrFragmentProcessor that implements the color filter in GPU shader code. 45*c8dee2aaSAndroid Build Coastguard Worker * 46*c8dee2aaSAndroid Build Coastguard Worker * The fragment processor receives a input FP that generates a premultiplied input color, and 47*c8dee2aaSAndroid Build Coastguard Worker * produces a premultiplied output color. 48*c8dee2aaSAndroid Build Coastguard Worker * 49*c8dee2aaSAndroid Build Coastguard Worker * A GrFPFailure indicates that the color filter isn't implemented for the GPU backend. 50*c8dee2aaSAndroid Build Coastguard Worker */ 51*c8dee2aaSAndroid Build Coastguard Worker GrFPResult Make(GrRecordingContext*, 52*c8dee2aaSAndroid Build Coastguard Worker const SkColorFilter*, 53*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrFragmentProcessor> inputFP, 54*c8dee2aaSAndroid Build Coastguard Worker const GrColorInfo& dstColorInfo, 55*c8dee2aaSAndroid Build Coastguard Worker const SkSurfaceProps&); 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrFragmentProcessor> Make(const SkMaskFilter*, 58*c8dee2aaSAndroid Build Coastguard Worker const GrFPArgs&, 59*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& ctm); 60*c8dee2aaSAndroid Build Coastguard Worker 61*c8dee2aaSAndroid Build Coastguard Worker bool IsSupported(const SkMaskFilter*); 62*c8dee2aaSAndroid Build Coastguard Worker 63*c8dee2aaSAndroid Build Coastguard Worker /** 64*c8dee2aaSAndroid Build Coastguard Worker * Call on the root SkShader to produce a GrFragmentProcessor. 65*c8dee2aaSAndroid Build Coastguard Worker * 66*c8dee2aaSAndroid Build Coastguard Worker * The returned GrFragmentProcessor expects an unpremultiplied input color and produces a 67*c8dee2aaSAndroid Build Coastguard Worker * premultiplied output. 68*c8dee2aaSAndroid Build Coastguard Worker */ 69*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrFragmentProcessor> Make(const SkShader*, const GrFPArgs&, const SkMatrix& ctm); 70*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrFragmentProcessor> Make(const SkShader*, 71*c8dee2aaSAndroid Build Coastguard Worker const GrFPArgs&, 72*c8dee2aaSAndroid Build Coastguard Worker const SkShaders::MatrixRec&); 73*c8dee2aaSAndroid Build Coastguard Worker 74*c8dee2aaSAndroid Build Coastguard Worker /** 75*c8dee2aaSAndroid Build Coastguard Worker * Returns a GrFragmentProcessor for the passed-in runtime effect child. The processor will be 76*c8dee2aaSAndroid Build Coastguard Worker * created with generic/null inputs, since the runtime effect is responsible for filling in the 77*c8dee2aaSAndroid Build Coastguard Worker * arguments to the function. 78*c8dee2aaSAndroid Build Coastguard Worker */ 79*c8dee2aaSAndroid Build Coastguard Worker GrFPResult MakeChildFP(const SkRuntimeEffect::ChildPtr& child, const GrFPArgs& childArgs); 80*c8dee2aaSAndroid Build Coastguard Worker 81*c8dee2aaSAndroid Build Coastguard Worker } // namespace GrFragmentProcessors 82*c8dee2aaSAndroid Build Coastguard Worker 83*c8dee2aaSAndroid Build Coastguard Worker #endif 84