|  | // Copyright 2023 The Tint Authors. | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  |  | 
|  | //////////////////////////////////////////////////////////////////////////////// | 
|  | // File generated by tools/src/cmd/gen | 
|  | // using the template: | 
|  | //   src/tint/lang/core/builtin/function.h.tmpl | 
|  | // | 
|  | // Do not modify this file directly | 
|  | //////////////////////////////////////////////////////////////////////////////// | 
|  |  | 
|  | #ifndef SRC_TINT_LANG_CORE_BUILTIN_FUNCTION_H_ | 
|  | #define SRC_TINT_LANG_CORE_BUILTIN_FUNCTION_H_ | 
|  |  | 
|  | #include <string> | 
|  |  | 
|  | #include "src/tint/utils/text/string_stream.h" | 
|  |  | 
|  | // \cond DO_NOT_DOCUMENT | 
|  | namespace tint::builtin { | 
|  |  | 
|  | /// Enumerator of all builtin functions | 
|  | enum class Function { | 
|  | kNone = -1, | 
|  | kAbs, | 
|  | kAcos, | 
|  | kAcosh, | 
|  | kAll, | 
|  | kAny, | 
|  | kArrayLength, | 
|  | kAsin, | 
|  | kAsinh, | 
|  | kAtan, | 
|  | kAtan2, | 
|  | kAtanh, | 
|  | kCeil, | 
|  | kClamp, | 
|  | kCos, | 
|  | kCosh, | 
|  | kCountLeadingZeros, | 
|  | kCountOneBits, | 
|  | kCountTrailingZeros, | 
|  | kCross, | 
|  | kDegrees, | 
|  | kDeterminant, | 
|  | kDistance, | 
|  | kDot, | 
|  | kDot4I8Packed, | 
|  | kDot4U8Packed, | 
|  | kDpdx, | 
|  | kDpdxCoarse, | 
|  | kDpdxFine, | 
|  | kDpdy, | 
|  | kDpdyCoarse, | 
|  | kDpdyFine, | 
|  | kExp, | 
|  | kExp2, | 
|  | kExtractBits, | 
|  | kFaceForward, | 
|  | kFirstLeadingBit, | 
|  | kFirstTrailingBit, | 
|  | kFloor, | 
|  | kFma, | 
|  | kFract, | 
|  | kFrexp, | 
|  | kFwidth, | 
|  | kFwidthCoarse, | 
|  | kFwidthFine, | 
|  | kInsertBits, | 
|  | kInverseSqrt, | 
|  | kLdexp, | 
|  | kLength, | 
|  | kLog, | 
|  | kLog2, | 
|  | kMax, | 
|  | kMin, | 
|  | kMix, | 
|  | kModf, | 
|  | kNormalize, | 
|  | kPack2X16Float, | 
|  | kPack2X16Snorm, | 
|  | kPack2X16Unorm, | 
|  | kPack4X8Snorm, | 
|  | kPack4X8Unorm, | 
|  | kPow, | 
|  | kQuantizeToF16, | 
|  | kRadians, | 
|  | kReflect, | 
|  | kRefract, | 
|  | kReverseBits, | 
|  | kRound, | 
|  | kSaturate, | 
|  | kSelect, | 
|  | kSign, | 
|  | kSin, | 
|  | kSinh, | 
|  | kSmoothstep, | 
|  | kSqrt, | 
|  | kStep, | 
|  | kStorageBarrier, | 
|  | kTan, | 
|  | kTanh, | 
|  | kTranspose, | 
|  | kTrunc, | 
|  | kUnpack2X16Float, | 
|  | kUnpack2X16Snorm, | 
|  | kUnpack2X16Unorm, | 
|  | kUnpack4X8Snorm, | 
|  | kUnpack4X8Unorm, | 
|  | kWorkgroupBarrier, | 
|  | kWorkgroupUniformLoad, | 
|  | kTextureDimensions, | 
|  | kTextureGather, | 
|  | kTextureGatherCompare, | 
|  | kTextureNumLayers, | 
|  | kTextureNumLevels, | 
|  | kTextureNumSamples, | 
|  | kTextureSample, | 
|  | kTextureSampleBias, | 
|  | kTextureSampleCompare, | 
|  | kTextureSampleCompareLevel, | 
|  | kTextureSampleGrad, | 
|  | kTextureSampleLevel, | 
|  | kTextureSampleBaseClampToEdge, | 
|  | kTextureStore, | 
|  | kTextureLoad, | 
|  | kAtomicLoad, | 
|  | kAtomicStore, | 
|  | kAtomicAdd, | 
|  | kAtomicSub, | 
|  | kAtomicMax, | 
|  | kAtomicMin, | 
|  | kAtomicAnd, | 
|  | kAtomicOr, | 
|  | kAtomicXor, | 
|  | kAtomicExchange, | 
|  | kAtomicCompareExchangeWeak, | 
|  | kTintMaterialize, | 
|  | }; | 
|  |  | 
|  | /// Matches the Function by name | 
|  | /// @param name the builtin name to parse | 
|  | /// @returns the parsed Function, or Function::kNone if `name` did not | 
|  | /// match any builtin function. | 
|  | Function ParseFunction(std::string_view name); | 
|  |  | 
|  | /// @returns the name of the builtin function type. The spelling, including | 
|  | /// case, matches the name in the WGSL spec. | 
|  | const char* str(Function i); | 
|  |  | 
|  | /// Emits the name of the builtin function type. The spelling, including case, | 
|  | /// matches the name in the WGSL spec. | 
|  | utils::StringStream& operator<<(utils::StringStream& out, Function i); | 
|  |  | 
|  | /// All builtin functions | 
|  | constexpr Function kFunctions[] = { | 
|  | Function::kAbs, | 
|  | Function::kAcos, | 
|  | Function::kAcosh, | 
|  | Function::kAll, | 
|  | Function::kAny, | 
|  | Function::kArrayLength, | 
|  | Function::kAsin, | 
|  | Function::kAsinh, | 
|  | Function::kAtan, | 
|  | Function::kAtan2, | 
|  | Function::kAtanh, | 
|  | Function::kCeil, | 
|  | Function::kClamp, | 
|  | Function::kCos, | 
|  | Function::kCosh, | 
|  | Function::kCountLeadingZeros, | 
|  | Function::kCountOneBits, | 
|  | Function::kCountTrailingZeros, | 
|  | Function::kCross, | 
|  | Function::kDegrees, | 
|  | Function::kDeterminant, | 
|  | Function::kDistance, | 
|  | Function::kDot, | 
|  | Function::kDot4I8Packed, | 
|  | Function::kDot4U8Packed, | 
|  | Function::kDpdx, | 
|  | Function::kDpdxCoarse, | 
|  | Function::kDpdxFine, | 
|  | Function::kDpdy, | 
|  | Function::kDpdyCoarse, | 
|  | Function::kDpdyFine, | 
|  | Function::kExp, | 
|  | Function::kExp2, | 
|  | Function::kExtractBits, | 
|  | Function::kFaceForward, | 
|  | Function::kFirstLeadingBit, | 
|  | Function::kFirstTrailingBit, | 
|  | Function::kFloor, | 
|  | Function::kFma, | 
|  | Function::kFract, | 
|  | Function::kFrexp, | 
|  | Function::kFwidth, | 
|  | Function::kFwidthCoarse, | 
|  | Function::kFwidthFine, | 
|  | Function::kInsertBits, | 
|  | Function::kInverseSqrt, | 
|  | Function::kLdexp, | 
|  | Function::kLength, | 
|  | Function::kLog, | 
|  | Function::kLog2, | 
|  | Function::kMax, | 
|  | Function::kMin, | 
|  | Function::kMix, | 
|  | Function::kModf, | 
|  | Function::kNormalize, | 
|  | Function::kPack2X16Float, | 
|  | Function::kPack2X16Snorm, | 
|  | Function::kPack2X16Unorm, | 
|  | Function::kPack4X8Snorm, | 
|  | Function::kPack4X8Unorm, | 
|  | Function::kPow, | 
|  | Function::kQuantizeToF16, | 
|  | Function::kRadians, | 
|  | Function::kReflect, | 
|  | Function::kRefract, | 
|  | Function::kReverseBits, | 
|  | Function::kRound, | 
|  | Function::kSaturate, | 
|  | Function::kSelect, | 
|  | Function::kSign, | 
|  | Function::kSin, | 
|  | Function::kSinh, | 
|  | Function::kSmoothstep, | 
|  | Function::kSqrt, | 
|  | Function::kStep, | 
|  | Function::kStorageBarrier, | 
|  | Function::kTan, | 
|  | Function::kTanh, | 
|  | Function::kTranspose, | 
|  | Function::kTrunc, | 
|  | Function::kUnpack2X16Float, | 
|  | Function::kUnpack2X16Snorm, | 
|  | Function::kUnpack2X16Unorm, | 
|  | Function::kUnpack4X8Snorm, | 
|  | Function::kUnpack4X8Unorm, | 
|  | Function::kWorkgroupBarrier, | 
|  | Function::kWorkgroupUniformLoad, | 
|  | Function::kTextureDimensions, | 
|  | Function::kTextureGather, | 
|  | Function::kTextureGatherCompare, | 
|  | Function::kTextureNumLayers, | 
|  | Function::kTextureNumLevels, | 
|  | Function::kTextureNumSamples, | 
|  | Function::kTextureSample, | 
|  | Function::kTextureSampleBias, | 
|  | Function::kTextureSampleCompare, | 
|  | Function::kTextureSampleCompareLevel, | 
|  | Function::kTextureSampleGrad, | 
|  | Function::kTextureSampleLevel, | 
|  | Function::kTextureSampleBaseClampToEdge, | 
|  | Function::kTextureStore, | 
|  | Function::kTextureLoad, | 
|  | Function::kAtomicLoad, | 
|  | Function::kAtomicStore, | 
|  | Function::kAtomicAdd, | 
|  | Function::kAtomicSub, | 
|  | Function::kAtomicMax, | 
|  | Function::kAtomicMin, | 
|  | Function::kAtomicAnd, | 
|  | Function::kAtomicOr, | 
|  | Function::kAtomicXor, | 
|  | Function::kAtomicExchange, | 
|  | Function::kAtomicCompareExchangeWeak, | 
|  | Function::kTintMaterialize, | 
|  | }; | 
|  |  | 
|  | /// All builtin function names | 
|  | constexpr const char* kFunctionStrings[] = { | 
|  | "abs", | 
|  | "acos", | 
|  | "acosh", | 
|  | "all", | 
|  | "any", | 
|  | "arrayLength", | 
|  | "asin", | 
|  | "asinh", | 
|  | "atan", | 
|  | "atan2", | 
|  | "atanh", | 
|  | "ceil", | 
|  | "clamp", | 
|  | "cos", | 
|  | "cosh", | 
|  | "countLeadingZeros", | 
|  | "countOneBits", | 
|  | "countTrailingZeros", | 
|  | "cross", | 
|  | "degrees", | 
|  | "determinant", | 
|  | "distance", | 
|  | "dot", | 
|  | "dot4I8Packed", | 
|  | "dot4U8Packed", | 
|  | "dpdx", | 
|  | "dpdxCoarse", | 
|  | "dpdxFine", | 
|  | "dpdy", | 
|  | "dpdyCoarse", | 
|  | "dpdyFine", | 
|  | "exp", | 
|  | "exp2", | 
|  | "extractBits", | 
|  | "faceForward", | 
|  | "firstLeadingBit", | 
|  | "firstTrailingBit", | 
|  | "floor", | 
|  | "fma", | 
|  | "fract", | 
|  | "frexp", | 
|  | "fwidth", | 
|  | "fwidthCoarse", | 
|  | "fwidthFine", | 
|  | "insertBits", | 
|  | "inverseSqrt", | 
|  | "ldexp", | 
|  | "length", | 
|  | "log", | 
|  | "log2", | 
|  | "max", | 
|  | "min", | 
|  | "mix", | 
|  | "modf", | 
|  | "normalize", | 
|  | "pack2x16float", | 
|  | "pack2x16snorm", | 
|  | "pack2x16unorm", | 
|  | "pack4x8snorm", | 
|  | "pack4x8unorm", | 
|  | "pow", | 
|  | "quantizeToF16", | 
|  | "radians", | 
|  | "reflect", | 
|  | "refract", | 
|  | "reverseBits", | 
|  | "round", | 
|  | "saturate", | 
|  | "select", | 
|  | "sign", | 
|  | "sin", | 
|  | "sinh", | 
|  | "smoothstep", | 
|  | "sqrt", | 
|  | "step", | 
|  | "storageBarrier", | 
|  | "tan", | 
|  | "tanh", | 
|  | "transpose", | 
|  | "trunc", | 
|  | "unpack2x16float", | 
|  | "unpack2x16snorm", | 
|  | "unpack2x16unorm", | 
|  | "unpack4x8snorm", | 
|  | "unpack4x8unorm", | 
|  | "workgroupBarrier", | 
|  | "workgroupUniformLoad", | 
|  | "textureDimensions", | 
|  | "textureGather", | 
|  | "textureGatherCompare", | 
|  | "textureNumLayers", | 
|  | "textureNumLevels", | 
|  | "textureNumSamples", | 
|  | "textureSample", | 
|  | "textureSampleBias", | 
|  | "textureSampleCompare", | 
|  | "textureSampleCompareLevel", | 
|  | "textureSampleGrad", | 
|  | "textureSampleLevel", | 
|  | "textureSampleBaseClampToEdge", | 
|  | "textureStore", | 
|  | "textureLoad", | 
|  | "atomicLoad", | 
|  | "atomicStore", | 
|  | "atomicAdd", | 
|  | "atomicSub", | 
|  | "atomicMax", | 
|  | "atomicMin", | 
|  | "atomicAnd", | 
|  | "atomicOr", | 
|  | "atomicXor", | 
|  | "atomicExchange", | 
|  | "atomicCompareExchangeWeak", | 
|  | "_tint_materialize", | 
|  | }; | 
|  |  | 
|  | /// Determines if the given `f` is a coarse derivative. | 
|  | /// @param f the builtin type | 
|  | /// @returns true if the given derivative is coarse. | 
|  | bool IsCoarseDerivativeBuiltin(Function f); | 
|  |  | 
|  | /// Determines if the given `f` is a fine derivative. | 
|  | /// @param f the builtin type | 
|  | /// @returns true if the given derivative is fine. | 
|  | bool IsFineDerivativeBuiltin(Function f); | 
|  |  | 
|  | /// Determine if the given `f` is a derivative builtin. | 
|  | /// @param f the builtin type | 
|  | /// @returns true if the given `f` is a derivative builtin | 
|  | bool IsDerivativeBuiltin(Function f); | 
|  |  | 
|  | /// Determines if the given `f` is a texture operation builtin. | 
|  | /// @param f the builtin type | 
|  | /// @returns true if the given `f` is a texture operation builtin | 
|  | bool IsTextureBuiltin(Function f); | 
|  |  | 
|  | /// Determines if the given `f` is an image query builtin. | 
|  | /// @param f the builtin type | 
|  | /// @returns true if the given `f` is an image query builtin | 
|  | bool IsImageQueryBuiltin(Function f); | 
|  |  | 
|  | /// Determines if the given `f` is a data packing builtin. | 
|  | /// @param f the builtin type | 
|  | /// @returns true if the given `f` is a data packing builtin | 
|  | bool IsDataPackingBuiltin(Function f); | 
|  |  | 
|  | /// Determines if the given `f` is a data unpacking builtin. | 
|  | /// @param f the builtin type | 
|  | /// @returns true if the given `f` is a data unpacking builtin | 
|  | bool IsDataUnpackingBuiltin(Function f); | 
|  |  | 
|  | /// Determines if the given `f` is a barrier builtin. | 
|  | /// @param f the builtin type | 
|  | /// @returns true if the given `f` is a barrier builtin | 
|  | bool IsBarrierBuiltin(Function f); | 
|  |  | 
|  | /// Determines if the given `f` is an atomic builtin. | 
|  | /// @param f the builtin type | 
|  | /// @returns true if the given `f` is an atomic builtin | 
|  | bool IsAtomicBuiltin(Function f); | 
|  |  | 
|  | /// Determines if the given `f` is a DP4a builtin. | 
|  | /// @param f the builtin type | 
|  | /// @returns true if the given `f` is a DP4a builtin | 
|  | bool IsDP4aBuiltin(Function f); | 
|  |  | 
|  | /// Determines if the given `f` may have side-effects (i.e. writes to at least one of its inputs) | 
|  | /// @returns true if intrinsic may have side-effects | 
|  | bool HasSideEffects(Function f); | 
|  |  | 
|  | }  // namespace tint::builtin | 
|  | // \endcond | 
|  |  | 
|  | #endif  // SRC_TINT_LANG_CORE_BUILTIN_FUNCTION_H_ |