xref: /aosp_15_r20/external/skia/src/gpu/graphite/BuiltInCodeSnippetID.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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