diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2020-03-06 17:15:58 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-03-06 17:15:58 -0500 |
| commit | cdee13466080b737ed18c148e36af75898285ed6 (patch) | |
| tree | 55fba3a3236732907537c93929baf1e0cf298605 /source | |
| parent | b94a12b91086ea004d9b78fa8a14fd4726af9e76 (diff) | |
Remove generated header files (#1264)
* Update slang-binaries to verison with SPIR-V version support.
* Support vec and matrix Wave intrinsics on vk.
Added wave-vector.slang test
Add wave-diverge.slang test
Add support for more wave intrinsics to vk.
* Test out Wave intrinsic support for matrices.
* Remove matrix glsl intrinsics -> not available.
Fix some typo.
* Remove generated slang generated headers.
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/core.meta.slang.h | 1864 | ||||
| -rw-r--r-- | source/slang/glsl.meta.slang.h | 202 | ||||
| -rw-r--r-- | source/slang/hlsl.meta.slang.h | 3140 |
3 files changed, 0 insertions, 5206 deletions
diff --git a/source/slang/core.meta.slang.h b/source/slang/core.meta.slang.h deleted file mode 100644 index f793d0c1b..000000000 --- a/source/slang/core.meta.slang.h +++ /dev/null @@ -1,1864 +0,0 @@ -SLANG_RAW("// Slang `core` library\n") -SLANG_RAW("\n") -SLANG_RAW("// Aliases for base types\n") -SLANG_RAW("typedef half float16_t;\n") -SLANG_RAW("typedef float float32_t;\n") -SLANG_RAW("typedef double float64_t;\n") -SLANG_RAW("\n") -SLANG_RAW("typedef int int32_t;\n") -SLANG_RAW("typedef uint uint32_t;\n") -SLANG_RAW("\n") -SLANG_RAW("\n") -SLANG_RAW("// Modifier for variables that must resolve to compile-time constants\n") -SLANG_RAW("// as part of translation.\n") -SLANG_RAW("syntax constexpr : ConstExprModifier;\n") -SLANG_RAW("\n") -SLANG_RAW("// Modifier for variables that should have writes be made\n") -SLANG_RAW("// visible at the global-memory scope\n") -SLANG_RAW("syntax globallycoherent : GloballyCoherentModifier;\n") -SLANG_RAW("\n") -SLANG_RAW("// A type that can be used as an operand for builtins\n") -SLANG_RAW("interface __BuiltinType {}\n") -SLANG_RAW("\n") -SLANG_RAW("// A type that can be used for arithmetic operations\n") -SLANG_RAW("interface __BuiltinArithmeticType : __BuiltinType\n") -SLANG_RAW("{\n") -SLANG_RAW(" /// Initialize from a 32-bit signed integer value.\n") -SLANG_RAW(" __init(int value);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW(" /// A type that can be used for logical/bitwsie operations\n") -SLANG_RAW("interface __BuiltinLogicalType : __BuiltinType {}\n") -SLANG_RAW("\n") -SLANG_RAW("// A type that logically has a sign (positive/negative/zero)\n") -SLANG_RAW("interface __BuiltinSignedArithmeticType : __BuiltinArithmeticType {}\n") -SLANG_RAW("\n") -SLANG_RAW("// A type that can represent integers\n") -SLANG_RAW("interface __BuiltinIntegerType : __BuiltinArithmeticType\n") -SLANG_RAW("{}\n") -SLANG_RAW("\n") -SLANG_RAW("// A type that can represent non-integers\n") -SLANG_RAW("interface __BuiltinRealType : __BuiltinSignedArithmeticType {}\n") -SLANG_RAW("\n") -SLANG_RAW("// A type that uses a floating-point representation\n") -SLANG_RAW("interface __BuiltinFloatingPointType : __BuiltinRealType\n") -SLANG_RAW("{\n") -SLANG_RAW(" /// Initialize from a 32-bit floating-point value.\n") -SLANG_RAW(" __init(float value);\n") -SLANG_RAW("\n") -SLANG_RAW(" /// Get the value of the mathematical constant pi in this type.\n") -SLANG_RAW(" static This getPi();\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// A type resulting from an `enum` declaration.\n") -SLANG_RAW("__magic_type(EnumTypeType)\n") -SLANG_RAW("interface __EnumType\n") -SLANG_RAW("{\n") -SLANG_RAW(" // The type of tags for this `enum`\n") -SLANG_RAW(" //\n") -SLANG_RAW(" // Note: using `__Tag` instead of `Tag` to avoid any\n") -SLANG_RAW(" // conflict if a user had an `enum` case called `Tag`\n") -SLANG_RAW(" associatedtype __Tag : __BuiltinIntegerType;\n") -SLANG_RAW("};\n") -SLANG_RAW("\n") -SLANG_RAW("// Use an extension to declare that every `enum` type\n") -SLANG_RAW("// inherits an initializer based on the tag type.\n") -SLANG_RAW("//\n") -SLANG_RAW("// Note: there is an important and subtle point here.\n") -SLANG_RAW("// If we declared these initializers inside the `interface`\n") -SLANG_RAW("// declaration above, then they would implicitly be\n") -SLANG_RAW("// *requirements* of the `__EnumType` interface, and any\n") -SLANG_RAW("// type that declares conformance to it would need to\n") -SLANG_RAW("// provide implementations. That would put the onus on\n") -SLANG_RAW("// the semantic checker to synthesize such initializers\n") -SLANG_RAW("// when conforming an `enum` type to `__EnumType` (just\n") -SLANG_RAW("// as it currently synthesizes the `__Tag` requirement.\n") -SLANG_RAW("// Putting the declaration in an `extension` makes them\n") -SLANG_RAW("// concrete declerations rather than interface requirements.\n") -SLANG_RAW("// (Admittedly, they are \"concrete\" declarations with\n") -SLANG_RAW("// no bodies, because currently all initializers are\n") -SLANG_RAW("// assumed to be intrinsics).\n") -SLANG_RAW("//\n") -SLANG_RAW("// TODO: It might be more accurate to express this as:\n") -SLANG_RAW("//\n") -SLANG_RAW("// __generic<T:__EnumType> extension T { ... }\n") -SLANG_RAW("//\n") -SLANG_RAW("// That alternative would express an extension of every\n") -SLANG_RAW("// type that conforms to `__EnumType`, rather than an\n") -SLANG_RAW("// extension of `__EnumType` itself. The distinction\n") -SLANG_RAW("// is subtle, and unfortunately not one the Slang type\n") -SLANG_RAW("// checker is equiped to handle right now. For now we\n") -SLANG_RAW("// will stick with the syntax that actually works, even\n") -SLANG_RAW("// if it might be the less technically correct one.\n") -SLANG_RAW("//\n") -SLANG_RAW("//\n") -SLANG_RAW("extension __EnumType\n") -SLANG_RAW("{\n") -SLANG_RAW(" // TODO: this should be a single initializer using\n") -SLANG_RAW(" // the `__Tag` associated type from the `__EnumType`\n") -SLANG_RAW(" // interface, but right now the scoping for looking\n") -SLANG_RAW(" // up that type isn't working right.\n") -SLANG_RAW(" //\n") -SLANG_RAW(" __init(int value);\n") -SLANG_RAW(" __init(uint value);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// A type resulting from an `enum` declaration\n") -SLANG_RAW("// with the `[flags]` attribute.\n") -SLANG_RAW("interface __FlagsEnumType : __EnumType\n") -SLANG_RAW("{\n") -SLANG_RAW("};\n") -SLANG_RAW("\n") -SLANG_RAW("// The \"comma operator\" is effectively just a generic function that returns its second\n") -SLANG_RAW("// argument. The left-to-right evaluation order guaranteed by Slang then ensures that\n") -SLANG_RAW("// `left` is evaluated before `right`.\n") -SLANG_RAW("//\n") -SLANG_RAW("__generic<T,U> __intrinsic_op(") -SLANG_SPLICE(kCompoundIntrinsicOp_Sequence -) -SLANG_RAW(") U operator,(T left, U right);\n") -SLANG_RAW("\n") -SLANG_RAW("// The ternary `?:` operator does not short-circuit in HLSL, and Slang continues to\n") -SLANG_RAW("// follow that definition, so that this operator is effectively just an ordinary\n") -SLANG_RAW("// function, rather than a special-case piece of syntax.\n") -SLANG_RAW("//\n") -SLANG_RAW("__generic<T> __intrinsic_op(select) T operator?:(bool condition, T ifTrue, T ifFalse);\n") -SLANG_RAW("__generic<T, let N : int> __intrinsic_op(select) vector<T,N> operator?:(vector<bool,N> condition, vector<T,N> ifTrue, vector<T,N> ifFalse);\n") -SLANG_RAW("\n") - -// We are going to use code generation to produce the -// declarations for all of our base types. -static const int kBaseTypeCount = sizeof(kBaseTypes) / sizeof(kBaseTypes[0]); -for (int tt = 0; tt < kBaseTypeCount; ++tt) -{ -SLANG_RAW("#line 131 \"core.meta.slang\"") -SLANG_RAW("\n") -SLANG_RAW("\n") -SLANG_RAW("__builtin_type(") -SLANG_SPLICE(int(kBaseTypes[tt].tag) -) -SLANG_RAW(")\n") -SLANG_RAW("struct ") -SLANG_SPLICE(kBaseTypes[tt].name -) -SLANG_RAW("\n") -SLANG_RAW(" : __BuiltinType\n") -SLANG_RAW("\n") - - switch (kBaseTypes[tt].tag) - { - case BaseType::Half: - case BaseType::Float: - case BaseType::Double: -SLANG_RAW("#line 143 \"core.meta.slang\"") -SLANG_RAW("\n") -SLANG_RAW(" , __BuiltinFloatingPointType\n") -SLANG_RAW(" , __BuiltinRealType\n") -SLANG_RAW(" , __BuiltinSignedArithmeticType\n") -SLANG_RAW(" , __BuiltinArithmeticType\n") - - break; - case BaseType::Int8: - case BaseType::Int16: - case BaseType::Int: - case BaseType::Int64: -SLANG_RAW("#line 154 \"core.meta.slang\"") -SLANG_RAW("\n") -SLANG_RAW(" , __BuiltinSignedArithmeticType\n") - - ; // fall through to: - case BaseType::UInt8: - case BaseType::UInt16: - case BaseType::UInt: - case BaseType::UInt64: -SLANG_RAW("#line 162 \"core.meta.slang\"") -SLANG_RAW("\n") -SLANG_RAW(" , __BuiltinArithmeticType\n") -SLANG_RAW(" , __BuiltinIntegerType\n") - - ; // fall through to: - case BaseType::Bool: -SLANG_RAW("#line 168 \"core.meta.slang\"") -SLANG_RAW("\n") -SLANG_RAW(" , __BuiltinLogicalType\n") - - break; - - default: - break; - } -SLANG_RAW("#line 176 \"core.meta.slang\"") -SLANG_RAW("\n") -SLANG_RAW("{\n") -SLANG_RAW("\n") - - // Declare initializers to convert from various other types - for (int ss = 0; ss < kBaseTypeCount; ++ss) - { - // Don't allow conversion from `void` - if (kBaseTypes[ss].tag == BaseType::Void) - continue; - - // We need to emit a modifier so that the semantic-checking - // layer will know it can use these operations for implicit - // conversion. - ConversionCost conversionCost = getBaseTypeConversionCost( - kBaseTypes[tt], - kBaseTypes[ss]); -SLANG_RAW("#line 193 \"core.meta.slang\"") -SLANG_RAW("\n") -SLANG_RAW("\n") -SLANG_RAW(" __implicit_conversion(") -SLANG_SPLICE(conversionCost -) -SLANG_RAW(")\n") -SLANG_RAW(" __init(") -SLANG_SPLICE(kBaseTypes[ss].name -) -SLANG_RAW(" value);\n") -SLANG_RAW("\n") - - } - - // If this is a basic integer type, then define explicit - // initializers that take a value of an `enum` type. - // - // TODO: This should actually be restricted, so that this - // only applies `where T.__Tag == Self`, but we don't have - // the needed features in our type system to implement - // that constraint right now. - // - switch (kBaseTypes[tt].tag) - { - // TODO: should this cover the full gamut of integer types? - case BaseType::Int: - case BaseType::UInt: -SLANG_RAW("#line 214 \"core.meta.slang\"") -SLANG_RAW("\n") -SLANG_RAW(" __generic<T:__EnumType>\n") -SLANG_RAW(" __init(T value);\n") - - break; - - default: - break; - } - - // If this is a floating-point type, then we need to - // define the basic `getPi()` function that is used - // to implement generic versions of `degrees()` and - // `radians()`. - // - switch (kBaseTypes[tt].tag) - { - default: - break; - case BaseType::Half: - case BaseType::Float: - case BaseType::Double: -SLANG_RAW("#line 236 \"core.meta.slang\"") -SLANG_RAW("\n") -SLANG_RAW(" static ") -SLANG_SPLICE(kBaseTypes[tt].name -) -SLANG_RAW(" getPi() { return ") -SLANG_SPLICE(kBaseTypes[tt].name -) -SLANG_RAW("(3.14159265358979323846264338328); }\n") - - break; - } -SLANG_RAW("#line 241 \"core.meta.slang\"") -SLANG_RAW("\n") -SLANG_RAW("\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") - -} - -// Declare built-in pointer type -// (eventually we can have the traditional syntax sugar for this) -SLANG_RAW("#line 250 \"core.meta.slang\"") -SLANG_RAW("\n") -SLANG_RAW("__generic<T>\n") -SLANG_RAW("__magic_type(PtrType)\n") -SLANG_RAW("__intrinsic_type(") -SLANG_SPLICE(kIROp_PtrType -) -SLANG_RAW(")\n") -SLANG_RAW("struct Ptr\n") -SLANG_RAW("{};\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T>\n") -SLANG_RAW("__magic_type(OutType)\n") -SLANG_RAW("__intrinsic_type(") -SLANG_SPLICE(kIROp_OutType -) -SLANG_RAW(")\n") -SLANG_RAW("struct Out\n") -SLANG_RAW("{};\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T>\n") -SLANG_RAW("__magic_type(InOutType)\n") -SLANG_RAW("__intrinsic_type(") -SLANG_SPLICE(kIROp_InOutType -) -SLANG_RAW(")\n") -SLANG_RAW("struct InOut\n") -SLANG_RAW("{};\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T>\n") -SLANG_RAW("__magic_type(RefType)\n") -SLANG_RAW("__intrinsic_type(") -SLANG_SPLICE(kIROp_RefType -) -SLANG_RAW(")\n") -SLANG_RAW("struct Ref\n") -SLANG_RAW("{};\n") -SLANG_RAW("\n") -SLANG_RAW("__magic_type(StringType)\n") -SLANG_RAW("__intrinsic_type(") -SLANG_SPLICE(kIROp_StringType -) -SLANG_RAW(")\n") -SLANG_RAW("struct String\n") -SLANG_RAW("{};\n") -SLANG_RAW("\n") -SLANG_RAW(" /// An `N` component vector with elements of type `T`.\n") -SLANG_RAW("__generic<T = float, let N : int = 4>\n") -SLANG_RAW("__magic_type(Vector)\n") -SLANG_RAW("struct vector\n") -SLANG_RAW("{\n") -SLANG_RAW(" /// The element type of the vector\n") -SLANG_RAW(" typedef T Element;\n") -SLANG_RAW("\n") -SLANG_RAW("\n") -SLANG_RAW(" /// Initialize a vector where all elements have the same scalar `value`.\n") -SLANG_RAW(" __implicit_conversion(") -SLANG_SPLICE(kConversionCost_ScalarToVector -) -SLANG_RAW(")\n") -SLANG_RAW(" __intrinsic_op(") -SLANG_SPLICE(kIROp_constructVectorFromScalar -) -SLANG_RAW(")\n") -SLANG_RAW(" __init(T value);\n") -SLANG_RAW("\n") -SLANG_RAW(" /// Initialize a vector from a value of the same type\n") -SLANG_RAW(" // TODO: we should revise semantic checking so this kind of \"identity\" conversion is not required\n") -SLANG_RAW(" __init(vector<T,N> value);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW(" /// A matrix with `R` rows and `C` columns, with elements of type `T`.\n") -SLANG_RAW("__generic<T = float, let R : int = 4, let C : int = 4>\n") -SLANG_RAW("__magic_type(Matrix)\n") -SLANG_RAW("struct matrix\n") -SLANG_RAW("{\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") - -static const struct { - char const* name; - char const* glslPrefix; -} kTypes[] = -{ - {"half", "f16"}, - {"float", ""}, - {"double", "d"}, - - {"float16_t", "f16"}, - {"float32_t", "f32"}, - {"float64_t", "f64"}, - - {"int8_t", "i8"}, - {"int16_t", "i16"}, - {"int32_t", "i32"}, - {"int", "i"}, - {"int64_t", "i64"}, - - {"uint8_t", "u8"}, - {"uint16_t", "u16"}, - {"uint32_t", "u32"}, - {"uint", "u"}, - {"uint64_t", "u64"}, - - {"bool", "b"}, -}; -static const int kTypeCount = sizeof(kTypes) / sizeof(kTypes[0]); - -for (int tt = 0; tt < kTypeCount; ++tt) -{ - // Declare HLSL vector types - for (int ii = 1; ii <= 4; ++ii) - { - sb << "typedef vector<" << kTypes[tt].name << "," << ii << "> " << kTypes[tt].name << ii << ";\n"; - } - - // Declare HLSL matrix types - for (int rr = 2; rr <= 4; ++rr) - for (int cc = 2; cc <= 4; ++cc) - { - sb << "typedef matrix<" << kTypes[tt].name << "," << rr << "," << cc << "> " << kTypes[tt].name << rr << "x" << cc << ";\n"; - } -} - -// Declare additional built-in generic types -SLANG_RAW("#line 353 \"core.meta.slang\"") -SLANG_RAW("\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T>\n") -SLANG_RAW("__intrinsic_type(") -SLANG_SPLICE(kIROp_ConstantBufferType -) -SLANG_RAW(")\n") -SLANG_RAW("__magic_type(ConstantBuffer)\n") -SLANG_RAW("struct ConstantBuffer {}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T>\n") -SLANG_RAW("__intrinsic_type(") -SLANG_SPLICE(kIROp_TextureBufferType -) -SLANG_RAW(")\n") -SLANG_RAW("__magic_type(TextureBuffer)\n") -SLANG_RAW("struct TextureBuffer {}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T>\n") -SLANG_RAW("__intrinsic_type(") -SLANG_SPLICE(kIROp_ParameterBlockType -) -SLANG_RAW(")\n") -SLANG_RAW("__magic_type(ParameterBlockType)\n") -SLANG_RAW("struct ParameterBlock {}\n") -SLANG_RAW("\n") - - -static const char* kComponentNames[]{ "x", "y", "z", "w" }; -static const char* kVectorNames[]{ "", "x", "xy", "xyz", "xyzw" }; - -// Need to add constructors to the types above -for (int N = 2; N <= 4; ++N) -{ - sb << "__generic<T> __extension vector<T, " << N << ">\n{\n"; - - // initialize from N scalars - sb << "__init("; - for (int ii = 0; ii < N; ++ii) - { - if (ii != 0) sb << ", "; - sb << "T " << kComponentNames[ii]; - } - sb << ");\n"; - - // Initialize from an M-vector and then scalars - for (int M = 2; M < N; ++M) - { - sb << "__init(vector<T," << M << "> " << kVectorNames[M]; - for (int ii = M; ii < N; ++ii) - { - sb << ", T " << kComponentNames[ii]; - } - sb << ");\n"; - } - - // Initialize from two vectors, of size M and N-M - for(int M = 2; M <= (N-2); ++M) - { - int K = N - M; - SLANG_ASSERT(K >= 2); - - sb << "__init(vector<T," << M << "> " << kVectorNames[M]; - sb << ", vector<T," << K << "> "; - for (int ii = 0; ii < K; ++ii) - { - // The component names for the second parameter - // must start at `M`, so that we get signatures like: - // - // __init(float2 xy, float2 zw) - // - sb << kComponentNames[M + ii]; - } - sb << ");\n"; - } - - sb << "}\n"; -} - -// The above extension was generic in the *type* of the vector, -// but explicit in the *size*. We will now declare an extension -// for each builtin type that is generic in the size. -// -for (int tt = 0; tt < kBaseTypeCount; ++tt) -{ - if(kBaseTypes[tt].tag == BaseType::Void) continue; - - sb << "__generic<let N : int> __extension vector<" - << kBaseTypes[tt].name << ",N>\n{\n"; - - for (int ff = 0; ff < kBaseTypeCount; ++ff) - { - if(kBaseTypes[ff].tag == BaseType::Void) continue; - - - if( tt != ff ) - { - auto cost = getBaseTypeConversionCost( - kBaseTypes[tt], - kBaseTypes[ff]); - - // Implicit conversion from a vector of the same - // size, but different element type. - sb << " __implicit_conversion(" << cost << ")\n"; - sb << " __init(vector<" << kBaseTypes[ff].name << ",N> value);\n"; - - // Constructor to make a vector from a scalar of another type. - cost += kConversionCost_ScalarToVector; - sb << " __implicit_conversion(" << cost << ")\n"; - sb << " __init(" << kBaseTypes[ff].name << " value);\n"; - } - } - - sb << "}\n"; -} - -for( int R = 2; R <= 4; ++R ) -for( int C = 2; C <= 4; ++C ) -{ - sb << "__generic<T> __extension matrix<T, " << R << "," << C << ">\n{\n"; - - // initialize from R*C scalars - sb << "__init("; - for( int ii = 0; ii < R; ++ii ) - for( int jj = 0; jj < C; ++jj ) - { - if ((ii+jj) != 0) sb << ", "; - sb << "T m" << ii << jj; - } - sb << ");\n"; - - // Initialize from R C-vectors - sb << "__init("; - for (int ii = 0; ii < R; ++ii) - { - if(ii != 0) sb << ", "; - sb << "vector<T," << C << "> row" << ii; - } - sb << ");\n"; - - - // initialize from another matrix of the same size - // - // TODO(tfoley): See comment about how this overlaps - // with implicit conversion, in the `vector` case above - sb << "__generic<U> __init(matrix<U," << R << ", " << C << ">);\n"; - - // initialize from a matrix of larger size - for(int rr = R; rr <= 4; ++rr) - for( int cc = C; cc <= 4; ++cc ) - { - if(rr == R && cc == C) continue; - sb << "__init(matrix<T," << rr << "," << cc << "> value);\n"; - } - - sb << "}\n"; -} -SLANG_RAW("#line 501 \"core.meta.slang\"") -SLANG_RAW("\n") -SLANG_RAW("\n") -SLANG_RAW("\n") -SLANG_RAW(" /// Sampling state for filtered texture fetches.\n") -SLANG_RAW("__magic_type(SamplerState, ") -SLANG_SPLICE(int(SamplerStateFlavor::SamplerState) -) -SLANG_RAW(")\n") -SLANG_RAW("__intrinsic_type(") -SLANG_SPLICE(kIROp_SamplerStateType -) -SLANG_RAW(")\n") -SLANG_RAW("struct SamplerState\n") -SLANG_RAW("{\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW(" /// Sampling state for filtered texture fetches that include a comparison operation before filtering.\n") -SLANG_RAW("__magic_type(SamplerState, ") -SLANG_SPLICE(int(SamplerStateFlavor::SamplerComparisonState) -) -SLANG_RAW(")\n") -SLANG_RAW("__intrinsic_type(") -SLANG_SPLICE(kIROp_SamplerComparisonStateType -) -SLANG_RAW(")\n") -SLANG_RAW("struct SamplerComparisonState\n") -SLANG_RAW("{\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") - - -static const struct { - char const* name; - TextureFlavor::Shape baseShape; - int coordCount; -} kBaseTextureTypes[] = { - { "Texture1D", TextureFlavor::Shape::Shape1D, 1 }, - { "Texture2D", TextureFlavor::Shape::Shape2D, 2 }, - { "Texture3D", TextureFlavor::Shape::Shape3D, 3 }, - { "TextureCube", TextureFlavor::Shape::ShapeCube, 3 }, -}; -static const int kBaseTextureTypeCount = sizeof(kBaseTextureTypes) / sizeof(kBaseTextureTypes[0]); - - -static const struct { - char const* name; - SlangResourceAccess access; -} kBaseTextureAccessLevels[] = { - { "", SLANG_RESOURCE_ACCESS_READ }, - { "RW", SLANG_RESOURCE_ACCESS_READ_WRITE }, - { "RasterizerOrdered", SLANG_RESOURCE_ACCESS_RASTER_ORDERED }, -}; -static const int kBaseTextureAccessLevelCount = sizeof(kBaseTextureAccessLevels) / sizeof(kBaseTextureAccessLevels[0]); - -// Declare the GLSL types here for compatibility... -// -// TODO: The stdlib should include a module that declares the GLSL types, to keep -// them separate... -for (int tt = 0; tt < kBaseTextureTypeCount; ++tt) -{ - char const* name = kBaseTextureTypes[tt].name; - TextureFlavor::Shape baseShape = kBaseTextureTypes[tt].baseShape; - - for (int isArray = 0; isArray < 2; ++isArray) - { - // Arrays of 3D textures aren't allowed - if (isArray && baseShape == TextureFlavor::Shape::Shape3D) continue; - - for (int isMultisample = 0; isMultisample < 2; ++isMultisample) - for (int accessLevel = 0; accessLevel < kBaseTextureAccessLevelCount; ++accessLevel) - { - auto access = kBaseTextureAccessLevels[accessLevel].access; - - // TODO: any constraints to enforce on what gets to be multisampled? - - unsigned flavor = baseShape; - if (isArray) flavor |= TextureFlavor::ArrayFlag; - if (isMultisample) flavor |= TextureFlavor::MultisampleFlag; -// if (isShadow) flavor |= TextureFlavor::ShadowFlag; - - flavor |= (access << 8); - - // emit a generic signature - // TODO: allow for multisample count to come in as well... - sb << "__generic<T = float4> "; - - sb << "__magic_type(TextureSampler," << int(flavor) << ")\n"; - sb << "__intrinsic_type(" << (kIROp_TextureSamplerType + (int(flavor) << kIROpMeta_OtherShift)) << ")\n"; - sb << "struct Sampler"; - sb << kBaseTextureAccessLevels[accessLevel].name; - sb << name; - if (isMultisample) sb << "MS"; - if (isArray) sb << "Array"; -// if (isShadow) sb << "Shadow"; - sb << "\n{\n"; - sb << "__specialized_for_target(glsl)\n"; - sb << "__init("; - sb << kBaseTextureAccessLevels[accessLevel].name; - sb << name; - if (isMultisample) sb << "MS"; - if (isArray) sb << "Array"; - sb << "<T> t, "; - sb << "SamplerState s);\n"; - sb << "};\n"; - - sb << "__specialized_for_target(glsl)\n"; - sb << "T texture<T>(Sampler"; - sb << kBaseTextureAccessLevels[accessLevel].name; - sb << name; - if (isMultisample) sb << "MS"; - if (isArray) sb << "Array"; - sb << "<T> t, float" << kBaseTextureTypes[tt].coordCount + isArray << " location);\n"; - } - } -} - -for (int tt = 0; tt < kBaseTextureTypeCount; ++tt) -{ - char const* name = kBaseTextureTypes[tt].name; - TextureFlavor::Shape baseShape = kBaseTextureTypes[tt].baseShape; - - for (int isArray = 0; isArray < 2; ++isArray) - { - // Arrays of 3D textures aren't allowed - if (isArray && baseShape == TextureFlavor::Shape::Shape3D) continue; - - for (int isMultisample = 0; isMultisample < 2; ++isMultisample) - for (int accessLevel = 0; accessLevel < kBaseTextureAccessLevelCount; ++accessLevel) - { - auto access = kBaseTextureAccessLevels[accessLevel].access; - - // TODO: any constraints to enforce on what gets to be multisampled? - - unsigned flavor = baseShape; - if (isArray) flavor |= TextureFlavor::ArrayFlag; - if (isMultisample) flavor |= TextureFlavor::MultisampleFlag; -// if (isShadow) flavor |= TextureFlavor::ShadowFlag; - - flavor |= (access << 8); - - // emit a generic signature - // TODO: allow for multisample count to come in as well... - sb << "__generic<T = float4> "; - - sb << "__magic_type(Texture," << int(flavor) << ")\n"; - sb << "__intrinsic_type(" << (kIROp_TextureType + (int(flavor) << kIROpMeta_OtherShift)) << ")\n"; - sb << "struct "; - sb << kBaseTextureAccessLevels[accessLevel].name; - sb << name; - if (isMultisample) sb << "MS"; - if (isArray) sb << "Array"; -// if (isShadow) sb << "Shadow"; - sb << "\n{"; - - if( !isMultisample ) - { - sb << "float CalculateLevelOfDetail(SamplerState s, "; - sb << "float" << kBaseTextureTypes[tt].coordCount << " location);\n"; - - sb << "float CalculateLevelOfDetailUnclamped(SamplerState s, "; - sb << "float" << kBaseTextureTypes[tt].coordCount << " location);\n"; - } - - // `GetDimensions` - - for(int isFloat = 0; isFloat < 2; ++isFloat) - for(int includeMipInfo = 0; includeMipInfo < 2; ++includeMipInfo) - { - { - sb << "__glsl_version(450)\n"; - sb << "__glsl_extension(GL_EXT_samplerless_texture_functions)"; - sb << "__target_intrinsic(glsl, \"("; - - int aa = 1; - String lodStr = ", 0"; - if (includeMipInfo) - { - int mipLevelArg = aa++; - lodStr = ", int($"; - lodStr.append(mipLevelArg); - lodStr.append(")"); - } - - String opStr = " = textureSize($0" + lodStr; - switch( access ) - { - case SLANG_RESOURCE_ACCESS_READ_WRITE: - case SLANG_RESOURCE_ACCESS_RASTER_ORDERED: - opStr = " = imageSize($0"; - break; - - default: - break; - } - - - int cc = 0; - switch(baseShape) - { - case TextureFlavor::Shape::Shape1D: - sb << "($" << aa++ << opStr << "))"; - cc = 1; - break; - - case TextureFlavor::Shape::Shape2D: - case TextureFlavor::Shape::ShapeCube: - sb << "($" << aa++ << opStr << ").x)"; - sb << ", ($" << aa++ << opStr << ").y)"; - cc = 2; - break; - - case TextureFlavor::Shape::Shape3D: - sb << "($" << aa++ << opStr << ").x)"; - sb << ", ($" << aa++ << opStr << ").y)"; - sb << ", ($" << aa++ << opStr << ").z)"; - cc = 3; - break; - - default: - SLANG_UNEXPECTED("unhandled resource shape"); - break; - } - - if(isArray) - { - sb << ", ($" << aa++ << opStr << ")." << kComponentNames[cc] << ")"; - } - - if(isMultisample) - { - sb << ", ($" << aa++ << " = textureSamples($0))"; - } - - if (includeMipInfo) - { - sb << ", ($" << aa++ << " = textureQueryLevels($0))"; - } - - - sb << ")\")\n"; - } - - char const* t = isFloat ? "out float " : "out uint "; - - sb << "void GetDimensions("; - if(includeMipInfo) - sb << "uint mipLevel, "; - - switch(baseShape) - { - case TextureFlavor::Shape::Shape1D: - sb << t << "width"; - break; - - case TextureFlavor::Shape::Shape2D: - case TextureFlavor::Shape::ShapeCube: - sb << t << "width,"; - sb << t << "height"; - break; - - case TextureFlavor::Shape::Shape3D: - sb << t << "width,"; - sb << t << "height,"; - sb << t << "depth"; - break; - - default: - assert(!"unexpected"); - break; - } - - if(isArray) - { - sb << ", " << t << "elements"; - } - - if(isMultisample) - { - sb << ", " << t << "sampleCount"; - } - - if(includeMipInfo) - sb << ", " << t << "numberOfLevels"; - - sb << ");\n"; - } - - // `GetSamplePosition()` - if( isMultisample ) - { - sb << "float2 GetSamplePosition(int s);\n"; - } - - // `Load()` - - if( kBaseTextureTypes[tt].coordCount + isArray < 4 ) - { - // The `Load()` operation on an ordinary `Texture2D` takes - // an `int3` for the location, where `.xy` holds the texel - // coordinates, and `.z` holds the mip level to use. - // - // The third coordinate for mip level is absent in - // `Texure2DMS.Load()` and `RWTexture2D.Load`. This pattern - // is repreated for all the other texture shapes. - // - bool needsMipLevel = !isMultisample && (access == SLANG_RESOURCE_ACCESS_READ); - - int loadCoordCount = kBaseTextureTypes[tt].coordCount + isArray + (needsMipLevel?1:0); - - char const* glslFuncName = (access == SLANG_RESOURCE_ACCESS_READ) ? "texelFetch" : "imageLoad"; - - // When translating to GLSL, we need to break apart the `location` argument. - // - // TODO: this should realy be handled by having this member actually get lowered! - static const char* kGLSLLoadCoordsSwizzle[] = { "", "", "x", "xy", "xyz", "xyzw" }; - static const char* kGLSLLoadLODSwizzle[] = { "", "", "y", "z", "w", "error" }; - - // TODO: The GLSL translations here only handle the read-only texture - // cases (stuff that lowers to `texture*` in GLSL) and not the stuff - // that lowers to `image*`. - // - // At some point it may make sense to separate the read-only and - // `RW`/`RasterizerOrdered` cases here rather than try to share code. - - if (isMultisample) - { - sb << "__glsl_extension(GL_EXT_samplerless_texture_functions)"; - sb << "__target_intrinsic(glsl, \"$c" << glslFuncName << "($0, $1, $2)$z\")\n"; - } - else - { - sb << "__glsl_extension(GL_EXT_samplerless_texture_functions)"; - sb << "__target_intrinsic(glsl, \"$c" << glslFuncName << "($0, "; - if( needsMipLevel ) - { - sb << "($1)." << kGLSLLoadCoordsSwizzle[loadCoordCount] << ", ($1)." << kGLSLLoadLODSwizzle[loadCoordCount]; - } - else - { - sb << "$1"; - } - sb << ")$z\")\n"; - - } - - // CUDA - if (isMultisample) - { - } - else - { - if (access == SLANG_RESOURCE_ACCESS_READ_WRITE) - { - const int coordCount = kBaseTextureTypes[tt].coordCount; - const int vecCount = coordCount + int(isArray); - - if( baseShape != TextureFlavor::Shape::ShapeCube ) - { - sb << "__target_intrinsic(cuda, \"surf" << coordCount << "D"; - if (isArray) - { - sb << "Layered"; - } - sb << "read"; - sb << "<$T0>($0"; - for (int i = 0; i < coordCount; ++i) - { - sb << ", ($1)"; - if (vecCount > 1) - { - sb << '.' << char(i + 'x'); - } - } - if (isArray) - { - sb << ", int(($1)." << char(coordCount + 'x') << ")"; - } - sb << ", SLANG_CUDA_BOUNDARY_MODE)\")\n"; - } - else - { - sb << "__target_intrinsic(cuda, \"surfCubemap"; - if (isArray) - { - sb << "Layered"; - } - sb << "read"; - sb << "<$T0>($0, ($1).x, ($1).y, ($1).z"; - if (isArray) - { - sb << ", int(($1).w)"; - } - sb << ", SLANG_CUDA_BOUNDARY_MODE)\")\n"; - } - } - else if (access == SLANG_RESOURCE_ACCESS_READ) - { - // We can allow this on Texture1D - if( baseShape == TextureFlavor::Shape::Shape1D && isArray == false) - { - sb << "__target_intrinsic(cuda, \"tex1Dfetch<$T0>($0, ($1).x)\")\n"; - } - } - } - - sb << "T Load("; - sb << "int" << loadCoordCount << " location"; - if(isMultisample) - { - sb << ", int sampleIndex"; - } - sb << ");\n"; - - // GLSL - if (isMultisample) - { - sb << "__glsl_extension(GL_EXT_samplerless_texture_functions)"; - sb << "__target_intrinsic(glsl, \"$c" << glslFuncName << "($0, $0, $1, $2)$z\")\n"; - } - else - { - sb << "__glsl_extension(GL_EXT_samplerless_texture_functions)"; - sb << "__target_intrinsic(glsl, \"$c" << glslFuncName << "($0, "; - if( needsMipLevel ) - { - sb << "($1)." << kGLSLLoadCoordsSwizzle[loadCoordCount] << ", ($1)." << kGLSLLoadLODSwizzle[loadCoordCount]; - } - else - { - sb << "$1, 0"; - } - sb << ", $2)$z\")\n"; - } - - - - sb << "T Load("; - sb << "int" << loadCoordCount << " location"; - if(isMultisample) - { - sb << ", int sampleIndex"; - } - sb << ", constexpr int" << kBaseTextureTypes[tt].coordCount << " offset"; - sb << ");\n"; - - - sb << "T Load("; - sb << "int" << loadCoordCount << " location"; - if(isMultisample) - { - sb << ", int sampleIndex"; - } - sb << ", constexpr int" << kBaseTextureTypes[tt].coordCount << " offset"; - sb << ", out uint status"; - sb << ");\n"; - } - - if(baseShape != TextureFlavor::Shape::ShapeCube) - { - int N = kBaseTextureTypes[tt].coordCount + isArray; - - char const* uintNs[] = { "", "uint", "uint2", "uint3", "uint4" }; - char const* ivecNs[] = { "", "int", "ivec2", "ivec3", "ivec4" }; - - auto uintN = uintNs[N]; - auto ivecN = ivecNs[N]; - - // subscript operator - sb << "__subscript(" << uintN << " location) -> T {\n"; - - // !!!!!!!!!!!!!!!!!!!! get !!!!!!!!!!!!!!!!!!!!!!! - - // GLSL/SPIR-V distinguished sampled vs. non-sampled images - { - switch( access ) - { - case SLANG_RESOURCE_ACCESS_NONE: - case SLANG_RESOURCE_ACCESS_READ: - sb << "__glsl_extension(GL_EXT_samplerless_texture_functions)"; - sb << "__target_intrinsic(glsl, \"$ctexelFetch($0, " << ivecN << "($1)"; - if( !isMultisample ) - { - sb << ", 0"; - } - else - { - // TODO: how to handle passing through sample index? - sb << ", 0"; - } - break; - - default: - sb << "__target_intrinsic(glsl, \"$cimageLoad($0, " << ivecN << "($1)"; - if( isMultisample ) - { - // TODO: how to handle passing through sample index? - sb << ", 0"; - } - break; - } - sb << ")$z\")\n"; - } - - // CUDA - { - if (access == SLANG_RESOURCE_ACCESS_READ_WRITE) - { - const int coordCount = kBaseTextureTypes[tt].coordCount; - const int vecCount = coordCount + int(isArray); - - sb << "__target_intrinsic(cuda, \"surf"; - if( baseShape != TextureFlavor::Shape::ShapeCube ) - { - sb << coordCount << "D"; - } - else - { - sb << "Cubemap"; - } - - sb << (isArray ? "Layered" : ""); - sb << "read<$T0>($0"; - - for (int i = 0; i < vecCount; ++i) - { - sb << ", ($1)"; - if (vecCount > 1) - { - sb << '.' << char(i + 'x'); - } - } - - sb << ", SLANG_CUDA_BOUNDARY_MODE)\")\n"; - } - else if (access == SLANG_RESOURCE_ACCESS_READ) - { - // We can allow this on Texture1D - if( baseShape == TextureFlavor::Shape::Shape1D && isArray == false) - { - sb << "__target_intrinsic(cuda, \"tex1Dfetch<$T0>($0, $1)\")\n"; - } - } - } - - // Output that has get - sb << " get;\n"; - - // !!!!!!!!!!!!!!!!!!!! set !!!!!!!!!!!!!!!!!!!!!!! - - if (!(access == SLANG_RESOURCE_ACCESS_NONE || access == SLANG_RESOURCE_ACCESS_READ)) - { - // GLSL - sb << "__target_intrinsic(glsl, \"imageStore($0, " << ivecN << "($1), $V2)\")\n"; - - // CUDA - { - const int coordCount = kBaseTextureTypes[tt].coordCount; - const int vecCount = coordCount + int(isArray); - - sb << "__target_intrinsic(cuda, \"surf"; - if( baseShape != TextureFlavor::Shape::ShapeCube ) - { - sb << coordCount << "D"; - } - else - { - sb << "Cubemap"; - } - - sb << (isArray ? "Layered" : ""); - sb << "write<$T0>($2, $0"; - for (int i = 0; i < vecCount; ++i) - { - sb << ", ($1)"; - if (vecCount > 1) - { - sb << '.' << char(i + 'x'); - } - } - - sb << ", SLANG_CUDA_BOUNDARY_MODE)\")\n"; - } - - // Set - sb << " set;\n"; - } - - // !!!!!!!!!!!!!!!!!! ref !!!!!!!!!!!!!!!!!!!!!!!!! - - // Depending on the access level of the texture type, - // we either have just a getter (the default), or both - // a getter and setter. - switch( access ) - { - case SLANG_RESOURCE_ACCESS_NONE: - case SLANG_RESOURCE_ACCESS_READ: - break; - default: - sb << "__intrinsic_op(" << int(kIROp_ImageSubscript) << ") ref;\n"; - break; - } - - sb << "}\n"; - } - - if( !isMultisample ) - { - // `Sample()` - - sb << "__target_intrinsic(glsl, \"$ctexture($p, $2)$z\")\n"; - - // CUDA - { - const int coordCount = kBaseTextureTypes[tt].coordCount; - const int vecCount = coordCount + int(isArray); - - if( baseShape != TextureFlavor::Shape::ShapeCube ) - { - sb << "__target_intrinsic(cuda, \"tex" << coordCount << "D"; - if (isArray) - { - sb << "Layered"; - } - sb << "<$T0>($0"; - for (int i = 0; i < coordCount; ++i) - { - sb << ", ($2)"; - if (vecCount > 1) - { - sb << '.' << char(i + 'x'); - } - } - if (isArray) - { - sb << ", int(($2)." << char(coordCount + 'x') << ")"; - } - sb << ")\")\n"; - } - else - { - sb << "__target_intrinsic(cuda, \"texCubemap"; - if (isArray) - { - sb << "Layered"; - } - sb << "<$T0>($0, ($2).x, ($2).y, ($2).z"; - if (isArray) - { - sb << ", int(($2).w)"; - } - sb << ")\")\n"; - } - } - - sb << "T Sample(SamplerState s, "; - sb << "float" << kBaseTextureTypes[tt].coordCount + isArray << " location);\n"; - - if( baseShape != TextureFlavor::Shape::ShapeCube ) - { - sb << "__target_intrinsic(glsl, \"$ctextureOffset($p, $2, $3)$z\")\n"; - sb << "T Sample(SamplerState s, "; - sb << "float" << kBaseTextureTypes[tt].coordCount + isArray << " location, "; - sb << "constexpr int" << kBaseTextureTypes[tt].coordCount << " offset);\n"; - } - - sb << "T Sample(SamplerState s, "; - sb << "float" << kBaseTextureTypes[tt].coordCount + isArray << " location, "; - if( baseShape != TextureFlavor::Shape::ShapeCube ) - { - sb << "constexpr int" << kBaseTextureTypes[tt].coordCount << " offset, "; - } - sb << "float clamp);\n"; - - sb << "T Sample(SamplerState s, "; - sb << "float" << kBaseTextureTypes[tt].coordCount + isArray << " location, "; - if( baseShape != TextureFlavor::Shape::ShapeCube ) - { - sb << "constexpr int" << kBaseTextureTypes[tt].coordCount << " offset, "; - } - sb << "float clamp, out uint status);\n"; - - // `SampleBias()` - sb << "__target_intrinsic(glsl, \"$ctexture($p, $2, $3)$z\")\n"; - sb << "T SampleBias(SamplerState s, "; - sb << "float" << kBaseTextureTypes[tt].coordCount + isArray << " location, float bias);\n"; - - if( baseShape != TextureFlavor::Shape::ShapeCube ) - { - sb << "__target_intrinsic(glsl, \"$ctextureOffset($p, $2, $3, $4)$z\")\n"; - sb << "T SampleBias(SamplerState s, "; - sb << "float" << kBaseTextureTypes[tt].coordCount + isArray << " location, float bias, "; - sb << "constexpr int" << kBaseTextureTypes[tt].coordCount << " offset);\n"; - } - int baseCoordCount = kBaseTextureTypes[tt].coordCount; - int arrCoordCount = baseCoordCount + isArray; - if (arrCoordCount <= 3) - { - // `SampleCmp()` and `SampleCmpLevelZero` - sb << "__target_intrinsic(glsl, \"texture($p, vec" << arrCoordCount + 1 << "($2, $3))\")"; - sb << "float SampleCmp(SamplerComparisonState s, "; - sb << "float" << kBaseTextureTypes[tt].coordCount + isArray << " location, "; - sb << "float compareValue"; - sb << ");\n"; - sb << "__target_intrinsic(glsl, \"texture($p, vec" << arrCoordCount + 1 << "($2, $3))\")"; - sb << "float SampleCmpLevelZero(SamplerComparisonState s, "; - sb << "float" << kBaseTextureTypes[tt].coordCount + isArray << " location, "; - sb << "float compareValue"; - sb << ");\n"; - } - if (arrCoordCount < 3) - { - int extCoordCount = arrCoordCount + 1; - - if (extCoordCount < 3) - extCoordCount = 3; - - sb << "__target_intrinsic(glsl, \"$ctextureLod($p, "; - - sb << "vec" << extCoordCount << "($2,"; - for (int ii = arrCoordCount; ii < extCoordCount - 1; ++ii) - { - sb << " 0.0,"; - } - sb << "$3)"; - - sb << ", 0.0)$z\")\n"; - } - else if(arrCoordCount <= 3) - { - int extCoordCount = arrCoordCount + 1; - - if (extCoordCount < 3) - extCoordCount = 3; - - sb << "__target_intrinsic(glsl, \"$ctextureGrad($p, "; - - sb << "vec" << extCoordCount << "($2,"; - for (int ii = arrCoordCount; ii < extCoordCount - 1; ++ii) - { - sb << " 0.0,"; - } - sb << "$3)"; - - // Construct gradients - sb << ", vec" << baseCoordCount << "(0.0)"; - sb << ", vec" << baseCoordCount << "(0.0)"; - sb << ")$z\")\n"; - } - - - if( baseShape != TextureFlavor::Shape::ShapeCube ) - { - // Note(tfoley): MSDN seems confused, and claims that the `offset` - // parameter for `SampleCmp` is available for everything but 3D - // textures, while `Sample` and `SampleBias` are consistent in - // saying they only exclude `offset` for cube maps (which makes - // sense). I'm going to assume the documentation for `SampleCmp` - // is just wrong. - - sb << "float SampleCmp(SamplerComparisonState s, "; - sb << "float" << kBaseTextureTypes[tt].coordCount + isArray << " location, "; - sb << "float compareValue, "; - sb << "constexpr int" << kBaseTextureTypes[tt].coordCount << " offset);\n"; - - sb << "float SampleCmpLevelZero(SamplerComparisonState s, "; - sb << "float" << kBaseTextureTypes[tt].coordCount + isArray << " location, "; - sb << "float compareValue, "; - sb << "constexpr int" << kBaseTextureTypes[tt].coordCount << " offset);\n"; - } - - // TODO(JS): Not clear how to map this to CUDA, because in HLSL, the gradient is a vector based on - // the dimension. On CUDA there is texNDGrad, but it always just takes ddx, ddy. - // I could just assume 0 for elements not supplied, and ignore z. For now will just leave - sb << "__target_intrinsic(glsl, \"$ctextureGrad($p, $2, $3, $4)$z\")\n"; - sb << "T SampleGrad(SamplerState s, "; - sb << "float" << kBaseTextureTypes[tt].coordCount + isArray << " location, "; - sb << "float" << kBaseTextureTypes[tt].coordCount << " gradX, "; - sb << "float" << kBaseTextureTypes[tt].coordCount << " gradY"; - sb << ");\n"; - - if( baseShape != TextureFlavor::Shape::ShapeCube ) - { - sb << "__target_intrinsic(glsl, \"$ctextureGradOffset($p, $2, $3, $4, $5)$z\")\n"; - sb << "T SampleGrad(SamplerState s, "; - sb << "float" << kBaseTextureTypes[tt].coordCount + isArray << " location, "; - sb << "float" << kBaseTextureTypes[tt].coordCount << " gradX, "; - sb << "float" << kBaseTextureTypes[tt].coordCount << " gradY, "; - sb << "constexpr int" << kBaseTextureTypes[tt].coordCount << " offset);\n"; - } - - // `SampleLevel` - - sb << "__target_intrinsic(glsl, \"$ctextureLod($p, $2, $3)$z\")\n"; - - // CUDA - { - const int coordCount = kBaseTextureTypes[tt].coordCount; - const int vecCount = coordCount + int(isArray); - - if( baseShape != TextureFlavor::Shape::ShapeCube ) - { - sb << "__target_intrinsic(cuda, \"tex" << coordCount << "D"; - if (isArray) - { - sb << "Layered"; - } - sb << "Lod<$T0>($0"; - for (int i = 0; i < coordCount; ++i) - { - sb << ", ($2)"; - if (vecCount > 1) - { - sb << '.' << char(i + 'x'); - } - } - if (isArray) - { - sb << ", int(($2)." << char(coordCount + 'x') << ")"; - } - sb << ", $3)\")\n"; - } - else - { - sb << "__target_intrinsic(cuda, \"texCubemap"; - if (isArray) - { - sb << "Layered"; - } - sb << "Lod<$T0>($0, ($2).x, ($2).y, ($2).z"; - if (isArray) - { - sb << ", int(($2).w)"; - } - sb << ", $3)\")\n"; - } - } - - sb << "T SampleLevel(SamplerState s, "; - sb << "float" << kBaseTextureTypes[tt].coordCount + isArray << " location, "; - sb << "float level);\n"; - - if( baseShape != TextureFlavor::Shape::ShapeCube ) - { - sb << "__target_intrinsic(glsl, \"$ctextureLodOffset($p, $2, $3, $4)$z\")\n"; - sb << "T SampleLevel(SamplerState s, "; - sb << "float" << kBaseTextureTypes[tt].coordCount + isArray << " location, "; - sb << "float level, "; - sb << "constexpr int" << kBaseTextureTypes[tt].coordCount << " offset);\n"; - } - } - - sb << "\n};\n"; - - // `Gather*()` operations are handled via an `extension` declaration, - // because this lets us capture the element type of the texture. - // - // TODO: longer-term there should be something like a `TextureElementType` - // interface, that both scalars and vectors implement, that then exposes - // a `Scalar` associated type, and `Gather` can return `vector<T.Scalar, 4>`. - // - static const struct { - char const* genericPrefix; - char const* elementType; - char const* outputType; - } kGatherExtensionCases[] = { - { "__generic<T, let N : int>", "vector<T,N>", "vector<T, 4>" }, - { "", "float", "vector<float, 4>" }, - { "", "int" , "vector<int, 4>"}, - { "", "uint", "vector<uint, 4>"}, - - // TODO: need a case here for scalars `T`, but also - // need to ensure that case doesn't accidentally match - // for `T = vector<...>`, which requires actual checking - // of constraints on generic parameters. - }; - for(auto cc : kGatherExtensionCases) - { - // TODO: this should really be an `if` around the entire `Gather` logic - if (isMultisample) break; - - EMIT_LINE_DIRECTIVE(); - sb << cc.genericPrefix << " __extension "; - sb << kBaseTextureAccessLevels[accessLevel].name; - sb << name; - if (isArray) sb << "Array"; - sb << "<" << cc.elementType << " >"; - sb << "\n{\n"; - - // `Gather` - // (tricky because it returns a 4-vector of the element type - // of the texture components...) - // - // TODO: is it actually correct to restrict these so that, e.g., - // `GatherAlpha()` isn't allowed on `Texture2D<float3>` because - // it nominally doesn't have an alpha component? - static const struct { - int componentIndex; - char const* componentName; - } kGatherComponets[] = { - { 0, "" }, - { 0, "Red" }, - { 1, "Green" }, - { 2, "Blue" }, - { 3, "Alpha" }, - }; - - for(auto kk : kGatherComponets) - { - auto componentIndex = kk.componentIndex; - auto componentName = kk.componentName; - - auto outputType = cc.outputType; - - EMIT_LINE_DIRECTIVE(); - - sb << "__target_intrinsic(glsl, \"textureGather($p, $2, " << componentIndex << ")\")\n"; - if (kBaseTextureTypes[tt].coordCount == 2) - { - // Gather only works on 2D in CUDA - // "It is based on the base type of DataType except when readMode is equal to cudaReadModeNormalizedFloat (see Texture Reference API), in which case it is always float4." - sb << "__target_intrinsic(cuda, \"tex2Dgather<$T0>($0, ($2).x, ($2).y, " << componentIndex << ")\")\n"; - } - sb << outputType << " Gather" << componentName << "(SamplerState s, "; - sb << "float" << kBaseTextureTypes[tt].coordCount << " location);\n"; - - EMIT_LINE_DIRECTIVE(); - sb << "__target_intrinsic(glsl, \"textureGatherOffset($p, $2, $3, " << componentIndex << ")\")\n"; - sb << outputType << " Gather" << componentName << "(SamplerState s, "; - sb << "float" << kBaseTextureTypes[tt].coordCount << " location, "; - sb << "constexpr int" << kBaseTextureTypes[tt].coordCount << " offset);\n"; - - EMIT_LINE_DIRECTIVE(); - sb << outputType << " Gather" << componentName << "(SamplerState s, "; - sb << "float" << kBaseTextureTypes[tt].coordCount << " location, "; - sb << "constexpr int" << kBaseTextureTypes[tt].coordCount << " offset, "; - sb << "out uint status);\n"; - - EMIT_LINE_DIRECTIVE(); - sb << "__target_intrinsic(glsl, \"textureGatherOffsets($p, $2, int" << kBaseTextureTypes[tt].coordCount << "[]($3, $4, $5, $6), " << componentIndex << ")\")\n"; - sb << outputType << " Gather" << componentName << "(SamplerState s, "; - sb << "float" << kBaseTextureTypes[tt].coordCount << " location, "; - sb << "int" << kBaseTextureTypes[tt].coordCount << " offset1, "; - sb << "int" << kBaseTextureTypes[tt].coordCount << " offset2, "; - sb << "int" << kBaseTextureTypes[tt].coordCount << " offset3, "; - sb << "int" << kBaseTextureTypes[tt].coordCount << " offset4);\n"; - - EMIT_LINE_DIRECTIVE(); - sb << outputType << " Gather" << componentName << "(SamplerState s, "; - sb << "float" << kBaseTextureTypes[tt].coordCount << " location, "; - sb << "int" << kBaseTextureTypes[tt].coordCount << " offset1, "; - sb << "int" << kBaseTextureTypes[tt].coordCount << " offset2, "; - sb << "int" << kBaseTextureTypes[tt].coordCount << " offset3, "; - sb << "int" << kBaseTextureTypes[tt].coordCount << " offset4, "; - sb << "out uint status);\n"; - } - - EMIT_LINE_DIRECTIVE(); - sb << "\n}\n"; - } - } - } -} - - -for (auto op : unaryOps) -{ - char const* fixity = (op.flags & POSTFIX) != 0 ? "__postfix " : "__prefix "; - char const* qual = (op.flags & ASSIGNMENT) != 0 ? "in out " : ""; - - for (auto type : kBaseTypes) - { - if ((type.flags & op.flags) == 0) - continue; - - char const* resultType = type.name; - if (op.flags & BOOL_RESULT) resultType = "bool"; - - // scalar version - sb << fixity; - sb << "__intrinsic_op(" << int(op.opCode) << ") " << resultType << " operator" << op.opName << "(" << qual << type.name << " value);\n"; - - // vector version - sb << "__generic<let N : int> "; - sb << fixity; - sb << "__intrinsic_op(" << int(op.opCode) << ") vector<" << resultType << ",N> operator" << op.opName << "(" << qual << "vector<" << type.name << ",N> value);\n"; - - // matrix version - sb << "__generic<let N : int, let M : int> "; - sb << fixity; - sb << "__intrinsic_op(" << int(op.opCode) << ") matrix<" << resultType << ",N,M> operator" << op.opName << "(" << qual << "matrix<" << type.name << ",N,M> value);\n"; - } - - // Synthesize generic versions - if(op.interface) - { - char const* resultType = "T"; - if (op.flags & BOOL_RESULT) resultType = "bool"; - - // scalar version - sb << fixity; - sb << "__generic<T : " << op.interface << ">\n"; - sb << "__intrinsic_op(" << int(op.opCode) << ") " << resultType << " operator" << op.opName << "(" << qual << "T value);\n"; - - // vector version - sb << "__generic<T : " << op.interface << ", let N : int> "; - sb << fixity; - sb << "__intrinsic_op(" << int(op.opCode) << ") vector<" << resultType << ",N> operator" << op.opName << "(" << qual << "vector<T,N> value);\n"; - - // matrix version - sb << "__generic<T : " << op.interface << ", let N : int, let M : int> "; - sb << fixity; - sb << "__intrinsic_op(" << int(op.opCode) << ") matrix<" << resultType << ",N,M> operator" << op.opName << "(" << qual << "matrix<T,N,M> value);\n"; - } -} - -for (auto op : binaryOps) -{ - char const* leftQual = ""; - if(op.flags & ASSIGNMENT) leftQual = "in out "; - - for (auto type : kBaseTypes) - { - if ((type.flags & op.flags) == 0) - continue; - - char const* leftType = type.name; - char const* rightType = leftType; - char const* resultType = leftType; - - if (op.flags & BOOL_RESULT) resultType = "bool"; - - // TODO: We should handle a `SHIFT` flag on the op - // by changing `rightType` to `int` in order to - // account for the fact that the shift amount should - // always have a fixed type independent of the LHS. - // - // (It is unclear why this change hadn't been made - // already, so it is possible that such a change - // breaks overload resolution or other parts of - // the compiler) - - // scalar version - sb << "__intrinsic_op(" << int(op.opCode) << ") " << resultType << " operator" << op.opName << "(" << leftQual << leftType << " left, " << rightType << " right);\n"; - - // vector version - sb << "__generic<let N : int> "; - sb << "__intrinsic_op(" << int(op.opCode) << ") vector<" << resultType << ",N> operator" << op.opName << "(" << leftQual << "vector<" << leftType << ",N> left, vector<" << rightType << ",N> right);\n"; - - // matrix version - sb << "__generic<let N : int, let M : int> "; - sb << "__intrinsic_op(" << int(op.opCode) << ") matrix<" << resultType << ",N,M> operator" << op.opName << "(" << leftQual << "matrix<" << leftType << ",N,M> left, matrix<" << rightType << ",N,M> right);\n"; - - // We currently synthesize addiitonal overloads - // for the case where one or the other operand - // is a scalar. This choice serves a few purposes: - // - // 1. It avoids introducing scalar-to-vector or - // scalar-to-matrix promotions before the operator, - // which might allow some back ends to produce - // more optimal code. - // - // 2. It avoids concerns about making overload resolution - // and the inference rules for `N` and `M` able to - // handle the mixed vector/scalar or matrix/scalar case. - // - // 3. Having explicit overloads for the matrix/scalar cases - // here means that we do *not* need to support a general - // implicit conversion from scalars to matrices, unless - // we decide we want to. - // - // Note: Case (2) of the motivation shouldn't really apply - // any more, because we end up having to support similar - // inteference for built-in binary math functions where - // vectors and scalars might be combined (and where defining - // additional overloads to cover all the combinations doesn't - // seem practical or desirable). - // - // TODO: We should consider whether dropping these extra - // overloads is possible and worth it. The optimization - // concern (1) could possibly be addressed in specific - // back-ends. The issue (3) about not wanting to support - // implicit scalar-to-matrix conversion may be moot if - // we end up needing to support mixed scalar/matrix input - // for builtin in non-operator functions anyway. - - // scalar-vector and scalar-matrix - if (!(op.flags & ASSIGNMENT)) - { - sb << "__generic<let N : int> "; - sb << "__intrinsic_op(" << int(op.opCode) << ") vector<" << resultType << ",N> operator" << op.opName << "(" << leftQual << leftType << " left, vector<" << rightType << ",N> right);\n"; - - sb << "__generic<let N : int, let M : int> "; - sb << "__intrinsic_op(" << int(op.opCode) << ") matrix<" << resultType << ",N,M> operator" << op.opName << "(" << leftQual << leftType << " left, matrix<" << rightType << ",N,M> right);\n"; - } - - // vector-scalar and matrix-scalar - sb << "__generic<let N : int> "; - sb << "__intrinsic_op(" << int(op.opCode) << ") vector<" << resultType << ",N> operator" << op.opName << "(" << leftQual << "vector<" << leftType << ",N> left, " << rightType << " right);\n"; - - sb << "__generic<let N : int, let M : int> "; - sb << "__intrinsic_op(" << int(op.opCode) << ") matrix<" << resultType << ",N,M> operator" << op.opName << "(" << leftQual << "matrix<" << leftType << ",N,M> left, " << rightType << " right);\n"; - } - - // Synthesize generic versions - if(op.interface) - { - char const* leftType = "T"; - char const* rightType = leftType; - char const* resultType = leftType; - - if (op.flags & BOOL_RESULT) resultType = "bool"; - // TODO: handle `SHIFT` - - // scalar version - sb << "__generic<T : " << op.interface << ">\n"; - sb << "__intrinsic_op(" << int(op.opCode) << ") " << resultType << " operator" << op.opName << "(" << leftQual << leftType << " left, " << rightType << " right);\n"; - - // vector version - sb << "__generic<T : " << op.interface << ", let N : int> "; - sb << "__intrinsic_op(" << int(op.opCode) << ") vector<" << resultType << ",N> operator" << op.opName << "(" << leftQual << "vector<" << leftType << ",N> left, vector<" << rightType << ",N> right);\n"; - - // matrix version - sb << "__generic<T : " << op.interface << ", let N : int, let M : int> "; - sb << "__intrinsic_op(" << int(op.opCode) << ") matrix<" << resultType << ",N,M> operator" << op.opName << "(" << leftQual << "matrix<" << leftType << ",N,M> left, matrix<" << rightType << ",N,M> right);\n"; - - // scalar-vector and scalar-matrix - if (!(op.flags & ASSIGNMENT)) - { - sb << "__generic<T : " << op.interface << ", let N : int> "; - sb << "__intrinsic_op(" << int(op.opCode) << ") vector<" << resultType << ",N> operator" << op.opName << "(" << leftQual << leftType << " left, vector<" << rightType << ",N> right);\n"; - - sb << "__generic<T : " << op.interface << ", let N : int, let M : int> "; - sb << "__intrinsic_op(" << int(op.opCode) << ") matrix<" << resultType << ",N,M> operator" << op.opName << "(" << leftQual << leftType << " left, matrix<" << rightType << ",N,M> right);\n"; - } - - // vector-scalar and matrix-scalar - sb << "__generic<T : " << op.interface << ", let N : int> "; - sb << "__intrinsic_op(" << int(op.opCode) << ") vector<" << resultType << ",N> operator" << op.opName << "(" << leftQual << "vector<" << leftType << ",N> left, " << rightType << " right);\n"; - - sb << "__generic<T : " << op.interface << ", let N : int, let M : int> "; - sb << "__intrinsic_op(" << int(op.opCode) << ") matrix<" << resultType << ",N,M> operator" << op.opName << "(" << leftQual << "matrix<" << leftType << ",N,M> left, " << rightType << " right);\n"; - } -} -SLANG_RAW("#line 1632 \"core.meta.slang\"") -SLANG_RAW("\n") -SLANG_RAW("\n") -SLANG_RAW("// Specialized function\n") -SLANG_RAW("\n") -SLANG_RAW("__intrinsic_op\n") -SLANG_RAW("int getStringHash(String string);\n") -SLANG_RAW("\n") -SLANG_RAW("// Operators to apply to `enum` types\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<E : __EnumType>\n") -SLANG_RAW("__intrinsic_op(") -SLANG_SPLICE(kIROp_Eql -) -SLANG_RAW(")\n") -SLANG_RAW("bool operator==(E left, E right);\n") -SLANG_RAW("\n") -SLANG_RAW("// Binding Attributes\n") -SLANG_RAW("\n") -SLANG_RAW("__attributeTarget(DeclBase)\n") -SLANG_RAW("attribute_syntax [vk_binding(binding: int, set: int = 0)]\t\t\t: GLSLBindingAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("__attributeTarget(DeclBase)\n") -SLANG_RAW("attribute_syntax [gl_binding(binding: int, set: int = 0)]\t\t\t: GLSLBindingAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("\n") -SLANG_RAW("__attributeTarget(VarDeclBase)\n") -SLANG_RAW("attribute_syntax [vk_shader_record]\t\t\t : ShaderRecordAttribute;\n") -SLANG_RAW("__attributeTarget(VarDeclBase)\n") -SLANG_RAW("attribute_syntax [shader_record]\t\t\t : ShaderRecordAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("__attributeTarget(DeclBase)\n") -SLANG_RAW("attribute_syntax [vk_push_constant]\t\t\t\t\t\t\t\t\t: PushConstantAttribute;\n") -SLANG_RAW("__attributeTarget(DeclBase)\n") -SLANG_RAW("attribute_syntax [push_constant]\t\t\t\t\t\t\t\t\t: PushConstantAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("__attributeTarget(VarDeclBase)\n") -SLANG_RAW("attribute_syntax [vk_location(locaiton : int)] : GLSLLocationAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("__attributeTarget(VarDeclBase)\n") -SLANG_RAW("attribute_syntax [vk_index(index : int)] : GLSLIndexAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("// Statement Attributes\n") -SLANG_RAW("\n") -SLANG_RAW("__attributeTarget(LoopStmt)\n") -SLANG_RAW("attribute_syntax [unroll(count: int = 0)] : UnrollAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("__attributeTarget(LoopStmt)\n") -SLANG_RAW("attribute_syntax [loop] : LoopAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("__attributeTarget(LoopStmt)\n") -SLANG_RAW("attribute_syntax [fastopt] : FastOptAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("__attributeTarget(LoopStmt)\n") -SLANG_RAW("attribute_syntax [allow_uav_condition] : AllowUAVConditionAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("__attributeTarget(IfStmt)\n") -SLANG_RAW("attribute_syntax [flatten] : FlattenAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("__attributeTarget(IfStmt)\n") -SLANG_RAW("__attributeTarget(SwitchStmt)\n") -SLANG_RAW("attribute_syntax [branch] : BranchAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("__attributeTarget(SwitchStmt)\n") -SLANG_RAW("attribute_syntax [forcecase] : ForceCaseAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("__attributeTarget(SwitchStmt)\n") -SLANG_RAW("attribute_syntax [call] : CallAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("// Entry-point Attributes\n") -SLANG_RAW("\n") -SLANG_RAW("// All Stages\n") -SLANG_RAW("__attributeTarget(FuncDecl)\n") -SLANG_RAW("attribute_syntax [shader(stage)] : EntryPointAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("// Hull Shader\n") -SLANG_RAW("__attributeTarget(FuncDecl)\n") -SLANG_RAW("attribute_syntax [maxtessfactor(factor: float)] : MaxTessFactorAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("__attributeTarget(FuncDecl)\n") -SLANG_RAW("attribute_syntax [outputcontrolpoints(count: int)] : OutputControlPointsAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("__attributeTarget(FuncDecl)\n") -SLANG_RAW("attribute_syntax [outputtopology(topology)] : OutputTopologyAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("__attributeTarget(FuncDecl)\n") -SLANG_RAW("attribute_syntax [partitioning(mode)] : PartitioningAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("__attributeTarget(FuncDecl)\n") -SLANG_RAW("attribute_syntax [patchconstantfunc(name)] : PatchConstantFuncAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("// Hull/Domain Shader\n") -SLANG_RAW("__attributeTarget(FuncDecl)\n") -SLANG_RAW("attribute_syntax [domain(domain)] : DomainAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("// Geometry Shader\n") -SLANG_RAW("__attributeTarget(FuncDecl)\n") -SLANG_RAW("attribute_syntax [maxvertexcount(count: int)] : MaxVertexCountAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("__attributeTarget(FuncDecl)\n") -SLANG_RAW("attribute_syntax [instance(count: int)] : InstanceAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("// Fragment (\"Pixel\") Shader\n") -SLANG_RAW("__attributeTarget(FuncDecl)\n") -SLANG_RAW("attribute_syntax [earlydepthstencil] : EarlyDepthStencilAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("// Compute Shader\n") -SLANG_RAW("__attributeTarget(FuncDecl)\n") -SLANG_RAW("attribute_syntax [numthreads(x: int, y: int = 1, z: int = 1)] : NumThreadsAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("//\n") -SLANG_RAW("__attributeTarget(VarDeclBase)\n") -SLANG_RAW("attribute_syntax [__vulkanRayPayload] : VulkanRayPayloadAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("__attributeTarget(VarDeclBase)\n") -SLANG_RAW("attribute_syntax [__vulkanCallablePayload] : VulkanCallablePayloadAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("__attributeTarget(VarDeclBase)\n") -SLANG_RAW("attribute_syntax [__vulkanHitAttributes] : VulkanHitAttributesAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("__attributeTarget(FunctionDeclBase)\n") -SLANG_RAW("attribute_syntax [mutating] : MutatingAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW(" /// Indicates that a function computes its result as a function of its arguments without loading/storing any memory or other state.\n") -SLANG_RAW(" ///\n") -SLANG_RAW(" /// This is equivalent to the LLVM `readnone` function attribute.\n") -SLANG_RAW("__attributeTarget(FunctionDeclBase)\n") -SLANG_RAW("attribute_syntax [__readNone] : ReadNoneAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("enum _AttributeTargets\n") -SLANG_RAW("{\n") -SLANG_RAW(" Struct = ") -SLANG_SPLICE( (int) UserDefinedAttributeTargets::Struct -) -SLANG_RAW(",\n") -SLANG_RAW(" Var = ") -SLANG_SPLICE( (int) UserDefinedAttributeTargets::Var -) -SLANG_RAW(",\n") -SLANG_RAW(" Function = ") -SLANG_SPLICE( (int) UserDefinedAttributeTargets::Function -) -SLANG_RAW(",\n") -SLANG_RAW("};\n") -SLANG_RAW("__attributeTarget(StructDecl)\n") -SLANG_RAW("attribute_syntax [__AttributeUsage(target : _AttributeTargets)] : AttributeUsageAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("__attributeTarget(VarDeclBase)\n") -SLANG_RAW("attribute_syntax [format(format : String)] : FormatAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("__attributeTarget(Decl)\n") -SLANG_RAW("attribute_syntax [allow(diagnostic: String)] : AllowAttribute;\n") -SLANG_RAW("\n") -SLANG_RAW("// Linking\n") -SLANG_RAW("__attributeTarget(Decl)\n") -SLANG_RAW("attribute_syntax [__extern] : ExternAttribute;\n") -SLANG_RAW("\n") diff --git a/source/slang/glsl.meta.slang.h b/source/slang/glsl.meta.slang.h deleted file mode 100644 index f7634db31..000000000 --- a/source/slang/glsl.meta.slang.h +++ /dev/null @@ -1,202 +0,0 @@ -SLANG_RAW("// Slang GLSL compatibility library\n") -SLANG_RAW("\n") - -static const struct { - char const* name; - char const* glslPrefix; -} kTypes[] = -{ - {"float", ""}, - {"int", "i"}, - {"uint", "u"}, - {"bool", "b"}, -}; -static const int kTypeCount = sizeof(kTypes) / sizeof(kTypes[0]); - -for( int tt = 0; tt < kTypeCount; ++tt ) -{ - // Declare GLSL aliases for HLSL types - for (int vv = 2; vv <= 4; ++vv) - { - sb << "typedef vector<" << kTypes[tt].name << "," << vv << "> " << kTypes[tt].glslPrefix << "vec" << vv << ";\n"; - sb << "typedef matrix<" << kTypes[tt].name << "," << vv << "," << vv << "> " << kTypes[tt].glslPrefix << "mat" << vv << ";\n"; - } - for (int rr = 2; rr <= 4; ++rr) - for (int cc = 2; cc <= 4; ++cc) - { - sb << "typedef matrix<" << kTypes[tt].name << "," << rr << "," << cc << "> " << kTypes[tt].glslPrefix << "mat" << rr << "x" << cc << ";\n"; - } -} - -// Multiplication operations for vectors + matrices - -// scalar-vector and vector-scalar -sb << "__generic<T : __BuiltinArithmeticType, let N : int> __intrinsic_op(mul) vector<T,N> operator*(vector<T,N> x, T y);\n"; -sb << "__generic<T : __BuiltinArithmeticType, let N : int> __intrinsic_op(mul) vector<T,N> operator*(T x, vector<T,N> y);\n"; - -// scalar-matrix and matrix-scalar -sb << "__generic<T : __BuiltinArithmeticType, let N : int, let M :int> __intrinsic_op(mul) matrix<T,N,M> operator*(matrix<T,N,M> x, T y);\n"; -sb << "__generic<T : __BuiltinArithmeticType, let N : int, let M :int> __intrinsic_op(mul) matrix<T,N,M> operator*(T x, matrix<T,N,M> y);\n"; - -// vector-vector (dot product) -sb << "__generic<T : __BuiltinArithmeticType, let N : int> __intrinsic_op(dot) T operator*(vector<T,N> x, vector<T,N> y);\n"; - -// vector-matrix -sb << "__generic<T : __BuiltinArithmeticType, let N : int, let M : int> __intrinsic_op(mul) vector<T,M> operator*(vector<T,N> x, matrix<T,N,M> y);\n"; - -// matrix-vector -sb << "__generic<T : __BuiltinArithmeticType, let N : int, let M : int> __intrinsic_op(mul) vector<T,N> operator*(matrix<T,N,M> x, vector<T,M> y);\n"; - -// matrix-matrix -sb << "__generic<T : __BuiltinArithmeticType, let R : int, let N : int, let C : int> __intrinsic_op(mul) matrix<T,R,C> operator*(matrix<T,R,N> x, matrix<T,N,C> y);\n"; - - - -// - -// TODO(tfoley): Need to handle `RW*` variants of texture types as well... -static const struct { - char const* name; - TextureFlavor::Shape baseShape; - int coordCount; -} kBaseTextureTypes[] = { - { "1D", TextureFlavor::Shape::Shape1D, 1 }, - { "2D", TextureFlavor::Shape::Shape2D, 2 }, - { "3D", TextureFlavor::Shape::Shape3D, 3 }, - { "Cube", TextureFlavor::Shape::ShapeCube, 3 }, - { "Buffer", TextureFlavor::Shape::ShapeBuffer, 1 }, -}; -static const int kBaseTextureTypeCount = sizeof(kBaseTextureTypes) / sizeof(kBaseTextureTypes[0]); - - -static const struct { - char const* name; - SlangResourceAccess access; -} kBaseTextureAccessLevels[] = { - { "", SLANG_RESOURCE_ACCESS_READ }, - { "RW", SLANG_RESOURCE_ACCESS_READ_WRITE }, - { "RasterizerOrdered", SLANG_RESOURCE_ACCESS_RASTER_ORDERED }, -}; -static const int kBaseTextureAccessLevelCount = sizeof(kBaseTextureAccessLevels) / sizeof(kBaseTextureAccessLevels[0]); - -for (int tt = 0; tt < kBaseTextureTypeCount; ++tt) -{ - char const* shapeName = kBaseTextureTypes[tt].name; - TextureFlavor::Shape baseShape = kBaseTextureTypes[tt].baseShape; - - for (int isArray = 0; isArray < 2; ++isArray) - { - // Arrays of 3D textures aren't allowed - if (isArray && baseShape == TextureFlavor::Shape::Shape3D) continue; - - for (int isMultisample = 0; isMultisample < 2; ++isMultisample) - { - auto readAccess = SLANG_RESOURCE_ACCESS_READ; - auto readWriteAccess = SLANG_RESOURCE_ACCESS_READ_WRITE; - - // TODO: any constraints to enforce on what gets to be multisampled? - - - unsigned flavor = baseShape; - if (isArray) flavor |= TextureFlavor::ArrayFlag; - if (isMultisample) flavor |= TextureFlavor::MultisampleFlag; -// if (isShadow) flavor |= TextureFlavor::ShadowFlag; - - - - unsigned readFlavor = flavor | (readAccess << 8); - unsigned readWriteFlavor = flavor | (readWriteAccess << 8); - - StringBuilder nameBuilder; - nameBuilder << shapeName; - if (isMultisample) nameBuilder << "MS"; - if (isArray) nameBuilder << "Array"; - auto name = nameBuilder.ProduceString(); - - sb << "__generic<T> "; - sb << "__magic_type(TextureSampler," << int(readFlavor) << ") struct "; - sb << "__sampler" << name; - sb << " {};\n"; - - sb << "__generic<T> "; - sb << "__magic_type(Texture," << int(readFlavor) << ") struct "; - sb << "__texture" << name; - sb << " {};\n"; - - sb << "__generic<T> "; - sb << "__magic_type(GLSLImageType," << int(readWriteFlavor) << ") struct "; - sb << "__image" << name; - sb << " {};\n"; - - // TODO(tfoley): flesh this out for all the available prefixes - static const struct - { - char const* prefix; - char const* elementType; - } kTextureElementTypes[] = { - { "", "vec4" }, - { "i", "ivec4" }, - { "u", "uvec4" }, - { nullptr, nullptr }, - }; - for( auto ee = kTextureElementTypes; ee->prefix; ++ee ) - { - sb << "typedef __sampler" << name << "<" << ee->elementType << "> " << ee->prefix << "sampler" << name << ";\n"; - sb << "typedef __texture" << name << "<" << ee->elementType << "> " << ee->prefix << "texture" << name << ";\n"; - sb << "typedef __image" << name << "<" << ee->elementType << "> " << ee->prefix << "image" << name << ";\n"; - } - } - } -} - -sb << "__generic<T> __magic_type(GLSLInputParameterGroupType) struct __GLSLInputParameterGroup {};\n"; -sb << "__generic<T> __magic_type(GLSLOutputParameterGroupType) struct __GLSLOutputParameterGroup {};\n"; -sb << "__generic<T> __magic_type(GLSLShaderStorageBufferType) struct __GLSLShaderStorageBuffer {};\n"; - -sb << "__magic_type(SamplerState," << int(SamplerStateFlavor::SamplerState) << ") struct sampler {};"; - -sb << "__magic_type(GLSLInputAttachmentType) struct subpassInput {};"; - -// Define additional keywords - -sb << "syntax buffer : GLSLBufferModifier;\n"; - -// [GLSL 4.3] Storage Qualifiers - -// TODO: need to support `shared` here with its GLSL meaning - -sb << "syntax patch : GLSLPatchModifier;\n"; -// `centroid` and `sample` handled centrally - -// [GLSL 4.5] Interpolation Qualifiers -sb << "syntax smooth : SimpleModifier;\n"; -sb << "syntax flat : SimpleModifier;\n"; -sb << "syntax noperspective : SimpleModifier;\n"; - - -// [GLSL 4.3.2] Constant Qualifier - -// We need to handle GLSL `const` separately from HLSL `const`, -// since they mean such different things. - -// [GLSL 4.7.2] Precision Qualifiers -sb << "syntax highp : SimpleModifier;\n"; -sb << "syntax mediump : SimpleModifier;\n"; -sb << "syntax lowp : SimpleModifier;\n"; - -// [GLSL 4.8.1] The Invariant Qualifier - -sb << "syntax invariant : SimpleModifier;\n"; - -// [GLSL 4.10] Memory Qualifiers - -sb << "syntax coherent : SimpleModifier;\n"; -sb << "syntax volatile : SimpleModifier;\n"; -sb << "syntax restrict : SimpleModifier;\n"; -sb << "syntax readonly : GLSLReadOnlyModifier;\n"; -sb << "syntax writeonly : GLSLWriteOnlyModifier;\n"; - -// We will treat `subroutine` as a qualifier for now -sb << "syntax subroutine : SimpleModifier;\n"; -SLANG_RAW("\n") -SLANG_RAW("\n") diff --git a/source/slang/hlsl.meta.slang.h b/source/slang/hlsl.meta.slang.h deleted file mode 100644 index 216f45bbe..000000000 --- a/source/slang/hlsl.meta.slang.h +++ /dev/null @@ -1,3140 +0,0 @@ -SLANG_RAW("// Slang HLSL compatibility library\n") -SLANG_RAW("\n") -SLANG_RAW("typedef uint UINT;\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T>\n") -SLANG_RAW("__magic_type(HLSLAppendStructuredBufferType)\n") -SLANG_RAW("__intrinsic_type(") -SLANG_SPLICE(kIROp_HLSLAppendStructuredBufferType -) -SLANG_RAW(")\n") -SLANG_RAW("struct AppendStructuredBuffer\n") -SLANG_RAW("{\n") -SLANG_RAW(" void Append(T value);\n") -SLANG_RAW("\n") -SLANG_RAW(" void GetDimensions(\n") -SLANG_RAW(" out uint numStructs,\n") -SLANG_RAW(" out uint stride);\n") -SLANG_RAW("};\n") -SLANG_RAW("\n") -SLANG_RAW("__magic_type(HLSLByteAddressBufferType)\n") -SLANG_RAW("__intrinsic_type(") -SLANG_SPLICE(kIROp_HLSLByteAddressBufferType -) -SLANG_RAW(")\n") -SLANG_RAW("struct ByteAddressBuffer\n") -SLANG_RAW("{\n") -SLANG_RAW(" __target_intrinsic(glsl, \"$1 = $0._data.length() * 4\")\n") -SLANG_RAW(" void GetDimensions(\n") -SLANG_RAW(" out uint dim);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"$0._data[$1/4]\")\n") -SLANG_RAW(" uint Load(int location);\n") -SLANG_RAW("\n") -SLANG_RAW(" uint Load(int location, out uint status);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"uvec2($0._data[$1/4], $0._data[$1/4+1])\")\n") -SLANG_RAW(" uint2 Load2(int location);\n") -SLANG_RAW("\n") -SLANG_RAW(" uint2 Load2(int location, out uint status);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"uvec3($0._data[$1/4], $0._data[$1/4+1], $0._data[$1/4+2])\")\n") -SLANG_RAW(" uint3 Load3(int location);\n") -SLANG_RAW("\n") -SLANG_RAW(" uint3 Load3(int location, out uint status);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"uvec4($0._data[$1/4], $0._data[$1/4+1], $0._data[$1/4+2], $0._data[$1/4+3])\")\n") -SLANG_RAW(" uint4 Load4(int location);\n") -SLANG_RAW("\n") -SLANG_RAW(" uint4 Load4(int location, out uint status);\n") -SLANG_RAW("};\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T>\n") -SLANG_RAW("__magic_type(HLSLStructuredBufferType)\n") -SLANG_RAW("__intrinsic_type(") -SLANG_SPLICE(kIROp_HLSLStructuredBufferType -) -SLANG_RAW(")\n") -SLANG_RAW("struct StructuredBuffer\n") -SLANG_RAW("{\n") -SLANG_RAW(" __target_intrinsic(glsl, \"$1 = $0._data.length(); $2 = 0\")\n") -SLANG_RAW(" void GetDimensions(\n") -SLANG_RAW(" out uint numStructs,\n") -SLANG_RAW(" out uint stride);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"$0._data[$1]\") \n") -SLANG_RAW(" T Load(int location);\n") -SLANG_RAW(" T Load(int location, out uint status);\n") -SLANG_RAW("\n") -SLANG_RAW(" __subscript(uint index) -> T\n") -SLANG_RAW(" {\n") -SLANG_RAW(" __target_intrinsic(glsl, \"$0._data[$1]\")\n") -SLANG_RAW(" get;\n") -SLANG_RAW(" };\n") -SLANG_RAW("};\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T>\n") -SLANG_RAW("__magic_type(HLSLConsumeStructuredBufferType)\n") -SLANG_RAW("__intrinsic_type(") -SLANG_SPLICE(kIROp_HLSLConsumeStructuredBufferType -) -SLANG_RAW(")\n") -SLANG_RAW("struct ConsumeStructuredBuffer\n") -SLANG_RAW("{\n") -SLANG_RAW(" T Consume();\n") -SLANG_RAW("\n") -SLANG_RAW(" void GetDimensions(\n") -SLANG_RAW(" out uint numStructs,\n") -SLANG_RAW(" out uint stride);\n") -SLANG_RAW("};\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T, let N : int>\n") -SLANG_RAW("__magic_type(HLSLInputPatchType)\n") -SLANG_RAW("__intrinsic_type(") -SLANG_SPLICE(kIROp_HLSLInputPatchType -) -SLANG_RAW(")\n") -SLANG_RAW("struct InputPatch\n") -SLANG_RAW("{\n") -SLANG_RAW(" __subscript(uint index) -> T;\n") -SLANG_RAW("};\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T, let N : int>\n") -SLANG_RAW("__magic_type(HLSLOutputPatchType)\n") -SLANG_RAW("__intrinsic_type(") -SLANG_SPLICE(kIROp_HLSLOutputPatchType -) -SLANG_RAW(")\n") -SLANG_RAW("struct OutputPatch\n") -SLANG_RAW("{\n") -SLANG_RAW(" __subscript(uint index) -> T;\n") -SLANG_RAW("};\n") -SLANG_RAW("\n") - -static const struct { - IROp op; - char const* name; -} kMutableByteAddressBufferCases[] = -{ - { kIROp_HLSLRWByteAddressBufferType, "RWByteAddressBuffer" }, - { kIROp_HLSLRasterizerOrderedByteAddressBufferType, "RasterizerOrderedByteAddressBuffer" }, -}; -for(auto item : kMutableByteAddressBufferCases) { -SLANG_RAW("#line 105 \"hlsl.meta.slang\"") -SLANG_RAW("\n") -SLANG_RAW("\n") -SLANG_RAW("__magic_type(HLSL") -SLANG_SPLICE(item.name -) -SLANG_RAW("Type)\n") -SLANG_RAW("__intrinsic_type(") -SLANG_SPLICE(item.op -) -SLANG_RAW(")\n") -SLANG_RAW("struct ") -SLANG_SPLICE(item.name -) -SLANG_RAW("\n") -SLANG_RAW("{\n") -SLANG_RAW(" // Note(tfoley): supports all operations from `ByteAddressBuffer`\n") -SLANG_RAW(" // TODO(tfoley): can this be made a sub-type?\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"$1 = $0._data.length() * 4\")\n") -SLANG_RAW(" void GetDimensions(\n") -SLANG_RAW(" out uint dim);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"$0._data[$1/4]\")\n") -SLANG_RAW(" uint Load(int location);\n") -SLANG_RAW("\n") -SLANG_RAW(" uint Load(int location, out uint status);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"uvec2($0._data[$1/4], $0._data[$1/4+1])\")\n") -SLANG_RAW(" uint2 Load2(int location);\n") -SLANG_RAW("\n") -SLANG_RAW(" uint2 Load2(int location, out uint status);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"uvec3($0._data[$1/4], $0._data[$1/4+1], $0._data[$1/4+2])\")\n") -SLANG_RAW(" uint3 Load3(int location);\n") -SLANG_RAW("\n") -SLANG_RAW(" uint3 Load3(int location, out uint status);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"uvec4($0._data[$1/4], $0._data[$1/4+1], $0._data[$1/4+2], $0._data[$1/4+3])\")\n") -SLANG_RAW(" uint4 Load4(int location);\n") -SLANG_RAW("\n") -SLANG_RAW(" uint4 Load4(int location, out uint status);\n") -SLANG_RAW("\n") -SLANG_RAW(" // Added operations:\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"($3 = atomicAdd($0._data[$1/4], $2))\")\n") -SLANG_RAW(" void InterlockedAdd(\n") -SLANG_RAW(" UINT dest,\n") -SLANG_RAW(" UINT value,\n") -SLANG_RAW(" out UINT original_value);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"atomicAdd($0._data[$1/4], $2)\")\n") -SLANG_RAW(" void InterlockedAdd(\n") -SLANG_RAW(" UINT dest,\n") -SLANG_RAW(" UINT value);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"($3 = atomicAnd($0._data[$1/4], $2))\")\n") -SLANG_RAW(" void InterlockedAnd(\n") -SLANG_RAW(" UINT dest,\n") -SLANG_RAW(" UINT value,\n") -SLANG_RAW(" out UINT original_value);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"atomicAnd($0._data[$1/4], $2)\")\n") -SLANG_RAW(" void InterlockedAnd(\n") -SLANG_RAW(" UINT dest,\n") -SLANG_RAW(" UINT value);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"($4 = atomicCompSwap($0._data[$1/4], $2, $3))\")\n") -SLANG_RAW(" void InterlockedCompareExchange(\n") -SLANG_RAW(" UINT dest,\n") -SLANG_RAW(" UINT compare_value,\n") -SLANG_RAW(" UINT value,\n") -SLANG_RAW(" out UINT original_value);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"atomicCompSwap($0._data[$1/4], $2, $3)\")\n") -SLANG_RAW(" void InterlockedCompareStore(\n") -SLANG_RAW(" UINT dest,\n") -SLANG_RAW(" UINT compare_value,\n") -SLANG_RAW(" UINT value);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"($3 = atomicExchange($0._data[$1/4], $2))\")\n") -SLANG_RAW(" void InterlockedExchange(\n") -SLANG_RAW(" UINT dest,\n") -SLANG_RAW(" UINT value,\n") -SLANG_RAW(" out UINT original_value);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"($3 = atomicMax($0._data[$1/4], $2))\")\n") -SLANG_RAW(" void InterlockedMax(\n") -SLANG_RAW(" UINT dest,\n") -SLANG_RAW(" UINT value,\n") -SLANG_RAW(" out UINT original_value);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"atomicMax($0._data[$1/4], $2)\")\n") -SLANG_RAW(" void InterlockedMax(\n") -SLANG_RAW(" UINT dest,\n") -SLANG_RAW(" UINT value);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"($3 = atomicMin($0._data[$1/4], $2))\")\n") -SLANG_RAW(" void InterlockedMin(\n") -SLANG_RAW(" UINT dest,\n") -SLANG_RAW(" UINT value,\n") -SLANG_RAW(" out UINT original_value);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"atomicMin($0._data[$1/4], $2)\")\n") -SLANG_RAW(" void InterlockedMin(\n") -SLANG_RAW(" UINT dest,\n") -SLANG_RAW(" UINT value);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"($3 = atomicOr($0._data[$1/4], $2))\")\n") -SLANG_RAW(" void InterlockedOr(\n") -SLANG_RAW(" UINT dest,\n") -SLANG_RAW(" UINT value,\n") -SLANG_RAW(" out UINT original_value);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"atomicOr($0._data[$1/4], $2)\")\n") -SLANG_RAW(" void InterlockedOr(\n") -SLANG_RAW(" UINT dest,\n") -SLANG_RAW(" UINT value);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"($3 = atomicXor($0._data[$1/4], $2))\")\n") -SLANG_RAW(" void InterlockedXor(\n") -SLANG_RAW(" UINT dest,\n") -SLANG_RAW(" UINT value,\n") -SLANG_RAW(" out UINT original_value);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"atomicXor($0._data[$1/4], $2)\")\n") -SLANG_RAW(" void InterlockedXor(\n") -SLANG_RAW(" UINT dest,\n") -SLANG_RAW(" UINT value);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"$0._data[$1/4] = $2\")\n") -SLANG_RAW(" void Store(\n") -SLANG_RAW(" uint address,\n") -SLANG_RAW(" uint value);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"$0._data[$1/4] = $2.x, $0._data[$1/4+1] = $2.y\")\n") -SLANG_RAW(" void Store2(\n") -SLANG_RAW(" uint address,\n") -SLANG_RAW(" uint2 value);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"$0._data[$1/4] = $2.x, $0._data[$1/4+1] = $2.y, $0._data[$1/4+2] = $2.z\")\n") -SLANG_RAW(" void Store3(\n") -SLANG_RAW(" uint address,\n") -SLANG_RAW(" uint3 value);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"$0._data[$1/4] = $2.x, $0._data[$1/4+1] = $2.y, $0._data[$1/4+2] = $2.z, $0._data[$1/4+3] = $2.w\")\n") -SLANG_RAW(" void Store4(\n") -SLANG_RAW(" uint address,\n") -SLANG_RAW(" uint4 value);\n") -SLANG_RAW("};\n") -SLANG_RAW("\n") - -} -SLANG_RAW("#line 248 \"hlsl.meta.slang\"") -SLANG_RAW("\n") -SLANG_RAW("\n") - -static const struct { - IROp op; - char const* name; -} kMutableStructuredBufferCases[] = -{ - { kIROp_HLSLRWStructuredBufferType, "RWStructuredBuffer" }, - { kIROp_HLSLRasterizerOrderedStructuredBufferType, "RasterizerOrderedStructuredBuffer" }, -}; -for(auto item : kMutableStructuredBufferCases) { -SLANG_RAW("#line 260 \"hlsl.meta.slang\"") -SLANG_RAW("\n") -SLANG_RAW("\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T>\n") -SLANG_RAW("__magic_type(HLSL") -SLANG_SPLICE(item.name -) -SLANG_RAW("Type)\n") -SLANG_RAW("__intrinsic_type(") -SLANG_SPLICE(item.op -) -SLANG_RAW(")\n") -SLANG_RAW("struct ") -SLANG_SPLICE(item.name -) -SLANG_RAW("\n") -SLANG_RAW("{\n") -SLANG_RAW(" uint DecrementCounter();\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"$1 = $0._data.length(); $2 = 0\")\n") -SLANG_RAW(" void GetDimensions(\n") -SLANG_RAW(" out uint numStructs,\n") -SLANG_RAW(" out uint stride);\n") -SLANG_RAW("\n") -SLANG_RAW(" uint IncrementCounter();\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"$0._data[$1]\")\n") -SLANG_RAW(" T Load(int location);\n") -SLANG_RAW(" T Load(int location, out uint status);\n") -SLANG_RAW("\n") -SLANG_RAW(" __subscript(uint index) -> T\n") -SLANG_RAW(" {\n") -SLANG_RAW(" __target_intrinsic(glsl, \"$0._data[$1]\")\n") -SLANG_RAW(" ref;\n") -SLANG_RAW(" }\n") -SLANG_RAW("};\n") -SLANG_RAW("\n") - -} -SLANG_RAW("#line 290 \"hlsl.meta.slang\"") -SLANG_RAW("\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T>\n") -SLANG_RAW("__magic_type(HLSLPointStreamType)\n") -SLANG_RAW("__intrinsic_type(") -SLANG_SPLICE(kIROp_HLSLPointStreamType -) -SLANG_RAW(")\n") -SLANG_RAW("struct PointStream\n") -SLANG_RAW("{\n") -SLANG_RAW(" __target_intrinsic(glsl, \"EmitVertex()\")\n") -SLANG_RAW(" void Append(T value);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"EndPrimitive()\")\n") -SLANG_RAW(" void RestartStrip();\n") -SLANG_RAW("};\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T>\n") -SLANG_RAW("__magic_type(HLSLLineStreamType)\n") -SLANG_RAW("__intrinsic_type(") -SLANG_SPLICE(kIROp_HLSLLineStreamType -) -SLANG_RAW(")\n") -SLANG_RAW("struct LineStream\n") -SLANG_RAW("{\n") -SLANG_RAW(" __target_intrinsic(glsl, \"EmitVertex()\")\n") -SLANG_RAW(" void Append(T value);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"EndPrimitive()\")\n") -SLANG_RAW(" void RestartStrip();\n") -SLANG_RAW("};\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T>\n") -SLANG_RAW("__magic_type(HLSLTriangleStreamType)\n") -SLANG_RAW("__intrinsic_type(") -SLANG_SPLICE(kIROp_HLSLTriangleStreamType -) -SLANG_RAW(")\n") -SLANG_RAW("struct TriangleStream\n") -SLANG_RAW("{\n") -SLANG_RAW(" __target_intrinsic(glsl, \"EmitVertex()\")\n") -SLANG_RAW(" void Append(T value);\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(glsl, \"EndPrimitive()\")\n") -SLANG_RAW(" void RestartStrip();\n") -SLANG_RAW("};\n") -SLANG_RAW("\n") -SLANG_RAW("#define VECTOR_MAP_UNARY(TYPE, COUNT, FUNC, VALUE) \\\n") -SLANG_RAW(" vector<TYPE,COUNT> result; for(int i = 0; i < COUNT; ++i) { result[i] = FUNC(VALUE[i]); } return result\n") -SLANG_RAW(" \n") -SLANG_RAW("#define MATRIX_MAP_UNARY(TYPE, ROWS, COLS, FUNC, VALUE) \\\n") -SLANG_RAW(" matrix<TYPE,ROWS,COLS> result; for(int i = 0; i < ROWS; ++i) { result[i] = FUNC(VALUE[i]); } return result\n") -SLANG_RAW("\n") -SLANG_RAW("#define VECTOR_MAP_BINARY(TYPE, COUNT, FUNC, LEFT, RIGHT) \\\n") -SLANG_RAW(" vector<TYPE,COUNT> result; for(int i = 0; i < COUNT; ++i) { result[i] = FUNC(LEFT[i], RIGHT[i]); } return result\n") -SLANG_RAW(" \n") -SLANG_RAW("#define MATRIX_MAP_BINARY(TYPE, ROWS, COLS, FUNC, LEFT, RIGHT) \\\n") -SLANG_RAW(" matrix<TYPE,ROWS,COLS> result; for(int i = 0; i < ROWS; ++i) { result[i] = FUNC(LEFT[i], RIGHT[i]); } return result\n") -SLANG_RAW("\n") -SLANG_RAW("#define VECTOR_MAP_TRINARY(TYPE, COUNT, FUNC, A, B, C) \\\n") -SLANG_RAW(" vector<TYPE,COUNT> result; for(int i = 0; i < COUNT; ++i) { result[i] = FUNC(A[i], B[i], C[i]); } return result\n") -SLANG_RAW(" \n") -SLANG_RAW("#define MATRIX_MAP_TRINARY(TYPE, ROWS, COLS, FUNC, A, B, C) \\\n") -SLANG_RAW(" matrix<TYPE,ROWS,COLS> result; for(int i = 0; i < ROWS; ++i) { result[i] = FUNC(A[i], B[i], C[i]); } return result\n") -SLANG_RAW("\n") -SLANG_RAW("// Try to terminate the current draw or dispatch call (HLSL SM 4.0)\n") -SLANG_RAW("void abort();\n") -SLANG_RAW("\n") -SLANG_RAW("// Absolute value (HLSL SM 1.0)\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinSignedArithmeticType>\n") -SLANG_RAW("T abs(T x);\n") -SLANG_RAW("/*{\n") -SLANG_RAW(" return x < 0 ? -x : x;\n") -SLANG_RAW("}*/\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinSignedArithmeticType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T, N> abs(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, abs, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinSignedArithmeticType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T,N,M> abs(matrix<T,N,M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, abs, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Inverse cosine (HLSL SM 1.0)\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("T acos(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T, N> acos(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, acos, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> acos(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, acos, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Test if all components are non-zero (HLSL SM 1.0)\n") -SLANG_RAW("__generic<T : __BuiltinType>\n") -SLANG_RAW("__target_intrinsic(glsl, \"bool($0)\")\n") -SLANG_RAW("bool all(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, \"all(bvec$N0($0))\")\n") -SLANG_RAW("bool all(vector<T,N> x);\n") -SLANG_RAW("// TODO: implementation of `all()` in the stdlib is\n") -SLANG_RAW("// blocked on fixing implementation of `bool` vector\n") -SLANG_RAW("// `getAt` on the CUDA codegen path.\n") -SLANG_RAW("/*\n") -SLANG_RAW("{\n") -SLANG_RAW(" bool result = true;\n") -SLANG_RAW(" for(int i = 0; i < N; ++i)\n") -SLANG_RAW(" result = result && all(x[i]);\n") -SLANG_RAW(" return result;\n") -SLANG_RAW("}\n") -SLANG_RAW("*/\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("bool all(matrix<T,N,M> x);\n") -SLANG_RAW("/*\n") -SLANG_RAW("{\n") -SLANG_RAW(" bool result = true;\n") -SLANG_RAW(" for(int i = 0; i < N; ++i)\n") -SLANG_RAW(" result = result && all(x[i]);\n") -SLANG_RAW(" return result;\n") -SLANG_RAW("}\n") -SLANG_RAW("*/\n") -SLANG_RAW("\n") -SLANG_RAW("// Barrier for writes to all memory spaces (HLSL SM 5.0)\n") -SLANG_RAW("__target_intrinsic(glsl, \"memoryBarrier(), groupMemoryBarrier(), memoryBarrierImage(), memoryBarrierBuffer()\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"__threadfence()\")\n") -SLANG_RAW("void AllMemoryBarrier();\n") -SLANG_RAW("\n") -SLANG_RAW("// Thread-group sync and barrier for writes to all memory spaces (HLSL SM 5.0)\n") -SLANG_RAW("__target_intrinsic(glsl, \"memoryBarrier(), groupMemoryBarrier(), memoryBarrierImage(), memoryBarrierBuffer(), barrier()\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"__syncthreads()\")\n") -SLANG_RAW("void AllMemoryBarrierWithGroupSync();\n") -SLANG_RAW("\n") -SLANG_RAW("// Test if any components is non-zero (HLSL SM 1.0)\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinType>\n") -SLANG_RAW("__target_intrinsic(glsl, \"bool($0)\")\n") -SLANG_RAW("bool any(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, \"any(bvec$N0($0))\")\n") -SLANG_RAW("bool any(vector<T, N> x);\n") -SLANG_RAW("// TODO: implementation of `any()` in the stdlib is\n") -SLANG_RAW("// blocked on fixing implementation of `bool` vector\n") -SLANG_RAW("// `getAt` on the CUDA codegen path.\n") -SLANG_RAW("/*\n") -SLANG_RAW("{\n") -SLANG_RAW(" bool result = false;\n") -SLANG_RAW(" for(int i = 0; i < N; ++i)\n") -SLANG_RAW(" result = result || any(x[i]);\n") -SLANG_RAW(" return result;\n") -SLANG_RAW("}\n") -SLANG_RAW("*/\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("bool any(matrix<T, N, M> x);\n") -SLANG_RAW("/*\n") -SLANG_RAW("{\n") -SLANG_RAW(" bool result = false;\n") -SLANG_RAW(" for(int i = 0; i < N; ++i)\n") -SLANG_RAW(" result = result || any(x[i]);\n") -SLANG_RAW(" return result;\n") -SLANG_RAW("}\n") -SLANG_RAW("*/\n") -SLANG_RAW("\n") -SLANG_RAW("\n") -SLANG_RAW("// Reinterpret bits as a double (HLSL SM 5.0)\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, \"packDouble2x32(uvec2($0, $1))\")\n") -SLANG_RAW("__glsl_extension(GL_ARB_gpu_shader5)\n") -SLANG_RAW("double asdouble(uint lowbits, uint highbits);\n") -SLANG_RAW("\n") -SLANG_RAW("// Reinterpret bits as a float (HLSL SM 4.0)\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, \"intBitsToFloat\")\n") -SLANG_RAW("float asfloat(int x);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, \"uintBitsToFloat\")\n") -SLANG_RAW("float asfloat(uint x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, \"intBitsToFloat\")\n") -SLANG_RAW("vector<float, N> asfloat(vector< int, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(float, N, asfloat, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, \"uintBitsToFloat\")\n") -SLANG_RAW("vector<float,N> asfloat(vector<uint,N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(float, N, asfloat, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<float,N,M> asfloat(matrix< int,N,M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(float, N, M, asfloat, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<float,N,M> asfloat(matrix<uint,N,M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(float, N, M, asfloat, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// No op\n") -SLANG_RAW("__intrinsic_op(") -SLANG_SPLICE(kCompoundIntrinsicOp_Pos -) -SLANG_RAW(")\n") -SLANG_RAW("float asfloat(float x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<let N : int>\n") -SLANG_RAW("__intrinsic_op(") -SLANG_SPLICE(kCompoundIntrinsicOp_Pos -) -SLANG_RAW(")\n") -SLANG_RAW("vector<float,N> asfloat(vector<float,N> x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<let N : int, let M : int>\n") -SLANG_RAW("__intrinsic_op(") -SLANG_SPLICE(kCompoundIntrinsicOp_Pos -) -SLANG_RAW(")\n") -SLANG_RAW("matrix<float,N,M> asfloat(matrix<float,N,M> x);\n") -SLANG_RAW("\n") -SLANG_RAW("// Inverse sine (HLSL SM 1.0)\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("T asin(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T, N> asin(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T,N,asin,x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> asin(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T,N,M,asin,x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Reinterpret bits as an int (HLSL SM 4.0)\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, \"floatBitsToInt\")\n") -SLANG_RAW("int asint(float x);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, \"int($0)\")\n") -SLANG_RAW("int asint(uint x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, \"floatBitsToInt\")\n") -SLANG_RAW("vector<int, N> asint(vector<float, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(int, N, asint, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, \"ivec$N0($0)\")\n") -SLANG_RAW("vector<int, N> asint(vector<uint, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(int, N, asint, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<int, N, M> asint(matrix<float, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(int, N, M, asint, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<int, N, M> asint(matrix<uint, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(int, N, M, asint, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// No op\n") -SLANG_RAW("__intrinsic_op(") -SLANG_SPLICE(kCompoundIntrinsicOp_Pos -) -SLANG_RAW(")\n") -SLANG_RAW("int asint(int x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<let N : int>\n") -SLANG_RAW("__intrinsic_op(") -SLANG_SPLICE(kCompoundIntrinsicOp_Pos -) -SLANG_RAW(")\n") -SLANG_RAW("vector<int,N> asint(vector<int,N> x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<let N : int, let M : int>\n") -SLANG_RAW("__intrinsic_op(") -SLANG_SPLICE(kCompoundIntrinsicOp_Pos -) -SLANG_RAW(")\n") -SLANG_RAW("matrix<int,N,M> asint(matrix<int,N,M> x);\n") -SLANG_RAW("\n") -SLANG_RAW("// Reinterpret bits of double as a uint (HLSL SM 5.0)\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, \"{ uvec2 v = unpackDouble2x32($0); $1 = v.x; $2 = v.y; }\")\n") -SLANG_RAW("__glsl_extension(GL_ARB_gpu_shader5)\n") -SLANG_RAW("void asuint(double value, out uint lowbits, out uint highbits);\n") -SLANG_RAW("\n") -SLANG_RAW("// Reinterpret bits as a uint (HLSL SM 4.0)\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, \"floatBitsToUint\")\n") -SLANG_RAW("uint asuint(float x);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, \"uint($0)\")\n") -SLANG_RAW("uint asuint(int x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, \"floatBitsToUint\")\n") -SLANG_RAW("vector<uint,N> asuint(vector<float,N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(uint, N, asuint, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, \"uvec$N0($0)\")\n") -SLANG_RAW("vector<uint, N> asuint(vector<int, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(uint, N, asuint, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<uint,N,M> asuint(matrix<float,N,M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(uint, N, M, asuint, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<uint, N, M> asuint(matrix<int, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(uint, N, M, asuint, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__intrinsic_op(") -SLANG_SPLICE(kCompoundIntrinsicOp_Pos -) -SLANG_RAW(")\n") -SLANG_RAW("uint asuint(uint x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<let N : int>\n") -SLANG_RAW("__intrinsic_op(") -SLANG_SPLICE(kCompoundIntrinsicOp_Pos -) -SLANG_RAW(")\n") -SLANG_RAW("vector<uint,N> asuint(vector<uint,N> x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<let N : int, let M : int>\n") -SLANG_RAW("__intrinsic_op(") -SLANG_SPLICE(kCompoundIntrinsicOp_Pos -) -SLANG_RAW(")\n") -SLANG_RAW("matrix<uint,N,M> asuint(matrix<uint,N,M> x);\n") -SLANG_RAW("\n") -SLANG_RAW("// Inverse tangent (HLSL SM 1.0)\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("T atan(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T, N> atan(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, atan, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> atan(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, atan, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl,\"atan($0,$1)\")\n") -SLANG_RAW("T atan2(T y, T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl,\"atan($0,$1)\")\n") -SLANG_RAW("vector<T, N> atan2(vector<T, N> y, vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_BINARY(T, N, atan2, y, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T,N,M> atan2(matrix<T,N,M> y, matrix<T,N,M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_BINARY(T, N, M, atan2, y, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Ceiling (HLSL SM 1.0)\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("T ceil(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T, N> ceil(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, ceil, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> ceil(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, ceil, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("\n") -SLANG_RAW("// Check access status to tiled resource\n") -SLANG_RAW("bool CheckAccessFullyMapped(uint status);\n") -SLANG_RAW("\n") -SLANG_RAW("// Clamp (HLSL SM 1.0)\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("T clamp(T x, T minBound, T maxBound)\n") -SLANG_RAW("{\n") -SLANG_RAW(" return min(max(x, minBound), maxBound);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T, N> clamp(vector<T, N> x, vector<T, N> minBound, vector<T, N> maxBound)\n") -SLANG_RAW("{\n") -SLANG_RAW(" return min(max(x, minBound), maxBound);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T,N,M> clamp(matrix<T,N,M> x, matrix<T,N,M> minBound, matrix<T,N,M> maxBound)\n") -SLANG_RAW("{\n") -SLANG_RAW(" return min(max(x, minBound), maxBound);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Clip (discard) fragment conditionally\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("void clip(T x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" if(x < T(0)) discard;\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("void clip(vector<T,N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" if(any(x < T(0))) discard;\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("void clip(matrix<T,N,M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" if(any(x < T(0))) discard;\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Cosine\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("T cos(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T, N> cos(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T,N, cos, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> cos(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, cos, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Hyperbolic cosine\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("T cosh(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T,N> cosh(vector<T,N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T,N, cosh, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> cosh(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, cosh, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Population count\n") -SLANG_RAW("__target_intrinsic(glsl, \"bitCount\")\n") -SLANG_RAW("uint countbits(uint value);\n") -SLANG_RAW("\n") -SLANG_RAW("// Cross product\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T,3> cross(vector<T,3> left, vector<T,3> right)\n") -SLANG_RAW("{\n") -SLANG_RAW(" return vector<T,3>(\n") -SLANG_RAW(" left.y * right.z - left.z * right.y,\n") -SLANG_RAW(" left.z * right.x - left.x * right.z,\n") -SLANG_RAW(" left.x * right.y - left.y * right.x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Convert encoded color\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("int4 D3DCOLORtoUBYTE4(float4 color)\n") -SLANG_RAW("{\n") -SLANG_RAW(" let scaled = color.zyxw * 255.001999f;\n") -SLANG_RAW(" return int4(scaled);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Partial-difference derivatives\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("__target_intrinsic(glsl, dFdx)\n") -SLANG_RAW("T ddx(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, dFdx)\n") -SLANG_RAW("vector<T, N> ddx(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, ddx, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> ddx(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, ddx, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__glsl_extension(GL_ARB_derivative_control)\n") -SLANG_RAW("__target_intrinsic(glsl, dFdxCoarse)\n") -SLANG_RAW("T ddx_coarse(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__glsl_extension(GL_ARB_derivative_control)\n") -SLANG_RAW("__target_intrinsic(glsl, dFdxCoarse)\n") -SLANG_RAW("vector<T, N> ddx_coarse(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, ddx_coarse, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> ddx_coarse(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, ddx_coarse, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__glsl_extension(GL_ARB_derivative_control)\n") -SLANG_RAW("__target_intrinsic(glsl, dFdxFine)\n") -SLANG_RAW("T ddx_fine(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__glsl_extension(GL_ARB_derivative_control)\n") -SLANG_RAW("__target_intrinsic(glsl, dFdxFine)\n") -SLANG_RAW("vector<T, N> ddx_fine(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, ddx_fine, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> ddx_fine(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, ddx_fine, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, dFdy)\n") -SLANG_RAW("T ddy(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, dFdy)\n") -SLANG_RAW("vector<T, N> ddy(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, ddy, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> ddy(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, ddy, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("__glsl_extension(GL_ARB_derivative_control)\n") -SLANG_RAW("__target_intrinsic(glsl, dFdyCoarse)\n") -SLANG_RAW("T ddy_coarse(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__glsl_extension(GL_ARB_derivative_control)\n") -SLANG_RAW("__target_intrinsic(glsl, dFdyCoarse)\n") -SLANG_RAW("vector<T, N> ddy_coarse(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, ddy_coarse, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> ddy_coarse(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, ddy_coarse, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__glsl_extension(GL_ARB_derivative_control)\n") -SLANG_RAW("__target_intrinsic(glsl, dFdyFine)\n") -SLANG_RAW("T ddy_fine(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__glsl_extension(GL_ARB_derivative_control)\n") -SLANG_RAW("__target_intrinsic(glsl, dFdyFine)\n") -SLANG_RAW("vector<T, N> ddy_fine(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, ddy_fine, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> ddy_fine(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, ddy_fine, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("\n") -SLANG_RAW("// Radians to degrees\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("T degrees(T x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" return x * (T(180) / T.getPi());\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T, N> degrees(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, degrees, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> degrees(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, degrees, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Matrix determinant\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int> T determinant(matrix<T,N,N> m);\n") -SLANG_RAW("\n") -SLANG_RAW("// Barrier for device memory\n") -SLANG_RAW("__target_intrinsic(glsl, \"memoryBarrier(), memoryBarrierImage(), memoryBarrierBuffer()\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"__threadfence()\")\n") -SLANG_RAW("void DeviceMemoryBarrier();\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"memoryBarrier(), memoryBarrierImage(), memoryBarrierBuffer(), barrier()\")\n") -SLANG_RAW("__target_intrinsic(glsl, \"__syncthreads()\")\n") -SLANG_RAW("void DeviceMemoryBarrierWithGroupSync();\n") -SLANG_RAW("\n") -SLANG_RAW("// Vector distance\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("T distance(vector<T, N> x, vector<T, N> y)\n") -SLANG_RAW("{\n") -SLANG_RAW(" return length(x - y);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Vector dot product\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("T dot(vector<T, N> x, vector<T, N> y)\n") -SLANG_RAW("{\n") -SLANG_RAW(" T result = T(0);\n") -SLANG_RAW(" for(int i = 0; i < N; ++i)\n") -SLANG_RAW(" result += x[i] * y[i];\n") -SLANG_RAW(" return result;\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Helper for computing distance terms for lighting (obsolete)\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType> vector<T,4> dst(vector<T,4> x, vector<T,4> y);\n") -SLANG_RAW("\n") -SLANG_RAW("// Error message\n") -SLANG_RAW("\n") -SLANG_RAW("// void errorf( string format, ... );\n") -SLANG_RAW("\n") -SLANG_RAW("// Attribute evaluation\n") -SLANG_RAW("\n") -SLANG_RAW("// TODO: The matrix cases of these functions won't actuall work\n") -SLANG_RAW("// when compiled to GLSL, since they only support scalar/vector\n") -SLANG_RAW("\n") -SLANG_RAW("// TODO: Should these be constrains to `__BuiltinFloatingPointType`?\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType>\n") -SLANG_RAW("__target_intrinsic(glsl, interpolateAtCentroid)\n") -SLANG_RAW("T EvaluateAttributeAtCentroid(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int>\n") -SLANG_RAW("__target_intrinsic(glsl, interpolateAtCentroid)\n") -SLANG_RAW("vector<T,N> EvaluateAttributeAtCentroid(vector<T,N> x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(glsl, interpolateAtCentroid)\n") -SLANG_RAW("matrix<T,N,M> EvaluateAttributeAtCentroid(matrix<T,N,M> x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType>\n") -SLANG_RAW("__target_intrinsic(glsl, \"interpolateAtSample($0, int($1))\")\n") -SLANG_RAW("T EvaluateAttributeAtSample(T x, uint sampleindex);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int>\n") -SLANG_RAW("__target_intrinsic(glsl, \"interpolateAtSample($0, int($1))\")\n") -SLANG_RAW("vector<T,N> EvaluateAttributeAtSample(vector<T,N> x, uint sampleindex);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(glsl, \"interpolateAtSample($0, int($1))\")\n") -SLANG_RAW("matrix<T,N,M> EvaluateAttributeAtSample(matrix<T,N,M> x, uint sampleindex);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType>\n") -SLANG_RAW("__target_intrinsic(glsl, \"interpolateAtOffset($0, vec2($1) / 16.0f)\")\n") -SLANG_RAW("T EvaluateAttributeSnapped(T x, int2 offset);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int>\n") -SLANG_RAW("__target_intrinsic(glsl, \"interpolateAtOffset($0, vec2($1) / 16.0f)\")\n") -SLANG_RAW("vector<T,N> EvaluateAttributeSnapped(vector<T,N> x, int2 offset);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(glsl, \"interpolateAtOffset($0, vec2($1) / 16.0f)\")\n") -SLANG_RAW("matrix<T,N,M> EvaluateAttributeSnapped(matrix<T,N,M> x, int2 offset);\n") -SLANG_RAW("\n") -SLANG_RAW("// Base-e exponent\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("T exp(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T, N> exp(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, exp, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> exp(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, exp, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Base-2 exponent\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("T exp2(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T,N> exp2(vector<T,N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, exp2, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T,N,M> exp2(matrix<T,N,M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, exp2, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Convert 16-bit float stored in low bits of integer\n") -SLANG_RAW("__target_intrinsic(glsl, \"unpackHalf2x16($0).x\")\n") -SLANG_RAW("float f16tof32(uint value);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<let N : int>\n") -SLANG_RAW("__target_intrinsic(glsl, \"unpackHalf2x16($0).x\")\n") -SLANG_RAW("vector<float,N> f16tof32(vector<uint,N> value);\n") -SLANG_RAW("\n") -SLANG_RAW("// Convert to 16-bit float stored in low bits of integer\n") -SLANG_RAW("__target_intrinsic(glsl, \"packHalf2x16(vec2($0,0.0))\")\n") -SLANG_RAW("uint f32tof16(float value);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<let N : int>\n") -SLANG_RAW("__target_intrinsic(glsl, \"packHalf2x16(vec2($0,0.0))\")\n") -SLANG_RAW("vector<uint,N> f32tof16(vector<float,N> value);\n") -SLANG_RAW("\n") -SLANG_RAW("// Flip surface normal to face forward, if needed\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T,N> faceforward(vector<T,N> n, vector<T,N> i, vector<T,N> ng)\n") -SLANG_RAW("{\n") -SLANG_RAW(" return dot(ng, i) < T(0.0f) ? n : -n;\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Find first set bit starting at high bit and working down\n") -SLANG_RAW("__target_intrinsic(glsl,\"findMSB\")\n") -SLANG_RAW("int firstbithigh(int value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl,\"findMSB\")\n") -SLANG_RAW("__generic<let N : int>\n") -SLANG_RAW("vector<int, N> firstbithigh(vector<int, N> value)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(int, N, firstbithigh, value);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl,\"findMSB\")\n") -SLANG_RAW("uint firstbithigh(uint value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl,\"findMSB\")\n") -SLANG_RAW("__generic<let N : int>\n") -SLANG_RAW("vector<uint,N> firstbithigh(vector<uint,N> value)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(uint, N, firstbithigh, value);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Find first set bit starting at low bit and working up\n") -SLANG_RAW("__target_intrinsic(glsl,\"findLSB\")\n") -SLANG_RAW("int firstbitlow(int value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl,\"findLSB\")\n") -SLANG_RAW("__generic<let N : int>\n") -SLANG_RAW("vector<int,N> firstbitlow(vector<int,N> value)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(int, N, firstbitlow, value);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl,\"findLSB\")\n") -SLANG_RAW("uint firstbitlow(uint value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl,\"findLSB\")\n") -SLANG_RAW("__generic<let N : int>\n") -SLANG_RAW("vector<uint,N> firstbitlow(vector<uint,N> value)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(uint, N, firstbitlow, value);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Floor (HLSL SM 1.0)\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("T floor(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T, N> floor(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, floor, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> floor(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, floor, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Fused multiply-add for doubles\n") -SLANG_RAW("double fma(double a, double b, double c);\n") -SLANG_RAW("__generic<let N : int> vector<double, N> fma(vector<double, N> a, vector<double, N> b, vector<double, N> c);\n") -SLANG_RAW("__generic<let N : int, let M : int> matrix<double,N,M> fma(matrix<double,N,M> a, matrix<double,N,M> b, matrix<double,N,M> c);\n") -SLANG_RAW("\n") -SLANG_RAW("// Floating point remainder of x/y\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("T fmod(T x, T y);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T, N> fmod(vector<T, N> x, vector<T, N> y)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_BINARY(T, N, fmod, x, y);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> fmod(matrix<T, N, M> x, matrix<T, N, M> y)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_BINARY(T, N, M, fmod, x, y);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Fractional part\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("__target_intrinsic(glsl, fract)\n") -SLANG_RAW("T frac(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, fract)\n") -SLANG_RAW("vector<T, N> frac(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, frac, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("matrix<T, N, M> frac(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, frac, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Split float into mantissa and exponent\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("T frexp(T x, out T exp);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T, N> frexp(vector<T, N> x, out vector<T, N> exp)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_BINARY(T, N, frexp, x, exp);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> frexp(matrix<T, N, M> x, out matrix<T, N, M> exp)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_BINARY(T, N, M, frexp, x, exp);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Texture filter width\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("T fwidth(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T, N> fwidth(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, fwidth, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> fwidth(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, fwidth, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Get number of samples in render target\n") -SLANG_RAW("uint GetRenderTargetSampleCount();\n") -SLANG_RAW("\n") -SLANG_RAW("// Get position of given sample\n") -SLANG_RAW("float2 GetRenderTargetSamplePosition(int Index);\n") -SLANG_RAW("\n") -SLANG_RAW("// Group memory barrier\n") -SLANG_RAW("__target_intrinsic(glsl, \"groupMemoryBarrier\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"__threadfence_block\")\n") -SLANG_RAW("void GroupMemoryBarrier();\n") -SLANG_RAW("\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"groupMemoryBarrier(), barrier()\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"__syncthreads()\")\n") -SLANG_RAW("void GroupMemoryBarrierWithGroupSync();\n") -SLANG_RAW("\n") -SLANG_RAW("// Atomics\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"$atomicAdd($A, $1)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"atomicAdd(&$0, $1)\")\n") -SLANG_RAW("void InterlockedAdd(__ref int dest, int value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"$atomicAdd($A, $1)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"atomicAdd((uint*)&$0, $1)\")\n") -SLANG_RAW("void InterlockedAdd(__ref uint dest, uint value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"($2 = $atomicAdd($A, $1))\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"($2 = atomicAdd(&$0, $1))\")\n") -SLANG_RAW("void InterlockedAdd(__ref int dest, int value, out int original_value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"($2 = $atomicAdd($A, $1))\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"($2 = (uint)atomicAdd((uint*)&$0, $1))\")\n") -SLANG_RAW("void InterlockedAdd(__ref uint dest, uint value, out uint original_value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"$atomicAnd($A, $1)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"atomicAnd(&$0, $1)\")\n") -SLANG_RAW("void InterlockedAnd(__ref int dest, int value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"$atomicAnd($A, $1)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"atomicAnd((int*)&$0, $1)\")\n") -SLANG_RAW("void InterlockedAnd(__ref uint dest, uint value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"($2 = $atomicAnd($A, $1))\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"($2 = atomicAnd(&$0, $1))\")\n") -SLANG_RAW("void InterlockedAnd(__ref int dest, int value, out int original_value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"($2 = $atomicAnd($A, $1))\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"($2 = atomicAnd((int*)&$0, $1))\")\n") -SLANG_RAW("void InterlockedAnd(__ref uint dest, uint value, out uint original_value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"($3 = $atomicCompSwap($A, $1, $2))\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"($3 = atomicCAS(&$0, $1, $2))\")\n") -SLANG_RAW("void InterlockedCompareExchange(__ref int dest, int compare_value, int value, out int original_value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"($3 = $atomicCompSwap($A, $1, $2))\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"($3 = (uint)atomicCAS((int*)&$0, $1, $2))\")\n") -SLANG_RAW("void InterlockedCompareExchange(__ref uint dest, uint compare_value, uint value, out uint original_value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"$atomicCompSwap($A, $1, $2)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"atomicCAS(&$0, $1, $2)\")\n") -SLANG_RAW("void InterlockedCompareStore(__ref int dest, int compare_value, int value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"$atomicCompSwap($A, $1, $2)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"atomicCAS((int*)&$0, $1, $2)\")\n") -SLANG_RAW("void InterlockedCompareStore(__ref uint dest, uint compare_value, uint value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"($2 = $atomicExchange($A, $1))\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"($2 = atomicExch(&$0, $1))\")\n") -SLANG_RAW("void InterlockedExchange(__ref int dest, int value, out int original_value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"($2 = $atomicExchange($A, $1))\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"($2 = (uint)atomicExch((int*)&$0, $1))\")\n") -SLANG_RAW("void InterlockedExchange(__ref uint dest, uint value, out uint original_value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"$atomicMax($A, $1)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"atomicMax(&$0, $1)\")\n") -SLANG_RAW("void InterlockedMax(__ref int dest, int value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"$atomicMax($A, $1)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"atomicMax((int*)&$0, $1)\")\n") -SLANG_RAW("void InterlockedMax(__ref uint dest, uint value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"($2 = $atomicMax($A, $1))\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"($2 = atomicMax(&$0, $1))\")\n") -SLANG_RAW("void InterlockedMax(__ref int dest, int value, out int original_value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"($2 = $atomicMax($A, $1))\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"($2 = (uint)atomicMax((int*)&$0, $1))\")\n") -SLANG_RAW("void InterlockedMax(__ref uint dest, uint value, out uint original_value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"$atomicMin($A, $1)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"atomicMin(&$0, $1)\")\n") -SLANG_RAW("void InterlockedMin(__ref int dest, int value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"$atomicMin($A, $1)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"atomicMin((int*)&$0, $1)\")\n") -SLANG_RAW("void InterlockedMin(__ref uint dest, uint value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"($2 = $atomicMin($A, $1))\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"($2 = atomicMin(&$0, $1))\")\n") -SLANG_RAW("void InterlockedMin(__ref int dest, int value, out int original_value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"($2 = $atomicMin($A, $1))\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"($2 = (uint)atomicMin((int*)&$0, $1))\")\n") -SLANG_RAW("void InterlockedMin(__ref uint dest, uint value, out uint original_value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"$atomicOr($A, $1)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"atomicOr(&$0, $1)\")\n") -SLANG_RAW("void InterlockedOr(__ref int dest, int value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"$atomicOr($A, $1)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"atomicOr((int*)&$0, $1)\")\n") -SLANG_RAW("void InterlockedOr(__ref uint dest, uint value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"($2 = $atomicOr($A, $1))\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"($2 = atomicOr(&$0, $1))\")\n") -SLANG_RAW("void InterlockedOr(__ref int dest, int value, out int original_value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"($2 = $atomicOr($A, $1))\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"($2 = (uint)atomicOr((int*)&$0, $1))\")\n") -SLANG_RAW("void InterlockedOr(__ref uint dest, uint value, out uint original_value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"$atomicXor($A, $1)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"atomicXor(&$0, $1)\")\n") -SLANG_RAW("void InterlockedXor(__ref int dest, int value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"$atomicXor($A, $1)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"atomicXor((int*)&$0, $1)\")\n") -SLANG_RAW("void InterlockedXor(__ref uint dest, uint value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"($2 = $atomicXor($A, $1))\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"($2 = atomicXor(&$0, $1))\")\n") -SLANG_RAW("void InterlockedXor(__ref int dest, int value, out int original_value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"($2 = $atomicXor($A, $1))\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"($2 = (uint)atomicXor((int*)&$0, $1))\")\n") -SLANG_RAW("void InterlockedXor(__ref uint dest, uint value, out uint original_value);\n") -SLANG_RAW("\n") -SLANG_RAW("// Is floating-point value finite?\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(cpu)\n") -SLANG_RAW("__target_intrinsic(cuda)\n") -SLANG_RAW("//__target_intrinsic(glsl, \"(!(isinf($0) || isnan($0)))\")\n") -SLANG_RAW("bool isfinite(T x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" return !(isinf(x) || isnan(x));\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("//__target_intrinsic(glsl, \"(!(isinf($0) || isnan($0)))\")\n") -SLANG_RAW("vector<bool, N> isfinite(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(bool, N, isfinite, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<bool, N, M> isfinite(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(bool, N, M, isfinite, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Is floating-point value infinite?\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("bool isinf(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<bool, N> isinf(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(bool, N, isinf, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<bool, N, M> isinf(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(bool, N, M, isinf, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Is floating-point value not-a-number?\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("bool isnan(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<bool, N> isnan(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(bool, N, isnan, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<bool, N, M> isnan(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(bool, N, M, isnan, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Construct float from mantissa and exponent\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, \"($0 * pow(2.0f, $1))\")\n") -SLANG_RAW("T ldexp(T x, T exp);\n") -SLANG_RAW("/*{\n") -SLANG_RAW(" return x * exp2(exp);\n") -SLANG_RAW("}*/\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, \"($0 * pow(2.0f, $1))\")\n") -SLANG_RAW("vector<T, N> ldexp(vector<T, N> x, vector<T, N> exp)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_BINARY(T, N, ldexp, x, exp);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> ldexp(matrix<T, N, M> x, matrix<T, N, M> exp)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_BINARY(T, N, M, ldexp, x, exp);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Vector length\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("T length(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" return sqrt(dot(x, x));\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Linear interpolation\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, mix)\n") -SLANG_RAW("T lerp(T x, T y, T s);\n") -SLANG_RAW("/*{\n") -SLANG_RAW(" return x * (1 - s) + y * s;\n") -SLANG_RAW("}*/\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, mix)\n") -SLANG_RAW("vector<T, N> lerp(vector<T, N> x, vector<T, N> y, vector<T, N> s)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_TRINARY(T, N, lerp, x, y, s);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T,N,M> lerp(matrix<T,N,M> x, matrix<T,N,M> y, matrix<T,N,M> s)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_TRINARY(T, N, M, lerp, x, y, s);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Legacy lighting function (obsolete)\n") -SLANG_RAW("float4 lit(float n_dot_l, float n_dot_h, float m);\n") -SLANG_RAW("\n") -SLANG_RAW("// Base-e logarithm\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("T log(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T, N> log(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, log, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> log(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, log, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Base-10 logarithm\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType> \n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, \"(log( $0 ) * $S0( 0.43429448190325182765112891891661) )\" )\n") -SLANG_RAW("T log10(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, \"(log( $0 ) * $S0(0.43429448190325182765112891891661) )\" )\n") -SLANG_RAW("vector<T,N> log10(vector<T,N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, log10, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> \n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T,N,M> log10(matrix<T,N,M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, log10, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Base-2 logarithm\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("T log2(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T,N> log2(vector<T,N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, log2, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T,N,M> log2(matrix<T,N,M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, log2, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// multiply-add\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, fma)\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType> T mad(T mvalue, T avalue, T bvalue);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, fma)\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> mad(vector<T,N> mvalue, vector<T,N> avalue, vector<T,N> bvalue);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, fma)\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> mad(matrix<T,N,M> mvalue, matrix<T,N,M> avalue, matrix<T,N,M> bvalue);\n") -SLANG_RAW("\n") -SLANG_RAW("// maximum\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType>\n") -SLANG_RAW("T max(T x, T y);\n") -SLANG_RAW("// Note: a stdlib implementation of `max` (or `min`) will require splitting\n") -SLANG_RAW("// floating-point and integer cases apart, because the floating-point\n") -SLANG_RAW("// version needs to correctly handle the case where one of the inputs\n") -SLANG_RAW("// is not-a-number.\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T, N> max(vector<T, N> x, vector<T, N> y)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_BINARY(T, N, max, x, y);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> max(matrix<T, N, M> x, matrix<T, N, M> y)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_BINARY(T, N, M, max, x, y);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// minimum\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType>\n") -SLANG_RAW("T min(T x, T y);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T,N> min(vector<T,N> x, vector<T,N> y)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_BINARY(T, N, min, x, y);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T,N,M> min(matrix<T,N,M> x, matrix<T,N,M> y)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_BINARY(T, N, M, min, x, y);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// split into integer and fractional parts (both with same sign)\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("T modf(T x, out T ip);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T,N> modf(vector<T,N> x, out vector<T,N> ip)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_BINARY(T, N, modf, x, ip);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T,N,M> modf(matrix<T,N,M> x, out matrix<T,N,M> ip)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_BINARY(T, N, M, modf, x, ip);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// msad4 (whatever that is)\n") -SLANG_RAW("uint4 msad4(uint reference, uint2 source, uint4 accum);\n") -SLANG_RAW("\n") -SLANG_RAW("// General inner products\n") -SLANG_RAW("\n") -SLANG_RAW("// scalar-scalar\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType> T mul(T x, T y);\n") -SLANG_RAW("\n") -SLANG_RAW("// scalar-vector and vector-scalar\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> mul(vector<T,N> x, T y);\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> mul(T x, vector<T,N> y);\n") -SLANG_RAW("\n") -SLANG_RAW("// scalar-matrix and matrix-scalar\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int, let M :int> matrix<T,N,M> mul(matrix<T,N,M> x, T y);\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int, let M :int> matrix<T,N,M> mul(T x, matrix<T,N,M> y);\n") -SLANG_RAW("\n") -SLANG_RAW("// vector-vector (dot product)\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int> __intrinsic_op(dot) T mul(vector<T,N> x, vector<T,N> y);\n") -SLANG_RAW("\n") -SLANG_RAW("// vector-matrix\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int, let M : int> __intrinsic_op(mulVectorMatrix) vector<T,M> mul(vector<T,N> x, matrix<T,N,M> y);\n") -SLANG_RAW("\n") -SLANG_RAW("// matrix-vector\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int, let M : int> __intrinsic_op(mulMatrixVector) vector<T,N> mul(matrix<T,N,M> x, vector<T,M> y);\n") -SLANG_RAW("\n") -SLANG_RAW("// matrix-matrix\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let R : int, let N : int, let C : int> __intrinsic_op(mulMatrixMatrix) matrix<T,R,C> mul(matrix<T,R,N> x, matrix<T,N,C> y);\n") -SLANG_RAW("\n") -SLANG_RAW("// noise (deprecated)\n") -SLANG_RAW("\n") -SLANG_RAW("float noise(float x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" return 0;\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<let N : int> float noise(vector<float, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" return 0;\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("/// Indicate that an index may be non-uniform at execution time.\n") -SLANG_RAW("///\n") -SLANG_RAW("/// Shader Model 5.1 and 6.x introduce support for dynamic indexing\n") -SLANG_RAW("/// of arrays of resources, but place the restriction that *by default*\n") -SLANG_RAW("/// the implementation can assume that any value used as an index into\n") -SLANG_RAW("/// such arrays will be dynamically uniform across an entire `Draw` or `Dispatch`\n") -SLANG_RAW("/// (when using instancing, the value must be uniform across all instances;\n") -SLANG_RAW("/// it does not seem that the restriction extends to draws within a multi-draw).\n") -SLANG_RAW("///\n") -SLANG_RAW("/// In order to indicate to the implementation that it cannot make the\n") -SLANG_RAW("/// uniformity assumption, a shader programmer is required to pass the index\n") -SLANG_RAW("/// to the `NonUniformResourceIndex` function before using it as an index.\n") -SLANG_RAW("/// The function superficially acts like an identity function.\n") -SLANG_RAW("///\n") -SLANG_RAW("/// Note: a future version of Slang may take responsibility for inserting calls\n") -SLANG_RAW("/// to this function as necessary in output code, rather than make this\n") -SLANG_RAW("/// the user's responsibility, so that the default behavior of the language\n") -SLANG_RAW("/// is more semantically \"correct.\"\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, nonuniformEXT)\n") -SLANG_RAW("__glsl_extension(GL_EXT_nonuniform_qualifier)\n") -SLANG_RAW("[__readNone]\n") -SLANG_RAW("uint NonUniformResourceIndex(uint index)\n") -SLANG_RAW("{\n") -SLANG_RAW(" return index;\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, nonuniformEXT)\n") -SLANG_RAW("__glsl_extension(GL_EXT_nonuniform_qualifier)\n") -SLANG_RAW("[__readNone]\n") -SLANG_RAW("int NonUniformResourceIndex(int index)\n") -SLANG_RAW("{\n") -SLANG_RAW(" return index;\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Normalize a vector\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> normalize(vector<T,N> x);\n") -SLANG_RAW("/*{\n") -SLANG_RAW(" return x / length(x);\n") -SLANG_RAW("}*/\n") -SLANG_RAW("\n") -SLANG_RAW("// Raise to a power\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("T pow(T x, T y);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T, N> pow(vector<T, N> x, vector<T, N> y)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_BINARY(T, N, pow, x, y);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T,N,M> pow(matrix<T,N,M> x, matrix<T,N,M> y)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_BINARY(T, N, M, pow, x, y);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Output message\n") -SLANG_RAW("\n") -SLANG_RAW("// void printf( string format, ... );\n") -SLANG_RAW("\n") -SLANG_RAW("// Tessellation factor fixup routines\n") -SLANG_RAW("\n") -SLANG_RAW("void Process2DQuadTessFactorsAvg(\n") -SLANG_RAW(" in float4 RawEdgeFactors,\n") -SLANG_RAW(" in float2 InsideScale,\n") -SLANG_RAW(" out float4 RoundedEdgeTessFactors,\n") -SLANG_RAW(" out float2 RoundedInsideTessFactors,\n") -SLANG_RAW(" out float2 UnroundedInsideTessFactors);\n") -SLANG_RAW("\n") -SLANG_RAW("void Process2DQuadTessFactorsMax(\n") -SLANG_RAW(" in float4 RawEdgeFactors,\n") -SLANG_RAW(" in float2 InsideScale,\n") -SLANG_RAW(" out float4 RoundedEdgeTessFactors,\n") -SLANG_RAW(" out float2 RoundedInsideTessFactors,\n") -SLANG_RAW(" out float2 UnroundedInsideTessFactors);\n") -SLANG_RAW("\n") -SLANG_RAW("void Process2DQuadTessFactorsMin(\n") -SLANG_RAW(" in float4 RawEdgeFactors,\n") -SLANG_RAW(" in float2 InsideScale,\n") -SLANG_RAW(" out float4 RoundedEdgeTessFactors,\n") -SLANG_RAW(" out float2 RoundedInsideTessFactors,\n") -SLANG_RAW(" out float2 UnroundedInsideTessFactors);\n") -SLANG_RAW("\n") -SLANG_RAW("void ProcessIsolineTessFactors(\n") -SLANG_RAW(" in float RawDetailFactor,\n") -SLANG_RAW(" in float RawDensityFactor,\n") -SLANG_RAW(" out float RoundedDetailFactor,\n") -SLANG_RAW(" out float RoundedDensityFactor);\n") -SLANG_RAW("\n") -SLANG_RAW("void ProcessQuadTessFactorsAvg(\n") -SLANG_RAW(" in float4 RawEdgeFactors,\n") -SLANG_RAW(" in float InsideScale,\n") -SLANG_RAW(" out float4 RoundedEdgeTessFactors,\n") -SLANG_RAW(" out float2 RoundedInsideTessFactors,\n") -SLANG_RAW(" out float2 UnroundedInsideTessFactors);\n") -SLANG_RAW("\n") -SLANG_RAW("void ProcessQuadTessFactorsMax(\n") -SLANG_RAW(" in float4 RawEdgeFactors,\n") -SLANG_RAW(" in float InsideScale,\n") -SLANG_RAW(" out float4 RoundedEdgeTessFactors,\n") -SLANG_RAW(" out float2 RoundedInsideTessFactors,\n") -SLANG_RAW(" out float2 UnroundedInsideTessFactors);\n") -SLANG_RAW("\n") -SLANG_RAW("void ProcessQuadTessFactorsMin(\n") -SLANG_RAW(" in float4 RawEdgeFactors,\n") -SLANG_RAW(" in float InsideScale,\n") -SLANG_RAW(" out float4 RoundedEdgeTessFactors,\n") -SLANG_RAW(" out float2 RoundedInsideTessFactors,\n") -SLANG_RAW(" out float2 UnroundedInsideTessFactors);\n") -SLANG_RAW("\n") -SLANG_RAW("void ProcessTriTessFactorsAvg(\n") -SLANG_RAW(" in float3 RawEdgeFactors,\n") -SLANG_RAW(" in float InsideScale,\n") -SLANG_RAW(" out float3 RoundedEdgeTessFactors,\n") -SLANG_RAW(" out float RoundedInsideTessFactor,\n") -SLANG_RAW(" out float UnroundedInsideTessFactor);\n") -SLANG_RAW("\n") -SLANG_RAW("void ProcessTriTessFactorsMax(\n") -SLANG_RAW(" in float3 RawEdgeFactors,\n") -SLANG_RAW(" in float InsideScale,\n") -SLANG_RAW(" out float3 RoundedEdgeTessFactors,\n") -SLANG_RAW(" out float RoundedInsideTessFactor,\n") -SLANG_RAW(" out float UnroundedInsideTessFactor);\n") -SLANG_RAW("\n") -SLANG_RAW("void ProcessTriTessFactorsMin(\n") -SLANG_RAW(" in float3 RawEdgeFactors,\n") -SLANG_RAW(" in float InsideScale,\n") -SLANG_RAW(" out float3 RoundedEdgeTessFactors,\n") -SLANG_RAW(" out float RoundedInsideTessFactors,\n") -SLANG_RAW(" out float UnroundedInsideTessFactors);\n") -SLANG_RAW("\n") -SLANG_RAW("// Degrees to radians\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("T radians(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T, N> radians(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, radians, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> radians(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, radians, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Approximate reciprocal\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, \"1.0/($0)\")\n") -SLANG_RAW("T rcp(T x);\n") -SLANG_RAW("/*{\n") -SLANG_RAW(" return T(1) / x;\n") -SLANG_RAW("}*/\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("vector<T, N> rcp(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, rcp, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("// Note: GLSL doesn't define a vector `rcp`, so not intrinsic there\n") -SLANG_RAW("matrix<T, N, M> rcp(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, rcp, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Reflect incident vector across plane with given normal\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("vector<T,N> reflect(vector<T,N> i, vector<T,N> n);\n") -SLANG_RAW("/*{\n") -SLANG_RAW(" return i - T(2) * dot(n,i) * n;\n") -SLANG_RAW("}*/\n") -SLANG_RAW("\n") -SLANG_RAW("// Refract incident vector given surface normal and index of refraction\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("vector<T,N> refract(vector<T,N> i, vector<T,N> n, float eta);\n") -SLANG_RAW("/*{\n") -SLANG_RAW(" let dotNI = dot(n,i);\n") -SLANG_RAW(" let k = T(1) - eta*eta*(T(1) - dotNI * dotNI);\n") -SLANG_RAW(" if(k < 0) return vector<T,N>(T(0));\n") -SLANG_RAW(" return eta * i - (eta * dotNI + sqrt(k)) * n;\n") -SLANG_RAW("}*/\n") -SLANG_RAW("\n") -SLANG_RAW("// Reverse order of bits\n") -SLANG_RAW("__target_intrinsic(glsl, \"bitfieldReverse\")\n") -SLANG_RAW("uint reversebits(uint value);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"bitfieldReverse\")\n") -SLANG_RAW("__generic<let N : int> vector<uint,N> reversebits(vector<uint,N> value);\n") -SLANG_RAW("\n") -SLANG_RAW("// Round-to-nearest\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("T round(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T, N> round(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, round, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T,N,M> round(matrix<T,N,M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, round, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Reciprocal of square root\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, \"inversesqrt($0)\")\n") -SLANG_RAW("T rsqrt(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, \"inversesqrt($0)\")\n") -SLANG_RAW("vector<T, N> rsqrt(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, rsqrt, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> rsqrt(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, rsqrt, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Clamp value to [0,1] range\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("T saturate(T x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" return clamp<T>(x, T(0), T(1));\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("vector<T,N> saturate(vector<T,N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" return clamp<T,N>(x,\n") -SLANG_RAW(" vector<T,N>(T(0)),\n") -SLANG_RAW(" vector<T,N>(T(1)));\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T,N,M> saturate(matrix<T,N,M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, saturate, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Extract sign of value\n") -SLANG_RAW("__generic<T : __BuiltinSignedArithmeticType>\n") -SLANG_RAW("__target_intrinsic(glsl, \"int(sign($0))\")\n") -SLANG_RAW("int sign(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinSignedArithmeticType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl, \"ivec$N0(sign($0))\")\n") -SLANG_RAW("vector<int, N> sign(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(int, N, sign, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinSignedArithmeticType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<int, N, M> sign(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(int, N, M, sign, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("\n") -SLANG_RAW("// Sine\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("T sin(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T, N> sin(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, sin, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> sin(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, sin, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Sine and cosine\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("void sincos(T x, out T s, out T c)\n") -SLANG_RAW("{\n") -SLANG_RAW(" s = sin(x);\n") -SLANG_RAW(" c = cos(x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("void sincos(vector<T,N> x, out vector<T,N> s, out vector<T,N> c)\n") -SLANG_RAW("{\n") -SLANG_RAW(" s = sin(x);\n") -SLANG_RAW(" c = cos(x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("void sincos(matrix<T,N,M> x, out matrix<T,N,M> s, out matrix<T,N,M> c)\n") -SLANG_RAW("{\n") -SLANG_RAW(" s = sin(x);\n") -SLANG_RAW(" c = cos(x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Hyperbolic Sine\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("T sinh(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T, N> sinh(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, sinh, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> sinh(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, sinh, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Smooth step (Hermite interpolation)\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("T smoothstep(T min, T max, T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T, N> smoothstep(vector<T, N> min, vector<T, N> max, vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_TRINARY(T, N, smoothstep, min, max, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> smoothstep(matrix<T, N, M> min, matrix<T, N, M> max, matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_TRINARY(T, N, M, smoothstep, min, max, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Square root\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("T sqrt(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T, N> sqrt(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, sqrt, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> sqrt(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, sqrt, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Step function\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("T step(T y, T x);\n") -SLANG_RAW("/*{\n") -SLANG_RAW(" return x < y ? T(0.0f) : T(1.0f);\n") -SLANG_RAW("}*/\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T,N> step(vector<T,N> y, vector<T,N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_BINARY(T, N, step, y, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> step(matrix<T, N, M> y, matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_BINARY(T, N, M, step, y, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Tangent\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("T tan(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T, N> tan(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, tan, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> tan(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, tan, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Hyperbolic tangent\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("T tanh(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T,N> tanh(vector<T,N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, tanh, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T,N,M> tanh(matrix<T,N,M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, tanh, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Matrix transpose\n") -SLANG_RAW("__generic<T : __BuiltinType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("matrix<T, M, N> transpose(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" matrix<T,M,N> result;\n") -SLANG_RAW(" for(int r = 0; r < M; ++r)\n") -SLANG_RAW(" for(int c = 0; c < N; ++c)\n") -SLANG_RAW(" result[r][c] = x[c][r];\n") -SLANG_RAW(" return result;\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Truncate to integer\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n") -SLANG_RAW("T trunc(T x);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("__target_intrinsic(glsl)\n") -SLANG_RAW("vector<T, N> trunc(vector<T, N> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" VECTOR_MAP_UNARY(T, N, trunc, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n") -SLANG_RAW("__target_intrinsic(hlsl)\n") -SLANG_RAW("matrix<T, N, M> trunc(matrix<T, N, M> x)\n") -SLANG_RAW("{\n") -SLANG_RAW(" MATRIX_MAP_UNARY(T, N, M, trunc, x);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// Shader model 6.0 stuff\n") -SLANG_RAW("\n") -SLANG_RAW("// Information for GLSL wave/subgroup support\n") -SLANG_RAW("// https://github.com/KhronosGroup/GLSL/blob/master/extensions/khr/GL_KHR_shader_subgroup.txt\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinType> T QuadReadLaneAt(T sourceValue, uint quadLaneID);\n") -SLANG_RAW("__generic<T : __BuiltinType, let N : int> vector<T,N> QuadReadLaneAt(vector<T,N> sourceValue, uint quadLaneID);\n") -SLANG_RAW("__generic<T : __BuiltinType, let N : int, let M : int> matrix<T,N,M> QuadReadLaneAt(matrix<T,N,M> sourceValue, uint quadLaneID);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinType> T QuadReadAcrossX(T localValue);\n") -SLANG_RAW("__generic<T : __BuiltinType, let N : int> vector<T,N> QuadReadAcrossX(vector<T,N> localValue);\n") -SLANG_RAW("__generic<T : __BuiltinType, let N : int, let M : int> matrix<T,N,M> QuadReadAcrossX(matrix<T,N,M> localValue);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinType> T QuadReadAcrossY(T localValue);\n") -SLANG_RAW("__generic<T : __BuiltinType, let N : int> vector<T,N> QuadReadAcrossY(vector<T,N> localValue);\n") -SLANG_RAW("__generic<T : __BuiltinType, let N : int, let M : int> matrix<T,N,M> QuadReadAcrossY(matrix<T,N,M> localValue);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinType> T QuadReadAcrossDiagonal(T localValue);\n") -SLANG_RAW("__generic<T : __BuiltinType, let N : int> vector<T,N> QuadReadAcrossDiagonal(vector<T,N> localValue);\n") -SLANG_RAW("__generic<T : __BuiltinType, let N : int, let M : int> matrix<T,N,M> QuadReadAcrossDiagonal(matrix<T,N,M> localValue);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinIntegerType>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_arithmetic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupAnd($0)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"_waveAnd(__activemask(), $0)\")\n") -SLANG_RAW("T WaveActiveBitAnd(T expr);\n") -SLANG_RAW("__generic<T : __BuiltinIntegerType, let N : int>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_arithmetic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupAnd($0)\")\n") -SLANG_RAW("vector<T,N> WaveActiveBitAnd(vector<T,N> expr);\n") -SLANG_RAW("__generic<T : __BuiltinIntegerType, let N : int, let M : int>\n") -SLANG_RAW("matrix<T,N,M> WaveActiveBitAnd(matrix<T,N,M> expr);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinIntegerType>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_arithmetic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupOr($0)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"_waveOr(__activemask(), $0)\")\n") -SLANG_RAW("T WaveActiveBitOr(T expr);\n") -SLANG_RAW("__generic<T : __BuiltinIntegerType, let N : int>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_arithmetic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupOr($0)\")\n") -SLANG_RAW("vector<T,N> WaveActiveBitOr(vector<T,N> expr);\n") -SLANG_RAW("__generic<T : __BuiltinIntegerType, let N : int, let M : int>\n") -SLANG_RAW("matrix<T,N,M> WaveActiveBitOr(matrix<T,N,M> expr);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinIntegerType>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_arithmetic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupXor($0)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"_waveXor(__activemask(), $0)\")\n") -SLANG_RAW("T WaveActiveBitXor(T expr);\n") -SLANG_RAW("__generic<T : __BuiltinIntegerType, let N : int> \n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_arithmetic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupXor($0)\")\n") -SLANG_RAW("vector<T,N> WaveActiveBitXor(vector<T,N> expr);\n") -SLANG_RAW("__generic<T : __BuiltinIntegerType, let N : int, let M : int>\n") -SLANG_RAW("matrix<T,N,M> WaveActiveBitXor(matrix<T,N,M> expr);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_arithmetic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupMax($0)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"_waveMax(__activemask(), $0)\")\n") -SLANG_RAW("T WaveActiveMax(T expr);\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_arithmetic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupMax($0)\")\n") -SLANG_RAW("vector<T,N> WaveActiveMax(vector<T,N> expr);\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int, let M : int>\n") -SLANG_RAW("matrix<T,N,M> WaveActiveMax(matrix<T,N,M> expr);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_arithmetic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupMin($0)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"_waveMin(__activemask(), $0)\")\n") -SLANG_RAW("T WaveActiveMin(T expr);\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_arithmetic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupMin($0)\")\n") -SLANG_RAW("vector<T,N> WaveActiveMin(vector<T,N> expr);\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int, let M : int>\n") -SLANG_RAW("matrix<T,N,M> WaveActiveMin(matrix<T,N,M> expr);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_arithmetic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupMul($0)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"_waveProduct(__activemask(), $0)\")\n") -SLANG_RAW("T WaveActiveProduct(T expr);\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_arithmetic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupMul($0)\")\n") -SLANG_RAW("vector<T,N> WaveActiveProduct(vector<T,N> expr);\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int, let M : int>\n") -SLANG_RAW("matrix<T,N,M> WaveActiveProduct(matrix<T,N,M> expr);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_arithmetic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupAdd($0)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"_waveSum(__activemask(), $0)\")\n") -SLANG_RAW("T WaveActiveSum(T expr);\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_arithmetic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupAdd($0)\")\n") -SLANG_RAW("vector<T,N> WaveActiveSum(vector<T,N> expr);\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int, let M : int>\n") -SLANG_RAW("matrix<T,N,M> WaveActiveSum(matrix<T,N,M> expr);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinType>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_vote)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupAllEqual($0)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"_waveAllEqual(__activemask(), $0)\")\n") -SLANG_RAW("bool WaveActiveAllEqual(T value);\n") -SLANG_RAW("__generic<T : __BuiltinType, let N : int> \n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_vote)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupAllEqual($0)\")\n") -SLANG_RAW("vector<bool,N> WaveActiveAllEqual(vector<T,N> value);\n") -SLANG_RAW("__generic<T : __BuiltinType, let N : int, let M : int>\n") -SLANG_RAW("matrix<bool,N,M> WaveActiveAllEqual(matrix<T,N,M> value);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinType> uint4 WaveMatch(T value);\n") -SLANG_RAW("__generic<T : __BuiltinType, let N : int> uint4 WaveMatch(vector<T,N> value);\n") -SLANG_RAW("__generic<T : __BuiltinType, let N : int, let M : int> uint4 WaveMatch(matrix<T,N,M> value);\n") -SLANG_RAW("\n") -SLANG_RAW("// TODO(JS): For CUDA the article claims mask has to be used carefully\n") -SLANG_RAW("// https://devblogs.nvidia.com/using-cuda-warp-level-primitives/\n") -SLANG_RAW("// With the Warp intrinsics there is no mask, and it's just the 'active lanes'. So __activemask()\n") -SLANG_RAW("// seems to be appropriate.\n") -SLANG_RAW("\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_vote)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupAll($0)\") \n") -SLANG_RAW("__target_intrinsic(cuda, \"(__all_sync(__activemask(), $0) != 0)\") \n") -SLANG_RAW("bool WaveActiveAllTrue(bool condition);\n") -SLANG_RAW("\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_vote)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupAny($0)\") \n") -SLANG_RAW("__target_intrinsic(cuda, \"(__any_sync(__activemask(), $0) != 0)\")\n") -SLANG_RAW("bool WaveActiveAnyTrue(bool condition);\n") -SLANG_RAW("\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_ballot)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupBallot($0)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"make_uint4(__ballot_sync(__activemask(), $0), 0, 0, 0)\")\n") -SLANG_RAW("uint4 WaveActiveBallot(bool condition);\n") -SLANG_RAW("\n") -SLANG_RAW("// TODO(JS): \n") -SLANG_RAW("// subgroupBallotBitCount seems to take a uint4 parameter. \n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_ballot)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupBallotBitCount($0)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"__popc(__ballot_sync(__activemask(), $0))\")\n") -SLANG_RAW("uint WaveActiveCountBits(bool value);\n") -SLANG_RAW("\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_basic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"gl_SubgroupSize\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"(warpSize)\")\n") -SLANG_RAW("uint WaveGetLaneCount();\n") -SLANG_RAW("\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_basic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"gl_SubgroupInvocationID\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"_getLaneId()\")\n") -SLANG_RAW("uint WaveGetLaneIndex();\n") -SLANG_RAW("\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_basic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupElect()\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"_waveIsFirstLane()\")\n") -SLANG_RAW("bool WaveIsFirstLane();\n") -SLANG_RAW("\n") -SLANG_RAW("// TODO(JS): We cannot calculate prefix sums using a mask of __activemask() & __lanemask_lt(), because (amongst other reasons)\n") -SLANG_RAW("// that would mean different lanes having a different mask, and they all have to have the same mask.\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_arithmetic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupExcusiveMul($0)\")\n") -SLANG_RAW("T WavePrefixProduct(T expr);\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_arithmetic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupExcusiveMul($0)\")\n") -SLANG_RAW("vector<T,N> WavePrefixProduct(vector<T,N> expr);\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int, let M : int>\n") -SLANG_RAW("matrix<T,N,M> WavePrefixProduct(matrix<T,N,M> expr);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_arithmetic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupExcusiveAdd($0)\")\n") -SLANG_RAW("T WavePrefixSum(T expr);\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_arithmetic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupExcusiveAdd($0)\")\n") -SLANG_RAW("vector<T,N> WavePrefixSum(vector<T,N> expr);\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int, let M : int>\n") -SLANG_RAW("matrix<T,N,M> WavePrefixSum(matrix<T,N,M> expr);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_arithmetic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupExcusiveAnd($0)\")\n") -SLANG_RAW("T WaveMultiPrefixBitAnd(T expr);\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_arithmetic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupExcusiveAnd($0)\")\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int>\n") -SLANG_RAW("vector<T,N> WaveMultiPrefixBitAnd(vector<T,N> expr);\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int, let M : int>\n") -SLANG_RAW("matrix<T,N,M> WaveMultiPrefixBitAnd(matrix<T,N,M> expr);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_arithmetic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupExcusiveOr($0)\")\n") -SLANG_RAW("T WaveMultiPrefixBitOr(T expr);\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_arithmetic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupExcusiveOr($0)\")\n") -SLANG_RAW("vector<T,N> WaveMultiPrefixBitOr(vector<T,N> expr);\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int, let M : int>\n") -SLANG_RAW("matrix<T,N,M> WaveMultiPrefixBitOr(matrix<T,N,M> expr);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_arithmetic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupExcusiveXor($0)\")\n") -SLANG_RAW("T WaveMultiPrefixBitXor(T expr);\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_arithmetic)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupExcusiveXor($0)\")\n") -SLANG_RAW("vector<T,N> WaveMultiPrefixBitXor(vector<T,N> expr);\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int, let M : int>\n") -SLANG_RAW("matrix<T,N,M> WaveMultiPrefixBitXor(matrix<T,N,M> expr);\n") -SLANG_RAW("\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_ballot)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupBallotExclusiveBitCount(subgroupBallot($0))\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"__popc(__ballot_sync(__activemask(), $0) & _getLaneLtMask())\")\n") -SLANG_RAW("uint WavePrefixCountBits(bool value);\n") -SLANG_RAW("\n") -SLANG_RAW("uint WaveMultiPrefixCountBits(bool value, uint4 mask);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType> T WaveMultiPrefixProduct(T value, uint4 mask);\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> WaveMultiPrefixProduct(vector<T,N> value, uint4 mask);\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> WaveMultiPrefixProduct(matrix<T,N,M> value, uint4 mask);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType> T WaveMultiPrefixSum(T value, uint4 mask);\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> WaveMultiPrefixSum(vector<T,N> value, uint4 mask);\n") -SLANG_RAW("__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> WaveMultiPrefixSum(matrix<T,N,M> value, uint4 mask);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinType>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_ballot)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupBroadcastFirst($0)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"_waveReadFirst($0)\")\n") -SLANG_RAW("T WaveReadLaneFirst(T expr);\n") -SLANG_RAW("__generic<T : __BuiltinType, let N : int>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_ballot)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupBroadcastFirst($0)\")\n") -SLANG_RAW("vector<T,N> WaveReadLaneFirst(vector<T,N> expr);\n") -SLANG_RAW("__generic<T : __BuiltinType, let N : int, let M : int>\n") -SLANG_RAW("matrix<T,N,M> WaveReadLaneFirst(matrix<T,N,M> expr);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<T : __BuiltinType>\n") -SLANG_RAW("__glsl_extension(GL_KHR_shader_subgroup_ballot)\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupBroadcast($0, $1)\")\n") -SLANG_RAW("__target_intrinsic(cuda, \"__shfl_sync(SLANG_CUDA_WARP_MASK, $0, $1)\")\n") -SLANG_RAW("T WaveReadLaneAt(T value, int lane);\n") -SLANG_RAW("__generic<T : __BuiltinType, let N : int>\n") -SLANG_RAW("__spirv_version(1.3)\n") -SLANG_RAW("__target_intrinsic(glsl, \"subgroupBroadcast($0, $1)\")\n") -SLANG_RAW("vector<T,N> WaveReadLaneAt(vector<T,N> value, int lane);\n") -SLANG_RAW("__generic<T : __BuiltinType, let N : int, let M : int>\n") -SLANG_RAW("matrix<T,N,M> WaveReadLaneAt(matrix<T,N,M> value, int lane);\n") -SLANG_RAW("\n") -SLANG_RAW("\n") -SLANG_RAW("// `typedef`s to help with the fact that HLSL has been sorta-kinda case insensitive at various points\n") -SLANG_RAW("typedef Texture2D texture2D;\n") -SLANG_RAW("\n") - - -// Buffer types - -static const struct { - char const* name; - SlangResourceAccess access; -} kBaseBufferAccessLevels[] = { - { "", SLANG_RESOURCE_ACCESS_READ }, - { "RW", SLANG_RESOURCE_ACCESS_READ_WRITE }, - { "RasterizerOrdered", SLANG_RESOURCE_ACCESS_RASTER_ORDERED }, -}; -static const int kBaseBufferAccessLevelCount = sizeof(kBaseBufferAccessLevels) / sizeof(kBaseBufferAccessLevels[0]); - -for (int aa = 0; aa < kBaseBufferAccessLevelCount; ++aa) -{ - auto access = kBaseBufferAccessLevels[aa].access; - auto flavor = TextureFlavor::create(TextureFlavor::Shape::ShapeBuffer, access).flavor; - sb << "__generic<T>\n"; - sb << "__magic_type(Texture," << int(flavor) << ")\n"; - sb << "__intrinsic_type(" << (kIROp_TextureType + (int(flavor) << kIROpMeta_OtherShift)) << ")\n"; - sb << "struct "; - sb << kBaseBufferAccessLevels[aa].name; - sb << "Buffer {\n"; - - sb << "void GetDimensions(out uint dim);\n"; - - char const* glslLoadFuncName = (access == SLANG_RESOURCE_ACCESS_READ) ? "texelFetch" : "imageLoad"; - - sb << "__glsl_extension(GL_EXT_samplerless_texture_functions)"; - sb << "__target_intrinsic(glsl, \"" << glslLoadFuncName << "($0, $1)$z\")\n"; - sb << "T Load(int location);\n"; - - sb << "T Load(int location, out uint status);\n"; - - sb << "__subscript(uint index) -> T {\n"; - - sb << "__glsl_extension(GL_EXT_samplerless_texture_functions)"; - sb << "__target_intrinsic(glsl, \"" << glslLoadFuncName << "($0, int($1))$z\") get;\n"; - - if (access != SLANG_RESOURCE_ACCESS_READ) - { - sb << "__target_intrinsic(glsl, \"imageStore($0, int($1), $V2)\") set;\n"; - - sb << "__intrinsic_op(" << int(kIROp_ImageSubscript) << ") ref;\n"; - } - - sb << "}\n"; - - sb << "};\n"; -} -SLANG_RAW("#line 2558 \"hlsl.meta.slang\"") -SLANG_RAW("\n") -SLANG_RAW("\n") -SLANG_RAW("\n") -SLANG_RAW("// DirectX Raytracing (DXR) Support\n") -SLANG_RAW("//\n") -SLANG_RAW("// The following is based on the experimental DXR SDK v0.09.01.\n") -SLANG_RAW("//\n") -SLANG_RAW("// Numbering follows the sections in the \"D3D12 Raytracing Functional Spec\" v0.09 (2018-03-12)\n") -SLANG_RAW("//\n") -SLANG_RAW("\n") -SLANG_RAW("// 10.1.1 - Ray Flags\n") -SLANG_RAW("\n") -SLANG_RAW("typedef uint RAY_FLAG;\n") -SLANG_RAW("\n") -SLANG_RAW("static const RAY_FLAG RAY_FLAG_NONE = 0x00;\n") -SLANG_RAW("static const RAY_FLAG RAY_FLAG_FORCE_OPAQUE = 0x01;\n") -SLANG_RAW("static const RAY_FLAG RAY_FLAG_FORCE_NON_OPAQUE = 0x02;\n") -SLANG_RAW("static const RAY_FLAG RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH = 0x04;\n") -SLANG_RAW("static const RAY_FLAG RAY_FLAG_SKIP_CLOSEST_HIT_SHADER = 0x08;\n") -SLANG_RAW("static const RAY_FLAG RAY_FLAG_CULL_BACK_FACING_TRIANGLES = 0x10;\n") -SLANG_RAW("static const RAY_FLAG RAY_FLAG_CULL_FRONT_FACING_TRIANGLES = 0x20;\n") -SLANG_RAW("static const RAY_FLAG RAY_FLAG_CULL_OPAQUE = 0x40;\n") -SLANG_RAW("static const RAY_FLAG RAY_FLAG_CULL_NON_OPAQUE = 0x80;\n") -SLANG_RAW("static const RAY_FLAG RAY_FLAG_SKIP_TRIANGLES = 0x100;\n") -SLANG_RAW("static const RAY_FLAG RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES = 0x200;\n") -SLANG_RAW("\n") -SLANG_RAW("// 10.1.2 - Ray Description Structure\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(hlsl, RayDesc)\n") -SLANG_RAW("struct RayDesc\n") -SLANG_RAW("{\n") -SLANG_RAW(" __target_intrinsic(hlsl, Origin)\n") -SLANG_RAW(" float3 Origin;\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(hlsl, TMin)\n") -SLANG_RAW(" float TMin;\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(hlsl, Direction)\n") -SLANG_RAW(" float3 Direction;\n") -SLANG_RAW("\n") -SLANG_RAW(" __target_intrinsic(hlsl, TMax)\n") -SLANG_RAW(" float TMax;\n") -SLANG_RAW("};\n") -SLANG_RAW("\n") -SLANG_RAW("// 10.1.3 - Ray Acceleration Structure\n") -SLANG_RAW("\n") -SLANG_RAW("__builtin\n") -SLANG_RAW("__magic_type(RaytracingAccelerationStructureType)\n") -SLANG_RAW("__intrinsic_type(") -SLANG_SPLICE(kIROp_RaytracingAccelerationStructureType -) -SLANG_RAW(")\n") -SLANG_RAW("struct RaytracingAccelerationStructure {};\n") -SLANG_RAW("\n") -SLANG_RAW("// 10.1.4 - Subobject Definitions\n") -SLANG_RAW("\n") -SLANG_RAW("// TODO: We may decide to support these, but their reliance on C++ implicit\n") -SLANG_RAW("// constructor call syntax (`SomeType someVar(arg0, arg1);`) makes them\n") -SLANG_RAW("// annoying for the current Slang parsing strategy, and using global variables\n") -SLANG_RAW("// for this stuff comes across as a kludge rather than the best possible design.\n") -SLANG_RAW("\n") -SLANG_RAW("// 10.1.5 - Intersection Attributes Structure\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(hlsl, BuiltInTriangleIntersectionAttributes)\n") -SLANG_RAW("struct BuiltInTriangleIntersectionAttributes\n") -SLANG_RAW("{\n") -SLANG_RAW(" __target_intrinsic(hlsl, barycentrics)\n") -SLANG_RAW(" float2 barycentrics;\n") -SLANG_RAW("};\n") -SLANG_RAW("\n") -SLANG_RAW("// 10.2 Shaders\n") -SLANG_RAW("\n") -SLANG_RAW("// Right now new shader stages need to be added directly to the compiler\n") -SLANG_RAW("// implementation, rather than being something that can be declared in the stdlib.\n") -SLANG_RAW("\n") -SLANG_RAW("// 10.3 - Intrinsics\n") -SLANG_RAW("\n") -SLANG_RAW("// 10.3.1\n") -SLANG_RAW("\n") -SLANG_RAW("void CallShader<Payload>(uint shaderIndex, inout Payload payload);\n") -SLANG_RAW("\n") -SLANG_RAW("// `executeCallableNV` is the GLSL intrinsic that will be used to implement\n") -SLANG_RAW("// `CallShader()` for GLSL-based targets.\n") -SLANG_RAW("//\n") -SLANG_RAW("__target_intrinsic(glsl, \"executeCallableNV\")\n") -SLANG_RAW("void __executeCallableNV(uint shaderIndex, int payloadLocation);\n") -SLANG_RAW("\n") -SLANG_RAW("// Next is the custom intrinsic that will compute the payload location\n") -SLANG_RAW("// for a type being used in a `CallShader()` call for GLSL-based targets.\n") -SLANG_RAW("//\n") -SLANG_RAW("__generic<Payload>\n") -SLANG_RAW("__target_intrinsic(glsl, \"$XC\")\n") -SLANG_RAW("[__readNone]\n") -SLANG_RAW("int __callablePayloadLocation(Payload payload);\n") -SLANG_RAW("\n") -SLANG_RAW("// Now we provide a hard-coded definition of `CallShader()` for GLSL-based\n") -SLANG_RAW("// targets, which maps the generic HLSL operation into the non-generic\n") -SLANG_RAW("// GLSL equivalent.\n") -SLANG_RAW("//\n") -SLANG_RAW("__generic<Payload>\n") -SLANG_RAW("__specialized_for_target(glsl)\n") -SLANG_RAW("void CallShader(uint shaderIndex, inout Payload payload)\n") -SLANG_RAW("{\n") -SLANG_RAW(" [__vulkanRayPayload]\n") -SLANG_RAW(" static Payload p;\n") -SLANG_RAW("\n") -SLANG_RAW(" p = payload;\n") -SLANG_RAW(" __executeCallableNV(shaderIndex, __callablePayloadLocation(p));\n") -SLANG_RAW(" payload = p;\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// 10.3.2\n") -SLANG_RAW("void TraceRay<payload_t>(\n") -SLANG_RAW(" RaytracingAccelerationStructure AccelerationStructure,\n") -SLANG_RAW(" uint RayFlags,\n") -SLANG_RAW(" uint InstanceInclusionMask,\n") -SLANG_RAW(" uint RayContributionToHitGroupIndex,\n") -SLANG_RAW(" uint MultiplierForGeometryContributionToHitGroupIndex,\n") -SLANG_RAW(" uint MissShaderIndex,\n") -SLANG_RAW(" RayDesc Ray,\n") -SLANG_RAW(" inout payload_t Payload);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"traceNV\")\n") -SLANG_RAW("void __traceNV(\n") -SLANG_RAW(" RaytracingAccelerationStructure AccelerationStructure,\n") -SLANG_RAW(" uint RayFlags,\n") -SLANG_RAW(" uint InstanceInclusionMask,\n") -SLANG_RAW(" uint RayContributionToHitGroupIndex,\n") -SLANG_RAW(" uint MultiplierForGeometryContributionToHitGroupIndex,\n") -SLANG_RAW(" uint MissShaderIndex,\n") -SLANG_RAW(" float3 Origin,\n") -SLANG_RAW(" float TMin,\n") -SLANG_RAW(" float3 Direction,\n") -SLANG_RAW(" float TMax,\n") -SLANG_RAW(" int PayloadLocation);\n") -SLANG_RAW("\n") -SLANG_RAW("// TODO: Slang's parsing logic currently puts modifiers on\n") -SLANG_RAW("// the `GenericDecl` rather than the inner decl when\n") -SLANG_RAW("// using our default syntax, which seems wrong. We need\n") -SLANG_RAW("// to fix this, but for now using the expanded `__generic`\n") -SLANG_RAW("// syntax works in a pinch.\n") -SLANG_RAW("//\n") -SLANG_RAW("__generic<Payload>\n") -SLANG_RAW("__target_intrinsic(glsl, \"$XP\")\n") -SLANG_RAW("[__readNone]\n") -SLANG_RAW("int __rayPayloadLocation(Payload payload);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<payload_t>\n") -SLANG_RAW("__specialized_for_target(glsl)\n") -SLANG_RAW("void TraceRay(\n") -SLANG_RAW(" RaytracingAccelerationStructure AccelerationStructure,\n") -SLANG_RAW(" uint RayFlags,\n") -SLANG_RAW(" uint InstanceInclusionMask,\n") -SLANG_RAW(" uint RayContributionToHitGroupIndex,\n") -SLANG_RAW(" uint MultiplierForGeometryContributionToHitGroupIndex,\n") -SLANG_RAW(" uint MissShaderIndex,\n") -SLANG_RAW(" RayDesc Ray,\n") -SLANG_RAW(" inout payload_t Payload)\n") -SLANG_RAW("{\n") -SLANG_RAW(" [__vulkanRayPayload]\n") -SLANG_RAW(" static payload_t p;\n") -SLANG_RAW("\n") -SLANG_RAW(" p = Payload;\n") -SLANG_RAW(" __traceNV(\n") -SLANG_RAW(" AccelerationStructure,\n") -SLANG_RAW(" RayFlags,\n") -SLANG_RAW(" InstanceInclusionMask,\n") -SLANG_RAW(" RayContributionToHitGroupIndex,\n") -SLANG_RAW(" MultiplierForGeometryContributionToHitGroupIndex,\n") -SLANG_RAW(" MissShaderIndex,\n") -SLANG_RAW(" Ray.Origin,\n") -SLANG_RAW(" Ray.TMin,\n") -SLANG_RAW(" Ray.Direction,\n") -SLANG_RAW(" Ray.TMax,\n") -SLANG_RAW(" __rayPayloadLocation(p));\n") -SLANG_RAW(" Payload = p;\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// 10.3.3\n") -SLANG_RAW("bool ReportHit<A>(float tHit, uint hitKind, A attributes);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"reportIntersectionNV\")\n") -SLANG_RAW("bool __reportIntersectionNV(float tHit, uint hitKind);\n") -SLANG_RAW("\n") -SLANG_RAW("__generic<A>\n") -SLANG_RAW("__specialized_for_target(glsl)\n") -SLANG_RAW("bool ReportHit(float tHit, uint hitKind, A attributes)\n") -SLANG_RAW("{\n") -SLANG_RAW(" [__vulkanHitAttributes]\n") -SLANG_RAW(" static A a;\n") -SLANG_RAW("\n") -SLANG_RAW(" a = attributes;\n") -SLANG_RAW(" return __reportIntersectionNV(tHit, hitKind);\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("// 10.3.4\n") -SLANG_RAW("__target_intrinsic(glsl, ignoreIntersectionNV)\n") -SLANG_RAW("void IgnoreHit();\n") -SLANG_RAW("\n") -SLANG_RAW("// 10.3.5\n") -SLANG_RAW("__target_intrinsic(glsl, terminateRayNV)\n") -SLANG_RAW("void AcceptHitAndEndSearch();\n") -SLANG_RAW("\n") -SLANG_RAW("// 10.4 - System Values and Special Semantics\n") -SLANG_RAW("\n") -SLANG_RAW("// TODO: Many of these functions need to be restricted so that\n") -SLANG_RAW("// they can only be accessed from specific stages.\n") -SLANG_RAW("\n") -SLANG_RAW("// 10.4.1 - Ray Dispatch System Values\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"(gl_LaunchIDNV)\")\n") -SLANG_RAW("uint3 DispatchRaysIndex();\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"(gl_LaunchSizeNV)\")\n") -SLANG_RAW("uint3 DispatchRaysDimensions();\n") -SLANG_RAW("\n") -SLANG_RAW("// 10.4.2 - Ray System Values\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"(gl_WorldRayOriginNV)\")\n") -SLANG_RAW("float3 WorldRayOrigin();\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"(gl_WorldRayDirectionNV)\")\n") -SLANG_RAW("float3 WorldRayDirection();\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"(gl_RayTminNV)\")\n") -SLANG_RAW("float RayTMin();\n") -SLANG_RAW("\n") -SLANG_RAW("// Note: The `RayTCurrent()` intrinsic should translate to\n") -SLANG_RAW("// either `gl_HitTNV` (for hit shaders) or `gl_RayTmaxNV`\n") -SLANG_RAW("// (for intersection shaders). Right now we are handling this\n") -SLANG_RAW("// during code emission, for simplicity.\n") -SLANG_RAW("//\n") -SLANG_RAW("// TODO: Once the compiler supports a more refined concept\n") -SLANG_RAW("// of profiles/capabilities and overloading based on them,\n") -SLANG_RAW("// we should simply provide two overloads here, specialized\n") -SLANG_RAW("// to the appropriate Vulkan stages.\n") -SLANG_RAW("//\n") -SLANG_RAW("__target_intrinsic(glsl, \"$XT\")\n") -SLANG_RAW("float RayTCurrent();\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"(gl_IncomingRayFlagsNV)\")\n") -SLANG_RAW("uint RayFlags();\n") -SLANG_RAW("\n") -SLANG_RAW("// 10.4.3 - Primitive/Object Space System Values\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"(gl_InstanceCustomIndexNV)\")\n") -SLANG_RAW("uint InstanceIndex();\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"(gl_InstanceID)\")\n") -SLANG_RAW("uint InstanceID();\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"(gl_PrimitiveID)\")\n") -SLANG_RAW("uint PrimitiveIndex();\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"(gl_ObjectRayOriginNV)\")\n") -SLANG_RAW("float3 ObjectRayOrigin();\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"(gl_ObjectRayDirectionNV)\")\n") -SLANG_RAW("float3 ObjectRayDirection();\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"transpose(gl_ObjectToWorldNV)\")\n") -SLANG_RAW("float3x4 ObjectToWorld3x4();\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"transpose(gl_WorldToObjectNV)\")\n") -SLANG_RAW("float3x4 WorldToObject3x4();\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"(gl_ObjectToWorldNV)\")\n") -SLANG_RAW("float4x3 ObjectToWorld4x3();\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"(gl_WorldToObjectNV)\")\n") -SLANG_RAW("float4x3 WorldToObject4x3();\n") -SLANG_RAW("\n") -SLANG_RAW("// Note: The provisional DXR spec included these unadorned\n") -SLANG_RAW("// `ObjectToWorld()` and `WorldToObject()` functions, so\n") -SLANG_RAW("// we will forward them to the new names as a convience\n") -SLANG_RAW("// for users who are porting their code.\n") -SLANG_RAW("//\n") -SLANG_RAW("// TODO: Should we provide a deprecation warning on these\n") -SLANG_RAW("// declarations, so that users can know they aren't coding\n") -SLANG_RAW("// against the final spec?\n") -SLANG_RAW("//\n") -SLANG_RAW("float3x4 ObjectToWorld() { return ObjectToWorld3x4(); }\n") -SLANG_RAW("float3x4 WorldToObject() { return WorldToObject3x4(); }\n") -SLANG_RAW("\n") -SLANG_RAW("// 10.4.4 - Hit Specific System values\n") -SLANG_RAW("__target_intrinsic(glsl, \"(gl_HitKindNV)\")\n") -SLANG_RAW("uint HitKind();\n") -SLANG_RAW("\n") -SLANG_RAW("// Pre-defined hit kinds (not documented explicitly)\n") -SLANG_RAW("static const uint HIT_KIND_TRIANGLE_FRONT_FACE = 254;\n") -SLANG_RAW("static const uint HIT_KIND_TRIANGLE_BACK_FACE = 255;\n") -SLANG_RAW("\n") -SLANG_RAW("//\n") -SLANG_RAW("// Shader Model 6.4\n") -SLANG_RAW("//\n") -SLANG_RAW("\n") -SLANG_RAW("// Treats `left` and `right` as 4-component vectors of `UInt8` and computes `dot(left, right) + acc`\n") -SLANG_RAW("uint dot4add_u8packed(uint left, uint right, uint acc);\n") -SLANG_RAW("\n") -SLANG_RAW("// Treats `left` and `right` as 4-component vectors of `Int8` and computes `dot(left, right) + acc`\n") -SLANG_RAW("int dot4add_i8packed(uint left, uint right, int acc);\n") -SLANG_RAW("\n") -SLANG_RAW("// Computes `dot(left, right) + acc`.\n") -SLANG_RAW("//\n") -SLANG_RAW("// May not produce infinities or NaNs for intermediate results that overflow the range of `half`\n") -SLANG_RAW("float dot2add(float2 left, float2 right, float acc);\n") -SLANG_RAW("\n") -SLANG_RAW("//\n") -SLANG_RAW("// Shader Model 6.5\n") -SLANG_RAW("//\n") -SLANG_RAW("\n") -SLANG_RAW("//\n") -SLANG_RAW("// Mesh Shaders\n") -SLANG_RAW("//\n") -SLANG_RAW("\n") -SLANG_RAW("// Set the number of output vertices and primitives for a mesh shader invocation.\n") -SLANG_RAW("void SetMeshOutputCounts(uint vertexCount, uint primitiveCount);\n") -SLANG_RAW("\n") -SLANG_RAW("// Specify the number of downstream mesh shader thread groups to invoke from an amplification shader,\n") -SLANG_RAW("// and provide the values for per-mesh payload parameters.\n") -SLANG_RAW("//\n") -SLANG_RAW("void DispatchMesh<P>(uint threadGroupCountX, uint threadGroupCountY, uint threadGroupCountZ, P meshPayload);\n") -SLANG_RAW("\n") -SLANG_RAW("//\n") -SLANG_RAW("// TODO: \"Sampler feedback\" types `FeedbackTexture2D` and `FeedbackTexture2DArray`.\n") -SLANG_RAW("//\n") -SLANG_RAW("\n") -SLANG_RAW("//\n") -SLANG_RAW("// DXR 1.1 and `TraceRayInline` support\n") -SLANG_RAW("//\n") -SLANG_RAW("\n") -SLANG_RAW("// Get the index of the geometry that was hit in an intersection, any-hit, or closest-hit shader\n") -SLANG_RAW("uint GeometryIndex();\n") -SLANG_RAW("\n") -SLANG_RAW("// Status of whether a (closest) hit has been committed in a `RayQuery`.\n") -SLANG_RAW("typedef uint COMMITTED_STATUS;\n") -SLANG_RAW("\n") -SLANG_RAW("// No hit committed.\n") -SLANG_RAW("static const COMMITTED_STATUS COMMITTED_NOTHING = 0;\n") -SLANG_RAW("\n") -SLANG_RAW("// Closest hit is a triangle.\n") -SLANG_RAW("//\n") -SLANG_RAW("// This could be an opaque triangle hit found by the fixed-function\n") -SLANG_RAW("// traversal and intersection implementation, or a non-opaque\n") -SLANG_RAW("// triangle hit committed by user code with `RayQuery.CommitNonOpaqueTriangleHit`\n") -SLANG_RAW("//\n") -SLANG_RAW("static const COMMITTED_STATUS COMMITTED_TRIANGLE_HIT = 1;\n") -SLANG_RAW("\n") -SLANG_RAW("// Closest hit is a procedural primitive.\n") -SLANG_RAW("//\n") -SLANG_RAW("// A procedural hit primitive is committed using `RayQuery.CommitProceduralPrimitiveHit`.\n") -SLANG_RAW("static const COMMITTED_STATUS COMMITTED_PROCEDURAL_PRIMITIVE_HIT = 2;\n") -SLANG_RAW("\n") -SLANG_RAW("// Type of candidate hit that a `RayQuery` is pausing at.\n") -SLANG_RAW("//\n") -SLANG_RAW("// A `RayQuery` can automatically commit hits with opaque triangles,\n") -SLANG_RAW("// but yields to user code for other hits to allow them to be\n") -SLANG_RAW("// dismissed or committed.\n") -SLANG_RAW("//\n") -SLANG_RAW("typedef uint CANDIDATE_TYPE;\n") -SLANG_RAW("\n") -SLANG_RAW("// Candidate hit is a non-opaque triangle.\n") -SLANG_RAW("static const CANDIDATE_TYPE CANDIDATE_NON_OPAQUE_TRIANGLE = 0;\n") -SLANG_RAW("\n") -SLANG_RAW("// Candidate hit is a procedural primitive.\n") -SLANG_RAW("static const CANDIDATE_TYPE CANDIDATE_PROCEDURAL_PRIMITIVE = 1;\n") -SLANG_RAW("\n") -SLANG_RAW("// Handle to state of an in-progress ray-tracing query.\n") -SLANG_RAW("//\n") -SLANG_RAW("// The ray query is effectively a coroutine that user shader\n") -SLANG_RAW("// code can resume to continue tracing the ray, and which yields\n") -SLANG_RAW("// back to the user code at interesting events along the ray.\n") -SLANG_RAW("//\n") -SLANG_RAW("__target_intrinsic(hlsl, RayQuery)\n") -SLANG_RAW("struct RayQuery <let rayFlags : RAY_FLAG = RAY_FLAG_NONE>\n") -SLANG_RAW("{\n") -SLANG_RAW(" // Initialize a ray-tracing query.\n") -SLANG_RAW(" //\n") -SLANG_RAW(" // This method may be called on a \"fresh\" ray query, or\n") -SLANG_RAW(" // on one that is already tracing a ray. In the latter\n") -SLANG_RAW(" // case any state related to the ray previously being\n") -SLANG_RAW(" // traced is overwritten.\n") -SLANG_RAW(" //\n") -SLANG_RAW(" // The `rayFlags` here will be bitwise ORed with\n") -SLANG_RAW(" // the `rayFlags` passed as a generic argument to\n") -SLANG_RAW(" // `RayQuery` to get the effective ray flags, which\n") -SLANG_RAW(" // must obey any API-imposed restrictions.\n") -SLANG_RAW(" //\n") -SLANG_RAW(" void TraceRayInline(RaytracingAccelerationStructure accelerationStructure, RAY_FLAG rayFlags, uint instanceInclusionMask, RayDesc ray);\n") -SLANG_RAW("\n") -SLANG_RAW(" // Resume the ray query coroutine.\n") -SLANG_RAW(" //\n") -SLANG_RAW(" // If the coroutine suspends because of encountering\n") -SLANG_RAW(" // a candidate hit that cannot be resolved with fixed-funciton\n") -SLANG_RAW(" // logic, this function returns `true`, and the `Candidate*()`\n") -SLANG_RAW(" // functions should be used by application code to resolve\n") -SLANG_RAW(" // the candidate hit (by either committing or ignoring it).\n") -SLANG_RAW(" //\n") -SLANG_RAW(" // If the coroutine terminates because traversal is\n") -SLANG_RAW(" // complete (or has been aborted), this function returns\n") -SLANG_RAW(" // `false`, and application code should use the `Committed*()`\n") -SLANG_RAW(" // functions to appropriately handle the closest hit (it any)\n") -SLANG_RAW(" // that was found.\n") -SLANG_RAW(" //\n") -SLANG_RAW(" bool Proceed();\n") -SLANG_RAW("\n") -SLANG_RAW(" // Causes the ray query to terminate.\n") -SLANG_RAW(" //\n") -SLANG_RAW(" // This function cases the ray query to act as if\n") -SLANG_RAW(" // traversal has terminated, so that subsequent\n") -SLANG_RAW(" // `Proceed()` calls will return `false`.\n") -SLANG_RAW(" //\n") -SLANG_RAW(" void Abort();\n") -SLANG_RAW("\n") -SLANG_RAW(" // Get the type of candidate hit being considered.\n") -SLANG_RAW(" //\n") -SLANG_RAW(" // The ray query coroutine will suspend when it encounters\n") -SLANG_RAW(" // a hit that cannot be resolved with fixed-function logic\n") -SLANG_RAW(" // (either a non-opaque triangle or a procedural primitive).\n") -SLANG_RAW(" // In either of those cases, `CandidateType()` will return\n") -SLANG_RAW(" // the kind of candidate hit that must be resolved by\n") -SLANG_RAW(" // user code.\n") -SLANG_RAW(" //\n") -SLANG_RAW(" CANDIDATE_TYPE CandidateType();\n") -SLANG_RAW("\n") -SLANG_RAW(" // Access properties of a candidate hit.\n") -SLANG_RAW(" //\n") -SLANG_RAW(" float3x4 CandidateObjectToWorld3x4();\n") -SLANG_RAW(" float4x3 CandidateObjectToWorld4x3();\n") -SLANG_RAW(" float3x4 CandidateWorldToObject3x4();\n") -SLANG_RAW(" float4x3 CandidateWorldToObject4x3();\n") -SLANG_RAW(" uint CandidateInstanceIndex();\n") -SLANG_RAW(" uint CandidateInstanceID();\n") -SLANG_RAW(" uint CandidateGeometryIndex();\n") -SLANG_RAW(" uint CandidatePrimitiveIndex();\n") -SLANG_RAW(" uint CandidateInstanceContributionToHitGroupIndex();\n") -SLANG_RAW("\n") -SLANG_RAW(" // Access properties of the ray being traced\n") -SLANG_RAW(" // in the object space of a candidate hit.\n") -SLANG_RAW(" //\n") -SLANG_RAW(" float3 CandidateObjectRayOrigin();\n") -SLANG_RAW(" float3 CandidateObjectRayDirection();\n") -SLANG_RAW("\n") -SLANG_RAW(" // Access properties of a candidate procedural primitive hit.\n") -SLANG_RAW(" //\n") -SLANG_RAW(" bool CandidateProceduralPrimitiveNonOpaque();\n") -SLANG_RAW("\n") -SLANG_RAW(" // Access properties of a candidate no-opaque triangle hit.\n") -SLANG_RAW(" //\n") -SLANG_RAW(" bool CandidateTriangleFrontFace();\n") -SLANG_RAW(" float2 CandidateTriangleBarycentrics();\n") -SLANG_RAW(" float CandidateTriangleRayT();\n") -SLANG_RAW("\n") -SLANG_RAW(" // Commit the current non-opaque triangle hit.\n") -SLANG_RAW(" void CommitNonOpaqueTriangleHit();\n") -SLANG_RAW("\n") -SLANG_RAW(" // Commit the current procedural primitive hit, with hit time `t`.\n") -SLANG_RAW(" void CommitProceduralPrimitiveHit(float t);\n") -SLANG_RAW("\n") -SLANG_RAW(" // Get the status of the committed (closest) hit, if any.\n") -SLANG_RAW(" COMMITTED_STATUS CommittedStatus();\n") -SLANG_RAW("\n") -SLANG_RAW(" // Access properties of the committed hit.\n") -SLANG_RAW(" //\n") -SLANG_RAW(" float3x4 CommittedObjectToWorld3x4();\n") -SLANG_RAW(" float4x3 CommittedObjectToWorld4x3();\n") -SLANG_RAW(" float3x4 CommittedWorldToObject3x4();\n") -SLANG_RAW(" float4x3 CommittedWorldToObject4x3();\n") -SLANG_RAW(" float CommittedRayT();\n") -SLANG_RAW(" uint CommittedInstanceIndex();\n") -SLANG_RAW(" uint CommittedInstanceID();\n") -SLANG_RAW(" uint CommittedGeometryIndex();\n") -SLANG_RAW(" uint CommittedPrimitiveIndex();\n") -SLANG_RAW(" uint CommittedInstanceContributionToHitGroupIndex();\n") -SLANG_RAW("\n") -SLANG_RAW(" // Access properties of the ray being traced\n") -SLANG_RAW(" // in the object space of a committed hit.\n") -SLANG_RAW(" //\n") -SLANG_RAW(" float3 CommittedObjectRayOrigin();\n") -SLANG_RAW(" float3 CommittedObjectRayDirection();\n") -SLANG_RAW("\n") -SLANG_RAW(" // Access properties of a committed triangle hit.\n") -SLANG_RAW(" //\n") -SLANG_RAW(" bool CommittedTriangleFrontFace();\n") -SLANG_RAW(" float2 CommittedTriangleBarycentrics();\n") -SLANG_RAW("\n") -SLANG_RAW(" // Access properties of the ray being traced.\n") -SLANG_RAW(" uint RayFlags();\n") -SLANG_RAW(" float3 WorldRayOrigin();\n") -SLANG_RAW(" float3 WorldRayDirection();\n") -SLANG_RAW(" float RayTMin();\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("//\n") -SLANG_RAW("// Vulkan/SPIR-V specific features\n") -SLANG_RAW("//\n") -SLANG_RAW("\n") -SLANG_RAW("struct VkSubpassInput<T>\n") -SLANG_RAW("{\n") -SLANG_RAW(" T SubpassLoad();\n") -SLANG_RAW("}\n") -SLANG_RAW("\n") -SLANG_RAW("struct VkSubpassInputMS<T>\n") -SLANG_RAW("{\n") -SLANG_RAW(" T SubpassLoad(int sampleIndex);\n") -SLANG_RAW("}\n") |
