1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2024 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 skgpu_graphite_precompile_PaintOptions_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_precompile_PaintOptions_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBlendMode.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSpan.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTDArray.h" 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker #include <functional> 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite { 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker class PrecompileBlender; 22*c8dee2aaSAndroid Build Coastguard Worker class PrecompileColorFilter; 23*c8dee2aaSAndroid Build Coastguard Worker class PrecompileImageFilter; 24*c8dee2aaSAndroid Build Coastguard Worker class PrecompileMaskFilter; 25*c8dee2aaSAndroid Build Coastguard Worker class PrecompileShader; 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker enum class Coverage; 28*c8dee2aaSAndroid Build Coastguard Worker enum DrawTypeFlags : uint16_t; 29*c8dee2aaSAndroid Build Coastguard Worker enum class PrecompileImageFilterFlags : uint32_t; 30*c8dee2aaSAndroid Build Coastguard Worker 31*c8dee2aaSAndroid Build Coastguard Worker class KeyContext; 32*c8dee2aaSAndroid Build Coastguard Worker class PaintOptionsPriv; 33*c8dee2aaSAndroid Build Coastguard Worker class PaintParamsKeyBuilder; 34*c8dee2aaSAndroid Build Coastguard Worker class PipelineDataGatherer; 35*c8dee2aaSAndroid Build Coastguard Worker struct RenderPassDesc; 36*c8dee2aaSAndroid Build Coastguard Worker class UniquePaintParamsID; 37*c8dee2aaSAndroid Build Coastguard Worker 38*c8dee2aaSAndroid Build Coastguard Worker /** \class PaintOptions 39*c8dee2aaSAndroid Build Coastguard Worker This is the Precompilation analog to SkPaint. It encapsulates a set of options for each 40*c8dee2aaSAndroid Build Coastguard Worker field of the SkPaint (e.g., colorFilters, imageFilters, etc). Many of the specific details 41*c8dee2aaSAndroid Build Coastguard Worker of an SkPaint that are irrelevant to the final compiled Pipelines are abstracted away 42*c8dee2aaSAndroid Build Coastguard Worker (e.g., the SkPaint's color field). 43*c8dee2aaSAndroid Build Coastguard Worker 44*c8dee2aaSAndroid Build Coastguard Worker How Precompilation works in practice is a PaintOptions object is created and a set of options 45*c8dee2aaSAndroid Build Coastguard Worker for each slot (e.g., shader, blender) are added. When passed to the Precompile() function, 46*c8dee2aaSAndroid Build Coastguard Worker all the combinations specified by the PaintOptions will be created and precompiled. 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Worker To be concrete, if a PaintOptions object had two shader options and two blender options, 49*c8dee2aaSAndroid Build Coastguard Worker four combinations would be precompiled. 50*c8dee2aaSAndroid Build Coastguard Worker */ 51*c8dee2aaSAndroid Build Coastguard Worker class SK_API PaintOptions { 52*c8dee2aaSAndroid Build Coastguard Worker public: 53*c8dee2aaSAndroid Build Coastguard Worker /** Constructs a PaintOptions object with default values. It is equivalent to a default 54*c8dee2aaSAndroid Build Coastguard Worker * initialized SkPaint. 55*c8dee2aaSAndroid Build Coastguard Worker 56*c8dee2aaSAndroid Build Coastguard Worker @return default initialized PaintOptions 57*c8dee2aaSAndroid Build Coastguard Worker */ 58*c8dee2aaSAndroid Build Coastguard Worker PaintOptions(); 59*c8dee2aaSAndroid Build Coastguard Worker PaintOptions(const PaintOptions&); 60*c8dee2aaSAndroid Build Coastguard Worker ~PaintOptions(); 61*c8dee2aaSAndroid Build Coastguard Worker PaintOptions& operator=(const PaintOptions&); 62*c8dee2aaSAndroid Build Coastguard Worker 63*c8dee2aaSAndroid Build Coastguard Worker /** Sets the shader options used when generating precompilation combinations. 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker This corresponds to SkPaint's setShader() method 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker @param shaders The options used for shading when generating precompilation combinations. 68*c8dee2aaSAndroid Build Coastguard Worker */ 69*c8dee2aaSAndroid Build Coastguard Worker void setShaders(SkSpan<const sk_sp<PrecompileShader>> shaders); getShaders()70*c8dee2aaSAndroid Build Coastguard Worker SkSpan<const sk_sp<PrecompileShader>> getShaders() const { 71*c8dee2aaSAndroid Build Coastguard Worker return SkSpan<const sk_sp<PrecompileShader>>(fShaderOptions); 72*c8dee2aaSAndroid Build Coastguard Worker } 73*c8dee2aaSAndroid Build Coastguard Worker 74*c8dee2aaSAndroid Build Coastguard Worker /** Sets the image filter options used when generating precompilation combinations. 75*c8dee2aaSAndroid Build Coastguard Worker 76*c8dee2aaSAndroid Build Coastguard Worker This corresponds to SkPaint's setImageFilter() method 77*c8dee2aaSAndroid Build Coastguard Worker 78*c8dee2aaSAndroid Build Coastguard Worker @param imageFilters The options used for image filtering when generating precompilation 79*c8dee2aaSAndroid Build Coastguard Worker combinations. 80*c8dee2aaSAndroid Build Coastguard Worker */ 81*c8dee2aaSAndroid Build Coastguard Worker void setImageFilters(SkSpan<const sk_sp<PrecompileImageFilter>> imageFilters); getImageFilters()82*c8dee2aaSAndroid Build Coastguard Worker SkSpan<const sk_sp<PrecompileImageFilter>> getImageFilters() const { 83*c8dee2aaSAndroid Build Coastguard Worker return SkSpan<const sk_sp<PrecompileImageFilter>>(fImageFilterOptions); 84*c8dee2aaSAndroid Build Coastguard Worker } 85*c8dee2aaSAndroid Build Coastguard Worker 86*c8dee2aaSAndroid Build Coastguard Worker /** Sets the mask filter options used when generating precompilation combinations. 87*c8dee2aaSAndroid Build Coastguard Worker 88*c8dee2aaSAndroid Build Coastguard Worker This corresponds to SkPaint's setMaskFilter() method 89*c8dee2aaSAndroid Build Coastguard Worker 90*c8dee2aaSAndroid Build Coastguard Worker @param maskFilters The options used for mask filtering when generating precompilation 91*c8dee2aaSAndroid Build Coastguard Worker combinations. 92*c8dee2aaSAndroid Build Coastguard Worker */ 93*c8dee2aaSAndroid Build Coastguard Worker void setMaskFilters(SkSpan<const sk_sp<PrecompileMaskFilter>> maskFilters); getMaskFilters()94*c8dee2aaSAndroid Build Coastguard Worker SkSpan<const sk_sp<PrecompileMaskFilter>> getMaskFilters() const { 95*c8dee2aaSAndroid Build Coastguard Worker return SkSpan<const sk_sp<PrecompileMaskFilter>>(fMaskFilterOptions); 96*c8dee2aaSAndroid Build Coastguard Worker } 97*c8dee2aaSAndroid Build Coastguard Worker 98*c8dee2aaSAndroid Build Coastguard Worker /** Sets the color filter options used when generating precompilation combinations. 99*c8dee2aaSAndroid Build Coastguard Worker 100*c8dee2aaSAndroid Build Coastguard Worker This corresponds to SkPaint's setColorFilter() method 101*c8dee2aaSAndroid Build Coastguard Worker 102*c8dee2aaSAndroid Build Coastguard Worker @param colorFilters The options used for color filtering when generating precompilation 103*c8dee2aaSAndroid Build Coastguard Worker combinations. 104*c8dee2aaSAndroid Build Coastguard Worker */ 105*c8dee2aaSAndroid Build Coastguard Worker void setColorFilters(SkSpan<const sk_sp<PrecompileColorFilter>> colorFilters); getColorFilters()106*c8dee2aaSAndroid Build Coastguard Worker SkSpan<const sk_sp<PrecompileColorFilter>> getColorFilters() const { 107*c8dee2aaSAndroid Build Coastguard Worker return SkSpan<const sk_sp<PrecompileColorFilter>>(fColorFilterOptions); 108*c8dee2aaSAndroid Build Coastguard Worker } 109*c8dee2aaSAndroid Build Coastguard Worker 110*c8dee2aaSAndroid Build Coastguard Worker /** Sets the blend mode options used when generating precompilation combinations. 111*c8dee2aaSAndroid Build Coastguard Worker 112*c8dee2aaSAndroid Build Coastguard Worker This corresponds to SkPaint's setBlendMode() method 113*c8dee2aaSAndroid Build Coastguard Worker 114*c8dee2aaSAndroid Build Coastguard Worker @param blendModes The options used for blending when generating precompilation 115*c8dee2aaSAndroid Build Coastguard Worker combinations. 116*c8dee2aaSAndroid Build Coastguard Worker */ 117*c8dee2aaSAndroid Build Coastguard Worker void setBlendModes(SkSpan<const SkBlendMode> blendModes); getBlendModes()118*c8dee2aaSAndroid Build Coastguard Worker SkSpan<const SkBlendMode> getBlendModes() const { 119*c8dee2aaSAndroid Build Coastguard Worker return SkSpan<const SkBlendMode>(fBlendModeOptions.data(), fBlendModeOptions.size()); 120*c8dee2aaSAndroid Build Coastguard Worker } 121*c8dee2aaSAndroid Build Coastguard Worker 122*c8dee2aaSAndroid Build Coastguard Worker /** Sets the blender options used when generating precompilation combinations. 123*c8dee2aaSAndroid Build Coastguard Worker 124*c8dee2aaSAndroid Build Coastguard Worker This corresponds to SkPaint's setBlender() method 125*c8dee2aaSAndroid Build Coastguard Worker 126*c8dee2aaSAndroid Build Coastguard Worker @param blenders The options used for blending when generating precompilation combinations. 127*c8dee2aaSAndroid Build Coastguard Worker */ 128*c8dee2aaSAndroid Build Coastguard Worker void setBlenders(SkSpan<const sk_sp<PrecompileBlender>> blenders); getBlenders()129*c8dee2aaSAndroid Build Coastguard Worker SkSpan<const sk_sp<PrecompileBlender>> getBlenders() const { 130*c8dee2aaSAndroid Build Coastguard Worker return SkSpan<const sk_sp<PrecompileBlender>>(fBlenderOptions); 131*c8dee2aaSAndroid Build Coastguard Worker } 132*c8dee2aaSAndroid Build Coastguard Worker 133*c8dee2aaSAndroid Build Coastguard Worker /** Sets the dither setting used when generating precompilation combinations 134*c8dee2aaSAndroid Build Coastguard Worker 135*c8dee2aaSAndroid Build Coastguard Worker This corresponds to SkPaint's setDither() method 136*c8dee2aaSAndroid Build Coastguard Worker 137*c8dee2aaSAndroid Build Coastguard Worker @param dither the dither setting used when generating precompilation combinations. 138*c8dee2aaSAndroid Build Coastguard Worker */ setDither(bool dither)139*c8dee2aaSAndroid Build Coastguard Worker void setDither(bool dither) { fDither = dither; } isDither()140*c8dee2aaSAndroid Build Coastguard Worker bool isDither() const { return fDither; } 141*c8dee2aaSAndroid Build Coastguard Worker 142*c8dee2aaSAndroid Build Coastguard Worker // Provides access to functions that aren't part of the public API. 143*c8dee2aaSAndroid Build Coastguard Worker PaintOptionsPriv priv(); 144*c8dee2aaSAndroid Build Coastguard Worker const PaintOptionsPriv priv() const; // NOLINT(readability-const-return-type) 145*c8dee2aaSAndroid Build Coastguard Worker 146*c8dee2aaSAndroid Build Coastguard Worker private: 147*c8dee2aaSAndroid Build Coastguard Worker friend class PaintOptionsPriv; 148*c8dee2aaSAndroid Build Coastguard Worker friend class PrecompileImageFilter; // for ProcessCombination access 149*c8dee2aaSAndroid Build Coastguard Worker friend class PrecompileMaskFilter; // for ProcessCombination access 150*c8dee2aaSAndroid Build Coastguard Worker 151*c8dee2aaSAndroid Build Coastguard Worker void addColorFilter(sk_sp<PrecompileColorFilter> cf); addBlendMode(SkBlendMode bm)152*c8dee2aaSAndroid Build Coastguard Worker void addBlendMode(SkBlendMode bm) { 153*c8dee2aaSAndroid Build Coastguard Worker fBlendModeOptions.push_back(bm); 154*c8dee2aaSAndroid Build Coastguard Worker } 155*c8dee2aaSAndroid Build Coastguard Worker 156*c8dee2aaSAndroid Build Coastguard Worker void setClipShaders(SkSpan<const sk_sp<PrecompileShader>> clipShaders); 157*c8dee2aaSAndroid Build Coastguard Worker 158*c8dee2aaSAndroid Build Coastguard Worker int numShaderCombinations() const; 159*c8dee2aaSAndroid Build Coastguard Worker int numColorFilterCombinations() const; 160*c8dee2aaSAndroid Build Coastguard Worker int numBlendCombinations() const; 161*c8dee2aaSAndroid Build Coastguard Worker int numClipShaderCombinations() const; 162*c8dee2aaSAndroid Build Coastguard Worker 163*c8dee2aaSAndroid Build Coastguard Worker int numCombinations() const; 164*c8dee2aaSAndroid Build Coastguard Worker // 'desiredCombination' must be less than the result of the numCombinations call 165*c8dee2aaSAndroid Build Coastguard Worker void createKey(const KeyContext&, 166*c8dee2aaSAndroid Build Coastguard Worker PaintParamsKeyBuilder*, 167*c8dee2aaSAndroid Build Coastguard Worker PipelineDataGatherer*, 168*c8dee2aaSAndroid Build Coastguard Worker int desiredCombination, 169*c8dee2aaSAndroid Build Coastguard Worker bool addPrimitiveBlender, 170*c8dee2aaSAndroid Build Coastguard Worker Coverage coverage) const; 171*c8dee2aaSAndroid Build Coastguard Worker 172*c8dee2aaSAndroid Build Coastguard Worker typedef std::function<void(UniquePaintParamsID id, 173*c8dee2aaSAndroid Build Coastguard Worker DrawTypeFlags, 174*c8dee2aaSAndroid Build Coastguard Worker bool withPrimitiveBlender, 175*c8dee2aaSAndroid Build Coastguard Worker Coverage, 176*c8dee2aaSAndroid Build Coastguard Worker const RenderPassDesc&)> ProcessCombination; 177*c8dee2aaSAndroid Build Coastguard Worker 178*c8dee2aaSAndroid Build Coastguard Worker void buildCombinations(const KeyContext&, 179*c8dee2aaSAndroid Build Coastguard Worker PipelineDataGatherer*, 180*c8dee2aaSAndroid Build Coastguard Worker DrawTypeFlags, 181*c8dee2aaSAndroid Build Coastguard Worker bool addPrimitiveBlender, 182*c8dee2aaSAndroid Build Coastguard Worker Coverage, 183*c8dee2aaSAndroid Build Coastguard Worker const RenderPassDesc&, 184*c8dee2aaSAndroid Build Coastguard Worker const ProcessCombination&) const; 185*c8dee2aaSAndroid Build Coastguard Worker 186*c8dee2aaSAndroid Build Coastguard Worker skia_private::TArray<sk_sp<PrecompileShader>> fShaderOptions; 187*c8dee2aaSAndroid Build Coastguard Worker skia_private::TArray<sk_sp<PrecompileColorFilter>> fColorFilterOptions; 188*c8dee2aaSAndroid Build Coastguard Worker skia_private::TArray<SkBlendMode> fBlendModeOptions; 189*c8dee2aaSAndroid Build Coastguard Worker skia_private::TArray<sk_sp<PrecompileBlender>> fBlenderOptions; 190*c8dee2aaSAndroid Build Coastguard Worker skia_private::TArray<sk_sp<PrecompileShader>> fClipShaderOptions; 191*c8dee2aaSAndroid Build Coastguard Worker 192*c8dee2aaSAndroid Build Coastguard Worker skia_private::TArray<sk_sp<PrecompileImageFilter>> fImageFilterOptions; 193*c8dee2aaSAndroid Build Coastguard Worker skia_private::TArray<sk_sp<PrecompileMaskFilter>> fMaskFilterOptions; 194*c8dee2aaSAndroid Build Coastguard Worker 195*c8dee2aaSAndroid Build Coastguard Worker bool fDither = false; 196*c8dee2aaSAndroid Build Coastguard Worker }; 197*c8dee2aaSAndroid Build Coastguard Worker 198*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite 199*c8dee2aaSAndroid Build Coastguard Worker 200*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_precompile_PaintOptions_DEFINED 201