blob: 70824062d2ecbdc5e261f31382fe4ab2153d17c6 [file]
/*
* Copyright 2022 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef skgpu_graphite_BuiltInCodeSnippetID_DEFINED
#define skgpu_graphite_BuiltInCodeSnippetID_DEFINED
#include "include/core/SkTypes.h"
namespace skgpu::graphite {
enum class BuiltInCodeSnippetID : uint32_t {
// This isn't just a signal for a failure during paintparams key creation. It also actually
// implements the default behavior for an erroneous draw. That said, Device discards draws that
// have a PaintParamsKey referencing an error ID so this behavior is mostly academic.
kError,
// Snippet that passes through prior stage output
kPriorOutput,
// SkShader code snippets
kSolidColorShader,
kRGBPaintColor,
kAlphaOnlyPaintColor,
kLinearGradientShader4,
kLinearGradientShader8,
kLinearGradientShaderTexture,
kLinearGradientShaderBuffer,
kRadialGradientShader4,
kRadialGradientShader8,
kRadialGradientShaderTexture,
kRadialGradientShaderBuffer,
kSweepGradientShader4,
kSweepGradientShader8,
kSweepGradientShaderTexture,
kSweepGradientShaderBuffer,
kConicalGradientShader4,
kConicalGradientShader8,
kConicalGradientShaderTexture,
kConicalGradientShaderBuffer,
kLocalMatrixShader,
kLocalMatrixShaderPersp,
kImageShader,
kImageShaderClamp,
kCubicImageShader,
kHWImageShader,
kYUVImageShader,
kCubicYUVImageShader,
kHWYUVImageShader,
kHWYUVNoSwizzleImageShader,
kCoordNormalizeShader,
kCoordClampShader,
kDitherShader,
kPerlinNoiseShader,
// SkColorFilter code snippets
kMatrixColorFilter,
kHSLMatrixColorFilter,
kTableColorFilter,
kGaussianColorFilter,
// Color space, read swizzle, and alpha type conversions w/ specializations - these are built by
// composing together specialized or generalized child snippets that handle these stages:
// 1. Initial alpha (unpremul, force-opaque, identity, or alpha-swizzle)
// 2. Linear transfer function
// 3. Gamut transform
// 4. Encoding transfer function
// 5. Post alpha handling (premul, identity)
// Initial alpha stages:
// - Alpha-only images are always specialized to _AlphaOnly because the rest of the pipeline
// is already specialized on blending in color. It is never combined with other stages.
// - The generic _PreAlpha can be specialized into _Unpremul, _ForceOpaque, or eliding the
// stage (for no-op) when desired.
// - These stages apply the alpha swizzle of the texture's read swizzle.
kCSXform_AlphaOnly, // handles alpha-swizzle (no other CSXform steps combine with it)
kCSXform_PreAlpha, // handles unpremul, force-opaque, no-op
kCSXform_Unpremul, // specialization always performing unpremul
kCSXform_ForceOpaque, // specialization always forcing to opaque
// Transfer function stages:
// - sRGB and PQ can be used for both linear and encode stages; HLG is used to convert to
// linear, and HLGInv is used to encode.
// - Identity transfer functions can either be elided or encoded into sRGB coefficients.
kCSXform_TransferFn, // handles all stages by branching
kCSXform_sRGB, // sRGB linear and encoding
kCSXform_PQ, // PQ linear and encoding
kCSXform_HLG, // linear stage only, supports optional post-ootf parameters
kCSXform_HLGInv, // encoding stage only, supports optional pre-ootf parameters
// Gamut transform stage:
// - When specializing, can be elided entirely; otherwise can be set to the identity
// - This matrix is also used to apply any RGB swizzle of the texture's read swizzle
kCSXform_Gamut,
// Post alpha stages:
kCSXform_PostAlpha, // handles premul and no-op
kCSXform_Premul, // specialization always performing premul
// Emits special variable holding the primitiveColor emitted by a RenderStep
kPrimitiveColor,
// Analytic clip for circular roundrect and AA rect shapes
kAnalyticClip,
// Analytic plus atlas-based clip
kAnalyticAndAtlasClip,
kCompose, // compose 2 children together: outer_1(inner_0(...))
kBlendCompose, // compose 3 children together: outer_2(inner_0(...), inner_1(...))
// SkBlender code snippets
kPorterDuffBlender, // Can handle all GetPorterDuffBlendConstants() modes
kHSLCBlender, // kHue,kSaturation,kLuminosity, and kColor modes
// NOTE: We could offer an in-shader consolidation for overlay+hardlight, and darken+lighten
// but for now, those will map to the FixedBlends.
// Fixed blend modes hard code a specific blend function into the shader tree. This can be
// valuable when an internal effect is known to always do a certain blend and we want to
// benefit from inlining constants. It is also important for being able to convert the final
// blend of the SkPaint into fixed function HW blending, where each HW blend is part of the
// pipeline key, so using a known blend mode ID ensures the PaintParamsKey are also different.
//
// Lastly, for advanced blend modes that require complex shader calculations, we assume they
// are used rarely and with intent (i.e. unlikely to share a common shader tree with another
// advanced blend if we were to add branching). This keeps the amount of reachable SkSL that
// must be compiled for a given pipeline with advanced blends to a minimum.
//
// NOTE: Pipeline code generation depends on the fixed-function code IDs being contiguous and be
// defined last in the enum. They are ordered to match SkBlendMode such that:
// (id - kFirstFixedBlend) == SkBlendMode).
kFixedBlend_Clear,
kFixedBlend_Src,
kFixedBlend_Dst,
kFixedBlend_SrcOver,
kFixedBlend_DstOver,
kFixedBlend_SrcIn,
kFixedBlend_DstIn,
kFixedBlend_SrcOut,
kFixedBlend_DstOut,
kFixedBlend_SrcATop,
kFixedBlend_DstATop,
kFixedBlend_Xor,
kFixedBlend_Plus, // NOTE: Adds shader clamping, not compatible with GetPorterDuffConstants
kFixedBlend_Modulate, // NOTE: Uses color channels, incompatible with kPorterDuffBlender
kFixedBlend_Screen, // ""
// With support for advanced blend modes, these can also be handled by HW for the final blend.
kFixedBlend_Overlay,
kFixedBlend_Darken,
kFixedBlend_Lighten,
kFixedBlend_ColorDodge,
kFixedBlend_ColorBurn,
kFixedBlend_HardLight,
kFixedBlend_SoftLight,
kFixedBlend_Difference,
kFixedBlend_Exclusion,
kFixedBlend_Multiply,
kFixedBlend_Hue,
kFixedBlend_Saturation,
kFixedBlend_Color,
kFixedBlend_Luminosity,
kFirstFixedBlend = kFixedBlend_Clear,
kLast = kFixedBlend_Luminosity
};
static constexpr int kBuiltInCodeSnippetIDCount = static_cast<int>(BuiltInCodeSnippetID::kLast)+1;
static constexpr int kFixedBlendIDOffset =
static_cast<int>(BuiltInCodeSnippetID::kFirstFixedBlend);
static_assert(BuiltInCodeSnippetID::kLast == BuiltInCodeSnippetID::kFixedBlend_Luminosity);
} // namespace skgpu::graphite
#endif // skgpu_graphite_BuiltInCodeSnippetID_DEFINED