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_BuiltInCodeSnippetID_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_BuiltInCodeSnippetID_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 12*c8dee2aaSAndroid Build Coastguard Worker 13*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite { 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker enum class BuiltInCodeSnippetID : int32_t { 16*c8dee2aaSAndroid Build Coastguard Worker // This isn't just a signal for a failure during paintparams key creation. It also actually 17*c8dee2aaSAndroid Build Coastguard Worker // implements the default behavior for an erroneous draw. Currently it just draws solid 18*c8dee2aaSAndroid Build Coastguard Worker // magenta. 19*c8dee2aaSAndroid Build Coastguard Worker kError, 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker // Snippet that passes through prior stage output 22*c8dee2aaSAndroid Build Coastguard Worker kPriorOutput, 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker // SkShader code snippets 25*c8dee2aaSAndroid Build Coastguard Worker kSolidColorShader, 26*c8dee2aaSAndroid Build Coastguard Worker kRGBPaintColor, 27*c8dee2aaSAndroid Build Coastguard Worker kAlphaOnlyPaintColor, 28*c8dee2aaSAndroid Build Coastguard Worker kLinearGradientShader4, 29*c8dee2aaSAndroid Build Coastguard Worker kLinearGradientShader8, 30*c8dee2aaSAndroid Build Coastguard Worker kLinearGradientShaderTexture, 31*c8dee2aaSAndroid Build Coastguard Worker kLinearGradientShaderBuffer, 32*c8dee2aaSAndroid Build Coastguard Worker kRadialGradientShader4, 33*c8dee2aaSAndroid Build Coastguard Worker kRadialGradientShader8, 34*c8dee2aaSAndroid Build Coastguard Worker kRadialGradientShaderTexture, 35*c8dee2aaSAndroid Build Coastguard Worker kRadialGradientShaderBuffer, 36*c8dee2aaSAndroid Build Coastguard Worker kSweepGradientShader4, 37*c8dee2aaSAndroid Build Coastguard Worker kSweepGradientShader8, 38*c8dee2aaSAndroid Build Coastguard Worker kSweepGradientShaderTexture, 39*c8dee2aaSAndroid Build Coastguard Worker kSweepGradientShaderBuffer, 40*c8dee2aaSAndroid Build Coastguard Worker kConicalGradientShader4, 41*c8dee2aaSAndroid Build Coastguard Worker kConicalGradientShader8, 42*c8dee2aaSAndroid Build Coastguard Worker kConicalGradientShaderTexture, 43*c8dee2aaSAndroid Build Coastguard Worker kConicalGradientShaderBuffer, 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker kLocalMatrixShader, 46*c8dee2aaSAndroid Build Coastguard Worker kLocalMatrixShaderPersp, 47*c8dee2aaSAndroid Build Coastguard Worker kImageShader, 48*c8dee2aaSAndroid Build Coastguard Worker kCubicImageShader, 49*c8dee2aaSAndroid Build Coastguard Worker kHWImageShader, 50*c8dee2aaSAndroid Build Coastguard Worker kYUVImageShader, 51*c8dee2aaSAndroid Build Coastguard Worker kCubicYUVImageShader, 52*c8dee2aaSAndroid Build Coastguard Worker kHWYUVImageShader, 53*c8dee2aaSAndroid Build Coastguard Worker kHWYUVNoSwizzleImageShader, 54*c8dee2aaSAndroid Build Coastguard Worker kCoordClampShader, 55*c8dee2aaSAndroid Build Coastguard Worker kDitherShader, 56*c8dee2aaSAndroid Build Coastguard Worker kPerlinNoiseShader, 57*c8dee2aaSAndroid Build Coastguard Worker 58*c8dee2aaSAndroid Build Coastguard Worker // SkColorFilter code snippets 59*c8dee2aaSAndroid Build Coastguard Worker kMatrixColorFilter, 60*c8dee2aaSAndroid Build Coastguard Worker kTableColorFilter, 61*c8dee2aaSAndroid Build Coastguard Worker kGaussianColorFilter, 62*c8dee2aaSAndroid Build Coastguard Worker kColorSpaceXformColorFilter, 63*c8dee2aaSAndroid Build Coastguard Worker kPremulAlphaColorFilter, 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker // Emits special variable holding the primitiveColor emitted by a RenderStep 66*c8dee2aaSAndroid Build Coastguard Worker kPrimitiveColor, 67*c8dee2aaSAndroid Build Coastguard Worker 68*c8dee2aaSAndroid Build Coastguard Worker // Analytic clip for circular roundrect and AA rect shapes 69*c8dee2aaSAndroid Build Coastguard Worker kCircularRRectClip, 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker kCompose, // compose 2 children together: outer_1(inner_0(...)) 72*c8dee2aaSAndroid Build Coastguard Worker kBlendCompose, // compose 3 children together: outer_2(inner_0(...), inner_1(...)) 73*c8dee2aaSAndroid Build Coastguard Worker 74*c8dee2aaSAndroid Build Coastguard Worker // SkBlender code snippets 75*c8dee2aaSAndroid Build Coastguard Worker kPorterDuffBlender, // Can handle all GetPorterDuffBlendConstants() modes 76*c8dee2aaSAndroid Build Coastguard Worker kHSLCBlender, // kHue,kSaturation,kLuminosity, and kColor modes 77*c8dee2aaSAndroid Build Coastguard Worker // NOTE: We could offer an in-shader consolidation for overlay+hardlight, and darken+lighten 78*c8dee2aaSAndroid Build Coastguard Worker // but for now, those will map to the FixedBlends. 79*c8dee2aaSAndroid Build Coastguard Worker 80*c8dee2aaSAndroid Build Coastguard Worker // Fixed blend modes hard code a specific blend function into the shader tree. This can be 81*c8dee2aaSAndroid Build Coastguard Worker // valuable when an internal effect is known to always do a certain blend and we want to 82*c8dee2aaSAndroid Build Coastguard Worker // benefit from inlining constants. It is also important for being able to convert the final 83*c8dee2aaSAndroid Build Coastguard Worker // blend of the SkPaint into fixed function HW blending, where each HW blend is part of the 84*c8dee2aaSAndroid Build Coastguard Worker // pipeline key, so using a known blend mode ID ensures the PaintParamsKey are also different. 85*c8dee2aaSAndroid Build Coastguard Worker // 86*c8dee2aaSAndroid Build Coastguard Worker // Lastly, for advanced blend modes that require complex shader calculations, we assume they 87*c8dee2aaSAndroid Build Coastguard Worker // are used rarely and with intent (i.e. unlikely to share a common shader tree with another 88*c8dee2aaSAndroid Build Coastguard Worker // advanced blend if we were to add branching). This keeps the amount of reachable SkSL that 89*c8dee2aaSAndroid Build Coastguard Worker // must be compiled for a given pipeline with advanced blends to a minimum. 90*c8dee2aaSAndroid Build Coastguard Worker // 91*c8dee2aaSAndroid Build Coastguard Worker // NOTE: Pipeline code generation depends on the fixed-function code IDs being contiguous and be 92*c8dee2aaSAndroid Build Coastguard Worker // defined last in the enum. They are ordered to match SkBlendMode such that: 93*c8dee2aaSAndroid Build Coastguard Worker // (id - kFirstFixedBlend) == SkBlendMode). 94*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_Clear, 95*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_Src, 96*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_Dst, 97*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_SrcOver, 98*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_DstOver, 99*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_SrcIn, 100*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_DstIn, 101*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_SrcOut, 102*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_DstOut, 103*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_SrcATop, 104*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_DstATop, 105*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_Xor, 106*c8dee2aaSAndroid Build Coastguard Worker 107*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_Plus, // NOTE: Adds shader clamping, not compatible with GetPorterDuffConstants 108*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_Modulate, // NOTE: Uses color channels, incompatible with kPorterDuffBlender 109*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_Screen, // "" 110*c8dee2aaSAndroid Build Coastguard Worker 111*c8dee2aaSAndroid Build Coastguard Worker // With support for advanced blend modes, these can also be handled by HW for the final blend. 112*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_Overlay, 113*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_Darken, 114*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_Lighten, 115*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_ColorDodge, 116*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_ColorBurn, 117*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_HardLight, 118*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_SoftLight, 119*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_Difference, 120*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_Exclusion, 121*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_Multiply, 122*c8dee2aaSAndroid Build Coastguard Worker 123*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_Hue, 124*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_Saturation, 125*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_Color, 126*c8dee2aaSAndroid Build Coastguard Worker kFixedBlend_Luminosity, 127*c8dee2aaSAndroid Build Coastguard Worker 128*c8dee2aaSAndroid Build Coastguard Worker kFirstFixedBlend = kFixedBlend_Clear, 129*c8dee2aaSAndroid Build Coastguard Worker kLast = kFixedBlend_Luminosity 130*c8dee2aaSAndroid Build Coastguard Worker }; 131*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kBuiltInCodeSnippetIDCount = static_cast<int>(BuiltInCodeSnippetID::kLast)+1; 132*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kFixedBlendIDOffset = 133*c8dee2aaSAndroid Build Coastguard Worker static_cast<int>(BuiltInCodeSnippetID::kFirstFixedBlend); 134*c8dee2aaSAndroid Build Coastguard Worker 135*c8dee2aaSAndroid Build Coastguard Worker static_assert(BuiltInCodeSnippetID::kLast == BuiltInCodeSnippetID::kFixedBlend_Luminosity); 136*c8dee2aaSAndroid Build Coastguard Worker 137*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite 138*c8dee2aaSAndroid Build Coastguard Worker 139*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_BuiltInCodeSnippetID_DEFINED 140