1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2022 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_KeyHelpers_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_KeyHelpers_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBitmap.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBlendMode.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkM44.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint3.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSamplingOptions.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkShader.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSpan.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTileMode.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkGradientShader.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/Context.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/SkColorData.h" 22*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h" 23*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkColorSpaceXformSteps.h" 24*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/ReadSwizzle.h" 25*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/TextureProxy.h" 26*c8dee2aaSAndroid Build Coastguard Worker #include "src/shaders/SkShaderBase.h" 27*c8dee2aaSAndroid Build Coastguard Worker #include "src/shaders/gradients/SkGradientBaseShader.h" 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker class SkColorFilter; 30*c8dee2aaSAndroid Build Coastguard Worker class SkData; 31*c8dee2aaSAndroid Build Coastguard Worker class SkRuntimeEffect; 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite { 34*c8dee2aaSAndroid Build Coastguard Worker 35*c8dee2aaSAndroid Build Coastguard Worker class DrawContext; 36*c8dee2aaSAndroid Build Coastguard Worker class KeyContext; 37*c8dee2aaSAndroid Build Coastguard Worker class PaintParamsKeyBuilder; 38*c8dee2aaSAndroid Build Coastguard Worker class PipelineDataGatherer; 39*c8dee2aaSAndroid Build Coastguard Worker class UniquePaintParamsID; 40*c8dee2aaSAndroid Build Coastguard Worker enum class ReadSwizzle; 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker // Types of logical "destinations" that a blender might blend with. 43*c8dee2aaSAndroid Build Coastguard Worker enum class DstColorType { 44*c8dee2aaSAndroid Build Coastguard Worker // A color read from the framebuffer. 45*c8dee2aaSAndroid Build Coastguard Worker kSurface, 46*c8dee2aaSAndroid Build Coastguard Worker // A color provided by geometry. 47*c8dee2aaSAndroid Build Coastguard Worker kPrimitive, 48*c8dee2aaSAndroid Build Coastguard Worker // A color evaluated by a child shader. 49*c8dee2aaSAndroid Build Coastguard Worker kChildOutput, 50*c8dee2aaSAndroid Build Coastguard Worker }; 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker /** 53*c8dee2aaSAndroid Build Coastguard Worker * The KeyHelpers can be used to manually construct an SkPaintParamsKey. 54*c8dee2aaSAndroid Build Coastguard Worker * 55*c8dee2aaSAndroid Build Coastguard Worker * TODO: If we restructure how the keys are made, we can utilize a single block type for the 56*c8dee2aaSAndroid Build Coastguard Worker * different blend blocks outlined below. The different Src/Dst pairings could instead be encoded 57*c8dee2aaSAndroid Build Coastguard Worker * as parent-child relationships. 58*c8dee2aaSAndroid Build Coastguard Worker */ 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker struct SolidColorShaderBlock { 61*c8dee2aaSAndroid Build Coastguard Worker static void AddBlock(const KeyContext&, 62*c8dee2aaSAndroid Build Coastguard Worker PaintParamsKeyBuilder*, 63*c8dee2aaSAndroid Build Coastguard Worker PipelineDataGatherer*, 64*c8dee2aaSAndroid Build Coastguard Worker const SkPMColor4f&); 65*c8dee2aaSAndroid Build Coastguard Worker }; 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker struct RGBPaintColorBlock { 68*c8dee2aaSAndroid Build Coastguard Worker static void AddBlock(const KeyContext&, 69*c8dee2aaSAndroid Build Coastguard Worker PaintParamsKeyBuilder*, 70*c8dee2aaSAndroid Build Coastguard Worker PipelineDataGatherer*); 71*c8dee2aaSAndroid Build Coastguard Worker }; 72*c8dee2aaSAndroid Build Coastguard Worker 73*c8dee2aaSAndroid Build Coastguard Worker struct AlphaOnlyPaintColorBlock { 74*c8dee2aaSAndroid Build Coastguard Worker static void AddBlock(const KeyContext&, 75*c8dee2aaSAndroid Build Coastguard Worker PaintParamsKeyBuilder*, 76*c8dee2aaSAndroid Build Coastguard Worker PipelineDataGatherer*); 77*c8dee2aaSAndroid Build Coastguard Worker }; 78*c8dee2aaSAndroid Build Coastguard Worker 79*c8dee2aaSAndroid Build Coastguard Worker struct GradientShaderBlocks { 80*c8dee2aaSAndroid Build Coastguard Worker struct GradientData { 81*c8dee2aaSAndroid Build Coastguard Worker // The number of stops stored internal to this data structure before falling back to 82*c8dee2aaSAndroid Build Coastguard Worker // bitmap storage. 83*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kNumInternalStorageStops = 8; 84*c8dee2aaSAndroid Build Coastguard Worker 85*c8dee2aaSAndroid Build Coastguard Worker // This ctor is used during pre-compilation when we don't have enough information to 86*c8dee2aaSAndroid Build Coastguard Worker // extract uniform data. However, we must be able to provide enough data to make all the 87*c8dee2aaSAndroid Build Coastguard Worker // relevant decisions about which code snippets to use. 88*c8dee2aaSAndroid Build Coastguard Worker GradientData(SkShaderBase::GradientType, int numStops, bool useStorageBuffer); 89*c8dee2aaSAndroid Build Coastguard Worker 90*c8dee2aaSAndroid Build Coastguard Worker // This ctor is used when extracting information from PaintParams. It must provide 91*c8dee2aaSAndroid Build Coastguard Worker // enough data to generate the uniform data the selected code snippet will require. 92*c8dee2aaSAndroid Build Coastguard Worker GradientData(SkShaderBase::GradientType, 93*c8dee2aaSAndroid Build Coastguard Worker SkPoint point0, SkPoint point1, 94*c8dee2aaSAndroid Build Coastguard Worker float radius0, float radius1, 95*c8dee2aaSAndroid Build Coastguard Worker float bias, float scale, 96*c8dee2aaSAndroid Build Coastguard Worker SkTileMode, 97*c8dee2aaSAndroid Build Coastguard Worker int numStops, 98*c8dee2aaSAndroid Build Coastguard Worker const SkPMColor4f* colors, 99*c8dee2aaSAndroid Build Coastguard Worker const float* offsets, 100*c8dee2aaSAndroid Build Coastguard Worker const SkGradientBaseShader* shader, 101*c8dee2aaSAndroid Build Coastguard Worker sk_sp<TextureProxy> colorsAndOffsetsProxy, 102*c8dee2aaSAndroid Build Coastguard Worker bool useStorageBuffer, 103*c8dee2aaSAndroid Build Coastguard Worker const SkGradientShader::Interpolation&); 104*c8dee2aaSAndroid Build Coastguard Worker 105*c8dee2aaSAndroid Build Coastguard Worker bool operator==(const GradientData& rhs) const = delete; 106*c8dee2aaSAndroid Build Coastguard Worker bool operator!=(const GradientData& rhs) const = delete; 107*c8dee2aaSAndroid Build Coastguard Worker 108*c8dee2aaSAndroid Build Coastguard Worker // Layout options. 109*c8dee2aaSAndroid Build Coastguard Worker SkShaderBase::GradientType fType; 110*c8dee2aaSAndroid Build Coastguard Worker SkPoint fPoints[2]; 111*c8dee2aaSAndroid Build Coastguard Worker float fRadii[2]; 112*c8dee2aaSAndroid Build Coastguard Worker 113*c8dee2aaSAndroid Build Coastguard Worker // Layout options for sweep gradient. 114*c8dee2aaSAndroid Build Coastguard Worker float fBias; 115*c8dee2aaSAndroid Build Coastguard Worker float fScale; 116*c8dee2aaSAndroid Build Coastguard Worker 117*c8dee2aaSAndroid Build Coastguard Worker SkTileMode fTM; 118*c8dee2aaSAndroid Build Coastguard Worker int fNumStops; 119*c8dee2aaSAndroid Build Coastguard Worker bool fUseStorageBuffer; 120*c8dee2aaSAndroid Build Coastguard Worker 121*c8dee2aaSAndroid Build Coastguard Worker // For gradients w/ <= kNumInternalStorageStops stops we use fColors and fOffsets. 122*c8dee2aaSAndroid Build Coastguard Worker // The offsets are packed into a single float4 to save space when the layout is std140. 123*c8dee2aaSAndroid Build Coastguard Worker // 124*c8dee2aaSAndroid Build Coastguard Worker // Otherwise when storage buffers are preferred, we save the colors and offsets pointers 125*c8dee2aaSAndroid Build Coastguard Worker // to fSrcColors and fSrcOffsets so we can directly copy to the gatherer gradient buffer, 126*c8dee2aaSAndroid Build Coastguard Worker // else we pack the data into the fColorsAndOffsetsProxy texture. 127*c8dee2aaSAndroid Build Coastguard Worker SkPMColor4f fColors[kNumInternalStorageStops]; 128*c8dee2aaSAndroid Build Coastguard Worker SkV4 fOffsets[kNumInternalStorageStops / 4]; 129*c8dee2aaSAndroid Build Coastguard Worker sk_sp<TextureProxy> fColorsAndOffsetsProxy; 130*c8dee2aaSAndroid Build Coastguard Worker const SkPMColor4f* fSrcColors; 131*c8dee2aaSAndroid Build Coastguard Worker const float* fSrcOffsets; 132*c8dee2aaSAndroid Build Coastguard Worker const SkGradientBaseShader* fSrcShader; 133*c8dee2aaSAndroid Build Coastguard Worker 134*c8dee2aaSAndroid Build Coastguard Worker SkGradientShader::Interpolation fInterpolation; 135*c8dee2aaSAndroid Build Coastguard Worker }; 136*c8dee2aaSAndroid Build Coastguard Worker 137*c8dee2aaSAndroid Build Coastguard Worker static void AddBlock(const KeyContext&, 138*c8dee2aaSAndroid Build Coastguard Worker PaintParamsKeyBuilder*, 139*c8dee2aaSAndroid Build Coastguard Worker PipelineDataGatherer*, 140*c8dee2aaSAndroid Build Coastguard Worker const GradientData&); 141*c8dee2aaSAndroid Build Coastguard Worker }; 142*c8dee2aaSAndroid Build Coastguard Worker 143*c8dee2aaSAndroid Build Coastguard Worker struct LocalMatrixShaderBlock { 144*c8dee2aaSAndroid Build Coastguard Worker struct LMShaderData { LMShaderDataLocalMatrixShaderBlock::LMShaderData145*c8dee2aaSAndroid Build Coastguard Worker LMShaderData(const SkMatrix& localMatrix) 146*c8dee2aaSAndroid Build Coastguard Worker : fLocalMatrix(localMatrix) 147*c8dee2aaSAndroid Build Coastguard Worker , fHasPerspective(localMatrix.hasPerspective()) {} 148*c8dee2aaSAndroid Build Coastguard Worker 149*c8dee2aaSAndroid Build Coastguard Worker const SkM44 fLocalMatrix; 150*c8dee2aaSAndroid Build Coastguard Worker const bool fHasPerspective; 151*c8dee2aaSAndroid Build Coastguard Worker }; 152*c8dee2aaSAndroid Build Coastguard Worker 153*c8dee2aaSAndroid Build Coastguard Worker static void BeginBlock(const KeyContext&, 154*c8dee2aaSAndroid Build Coastguard Worker PaintParamsKeyBuilder*, 155*c8dee2aaSAndroid Build Coastguard Worker PipelineDataGatherer*, 156*c8dee2aaSAndroid Build Coastguard Worker const LMShaderData&); 157*c8dee2aaSAndroid Build Coastguard Worker }; 158*c8dee2aaSAndroid Build Coastguard Worker 159*c8dee2aaSAndroid Build Coastguard Worker struct ImageShaderBlock { 160*c8dee2aaSAndroid Build Coastguard Worker struct ImageData { 161*c8dee2aaSAndroid Build Coastguard Worker ImageData(const SkSamplingOptions& sampling, 162*c8dee2aaSAndroid Build Coastguard Worker SkTileMode tileModeX, 163*c8dee2aaSAndroid Build Coastguard Worker SkTileMode tileModeY, 164*c8dee2aaSAndroid Build Coastguard Worker SkISize imgSize, 165*c8dee2aaSAndroid Build Coastguard Worker SkRect subset); 166*c8dee2aaSAndroid Build Coastguard Worker SkSamplingOptions fSampling; 167*c8dee2aaSAndroid Build Coastguard Worker std::pair<SkTileMode, SkTileMode> fTileModes; 168*c8dee2aaSAndroid Build Coastguard Worker SkISize fImgSize; 169*c8dee2aaSAndroid Build Coastguard Worker SkRect fSubset; 170*c8dee2aaSAndroid Build Coastguard Worker 171*c8dee2aaSAndroid Build Coastguard Worker // TODO: Currently this is only filled in when we're generating the key from an actual 172*c8dee2aaSAndroid Build Coastguard Worker // SkImageShader. In the pre-compile case we will need to create a Graphite promise 173*c8dee2aaSAndroid Build Coastguard Worker // image which holds the appropriate data. 174*c8dee2aaSAndroid Build Coastguard Worker sk_sp<TextureProxy> fTextureProxy; 175*c8dee2aaSAndroid Build Coastguard Worker }; 176*c8dee2aaSAndroid Build Coastguard Worker 177*c8dee2aaSAndroid Build Coastguard Worker static void AddBlock(const KeyContext&, 178*c8dee2aaSAndroid Build Coastguard Worker PaintParamsKeyBuilder*, 179*c8dee2aaSAndroid Build Coastguard Worker PipelineDataGatherer*, 180*c8dee2aaSAndroid Build Coastguard Worker const ImageData&); 181*c8dee2aaSAndroid Build Coastguard Worker }; 182*c8dee2aaSAndroid Build Coastguard Worker 183*c8dee2aaSAndroid Build Coastguard Worker struct YUVImageShaderBlock { 184*c8dee2aaSAndroid Build Coastguard Worker struct ImageData { 185*c8dee2aaSAndroid Build Coastguard Worker ImageData(const SkSamplingOptions& sampling, 186*c8dee2aaSAndroid Build Coastguard Worker SkTileMode tileModeX, 187*c8dee2aaSAndroid Build Coastguard Worker SkTileMode tileModeY, 188*c8dee2aaSAndroid Build Coastguard Worker SkISize imgSize, 189*c8dee2aaSAndroid Build Coastguard Worker SkRect subset); 190*c8dee2aaSAndroid Build Coastguard Worker 191*c8dee2aaSAndroid Build Coastguard Worker SkSamplingOptions fSampling; 192*c8dee2aaSAndroid Build Coastguard Worker SkSamplingOptions fSamplingUV; 193*c8dee2aaSAndroid Build Coastguard Worker std::pair<SkTileMode, SkTileMode> fTileModes; 194*c8dee2aaSAndroid Build Coastguard Worker SkISize fImgSize; 195*c8dee2aaSAndroid Build Coastguard Worker SkISize fImgSizeUV; // Size of UV planes relative to Y's texel space 196*c8dee2aaSAndroid Build Coastguard Worker SkRect fSubset; 197*c8dee2aaSAndroid Build Coastguard Worker SkPoint fLinearFilterUVInset = { 0.50001f, 0.50001f }; 198*c8dee2aaSAndroid Build Coastguard Worker SkV4 fChannelSelect[4]; 199*c8dee2aaSAndroid Build Coastguard Worker float fAlphaParam = 0; 200*c8dee2aaSAndroid Build Coastguard Worker SkMatrix fYUVtoRGBMatrix; 201*c8dee2aaSAndroid Build Coastguard Worker SkPoint3 fYUVtoRGBTranslate; 202*c8dee2aaSAndroid Build Coastguard Worker 203*c8dee2aaSAndroid Build Coastguard Worker // TODO: Currently these are only filled in when we're generating the key from an actual 204*c8dee2aaSAndroid Build Coastguard Worker // SkImageShader. In the pre-compile case we will need to create Graphite promise 205*c8dee2aaSAndroid Build Coastguard Worker // images which hold the appropriate data. 206*c8dee2aaSAndroid Build Coastguard Worker sk_sp<TextureProxy> fTextureProxies[4]; 207*c8dee2aaSAndroid Build Coastguard Worker }; 208*c8dee2aaSAndroid Build Coastguard Worker 209*c8dee2aaSAndroid Build Coastguard Worker static void AddBlock(const KeyContext&, 210*c8dee2aaSAndroid Build Coastguard Worker PaintParamsKeyBuilder*, 211*c8dee2aaSAndroid Build Coastguard Worker PipelineDataGatherer*, 212*c8dee2aaSAndroid Build Coastguard Worker const ImageData&); 213*c8dee2aaSAndroid Build Coastguard Worker }; 214*c8dee2aaSAndroid Build Coastguard Worker 215*c8dee2aaSAndroid Build Coastguard Worker struct CoordClampShaderBlock { 216*c8dee2aaSAndroid Build Coastguard Worker struct CoordClampData { CoordClampDataCoordClampShaderBlock::CoordClampData217*c8dee2aaSAndroid Build Coastguard Worker CoordClampData(SkRect subset) : fSubset(subset) {} 218*c8dee2aaSAndroid Build Coastguard Worker 219*c8dee2aaSAndroid Build Coastguard Worker SkRect fSubset; 220*c8dee2aaSAndroid Build Coastguard Worker }; 221*c8dee2aaSAndroid Build Coastguard Worker 222*c8dee2aaSAndroid Build Coastguard Worker // The gatherer and data should be null or non-null together 223*c8dee2aaSAndroid Build Coastguard Worker static void BeginBlock(const KeyContext&, 224*c8dee2aaSAndroid Build Coastguard Worker PaintParamsKeyBuilder*, 225*c8dee2aaSAndroid Build Coastguard Worker PipelineDataGatherer*, 226*c8dee2aaSAndroid Build Coastguard Worker const CoordClampData&); 227*c8dee2aaSAndroid Build Coastguard Worker }; 228*c8dee2aaSAndroid Build Coastguard Worker 229*c8dee2aaSAndroid Build Coastguard Worker struct DitherShaderBlock { 230*c8dee2aaSAndroid Build Coastguard Worker struct DitherData { DitherDataDitherShaderBlock::DitherData231*c8dee2aaSAndroid Build Coastguard Worker DitherData(float range, sk_sp<TextureProxy> proxy) 232*c8dee2aaSAndroid Build Coastguard Worker : fRange(range) 233*c8dee2aaSAndroid Build Coastguard Worker , fLUTProxy(std::move(proxy)) {} 234*c8dee2aaSAndroid Build Coastguard Worker 235*c8dee2aaSAndroid Build Coastguard Worker float fRange; 236*c8dee2aaSAndroid Build Coastguard Worker sk_sp<TextureProxy> fLUTProxy; 237*c8dee2aaSAndroid Build Coastguard Worker }; 238*c8dee2aaSAndroid Build Coastguard Worker 239*c8dee2aaSAndroid Build Coastguard Worker static void AddBlock(const KeyContext&, 240*c8dee2aaSAndroid Build Coastguard Worker PaintParamsKeyBuilder*, 241*c8dee2aaSAndroid Build Coastguard Worker PipelineDataGatherer*, 242*c8dee2aaSAndroid Build Coastguard Worker const DitherData&); 243*c8dee2aaSAndroid Build Coastguard Worker }; 244*c8dee2aaSAndroid Build Coastguard Worker 245*c8dee2aaSAndroid Build Coastguard Worker struct PerlinNoiseShaderBlock { 246*c8dee2aaSAndroid Build Coastguard Worker enum class Type { 247*c8dee2aaSAndroid Build Coastguard Worker kFractalNoise, 248*c8dee2aaSAndroid Build Coastguard Worker kTurbulence, 249*c8dee2aaSAndroid Build Coastguard Worker }; 250*c8dee2aaSAndroid Build Coastguard Worker 251*c8dee2aaSAndroid Build Coastguard Worker struct PerlinNoiseData { PerlinNoiseDataPerlinNoiseShaderBlock::PerlinNoiseData252*c8dee2aaSAndroid Build Coastguard Worker PerlinNoiseData(Type type, 253*c8dee2aaSAndroid Build Coastguard Worker SkVector baseFrequency, 254*c8dee2aaSAndroid Build Coastguard Worker int numOctaves, 255*c8dee2aaSAndroid Build Coastguard Worker SkISize stitchData) 256*c8dee2aaSAndroid Build Coastguard Worker : fType(type) 257*c8dee2aaSAndroid Build Coastguard Worker , fBaseFrequency(baseFrequency) 258*c8dee2aaSAndroid Build Coastguard Worker , fNumOctaves(numOctaves) 259*c8dee2aaSAndroid Build Coastguard Worker , fStitchData{ SkIntToFloat(stitchData.fWidth), SkIntToFloat(stitchData.fHeight) } { 260*c8dee2aaSAndroid Build Coastguard Worker } 261*c8dee2aaSAndroid Build Coastguard Worker stitchingPerlinNoiseShaderBlock::PerlinNoiseData262*c8dee2aaSAndroid Build Coastguard Worker bool stitching() const { return !fStitchData.isZero(); } 263*c8dee2aaSAndroid Build Coastguard Worker 264*c8dee2aaSAndroid Build Coastguard Worker Type fType; 265*c8dee2aaSAndroid Build Coastguard Worker SkVector fBaseFrequency; 266*c8dee2aaSAndroid Build Coastguard Worker int fNumOctaves; 267*c8dee2aaSAndroid Build Coastguard Worker SkVector fStitchData; 268*c8dee2aaSAndroid Build Coastguard Worker 269*c8dee2aaSAndroid Build Coastguard Worker sk_sp<TextureProxy> fPermutationsProxy; 270*c8dee2aaSAndroid Build Coastguard Worker sk_sp<TextureProxy> fNoiseProxy; 271*c8dee2aaSAndroid Build Coastguard Worker }; 272*c8dee2aaSAndroid Build Coastguard Worker 273*c8dee2aaSAndroid Build Coastguard Worker // The gatherer and data should be null or non-null together 274*c8dee2aaSAndroid Build Coastguard Worker static void AddBlock(const KeyContext&, 275*c8dee2aaSAndroid Build Coastguard Worker PaintParamsKeyBuilder*, 276*c8dee2aaSAndroid Build Coastguard Worker PipelineDataGatherer*, 277*c8dee2aaSAndroid Build Coastguard Worker const PerlinNoiseData&); 278*c8dee2aaSAndroid Build Coastguard Worker }; 279*c8dee2aaSAndroid Build Coastguard Worker 280*c8dee2aaSAndroid Build Coastguard Worker struct BlendComposeBlock { 281*c8dee2aaSAndroid Build Coastguard Worker static void BeginBlock(const KeyContext&, PaintParamsKeyBuilder*, PipelineDataGatherer*); 282*c8dee2aaSAndroid Build Coastguard Worker }; 283*c8dee2aaSAndroid Build Coastguard Worker 284*c8dee2aaSAndroid Build Coastguard Worker struct PorterDuffBlenderBlock { 285*c8dee2aaSAndroid Build Coastguard Worker static void AddBlock(const KeyContext&, 286*c8dee2aaSAndroid Build Coastguard Worker PaintParamsKeyBuilder*, 287*c8dee2aaSAndroid Build Coastguard Worker PipelineDataGatherer*, 288*c8dee2aaSAndroid Build Coastguard Worker SkSpan<const float> coeffs); 289*c8dee2aaSAndroid Build Coastguard Worker }; 290*c8dee2aaSAndroid Build Coastguard Worker 291*c8dee2aaSAndroid Build Coastguard Worker struct HSLCBlenderBlock { 292*c8dee2aaSAndroid Build Coastguard Worker static void AddBlock(const KeyContext&, 293*c8dee2aaSAndroid Build Coastguard Worker PaintParamsKeyBuilder*, 294*c8dee2aaSAndroid Build Coastguard Worker PipelineDataGatherer*, 295*c8dee2aaSAndroid Build Coastguard Worker SkSpan<const float> coeffs); 296*c8dee2aaSAndroid Build Coastguard Worker }; 297*c8dee2aaSAndroid Build Coastguard Worker 298*c8dee2aaSAndroid Build Coastguard Worker struct ComposeBlock { 299*c8dee2aaSAndroid Build Coastguard Worker static void BeginBlock(const KeyContext&, 300*c8dee2aaSAndroid Build Coastguard Worker PaintParamsKeyBuilder*, 301*c8dee2aaSAndroid Build Coastguard Worker PipelineDataGatherer*); 302*c8dee2aaSAndroid Build Coastguard Worker }; 303*c8dee2aaSAndroid Build Coastguard Worker 304*c8dee2aaSAndroid Build Coastguard Worker struct MatrixColorFilterBlock { 305*c8dee2aaSAndroid Build Coastguard Worker struct MatrixColorFilterData { MatrixColorFilterDataMatrixColorFilterBlock::MatrixColorFilterData306*c8dee2aaSAndroid Build Coastguard Worker MatrixColorFilterData(const float matrix[20], bool inHSLA, bool clamp) 307*c8dee2aaSAndroid Build Coastguard Worker : fMatrix(matrix[ 0], matrix[ 1], matrix[ 2], matrix[ 3], 308*c8dee2aaSAndroid Build Coastguard Worker matrix[ 5], matrix[ 6], matrix[ 7], matrix[ 8], 309*c8dee2aaSAndroid Build Coastguard Worker matrix[10], matrix[11], matrix[12], matrix[13], 310*c8dee2aaSAndroid Build Coastguard Worker matrix[15], matrix[16], matrix[17], matrix[18]) 311*c8dee2aaSAndroid Build Coastguard Worker , fTranslate{matrix[4], matrix[9], matrix[14], matrix[19]} 312*c8dee2aaSAndroid Build Coastguard Worker , fInHSLA(inHSLA) 313*c8dee2aaSAndroid Build Coastguard Worker , fClamp(clamp) { 314*c8dee2aaSAndroid Build Coastguard Worker } 315*c8dee2aaSAndroid Build Coastguard Worker 316*c8dee2aaSAndroid Build Coastguard Worker SkM44 fMatrix; 317*c8dee2aaSAndroid Build Coastguard Worker SkV4 fTranslate; 318*c8dee2aaSAndroid Build Coastguard Worker bool fInHSLA; 319*c8dee2aaSAndroid Build Coastguard Worker bool fClamp; 320*c8dee2aaSAndroid Build Coastguard Worker }; 321*c8dee2aaSAndroid Build Coastguard Worker 322*c8dee2aaSAndroid Build Coastguard Worker // The gatherer and matrixCFData should be null or non-null together 323*c8dee2aaSAndroid Build Coastguard Worker static void AddBlock(const KeyContext&, 324*c8dee2aaSAndroid Build Coastguard Worker PaintParamsKeyBuilder*, 325*c8dee2aaSAndroid Build Coastguard Worker PipelineDataGatherer*, 326*c8dee2aaSAndroid Build Coastguard Worker const MatrixColorFilterData&); 327*c8dee2aaSAndroid Build Coastguard Worker }; 328*c8dee2aaSAndroid Build Coastguard Worker 329*c8dee2aaSAndroid Build Coastguard Worker struct TableColorFilterBlock { 330*c8dee2aaSAndroid Build Coastguard Worker struct TableColorFilterData { TableColorFilterDataTableColorFilterBlock::TableColorFilterData331*c8dee2aaSAndroid Build Coastguard Worker TableColorFilterData(sk_sp<TextureProxy> proxy) : fTextureProxy(std::move(proxy)) {} 332*c8dee2aaSAndroid Build Coastguard Worker 333*c8dee2aaSAndroid Build Coastguard Worker sk_sp<TextureProxy> fTextureProxy; 334*c8dee2aaSAndroid Build Coastguard Worker }; 335*c8dee2aaSAndroid Build Coastguard Worker 336*c8dee2aaSAndroid Build Coastguard Worker static void AddBlock(const KeyContext&, 337*c8dee2aaSAndroid Build Coastguard Worker PaintParamsKeyBuilder*, 338*c8dee2aaSAndroid Build Coastguard Worker PipelineDataGatherer*, 339*c8dee2aaSAndroid Build Coastguard Worker const TableColorFilterData&); 340*c8dee2aaSAndroid Build Coastguard Worker }; 341*c8dee2aaSAndroid Build Coastguard Worker 342*c8dee2aaSAndroid Build Coastguard Worker struct ColorSpaceTransformBlock { 343*c8dee2aaSAndroid Build Coastguard Worker struct ColorSpaceTransformData { 344*c8dee2aaSAndroid Build Coastguard Worker ColorSpaceTransformData(const SkColorSpace* src, 345*c8dee2aaSAndroid Build Coastguard Worker SkAlphaType srcAT, 346*c8dee2aaSAndroid Build Coastguard Worker const SkColorSpace* dst, 347*c8dee2aaSAndroid Build Coastguard Worker SkAlphaType dstAT); ColorSpaceTransformDataColorSpaceTransformBlock::ColorSpaceTransformData348*c8dee2aaSAndroid Build Coastguard Worker ColorSpaceTransformData(const SkColorSpaceXformSteps& steps) { fSteps = steps; } ColorSpaceTransformDataColorSpaceTransformBlock::ColorSpaceTransformData349*c8dee2aaSAndroid Build Coastguard Worker ColorSpaceTransformData(ReadSwizzle swizzle) : fReadSwizzle(swizzle) { 350*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fSteps.flags.mask() == 0); // By default, the colorspace should have no effect 351*c8dee2aaSAndroid Build Coastguard Worker } 352*c8dee2aaSAndroid Build Coastguard Worker SkColorSpaceXformSteps fSteps; 353*c8dee2aaSAndroid Build Coastguard Worker ReadSwizzle fReadSwizzle = ReadSwizzle::kRGBA; 354*c8dee2aaSAndroid Build Coastguard Worker }; 355*c8dee2aaSAndroid Build Coastguard Worker 356*c8dee2aaSAndroid Build Coastguard Worker static void AddBlock(const KeyContext&, 357*c8dee2aaSAndroid Build Coastguard Worker PaintParamsKeyBuilder*, 358*c8dee2aaSAndroid Build Coastguard Worker PipelineDataGatherer*, 359*c8dee2aaSAndroid Build Coastguard Worker const ColorSpaceTransformData&); 360*c8dee2aaSAndroid Build Coastguard Worker }; 361*c8dee2aaSAndroid Build Coastguard Worker 362*c8dee2aaSAndroid Build Coastguard Worker struct CircularRRectClipBlock { 363*c8dee2aaSAndroid Build Coastguard Worker struct CircularRRectClipData { CircularRRectClipDataCircularRRectClipBlock::CircularRRectClipData364*c8dee2aaSAndroid Build Coastguard Worker CircularRRectClipData(SkRect rect, 365*c8dee2aaSAndroid Build Coastguard Worker SkPoint radiusPlusHalf, 366*c8dee2aaSAndroid Build Coastguard Worker SkRect edgeSelect) : 367*c8dee2aaSAndroid Build Coastguard Worker fRect(rect), 368*c8dee2aaSAndroid Build Coastguard Worker fRadiusPlusHalf(radiusPlusHalf), 369*c8dee2aaSAndroid Build Coastguard Worker fEdgeSelect(edgeSelect) {} 370*c8dee2aaSAndroid Build Coastguard Worker SkRect fRect; // bounds, outset by 0.5 371*c8dee2aaSAndroid Build Coastguard Worker SkPoint fRadiusPlusHalf; // abs() of .x is radius+0.5, if < 0 indicates inverse fill 372*c8dee2aaSAndroid Build Coastguard Worker // .y is 1/(radius+0.5) 373*c8dee2aaSAndroid Build Coastguard Worker SkRect fEdgeSelect; // 1 indicates a rounded corner on that side (LTRB), 0 otherwise 374*c8dee2aaSAndroid Build Coastguard Worker }; 375*c8dee2aaSAndroid Build Coastguard Worker 376*c8dee2aaSAndroid Build Coastguard Worker static void AddBlock(const KeyContext&, 377*c8dee2aaSAndroid Build Coastguard Worker PaintParamsKeyBuilder*, 378*c8dee2aaSAndroid Build Coastguard Worker PipelineDataGatherer*, 379*c8dee2aaSAndroid Build Coastguard Worker const CircularRRectClipData&); 380*c8dee2aaSAndroid Build Coastguard Worker }; 381*c8dee2aaSAndroid Build Coastguard Worker 382*c8dee2aaSAndroid Build Coastguard Worker struct PrimitiveColorBlock { 383*c8dee2aaSAndroid Build Coastguard Worker static void AddBlock(const KeyContext&, 384*c8dee2aaSAndroid Build Coastguard Worker PaintParamsKeyBuilder*, 385*c8dee2aaSAndroid Build Coastguard Worker PipelineDataGatherer*); 386*c8dee2aaSAndroid Build Coastguard Worker }; 387*c8dee2aaSAndroid Build Coastguard Worker 388*c8dee2aaSAndroid Build Coastguard Worker /** 389*c8dee2aaSAndroid Build Coastguard Worker * Blend mode color filters blend their input (as the dst color) with some given color (supplied 390*c8dee2aaSAndroid Build Coastguard Worker * via a uniform) as the src color. 391*c8dee2aaSAndroid Build Coastguard Worker */ 392*c8dee2aaSAndroid Build Coastguard Worker void AddBlendModeColorFilter(const KeyContext&, 393*c8dee2aaSAndroid Build Coastguard Worker PaintParamsKeyBuilder*, 394*c8dee2aaSAndroid Build Coastguard Worker PipelineDataGatherer*, 395*c8dee2aaSAndroid Build Coastguard Worker SkBlendMode, 396*c8dee2aaSAndroid Build Coastguard Worker const SkPMColor4f& srcColor); 397*c8dee2aaSAndroid Build Coastguard Worker 398*c8dee2aaSAndroid Build Coastguard Worker struct RuntimeEffectBlock { 399*c8dee2aaSAndroid Build Coastguard Worker struct ShaderData { 400*c8dee2aaSAndroid Build Coastguard Worker // This ctor is used during pre-compilation when we don't have enough information to 401*c8dee2aaSAndroid Build Coastguard Worker // extract uniform data. 402*c8dee2aaSAndroid Build Coastguard Worker ShaderData(sk_sp<const SkRuntimeEffect> effect); 403*c8dee2aaSAndroid Build Coastguard Worker 404*c8dee2aaSAndroid Build Coastguard Worker // This ctor is used when extracting information from PaintParams. 405*c8dee2aaSAndroid Build Coastguard Worker ShaderData(sk_sp<const SkRuntimeEffect> effect, 406*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const SkData> uniforms); 407*c8dee2aaSAndroid Build Coastguard Worker 408*c8dee2aaSAndroid Build Coastguard Worker bool operator==(const ShaderData& rhs) const; 409*c8dee2aaSAndroid Build Coastguard Worker bool operator!=(const ShaderData& rhs) const { return !(*this == rhs); } 410*c8dee2aaSAndroid Build Coastguard Worker 411*c8dee2aaSAndroid Build Coastguard Worker // Runtime shader data. 412*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const SkRuntimeEffect> fEffect; 413*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const SkData> fUniforms; 414*c8dee2aaSAndroid Build Coastguard Worker }; 415*c8dee2aaSAndroid Build Coastguard Worker 416*c8dee2aaSAndroid Build Coastguard Worker static void BeginBlock(const KeyContext&, 417*c8dee2aaSAndroid Build Coastguard Worker PaintParamsKeyBuilder*, 418*c8dee2aaSAndroid Build Coastguard Worker PipelineDataGatherer*, 419*c8dee2aaSAndroid Build Coastguard Worker const ShaderData&); 420*c8dee2aaSAndroid Build Coastguard Worker }; 421*c8dee2aaSAndroid Build Coastguard Worker 422*c8dee2aaSAndroid Build Coastguard Worker void AddToKey(const KeyContext&, 423*c8dee2aaSAndroid Build Coastguard Worker PaintParamsKeyBuilder*, 424*c8dee2aaSAndroid Build Coastguard Worker PipelineDataGatherer*, 425*c8dee2aaSAndroid Build Coastguard Worker const SkBlender*); 426*c8dee2aaSAndroid Build Coastguard Worker 427*c8dee2aaSAndroid Build Coastguard Worker /** 428*c8dee2aaSAndroid Build Coastguard Worker * Add implementation details, for the specified backend, of this SkColorFilter to the 429*c8dee2aaSAndroid Build Coastguard Worker * provided key. 430*c8dee2aaSAndroid Build Coastguard Worker * 431*c8dee2aaSAndroid Build Coastguard Worker * @param keyContext backend context for key creation 432*c8dee2aaSAndroid Build Coastguard Worker * @param builder builder for creating the key for this SkShader 433*c8dee2aaSAndroid Build Coastguard Worker * @param gatherer if non-null, storage for this colorFilter's data 434*c8dee2aaSAndroid Build Coastguard Worker * @param filter This function is a no-op if filter is null. 435*c8dee2aaSAndroid Build Coastguard Worker */ 436*c8dee2aaSAndroid Build Coastguard Worker void AddToKey(const KeyContext& keyContext, 437*c8dee2aaSAndroid Build Coastguard Worker PaintParamsKeyBuilder* builder, 438*c8dee2aaSAndroid Build Coastguard Worker PipelineDataGatherer* gatherer, 439*c8dee2aaSAndroid Build Coastguard Worker const SkColorFilter* filter); 440*c8dee2aaSAndroid Build Coastguard Worker 441*c8dee2aaSAndroid Build Coastguard Worker /** 442*c8dee2aaSAndroid Build Coastguard Worker * Add implementation details, for the specified backend, of this SkShader to the 443*c8dee2aaSAndroid Build Coastguard Worker * provided key. 444*c8dee2aaSAndroid Build Coastguard Worker * 445*c8dee2aaSAndroid Build Coastguard Worker * @param keyContext backend context for key creation 446*c8dee2aaSAndroid Build Coastguard Worker * @param builder builder for creating the key for this SkShader 447*c8dee2aaSAndroid Build Coastguard Worker * @param gatherer if non-null, storage for this colorFilter's data 448*c8dee2aaSAndroid Build Coastguard Worker * @param shader This function is a no-op if shader is null. 449*c8dee2aaSAndroid Build Coastguard Worker */ 450*c8dee2aaSAndroid Build Coastguard Worker void AddToKey(const KeyContext& keyContext, 451*c8dee2aaSAndroid Build Coastguard Worker PaintParamsKeyBuilder* builder, 452*c8dee2aaSAndroid Build Coastguard Worker PipelineDataGatherer* gatherer, 453*c8dee2aaSAndroid Build Coastguard Worker const SkShader* shader); 454*c8dee2aaSAndroid Build Coastguard Worker 455*c8dee2aaSAndroid Build Coastguard Worker // TODO(b/330864257) These visitation functions are redundant with AddToKey, except that they are 456*c8dee2aaSAndroid Build Coastguard Worker // executed in the Device::drawGeometry() stack frame, whereas the keys are currently deferred until 457*c8dee2aaSAndroid Build Coastguard Worker // DrawPass::Make. Image use needs to be detected in the draw frame to split tasks to match client 458*c8dee2aaSAndroid Build Coastguard Worker // actions. Once paint keys are extracted in the draw frame, this can go away entirely. 459*c8dee2aaSAndroid Build Coastguard Worker void NotifyImagesInUse(Recorder*, DrawContext*, const SkBlender*); 460*c8dee2aaSAndroid Build Coastguard Worker void NotifyImagesInUse(Recorder*, DrawContext*, const SkColorFilter*); 461*c8dee2aaSAndroid Build Coastguard Worker void NotifyImagesInUse(Recorder*, DrawContext*, const SkShader*); 462*c8dee2aaSAndroid Build Coastguard Worker 463*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite 464*c8dee2aaSAndroid Build Coastguard Worker 465*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_KeyHelpers_DEFINED 466