diff options
| author | Tim Foley <tfoleyNV@users.noreply.github.com> | 2018-10-03 16:03:37 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-10-03 16:03:37 -0700 |
| commit | eaafafe772366a23ed847cbb10770c72aa5cfc28 (patch) | |
| tree | 980c9dcfa5e58472ef9c1e918839ed0a55751f50 | |
| parent | cde0dec060edc3f90caea8fde649c211a95b5954 (diff) | |
Update DXR API definitions for final spec. (#659)
* Update DXR API definitions for final spec.
The final version of the DXR API has changed the result type of the `DispatchRaysIndex()` and `DispatchRaysDimensions()` builtins to `uint3` (from `uint2`).
* Add updates for DXR object<->world transformations
The `ObjectToWorld()` and `WorldToObject()` functions were renamed to `ObjectToWorld3x4()` and `WorldToObject3x4()`, resepctively, and then new functions `ObjectToWorld4x3()` and `WorldToObject4x3()` were added to give convenient access to the transpose of these matrices.
(No, I'm not clear on why user's couldn't just call `transpose()`, either)
I've left the old function names in the standard library as forwarding functions just so that we don't break existing DXR code that relied on the old names.
| -rw-r--r-- | source/slang/hlsl.meta.slang | 2824 | ||||
| -rw-r--r-- | source/slang/hlsl.meta.slang.h | 23 |
2 files changed, 1438 insertions, 1409 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index a9609e13e..5bcff1762 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -1,1405 +1,1419 @@ -// Slang HLSL compatibility library - -typedef uint UINT; - -__generic<T> -__magic_type(HLSLAppendStructuredBufferType) -__intrinsic_type($(kIROp_HLSLAppendStructuredBufferType)) -struct AppendStructuredBuffer -{ - void Append(T value); - - void GetDimensions( - out uint numStructs, - out uint stride); -}; - -__magic_type(HLSLByteAddressBufferType) -__intrinsic_type($(kIROp_HLSLByteAddressBufferType)) -struct ByteAddressBuffer -{ - void GetDimensions( - out uint dim); - - uint Load(int location); - uint Load(int location, out uint status); - - uint2 Load2(int location); - uint2 Load2(int location, out uint status); - - uint3 Load3(int location); - uint3 Load3(int location, out uint status); - - uint4 Load4(int location); - uint4 Load4(int location, out uint status); -}; - -__generic<T> -__magic_type(HLSLStructuredBufferType) -__intrinsic_type($(kIROp_HLSLStructuredBufferType)) -struct StructuredBuffer -{ - void GetDimensions( - out uint numStructs, - out uint stride); - - T Load(int location); - T Load(int location, out uint status); - - __subscript(uint index) -> T { __intrinsic_op(bufferLoad) get; }; -}; - -__generic<T> -__magic_type(HLSLConsumeStructuredBufferType) -__intrinsic_type($(kIROp_HLSLConsumeStructuredBufferType)) -struct ConsumeStructuredBuffer -{ - T Consume(); - - void GetDimensions( - out uint numStructs, - out uint stride); -}; - -__generic<T, let N : int> -__magic_type(HLSLInputPatchType) -__intrinsic_type($(kIROp_HLSLInputPatchType)) -struct InputPatch -{ - __subscript(uint index) -> T; -}; - -__generic<T, let N : int> -__magic_type(HLSLOutputPatchType) -__intrinsic_type($(kIROp_HLSLOutputPatchType)) -struct OutputPatch -{ - __subscript(uint index) -> T; -}; - -${{{{ -static const struct { - IROp op; - char const* name; -} kMutableByteAddressBufferCases[] = -{ - { kIROp_HLSLRWByteAddressBufferType, "RWByteAddressBuffer" }, - { kIROp_HLSLRasterizerOrderedByteAddressBufferType, "RasterizerOrderedByteAddressBuffer" }, -}; -for(auto item : kMutableByteAddressBufferCases) { -}}}} - -__magic_type(HLSL$(item.name)Type) -__intrinsic_type($(item.op)) -struct $(item.name) -{ - // Note(tfoley): supports alll operations from `ByteAddressBuffer` - // TODO(tfoley): can this be made a sub-type? - - void GetDimensions( - out uint dim); - - uint Load(int location); - uint Load(int location, out uint status); - - uint2 Load2(int location); - uint2 Load2(int location, out uint status); - - uint3 Load3(int location); - uint3 Load3(int location, out uint status); - - uint4 Load4(int location); - uint4 Load4(int location, out uint status); - - // Added operations: - - void InterlockedAdd( - UINT dest, - UINT value, - out UINT original_value); - void InterlockedAdd( - UINT dest, - UINT value); - - void InterlockedAnd( - UINT dest, - UINT value, - out UINT original_value); - void InterlockedAnd( - UINT dest, - UINT value); - - void InterlockedCompareExchange( - UINT dest, - UINT compare_value, - UINT value, - out UINT original_value); - void InterlockedCompareExchange( - UINT dest, - UINT compare_value, - UINT value); - - void InterlockedCompareStore( - UINT dest, - UINT compare_value, - UINT value); - void InterlockedCompareStore( - UINT dest, - UINT compare_value); - - void InterlockedExchange( - UINT dest, - UINT value, - out UINT original_value); - void InterlockedExchange( - UINT dest, - UINT value); - - void InterlockedMax( - UINT dest, - UINT value, - out UINT original_value); - void InterlockedMax( - UINT dest, - UINT value); - - void InterlockedMin( - UINT dest, - UINT value, - out UINT original_value); - void InterlockedMin( - UINT dest, - UINT value); - - void InterlockedOr( - UINT dest, - UINT value, - out UINT original_value); - void InterlockedOr( - UINT dest, - UINT value); - - void InterlockedXor( - UINT dest, - UINT value, - out UINT original_value); - void InterlockedXor( - UINT dest, - UINT value); - - void Store( - uint address, - uint value); - - void Store2( - uint address, - uint2 value); - - void Store3( - uint address, - uint3 value); - - void Store4( - uint address, - uint4 value); -}; - -${{{{ -} -}}}} - -${{{{ -static const struct { - IROp op; - char const* name; -} kMutableStructuredBufferCases[] = -{ - { kIROp_HLSLRWStructuredBufferType, "RWStructuredBuffer" }, - { kIROp_HLSLRasterizerOrderedStructuredBufferType, "RasterizerOrderedStructuredBuffer" }, -}; -for(auto item : kMutableStructuredBufferCases) { -}}}} - - -__generic<T> -__magic_type(HLSL$(item.name)Type) -__intrinsic_type($(item.op)) -struct $(item.name) -{ - uint DecrementCounter(); - - void GetDimensions( - out uint numStructs, - out uint stride); - - uint IncrementCounter(); - - T Load(int location); - T Load(int location, out uint status); - - __subscript(uint index) -> T - { - __intrinsic_op(bufferElementRef) - ref; - } -}; - -${{{{ -} -}}}} - -__generic<T> -__magic_type(HLSLPointStreamType) -__intrinsic_type($(kIROp_HLSLPointStreamType)) -struct PointStream -{ - __target_intrinsic(glsl, "EmitVertex()") - void Append(T value); - - __target_intrinsic(glsl, "EndPrimitive()") - void RestartStrip(); -}; - -__generic<T> -__magic_type(HLSLLineStreamType) -__intrinsic_type($(kIROp_HLSLLineStreamType)) -struct LineStream -{ - __target_intrinsic(glsl, "EmitVertex()") - void Append(T value); - - __target_intrinsic(glsl, "EndPrimitive()") - void RestartStrip(); -}; - -__generic<T> -__magic_type(HLSLTriangleStreamType) -__intrinsic_type($(kIROp_HLSLTriangleStreamType)) -struct TriangleStream -{ - __target_intrinsic(glsl, "EmitVertex()") - void Append(T value); - - __target_intrinsic(glsl, "EndPrimitive()") - void RestartStrip(); -}; - -// Note(tfoley): Trying to systematically add all the HLSL builtins - -// Try to terminate the current draw or dispatch call (HLSL SM 4.0) -void abort(); - -// Absolute value (HLSL SM 1.0) -__generic<T : __BuiltinSignedArithmeticType> T abs(T x); -__generic<T : __BuiltinSignedArithmeticType, let N : int> vector<T,N> abs(vector<T,N> x); -__generic<T : __BuiltinSignedArithmeticType, let N : int, let M : int> matrix<T,N,M> abs(matrix<T,N,M> x); - -// Inverse cosine (HLSL SM 1.0) -__generic<T : __BuiltinFloatingPointType> T acos(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> acos(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> acos(matrix<T,N,M> x); - -// Test if all components are non-zero (HLSL SM 1.0) -__generic<T : __BuiltinType> bool all(T x); -__generic<T : __BuiltinType, let N : int> bool all(vector<T,N> x); -__generic<T : __BuiltinType, let N : int, let M : int> bool all(matrix<T,N,M> x); - -// Barrier for writes to all memory spaces (HLSL SM 5.0) -void AllMemoryBarrier(); - -// Thread-group sync and barrier for writes to all memory spaces (HLSL SM 5.0) -void AllMemoryBarrierWithGroupSync(); - -// Test if any components is non-zero (HLSL SM 1.0) - -__generic<T : __BuiltinType> -__target_intrinsic(glsl, "bool($0)") -bool any(T x); - -__generic<T : __BuiltinType, let N : int> -__target_intrinsic(glsl, "any(bvec$N0($0))") -bool any(vector<T,N> x); - -__generic<T : __BuiltinType, let N : int, let M : int> -// TODO: need to define GLSL mapping -bool any(matrix<T,N,M> x); - - -// Reinterpret bits as a double (HLSL SM 5.0) -double asdouble(uint lowbits, uint highbits); - -// Reinterpret bits as a float (HLSL SM 4.0) -float asfloat( int x); -float asfloat(uint x); -__generic<let N : int> vector<float,N> asfloat(vector< int,N> x); -__generic<let N : int> vector<float,N> asfloat(vector<uint,N> x); -__generic<let N : int, let M : int> matrix<float,N,M> asfloat(matrix< int,N,M> x); -__generic<let N : int, let M : int> matrix<float,N,M> asfloat(matrix<uint,N,M> x); - - -// Inverse sine (HLSL SM 1.0) -__generic<T : __BuiltinFloatingPointType> T asin(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> asin(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> asin(matrix<T,N,M> x); - -// Reinterpret bits as an int (HLSL SM 4.0) -int asint(float x); -int asint(uint x); -__generic<let N : int> vector<int,N> asint(vector<float,N> x); -__generic<let N : int> vector<int,N> asint(vector<uint,N> x); -__generic<let N : int, let M : int> matrix<int,N,M> asint(matrix<float,N,M> x); -__generic<let N : int, let M : int> matrix<int,N,M> asint(matrix<uint,N,M> x); - -// Reinterpret bits of double as a uint (HLSL SM 5.0) -void asuint(double value, out uint lowbits, out uint highbits); - -// Reinterpret bits as a uint (HLSL SM 4.0) -uint asuint(float x); -uint asuint(int x); -__generic<let N : int> vector<uint,N> asuint(vector<float,N> x); -__generic<let N : int> vector<uint,N> asuint(vector<int,N> x); -__generic<let N : int, let M : int> matrix<uint,N,M> asuint(matrix<float,N,M> x); -__generic<let N : int, let M : int> matrix<uint,N,M> asuint(matrix<int,N,M> x); - -// Inverse tangent (HLSL SM 1.0) -__generic<T : __BuiltinFloatingPointType> T atan(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> atan(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> atan(matrix<T,N,M> x); - -__generic<T : __BuiltinFloatingPointType> -__target_intrinsic(glsl,"atan($0,$1)") -T atan2(T y, T x); - -__generic<T : __BuiltinFloatingPointType, let N : int> -__target_intrinsic(glsl,"atan($0,$1)") -vector<T,N> atan2(vector<T,N> y, vector<T,N> x); - -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> -__target_intrinsic(glsl,"atan($0,$1)") -matrix<T,N,M> atan2(matrix<T,N,M> y, matrix<T,N,M> x); - -// Ceiling (HLSL SM 1.0) -__generic<T : __BuiltinFloatingPointType> T ceil(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> ceil(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> ceil(matrix<T,N,M> x); - - -// Check access status to tiled resource -bool CheckAccessFullyMapped(uint status); - -// Clamp (HLSL SM 1.0) -__generic<T : __BuiltinArithmeticType> T clamp(T x, T min, T max); -__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> clamp(vector<T,N> x, vector<T,N> min, vector<T,N> max); -__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> clamp(matrix<T,N,M> x, matrix<T,N,M> min, matrix<T,N,M> max); - -// Clip (discard) fragment conditionally -__generic<T : __BuiltinFloatingPointType> void clip(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> void clip(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> void clip(matrix<T,N,M> x); - -// Cosine -__generic<T : __BuiltinFloatingPointType> T cos(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> cos(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> cos(matrix<T,N,M> x); - -// Hyperbolic cosine -__generic<T : __BuiltinFloatingPointType> T cosh(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> cosh(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> cosh(matrix<T,N,M> x); - -// Population count -__target_intrinsic(glsl, "bitCount") -uint countbits(uint value); - -// Cross product -__generic<T : __BuiltinArithmeticType> vector<T,3> cross(vector<T,3> x, vector<T,3> y); - -// Convert encoded color -int4 D3DCOLORtoUBYTE4(float4 x); - -// Partial-difference derivatives -__generic<T : __BuiltinFloatingPointType> -__target_intrinsic(glsl, dFdx) -T ddx(T x); - -__generic<T : __BuiltinFloatingPointType, let N : int> -__target_intrinsic(glsl, dFdx) -vector<T,N> ddx(vector<T,N> x); - -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> -__target_intrinsic(glsl, dFdx) -matrix<T,N,M> ddx(matrix<T,N,M> x); - -__generic<T : __BuiltinFloatingPointType> -__glsl_extension(GL_ARB_derivative_control) -__target_intrinsic(glsl, dFdxCoarse) -T ddx_coarse(T x); - -__generic<T : __BuiltinFloatingPointType, let N : int> -__glsl_extension(GL_ARB_derivative_control) -__target_intrinsic(glsl, dFdxCoarse) -vector<T,N> ddx_coarse(vector<T,N> x); - -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> -__glsl_extension(GL_ARB_derivative_control) -__target_intrinsic(glsl, dFdxCoarse) -matrix<T,N,M> ddx_coarse(matrix<T,N,M> x); - -__generic<T : __BuiltinFloatingPointType> -__glsl_extension(GL_ARB_derivative_control) -__target_intrinsic(glsl, dFdxFine) -T ddx_fine(T x); - -__generic<T : __BuiltinFloatingPointType, let N : int> -__glsl_extension(GL_ARB_derivative_control) -__target_intrinsic(glsl, dFdxFine) -vector<T,N> ddx_fine(vector<T,N> x); - -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> -__glsl_extension(GL_ARB_derivative_control) -__target_intrinsic(glsl, dFdxFine) -matrix<T,N,M> ddx_fine(matrix<T,N,M> x); - -__generic<T : __BuiltinFloatingPointType> -__target_intrinsic(glsl, dFdy) -T ddy(T x); - -__generic<T : __BuiltinFloatingPointType, let N : int> -__target_intrinsic(glsl, dFdy) -vector<T,N> ddy(vector<T,N> x); - -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> -__target_intrinsic(glsl, dFdy) - matrix<T,N,M> ddy(matrix<T,N,M> x); - -__generic<T : __BuiltinFloatingPointType> -__glsl_extension(GL_ARB_derivative_control) -__target_intrinsic(glsl, dFdyCoarse) -T ddy_coarse(T x); - -__generic<T : __BuiltinFloatingPointType, let N : int> -__glsl_extension(GL_ARB_derivative_control) -__target_intrinsic(glsl, dFdyCoarse) -vector<T,N> ddy_coarse(vector<T,N> x); - -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> -__glsl_extension(GL_ARB_derivative_control) -__target_intrinsic(glsl, dFdyCoarse) -matrix<T,N,M> ddy_coarse(matrix<T,N,M> x); - -__generic<T : __BuiltinFloatingPointType> -__glsl_extension(GL_ARB_derivative_control) -__target_intrinsic(glsl, dFdyFine) -T ddy_fine(T x); - -__generic<T : __BuiltinFloatingPointType, let N : int> -__glsl_extension(GL_ARB_derivative_control) -__target_intrinsic(glsl, dFdyFine) -vector<T,N> ddy_fine(vector<T,N> x); - -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> -__glsl_extension(GL_ARB_derivative_control) -__target_intrinsic(glsl, dFdyFine) -matrix<T,N,M> ddy_fine(matrix<T,N,M> x); - - -// Radians to degrees -__generic<T : __BuiltinFloatingPointType> T degrees(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> degrees(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> degrees(matrix<T,N,M> x); - -// Matrix determinant - -__generic<T : __BuiltinFloatingPointType, let N : int> T determinant(matrix<T,N,N> m); - -// Barrier for device memory -void DeviceMemoryBarrier(); -void DeviceMemoryBarrierWithGroupSync(); - -// Vector distance - -__generic<T : __BuiltinFloatingPointType, let N : int> T distance(vector<T,N> x, vector<T,N> y); - -// Vector dot product - -__generic<T : __BuiltinArithmeticType, let N : int> T dot(vector<T,N> x, vector<T,N> y); - -// Helper for computing distance terms for lighting (obsolete) - -__generic<T : __BuiltinFloatingPointType> vector<T,4> dst(vector<T,4> x, vector<T,4> y); - -// Error message - -// void errorf( string format, ... ); - -// Attribute evaluation - -__generic<T : __BuiltinArithmeticType> T EvaluateAttributeAtCentroid(T x); -__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> EvaluateAttributeAtCentroid(vector<T,N> x); -__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> EvaluateAttributeAtCentroid(matrix<T,N,M> x); - -__generic<T : __BuiltinArithmeticType> T EvaluateAttributeAtSample(T x, uint sampleindex); -__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> EvaluateAttributeAtSample(vector<T,N> x, uint sampleindex); -__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> EvaluateAttributeAtSample(matrix<T,N,M> x, uint sampleindex); - -__generic<T : __BuiltinArithmeticType> T EvaluateAttributeSnapped(T x, int2 offset); -__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> EvaluateAttributeSnapped(vector<T,N> x, int2 offset); -__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> EvaluateAttributeSnapped(matrix<T,N,M> x, int2 offset); - -// Base-e exponent -__generic<T : __BuiltinFloatingPointType> T exp(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> exp(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> exp(matrix<T,N,M> x); - -// Base-2 exponent -__generic<T : __BuiltinFloatingPointType> T exp2(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> exp2(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> exp2(matrix<T,N,M> x); - -// Convert 16-bit float stored in low bits of integer -float f16tof32(uint value); -__generic<let N : int> vector<float,N> f16tof32(vector<uint,N> value); - -// Convert to 16-bit float stored in low bits of integer -uint f32tof16(float value); -__generic<let N : int> vector<uint,N> f32tof16(vector<float,N> value); - -// Flip surface normal to face forward, if needed -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> faceforward(vector<T,N> n, vector<T,N> i, vector<T,N> ng); - -// Find first set bit starting at high bit and working down -__target_intrinsic(glsl,"findMSB") -int firstbithigh(int value); - -__target_intrinsic(glsl,"findMSB") -__generic<let N : int> vector<int,N> firstbithigh(vector<int,N> value); - -__target_intrinsic(glsl,"findMSB") -uint firstbithigh(uint value); - -__target_intrinsic(glsl,"findMSB") -__generic<let N : int> vector<uint,N> firstbithigh(vector<uint,N> value); - -// Find first set bit starting at low bit and working up -__target_intrinsic(glsl,"findLSB") -int firstbitlow(int value); - -__target_intrinsic(glsl,"findLSB") -__generic<let N : int> vector<int,N> firstbitlow(vector<int,N> value); - -__target_intrinsic(glsl,"findLSB") -uint firstbitlow(uint value); - -__target_intrinsic(glsl,"findLSB") -__generic<let N : int> vector<uint,N> firstbitlow(vector<uint,N> value); - -// Floor (HLSL SM 1.0) -__generic<T : __BuiltinFloatingPointType> T floor(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> floor(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> floor(matrix<T,N,M> x); - -// Fused multiply-add for doubles -double fma(double a, double b, double c); -__generic<let N : int> vector<double, N> fma(vector<double, N> a, vector<double, N> b, vector<double, N> c); -__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); - -// Floating point remainder of x/y -__generic<T : __BuiltinFloatingPointType> T fmod(T x, T y); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> fmod(vector<T,N> x, vector<T,N> y); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> fmod(matrix<T,N,M> x, matrix<T,N,M> y); - -// Fractional part -__generic<T : __BuiltinFloatingPointType> -__target_intrinsic(glsl, fract) -T frac(T x); - -__generic<T : __BuiltinFloatingPointType, let N : int> -__target_intrinsic(glsl, fract) -vector<T,N> frac(vector<T,N> x); - -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> -__target_intrinsic(glsl, fract) -matrix<T,N,M> frac(matrix<T,N,M> x); - -// Split float into mantissa and exponent -__generic<T : __BuiltinFloatingPointType> T frexp(T x, out T exp); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> frexp(vector<T,N> x, out vector<T,N> exp); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> frexp(matrix<T,N,M> x, out matrix<T,N,M> exp); - -// Texture filter width -__generic<T : __BuiltinFloatingPointType> T fwidth(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> fwidth(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> fwidth(matrix<T,N,M> x); - -// Get number of samples in render target -uint GetRenderTargetSampleCount(); - -// Get position of given sample -float2 GetRenderTargetSamplePosition(int Index); - -// Group memory barrier -__target_intrinsic(glsl, "groupMemoryBarrier") -void GroupMemoryBarrier(); - -// Note: the unmatched parentheses in the GLSL lowering are -// to cancel out the parens that the emit logic uses, so that -// we can emit this as if it were an expression. -// -// TODO: investigate whether we can just use "operator comma" here. -__target_intrinsic(glsl, "groupMemoryBarrier()); (barrier()") -void GroupMemoryBarrierWithGroupSync(); - -// Atomics - -__target_intrinsic(glsl, "$atomicAdd($A, $1)") -void InterlockedAdd(__ref int dest, int value); - -__target_intrinsic(glsl, "$atomicAdd($A, $1)") -void InterlockedAdd(__ref uint dest, uint value); - -__target_intrinsic(glsl, "($2 = $atomicAdd($A, $1))") -void InterlockedAdd(__ref int dest, int value, out int original_value); - -__target_intrinsic(glsl, "($2 = $atomicAdd($A, $1))") -void InterlockedAdd(__ref uint dest, uint value, out uint original_value); - -__target_intrinsic(glsl, "$atomicAnd($A, $1)") -void InterlockedAnd(__ref int dest, int value); - -__target_intrinsic(glsl, "$atomicAnd($A, $1)") -void InterlockedAnd(__ref uint dest, uint value); - -__target_intrinsic(glsl, "($2 = $atomicAnd($A, $1))") -void InterlockedAnd(__ref int dest, int value, out int original_value); - -__target_intrinsic(glsl, "($2 = $atomicAnd($A, $1))") -void InterlockedAnd(__ref uint dest, uint value, out uint original_value); - -__target_intrinsic(glsl, "($3 = $atomicCompSwap($A, $1, $2))") -void InterlockedCompareExchange(__ref int dest, int compare_value, int value, out int original_value); - -__target_intrinsic(glsl, "($3 = $atomicCompSwap($A, $1, $2))") -void InterlockedCompareExchange(__ref uint dest, uint compare_value, uint value, out uint original_value); - -__target_intrinsic(glsl, "$atomicCompSwap($A, $1, $2)") -void InterlockedCompareStore(__ref int dest, int compare_value, int value); - -__target_intrinsic(glsl, "$atomicCompSwap($A, $1, $2)") -void InterlockedCompareStore(__ref uint dest, uint compare_value, uint value); - -__target_intrinsic(glsl, "$atomicExchange($A, $1)") -void InterlockedExchange(__ref int dest, int value); - -__target_intrinsic(glsl, "$atomicExchange($A, $1)") -void InterlockedExchange(__ref uint dest, uint value); - -__target_intrinsic(glsl, "($2 = $atomicExchange($A, $1))") -void InterlockedExchange(__ref int dest, int value, out int original_value); - -__target_intrinsic(glsl, "($2 = $atomicExchange($A, $1))") -void InterlockedExchange(__ref uint dest, uint value, out uint original_value); - -__target_intrinsic(glsl, "$atomicMax($A, $1)") -void InterlockedMax(__ref int dest, int value); - -__target_intrinsic(glsl, "$atomicMax($A, $1)") -void InterlockedMax(__ref uint dest, uint value); - -__target_intrinsic(glsl, "($2 = $atomicMax($A, $1))") -void InterlockedMax(__ref int dest, int value, out int original_value); - -__target_intrinsic(glsl, "($2 = $atomicMax($A, $1))") -void InterlockedMax(__ref uint dest, uint value, out uint original_value); - -__target_intrinsic(glsl, "$atomicMin($A, $1)") -void InterlockedMin(in out int dest, int value); - -__target_intrinsic(glsl, "$atomicMin($A, $1)") -void InterlockedMin(in out uint dest, uint value); - -__target_intrinsic(glsl, "($2 = $atomicMin($A, $1))") -void InterlockedMin(in out int dest, int value, out int original_value); - -__target_intrinsic(glsl, "($2 = $atomicMin($A, $1))") -void InterlockedMin(in out uint dest, uint value, out uint original_value); - -__target_intrinsic(glsl, "$atomicOr($A, $1)") -void InterlockedOr(__ref int dest, int value); - -__target_intrinsic(glsl, "$atomicOr($A, $1)") -void InterlockedOr(__ref uint dest, uint value); - -__target_intrinsic(glsl, "($2 = $atomicOr($A, $1))") -void InterlockedOr(__ref int dest, int value, out int original_value); - -__target_intrinsic(glsl, "($2 = $atomicOr($A, $1))") -void InterlockedOr(__ref uint dest, uint value, out uint original_value); - -__target_intrinsic(glsl, "$atomicXor($A, $1)") -void InterlockedXor(__ref int dest, int value); - -__target_intrinsic(glsl, "$atomicXor($A, $1)") -void InterlockedXor(__ref uint dest, uint value); - -__target_intrinsic(glsl, "($2 = $atomicXor($A, $1))") -void InterlockedXor(__ref int dest, int value, out int original_value); - -__target_intrinsic(glsl, "($2 = $atomicXor($A, $1))") -void InterlockedXor(__ref uint dest, uint value, out uint original_value); - -// Is floating-point value finite? -__generic<T : __BuiltinFloatingPointType> bool isfinite(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<bool,N> isfinite(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<bool,N,M> isfinite(matrix<T,N,M> x); - -// Is floating-point value infinite? -__generic<T : __BuiltinFloatingPointType> bool isinf(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<bool,N> isinf(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<bool,N,M> isinf(matrix<T,N,M> x); - -// Is floating-point value not-a-number? -__generic<T : __BuiltinFloatingPointType> bool isnan(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<bool,N> isnan(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<bool,N,M> isnan(matrix<T,N,M> x); - -// Construct float from mantissa and exponent -__generic<T : __BuiltinFloatingPointType> T ldexp(T x, T exp); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> ldexp(vector<T,N> x, vector<T,N> exp); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> ldexp(matrix<T,N,M> x, matrix<T,N,M> exp); - -// Vector length -__generic<T : __BuiltinFloatingPointType, let N : int> T length(vector<T,N> x); - -// Linear interpolation -__generic<T : __BuiltinFloatingPointType> -__target_intrinsic(glsl, mix) -T lerp(T x, T y, T s); - -__generic<T : __BuiltinFloatingPointType, let N : int> -__target_intrinsic(glsl, mix) -vector<T,N> lerp(vector<T,N> x, vector<T,N> y, vector<T,N> s); - -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> -__target_intrinsic(glsl, mix) -matrix<T,N,M> lerp(matrix<T,N,M> x, matrix<T,N,M> y, matrix<T,N,M> s); - -// Legacy lighting function (obsolete) -float4 lit(float n_dot_l, float n_dot_h, float m); - -// Base-e logarithm -__generic<T : __BuiltinFloatingPointType> T log(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> log(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> log(matrix<T,N,M> x); - -// Base-10 logarithm -__generic<T : __BuiltinFloatingPointType> T log10(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> log10(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> log10(matrix<T,N,M> x); - -// Base-2 logarithm -__generic<T : __BuiltinFloatingPointType> T log2(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> log2(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> log2(matrix<T,N,M> x); - -// multiply-add -__generic<T : __BuiltinArithmeticType> T mad(T mvalue, T avalue, T bvalue); -__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> mad(vector<T,N> mvalue, vector<T,N> avalue, vector<T,N> bvalue); -__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); - -// maximum -__generic<T : __BuiltinArithmeticType> T max(T x, T y); -__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> max(vector<T,N> x, vector<T,N> y); -__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> max(matrix<T,N,M> x, matrix<T,N,M> y); - -// minimum -__generic<T : __BuiltinArithmeticType> T min(T x, T y); -__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> min(vector<T,N> x, vector<T,N> y); -__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> min(matrix<T,N,M> x, matrix<T,N,M> y); - -// split into integer and fractional parts (both with same sign) -__generic<T : __BuiltinFloatingPointType> T modf(T x, out T ip); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> modf(vector<T,N> x, out vector<T,N> ip); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> modf(matrix<T,N,M> x, out matrix<T,N,M> ip); - -// msad4 (whatever that is) -uint4 msad4(uint reference, uint2 source, uint4 accum); - -// General inner products - -// scalar-scalar -__generic<T : __BuiltinArithmeticType> T mul(T x, T y); - -// scalar-vector and vector-scalar -__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> mul(vector<T,N> x, T y); -__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> mul(T x, vector<T,N> y); - -// scalar-matrix and matrix-scalar -__generic<T : __BuiltinArithmeticType, let N : int, let M :int> matrix<T,N,M> mul(matrix<T,N,M> x, T y); -__generic<T : __BuiltinArithmeticType, let N : int, let M :int> matrix<T,N,M> mul(T x, matrix<T,N,M> y); - -// vector-vector (dot product) -__generic<T : __BuiltinArithmeticType, let N : int> __intrinsic_op(dot) T mul(vector<T,N> x, vector<T,N> y); - -// vector-matrix -__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); - -// matrix-vector -__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); - -// matrix-matrix -__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); - -// noise (deprecated) -float noise(float x); -__generic<let N : int> float noise(vector<float, N> x); - -/// Indicate that an index may be non-uniform at execution time. -/// -/// Shader Model 5.1 and 6.x introduce support for dynamic indexing -/// of arrays of resources, but place the restriction that *by default* -/// the implementation can assume that any value used as an index into -/// such arrays will be dynamically uniform across an entire `Draw` or `Dispatch` -/// (when using instancing, the value must be uniform across all instances; -/// it does not seem that the restriction extends to draws within a multi-draw). -/// -/// In order to indicate to the implementation that it cannot make the -/// uniformity assumption, a shader programmer is required to pass the index -/// to the `NonUniformResourceIndex` function before using it as an index. -/// The function superficially acts like an identity function. -/// -/// Note: a future version of Slang may take responsibility for inserting calls -/// to this function as necessary in output code, rather than make this -/// the user's responsibility, so that the default behavior of the language -/// is more semantically "correct." -uint NonUniformResourceIndex(uint index); -int NonUniformResourceIndex(int index); - -// Normalize a vector -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> normalize(vector<T,N> x); - -// Raise to a power -__generic<T : __BuiltinFloatingPointType> T pow(T x, T y); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> pow(vector<T,N> x, vector<T,N> y); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> pow(matrix<T,N,M> x, matrix<T,N,M> y); - -// Output message - -// void printf( string format, ... ); - -// Tessellation factor fixup routines - -void Process2DQuadTessFactorsAvg( - in float4 RawEdgeFactors, - in float2 InsideScale, - out float4 RoundedEdgeTessFactors, - out float2 RoundedInsideTessFactors, - out float2 UnroundedInsideTessFactors); - -void Process2DQuadTessFactorsMax( - in float4 RawEdgeFactors, - in float2 InsideScale, - out float4 RoundedEdgeTessFactors, - out float2 RoundedInsideTessFactors, - out float2 UnroundedInsideTessFactors); - -void Process2DQuadTessFactorsMin( - in float4 RawEdgeFactors, - in float2 InsideScale, - out float4 RoundedEdgeTessFactors, - out float2 RoundedInsideTessFactors, - out float2 UnroundedInsideTessFactors); - -void ProcessIsolineTessFactors( - in float RawDetailFactor, - in float RawDensityFactor, - out float RoundedDetailFactor, - out float RoundedDensityFactor); - -void ProcessQuadTessFactorsAvg( - in float4 RawEdgeFactors, - in float InsideScale, - out float4 RoundedEdgeTessFactors, - out float2 RoundedInsideTessFactors, - out float2 UnroundedInsideTessFactors); - -void ProcessQuadTessFactorsMax( - in float4 RawEdgeFactors, - in float InsideScale, - out float4 RoundedEdgeTessFactors, - out float2 RoundedInsideTessFactors, - out float2 UnroundedInsideTessFactors); - -void ProcessQuadTessFactorsMin( - in float4 RawEdgeFactors, - in float InsideScale, - out float4 RoundedEdgeTessFactors, - out float2 RoundedInsideTessFactors, - out float2 UnroundedInsideTessFactors); - -void ProcessTriTessFactorsAvg( - in float3 RawEdgeFactors, - in float InsideScale, - out float3 RoundedEdgeTessFactors, - out float RoundedInsideTessFactor, - out float UnroundedInsideTessFactor); - -void ProcessTriTessFactorsMax( - in float3 RawEdgeFactors, - in float InsideScale, - out float3 RoundedEdgeTessFactors, - out float RoundedInsideTessFactor, - out float UnroundedInsideTessFactor); - -void ProcessTriTessFactorsMin( - in float3 RawEdgeFactors, - in float InsideScale, - out float3 RoundedEdgeTessFactors, - out float RoundedInsideTessFactors, - out float UnroundedInsideTessFactors); - -// Degrees to radians -__generic<T : __BuiltinFloatingPointType> T radians(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> radians(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> radians(matrix<T,N,M> x); - -// Approximate reciprocal -__generic<T : __BuiltinFloatingPointType> T rcp(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> rcp(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> rcp(matrix<T,N,M> x); - -// Reflect incident vector across plane with given normal -__generic<T : __BuiltinFloatingPointType, let N : int> -vector<T,N> reflect(vector<T,N> i, vector<T,N> n); - -// Refract incident vector given surface normal and index of refraction -__generic<T : __BuiltinFloatingPointType, let N : int> -vector<T,N> refract(vector<T,N> i, vector<T,N> n, float eta); - -// Reverse order of bits -__target_intrinsic(glsl, "bitfieldReverse") -uint reversebits(uint value); - -__target_intrinsic(glsl, "bitfieldReverse") -__generic<let N : int> vector<uint,N> reversebits(vector<uint,N> value); - -// Round-to-nearest -__generic<T : __BuiltinFloatingPointType> T round(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> round(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> round(matrix<T,N,M> x); - -// Reciprocal of square root -__generic<T : __BuiltinFloatingPointType> T rsqrt(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> rsqrt(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> rsqrt(matrix<T,N,M> x); - -// Clamp value to [0,1] range -__generic<T : __BuiltinFloatingPointType> -__target_intrinsic(glsl, "clamp($0, 0, 1)") -T saturate(T x); - -__generic<T : __BuiltinFloatingPointType, let N : int> -__target_intrinsic(glsl, "clamp($0, 0, 1)") -vector<T,N> saturate(vector<T,N> x); - -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> -__target_intrinsic(glsl, "clamp($0, 0, 1)") -matrix<T,N,M> saturate(matrix<T,N,M> x); - -__generic<T : __BuiltinFloatingPointType> -__specialized_for_target(glsl) -T saturate(T x) -{ - return clamp<T>(x, T(0), T(1)); -} - -__generic<T : __BuiltinFloatingPointType, let N : int> -__specialized_for_target(glsl) -vector<T,N> saturate(vector<T,N> x) -{ - return clamp<T,N>(x, - vector<T,N>(T(0)), - vector<T,N>(T(1))); -} - -// HACK: need a helper to turn a scalar into a matrix, -// because GLSL and HLSL disagree on the semantics of -// constructing a matrix from a single scalar. -__generic<T, let N : int, let M : int> -matrix<T,N,M> __scalarToMatrix(T value); - -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> -__specialized_for_target(glsl) -matrix<T,N,M> saturate(matrix<T,N,M> x) -{ - return clamp<T,N,M>(x, - __scalarToMatrix<T,N,M>(T(0)), - __scalarToMatrix<T,N,M>(T(1))); -} - - -// Extract sign of value -__generic<T : __BuiltinSignedArithmeticType> int sign(T x); -__generic<T : __BuiltinSignedArithmeticType, let N : int> vector<int,N> sign(vector<T,N> x); -__generic<T : __BuiltinSignedArithmeticType, let N : int, let M : int> matrix<int,N,M> sign(matrix<T,N,M> x); - - -// Sine -__generic<T : __BuiltinFloatingPointType> T sin(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> sin(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> sin(matrix<T,N,M> x); - -// Sine and cosine -__generic<T : __BuiltinFloatingPointType, let N : int> void sincos(T x, out T s, out T c); -__generic<T : __BuiltinFloatingPointType, let N : int> void sincos(vector<T,N> x, out vector<T,N> s, out vector<T,N> c); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> void sincos(matrix<T,N,M> x, out matrix<T,N,M> s, out matrix<T,N,M> c); - -// Hyperbolic Sine -__generic<T : __BuiltinFloatingPointType> T sinh(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> sinh(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> sinh(matrix<T,N,M> x); - -// Smooth step (Hermite interpolation) -__generic<T : __BuiltinFloatingPointType> T smoothstep(T min, T max, T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> smoothstep(vector<T,N> min, vector<T,N> max, vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> smoothstep(matrix<T,N,M> min, matrix<T,N,M> max, matrix<T,N,M> x); - -// Square root -__generic<T : __BuiltinFloatingPointType> T sqrt(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> sqrt(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> sqrt(matrix<T,N,M> x); - -// Step function -__generic<T : __BuiltinFloatingPointType> T step(T y, T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> step(vector<T,N> y, vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> step(matrix<T,N,M> y, matrix<T,N,M> x); - -// Tangent -__generic<T : __BuiltinFloatingPointType> T tan(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> tan(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> tan(matrix<T,N,M> x); - -// Hyperbolic tangent -__generic<T : __BuiltinFloatingPointType> T tanh(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> tanh(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> tanh(matrix<T,N,M> x); - -// Legacy texture-fetch operations - -/* -float4 tex1D(sampler1D s, float t); -float4 tex1D(sampler1D s, float t, float ddx, float ddy); -float4 tex1Dbias(sampler1D s, float4 t); -float4 tex1Dgrad(sampler1D s, float t, float ddx, float ddy); -float4 tex1Dlod(sampler1D s, float4 t); -float4 tex1Dproj(sampler1D s, float4 t); - -float4 tex2D(sampler2D s, float2 t); -float4 tex2D(sampler2D s, float2 t, float2 ddx, float2 ddy); -float4 tex2Dbias(sampler2D s, float4 t); -float4 tex2Dgrad(sampler2D s, float2 t, float2 ddx, float2 ddy); -float4 tex2Dlod(sampler2D s, float4 t); -float4 tex2Dproj(sampler2D s, float4 t); - -float4 tex3D(sampler3D s, float3 t); -float4 tex3D(sampler3D s, float3 t, float3 ddx, float3 ddy); -float4 tex3Dbias(sampler3D s, float4 t); -float4 tex3Dgrad(sampler3D s, float3 t, float3 ddx, float3 ddy); -float4 tex3Dlod(sampler3D s, float4 t); -float4 tex3Dproj(sampler3D s, float4 t); - -float4 texCUBE(samplerCUBE s, float3 t); -float4 texCUBE(samplerCUBE s, float3 t, float3 ddx, float3 ddy); -float4 texCUBEbias(samplerCUBE s, float4 t); -float4 texCUBEgrad(samplerCUBE s, float3 t, float3 ddx, float3 ddy); -float4 texCUBElod(samplerCUBE s, float4 t); -float4 texCUBEproj(samplerCUBE s, float4 t); -*/ - -// Matrix transpose -__generic<T : __BuiltinType, let N : int, let M : int> matrix<T,M,N> transpose(matrix<T,N,M> x); - -// Truncate to integer -__generic<T : __BuiltinFloatingPointType> T trunc(T x); -__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> trunc(vector<T,N> x); -__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> trunc(matrix<T,N,M> x); - -// Shader model 6.0 stuff - -uint GlobalOrderedCountIncrement(uint countToAppendForThisLane); - -__generic<T : __BuiltinType> T QuadReadLaneAt(T sourceValue, int quadLaneID); -__generic<T : __BuiltinType, let N : int> vector<T,N> QuadReadLaneAt(vector<T,N> sourceValue, int quadLaneID); -__generic<T : __BuiltinType, let N : int, let M : int> matrix<T,N,M> QuadReadLaneAt(matrix<T,N,M> sourceValue, int quadLaneID); - -__generic<T : __BuiltinType> T QuadSwapX(T localValue); -__generic<T : __BuiltinType, let N : int> vector<T,N> QuadSwapX(vector<T,N> localValue); -__generic<T : __BuiltinType, let N : int, let M : int> matrix<T,N,M> QuadSwapX(matrix<T,N,M> localValue); - -__generic<T : __BuiltinType> T QuadSwapY(T localValue); -__generic<T : __BuiltinType, let N : int> vector<T,N> QuadSwapY(vector<T,N> localValue); -__generic<T : __BuiltinType, let N : int, let M : int> matrix<T,N,M> QuadSwapY(matrix<T,N,M> localValue); - -__generic<T : __BuiltinIntegerType> T WaveAllBitAnd(T expr); -__generic<T : __BuiltinIntegerType, let N : int> vector<T,N> WaveAllBitAnd(vector<T,N> expr); -__generic<T : __BuiltinIntegerType, let N : int, let M : int> matrix<T,N,M> WaveAllBitAnd(matrix<T,N,M> expr); - -__generic<T : __BuiltinIntegerType> T WaveAllBitOr(T expr); -__generic<T : __BuiltinIntegerType, let N : int> vector<T,N> WaveAllBitOr(vector<T,N> expr); -__generic<T : __BuiltinIntegerType, let N : int, let M : int> matrix<T,N,M> WaveAllBitOr(matrix<T,N,M> expr); - -__generic<T : __BuiltinIntegerType> T WaveAllBitXor(T expr); -__generic<T : __BuiltinIntegerType, let N : int> vector<T,N> WaveAllBitXor(vector<T,N> expr); -__generic<T : __BuiltinIntegerType, let N : int, let M : int> matrix<T,N,M> WaveAllBitXor(matrix<T,N,M> expr); - -__generic<T : __BuiltinArithmeticType> T WaveAllMax(T expr); -__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> WaveAllMax(vector<T,N> expr); -__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> WaveAllMax(matrix<T,N,M> expr); - -__generic<T : __BuiltinArithmeticType> T WaveAllMin(T expr); -__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> WaveAllMin(vector<T,N> expr); -__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> WaveAllMin(matrix<T,N,M> expr); - -__generic<T : __BuiltinArithmeticType> T WaveAllProduct(T expr); -__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> WaveAllProduct(vector<T,N> expr); -__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> WaveAllProduct(matrix<T,N,M> expr); - -__generic<T : __BuiltinArithmeticType> T WaveAllSum(T expr); -__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> WaveAllSum(vector<T,N> expr); -__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> WaveAllSum(matrix<T,N,M> expr); - -bool WaveAllEqual(bool expr); -bool WaveAllTrue(bool expr); -bool WaveAnyTrue(bool expr); - -uint64_t WaveBallot(bool expr); - -uint WaveGetLaneCount(); -uint WaveGetLaneIndex(); -uint WaveGetOrderedIndex(); - -bool WaveIsHelperLane(); - -bool WaveOnce(); - -__generic<T : __BuiltinArithmeticType> T WavePrefixProduct(T expr); -__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> WavePrefixProduct(vector<T,N> expr); -__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> WavePrefixProduct(matrix<T,N,M> expr); - -__generic<T : __BuiltinArithmeticType> T WavePrefixSum(T expr); -__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> WavePrefixSum(vector<T,N> expr); -__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> WavePrefixSum(matrix<T,N,M> expr); - -__generic<T : __BuiltinType> T WaveReadFirstLane(T expr); -__generic<T : __BuiltinType, let N : int> vector<T,N> WaveReadFirstLane(vector<T,N> expr); -__generic<T : __BuiltinType, let N : int, let M : int> matrix<T,N,M> WaveReadFirstLane(matrix<T,N,M> expr); - -__generic<T : __BuiltinType> T WaveReadLaneAt(T expr, int laneIndex); -__generic<T : __BuiltinType, let N : int> vector<T,N> WaveReadLaneAt(vector<T,N> expr, int laneIndex); -__generic<T : __BuiltinType, let N : int, let M : int> matrix<T,N,M> WaveReadLaneAt(matrix<T,N,M> expr, int laneIndex); - -// `typedef`s to help with the fact that HLSL has been sorta-kinda case insensitive at various points -typedef Texture2D texture2D; - -${{{{ -// Component-wise multiplication ops -for(auto op : binaryOps) -{ - switch (op.opCode) - { - default: - continue; - - case kIROp_Mul: - case kIRPseudoOp_MulAssign: - break; - } - - for (auto type : kBaseTypes) - { - if ((type.flags & op.flags) == 0) - continue; - - char const* leftType = type.name; - char const* rightType = leftType; - char const* resultType = leftType; - - char const* leftQual = ""; - if(op.flags & ASSIGNMENT) leftQual = "in out "; - - 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"; - } -} - -// - -// 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 flavor = TextureFlavor::create(TextureFlavor::Shape::ShapeBuffer, kBaseBufferAccessLevels[aa].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"; - - sb << "__glsl_extension(GL_EXT_samplerless_texture_functions)"; - sb << "__target_intrinsic(glsl, \"texelFetch($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, \"texelFetch($0, int($1))$z\") get;\n"; - - if (kBaseBufferAccessLevels[aa].access != SLANG_RESOURCE_ACCESS_READ) - { - sb << "ref;\n"; - } - - sb << "}\n"; - - sb << "};\n"; -} -}}}} - - -// DirectX Raytracing (DXR) Support -// -// The following is based on the experimental DXR SDK v0.09.01. -// -// Numbering follows the sections in the "D3D12 Raytracing Functional Spec" v0.09 (2018-03-12) -// - -// 10.1.1 - Ray Flags - -typedef uint RAY_FLAG; - -static const RAY_FLAG RAY_FLAG_NONE = 0x00; -static const RAY_FLAG RAY_FLAG_FORCE_OPAQUE = 0x01; -static const RAY_FLAG RAY_FLAG_FORCE_NON_OPAQUE = 0x02; -static const RAY_FLAG RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH = 0x04; -static const RAY_FLAG RAY_FLAG_SKIP_CLOSEST_HIT_SHADER = 0x08; -static const RAY_FLAG RAY_FLAG_CULL_BACK_FACING_TRIANGLES = 0x10; -static const RAY_FLAG RAY_FLAG_CULL_FRONT_FACING_TRIANGLES = 0x20; -static const RAY_FLAG RAY_FLAG_CULL_OPAQUE = 0x40; -static const RAY_FLAG RAY_FLAG_CULL_NON_OPAQUE = 0x80; - -// 10.1.2 - Ray Description Structure - -__builtin -__magic_type(RayDescType) -__intrinsic_type($(kIROp_RayDescType)) -struct RayDesc -{ - __target_intrinsic(hlsl, Origin) - float3 Origin; - - __target_intrinsic(hlsl, TMin) - float TMin; - - __target_intrinsic(hlsl, Direction) - float3 Direction; - - __target_intrinsic(hlsl, TMax) - float TMax; -}; - -// 10.1.3 - Ray Acceleration Structure - -__builtin -__magic_type(RaytracingAccelerationStructureType) -__intrinsic_type($(kIROp_RaytracingAccelerationStructureType)) -struct RaytracingAccelerationStructure {}; - -// 10.1.4 - Subobject Definitions - -// TODO: We may decide to support these, but their reliance on C++ implicit -// constructor call syntax (`SomeType someVar(arg0, arg1);`) makes them -// annoying for the current Slang parsing strategy, and using global variables -// for this stuff comes across as a kludge rather than the best possible design. - -// 10.1.5 - Intersection Attributes Structure - -__builtin -__magic_type(BuiltInTriangleIntersectionAttributesType) -__intrinsic_type($(kIROp_BuiltInTriangleIntersectionAttributesType)) -struct BuiltInTriangleIntersectionAttributes -{ - __target_intrinsic(hlsl, barycentrics) - float2 barycentrics; -}; - -// 10.2 Shaders - -// Right now new shader stages need to be added directly to the compiler -// implementation, rather than being something that can be declared in the stdlib. - -// 10.3 - Intrinsics - -// 10.3.1 -void CallShader<param_t>(uint ShaderIndex, inout param_t Parameter); - -// 10.3.2 -void TraceRay<payload_t>( - RaytracingAccelerationStructure AccelerationStructure, - uint RayFlags, - uint InstanceInclusionMask, - uint RayContributionToHitGroupIndex, - uint MultiplierForGeometryContributionToHitGroupIndex, - uint MissShaderIndex, - RayDesc Ray, - inout payload_t Payload); - -// 10.3.3 -bool ReportHit<attr_t>(float THit, uint HitKind, attr_t Attributes); - -// 10.3.4 -void IgnoreHit(); - -// 10.3.5 -void AcceptHitAndEndSearch(); - -// 10.4 - System Values and Special Semantics - -// TODO: Many of these functions need to be restricted so that -// they can only be accessed from specific stages. - -// 10.4.1 - Ray Dispatch System Values -uint2 DispatchRaysIndex(); -uint2 DispatchRaysDimensions(); - -// 10.4.2 - Ray System Values -float3 WorldRayOrigin(); -float3 WorldRayDirection(); -float RayTMin(); -float RayTCurrent(); -uint RayFlags(); - -// 10.4.3 - Primitive/Object Space System Values -uint InstanceIndex(); -uint InstanceID(); -uint PrimitiveIndex(); -float3 ObjectRayOrigin(); -float3 ObjectRayDirection(); -float3x4 ObjectToWorld(); -float3x4 WorldToObject(); - -// 10.4.4 - Hit Specific System values -uint HitKind(); +// Slang HLSL compatibility library
+
+typedef uint UINT;
+
+__generic<T>
+__magic_type(HLSLAppendStructuredBufferType)
+__intrinsic_type($(kIROp_HLSLAppendStructuredBufferType))
+struct AppendStructuredBuffer
+{
+ void Append(T value);
+
+ void GetDimensions(
+ out uint numStructs,
+ out uint stride);
+};
+
+__magic_type(HLSLByteAddressBufferType)
+__intrinsic_type($(kIROp_HLSLByteAddressBufferType))
+struct ByteAddressBuffer
+{
+ void GetDimensions(
+ out uint dim);
+
+ uint Load(int location);
+ uint Load(int location, out uint status);
+
+ uint2 Load2(int location);
+ uint2 Load2(int location, out uint status);
+
+ uint3 Load3(int location);
+ uint3 Load3(int location, out uint status);
+
+ uint4 Load4(int location);
+ uint4 Load4(int location, out uint status);
+};
+
+__generic<T>
+__magic_type(HLSLStructuredBufferType)
+__intrinsic_type($(kIROp_HLSLStructuredBufferType))
+struct StructuredBuffer
+{
+ void GetDimensions(
+ out uint numStructs,
+ out uint stride);
+
+ T Load(int location);
+ T Load(int location, out uint status);
+
+ __subscript(uint index) -> T { __intrinsic_op(bufferLoad) get; };
+};
+
+__generic<T>
+__magic_type(HLSLConsumeStructuredBufferType)
+__intrinsic_type($(kIROp_HLSLConsumeStructuredBufferType))
+struct ConsumeStructuredBuffer
+{
+ T Consume();
+
+ void GetDimensions(
+ out uint numStructs,
+ out uint stride);
+};
+
+__generic<T, let N : int>
+__magic_type(HLSLInputPatchType)
+__intrinsic_type($(kIROp_HLSLInputPatchType))
+struct InputPatch
+{
+ __subscript(uint index) -> T;
+};
+
+__generic<T, let N : int>
+__magic_type(HLSLOutputPatchType)
+__intrinsic_type($(kIROp_HLSLOutputPatchType))
+struct OutputPatch
+{
+ __subscript(uint index) -> T;
+};
+
+${{{{
+static const struct {
+ IROp op;
+ char const* name;
+} kMutableByteAddressBufferCases[] =
+{
+ { kIROp_HLSLRWByteAddressBufferType, "RWByteAddressBuffer" },
+ { kIROp_HLSLRasterizerOrderedByteAddressBufferType, "RasterizerOrderedByteAddressBuffer" },
+};
+for(auto item : kMutableByteAddressBufferCases) {
+}}}}
+
+__magic_type(HLSL$(item.name)Type)
+__intrinsic_type($(item.op))
+struct $(item.name)
+{
+ // Note(tfoley): supports alll operations from `ByteAddressBuffer`
+ // TODO(tfoley): can this be made a sub-type?
+
+ void GetDimensions(
+ out uint dim);
+
+ uint Load(int location);
+ uint Load(int location, out uint status);
+
+ uint2 Load2(int location);
+ uint2 Load2(int location, out uint status);
+
+ uint3 Load3(int location);
+ uint3 Load3(int location, out uint status);
+
+ uint4 Load4(int location);
+ uint4 Load4(int location, out uint status);
+
+ // Added operations:
+
+ void InterlockedAdd(
+ UINT dest,
+ UINT value,
+ out UINT original_value);
+ void InterlockedAdd(
+ UINT dest,
+ UINT value);
+
+ void InterlockedAnd(
+ UINT dest,
+ UINT value,
+ out UINT original_value);
+ void InterlockedAnd(
+ UINT dest,
+ UINT value);
+
+ void InterlockedCompareExchange(
+ UINT dest,
+ UINT compare_value,
+ UINT value,
+ out UINT original_value);
+ void InterlockedCompareExchange(
+ UINT dest,
+ UINT compare_value,
+ UINT value);
+
+ void InterlockedCompareStore(
+ UINT dest,
+ UINT compare_value,
+ UINT value);
+ void InterlockedCompareStore(
+ UINT dest,
+ UINT compare_value);
+
+ void InterlockedExchange(
+ UINT dest,
+ UINT value,
+ out UINT original_value);
+ void InterlockedExchange(
+ UINT dest,
+ UINT value);
+
+ void InterlockedMax(
+ UINT dest,
+ UINT value,
+ out UINT original_value);
+ void InterlockedMax(
+ UINT dest,
+ UINT value);
+
+ void InterlockedMin(
+ UINT dest,
+ UINT value,
+ out UINT original_value);
+ void InterlockedMin(
+ UINT dest,
+ UINT value);
+
+ void InterlockedOr(
+ UINT dest,
+ UINT value,
+ out UINT original_value);
+ void InterlockedOr(
+ UINT dest,
+ UINT value);
+
+ void InterlockedXor(
+ UINT dest,
+ UINT value,
+ out UINT original_value);
+ void InterlockedXor(
+ UINT dest,
+ UINT value);
+
+ void Store(
+ uint address,
+ uint value);
+
+ void Store2(
+ uint address,
+ uint2 value);
+
+ void Store3(
+ uint address,
+ uint3 value);
+
+ void Store4(
+ uint address,
+ uint4 value);
+};
+
+${{{{
+}
+}}}}
+
+${{{{
+static const struct {
+ IROp op;
+ char const* name;
+} kMutableStructuredBufferCases[] =
+{
+ { kIROp_HLSLRWStructuredBufferType, "RWStructuredBuffer" },
+ { kIROp_HLSLRasterizerOrderedStructuredBufferType, "RasterizerOrderedStructuredBuffer" },
+};
+for(auto item : kMutableStructuredBufferCases) {
+}}}}
+
+
+__generic<T>
+__magic_type(HLSL$(item.name)Type)
+__intrinsic_type($(item.op))
+struct $(item.name)
+{
+ uint DecrementCounter();
+
+ void GetDimensions(
+ out uint numStructs,
+ out uint stride);
+
+ uint IncrementCounter();
+
+ T Load(int location);
+ T Load(int location, out uint status);
+
+ __subscript(uint index) -> T
+ {
+ __intrinsic_op(bufferElementRef)
+ ref;
+ }
+};
+
+${{{{
+}
+}}}}
+
+__generic<T>
+__magic_type(HLSLPointStreamType)
+__intrinsic_type($(kIROp_HLSLPointStreamType))
+struct PointStream
+{
+ __target_intrinsic(glsl, "EmitVertex()")
+ void Append(T value);
+
+ __target_intrinsic(glsl, "EndPrimitive()")
+ void RestartStrip();
+};
+
+__generic<T>
+__magic_type(HLSLLineStreamType)
+__intrinsic_type($(kIROp_HLSLLineStreamType))
+struct LineStream
+{
+ __target_intrinsic(glsl, "EmitVertex()")
+ void Append(T value);
+
+ __target_intrinsic(glsl, "EndPrimitive()")
+ void RestartStrip();
+};
+
+__generic<T>
+__magic_type(HLSLTriangleStreamType)
+__intrinsic_type($(kIROp_HLSLTriangleStreamType))
+struct TriangleStream
+{
+ __target_intrinsic(glsl, "EmitVertex()")
+ void Append(T value);
+
+ __target_intrinsic(glsl, "EndPrimitive()")
+ void RestartStrip();
+};
+
+// Note(tfoley): Trying to systematically add all the HLSL builtins
+
+// Try to terminate the current draw or dispatch call (HLSL SM 4.0)
+void abort();
+
+// Absolute value (HLSL SM 1.0)
+__generic<T : __BuiltinSignedArithmeticType> T abs(T x);
+__generic<T : __BuiltinSignedArithmeticType, let N : int> vector<T,N> abs(vector<T,N> x);
+__generic<T : __BuiltinSignedArithmeticType, let N : int, let M : int> matrix<T,N,M> abs(matrix<T,N,M> x);
+
+// Inverse cosine (HLSL SM 1.0)
+__generic<T : __BuiltinFloatingPointType> T acos(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> acos(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> acos(matrix<T,N,M> x);
+
+// Test if all components are non-zero (HLSL SM 1.0)
+__generic<T : __BuiltinType> bool all(T x);
+__generic<T : __BuiltinType, let N : int> bool all(vector<T,N> x);
+__generic<T : __BuiltinType, let N : int, let M : int> bool all(matrix<T,N,M> x);
+
+// Barrier for writes to all memory spaces (HLSL SM 5.0)
+void AllMemoryBarrier();
+
+// Thread-group sync and barrier for writes to all memory spaces (HLSL SM 5.0)
+void AllMemoryBarrierWithGroupSync();
+
+// Test if any components is non-zero (HLSL SM 1.0)
+
+__generic<T : __BuiltinType>
+__target_intrinsic(glsl, "bool($0)")
+bool any(T x);
+
+__generic<T : __BuiltinType, let N : int>
+__target_intrinsic(glsl, "any(bvec$N0($0))")
+bool any(vector<T,N> x);
+
+__generic<T : __BuiltinType, let N : int, let M : int>
+// TODO: need to define GLSL mapping
+bool any(matrix<T,N,M> x);
+
+
+// Reinterpret bits as a double (HLSL SM 5.0)
+double asdouble(uint lowbits, uint highbits);
+
+// Reinterpret bits as a float (HLSL SM 4.0)
+float asfloat( int x);
+float asfloat(uint x);
+__generic<let N : int> vector<float,N> asfloat(vector< int,N> x);
+__generic<let N : int> vector<float,N> asfloat(vector<uint,N> x);
+__generic<let N : int, let M : int> matrix<float,N,M> asfloat(matrix< int,N,M> x);
+__generic<let N : int, let M : int> matrix<float,N,M> asfloat(matrix<uint,N,M> x);
+
+
+// Inverse sine (HLSL SM 1.0)
+__generic<T : __BuiltinFloatingPointType> T asin(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> asin(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> asin(matrix<T,N,M> x);
+
+// Reinterpret bits as an int (HLSL SM 4.0)
+int asint(float x);
+int asint(uint x);
+__generic<let N : int> vector<int,N> asint(vector<float,N> x);
+__generic<let N : int> vector<int,N> asint(vector<uint,N> x);
+__generic<let N : int, let M : int> matrix<int,N,M> asint(matrix<float,N,M> x);
+__generic<let N : int, let M : int> matrix<int,N,M> asint(matrix<uint,N,M> x);
+
+// Reinterpret bits of double as a uint (HLSL SM 5.0)
+void asuint(double value, out uint lowbits, out uint highbits);
+
+// Reinterpret bits as a uint (HLSL SM 4.0)
+uint asuint(float x);
+uint asuint(int x);
+__generic<let N : int> vector<uint,N> asuint(vector<float,N> x);
+__generic<let N : int> vector<uint,N> asuint(vector<int,N> x);
+__generic<let N : int, let M : int> matrix<uint,N,M> asuint(matrix<float,N,M> x);
+__generic<let N : int, let M : int> matrix<uint,N,M> asuint(matrix<int,N,M> x);
+
+// Inverse tangent (HLSL SM 1.0)
+__generic<T : __BuiltinFloatingPointType> T atan(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> atan(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> atan(matrix<T,N,M> x);
+
+__generic<T : __BuiltinFloatingPointType>
+__target_intrinsic(glsl,"atan($0,$1)")
+T atan2(T y, T x);
+
+__generic<T : __BuiltinFloatingPointType, let N : int>
+__target_intrinsic(glsl,"atan($0,$1)")
+vector<T,N> atan2(vector<T,N> y, vector<T,N> x);
+
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>
+__target_intrinsic(glsl,"atan($0,$1)")
+matrix<T,N,M> atan2(matrix<T,N,M> y, matrix<T,N,M> x);
+
+// Ceiling (HLSL SM 1.0)
+__generic<T : __BuiltinFloatingPointType> T ceil(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> ceil(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> ceil(matrix<T,N,M> x);
+
+
+// Check access status to tiled resource
+bool CheckAccessFullyMapped(uint status);
+
+// Clamp (HLSL SM 1.0)
+__generic<T : __BuiltinArithmeticType> T clamp(T x, T min, T max);
+__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> clamp(vector<T,N> x, vector<T,N> min, vector<T,N> max);
+__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> clamp(matrix<T,N,M> x, matrix<T,N,M> min, matrix<T,N,M> max);
+
+// Clip (discard) fragment conditionally
+__generic<T : __BuiltinFloatingPointType> void clip(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> void clip(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> void clip(matrix<T,N,M> x);
+
+// Cosine
+__generic<T : __BuiltinFloatingPointType> T cos(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> cos(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> cos(matrix<T,N,M> x);
+
+// Hyperbolic cosine
+__generic<T : __BuiltinFloatingPointType> T cosh(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> cosh(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> cosh(matrix<T,N,M> x);
+
+// Population count
+__target_intrinsic(glsl, "bitCount")
+uint countbits(uint value);
+
+// Cross product
+__generic<T : __BuiltinArithmeticType> vector<T,3> cross(vector<T,3> x, vector<T,3> y);
+
+// Convert encoded color
+int4 D3DCOLORtoUBYTE4(float4 x);
+
+// Partial-difference derivatives
+__generic<T : __BuiltinFloatingPointType>
+__target_intrinsic(glsl, dFdx)
+T ddx(T x);
+
+__generic<T : __BuiltinFloatingPointType, let N : int>
+__target_intrinsic(glsl, dFdx)
+vector<T,N> ddx(vector<T,N> x);
+
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>
+__target_intrinsic(glsl, dFdx)
+matrix<T,N,M> ddx(matrix<T,N,M> x);
+
+__generic<T : __BuiltinFloatingPointType>
+__glsl_extension(GL_ARB_derivative_control)
+__target_intrinsic(glsl, dFdxCoarse)
+T ddx_coarse(T x);
+
+__generic<T : __BuiltinFloatingPointType, let N : int>
+__glsl_extension(GL_ARB_derivative_control)
+__target_intrinsic(glsl, dFdxCoarse)
+vector<T,N> ddx_coarse(vector<T,N> x);
+
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>
+__glsl_extension(GL_ARB_derivative_control)
+__target_intrinsic(glsl, dFdxCoarse)
+matrix<T,N,M> ddx_coarse(matrix<T,N,M> x);
+
+__generic<T : __BuiltinFloatingPointType>
+__glsl_extension(GL_ARB_derivative_control)
+__target_intrinsic(glsl, dFdxFine)
+T ddx_fine(T x);
+
+__generic<T : __BuiltinFloatingPointType, let N : int>
+__glsl_extension(GL_ARB_derivative_control)
+__target_intrinsic(glsl, dFdxFine)
+vector<T,N> ddx_fine(vector<T,N> x);
+
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>
+__glsl_extension(GL_ARB_derivative_control)
+__target_intrinsic(glsl, dFdxFine)
+matrix<T,N,M> ddx_fine(matrix<T,N,M> x);
+
+__generic<T : __BuiltinFloatingPointType>
+__target_intrinsic(glsl, dFdy)
+T ddy(T x);
+
+__generic<T : __BuiltinFloatingPointType, let N : int>
+__target_intrinsic(glsl, dFdy)
+vector<T,N> ddy(vector<T,N> x);
+
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>
+__target_intrinsic(glsl, dFdy)
+ matrix<T,N,M> ddy(matrix<T,N,M> x);
+
+__generic<T : __BuiltinFloatingPointType>
+__glsl_extension(GL_ARB_derivative_control)
+__target_intrinsic(glsl, dFdyCoarse)
+T ddy_coarse(T x);
+
+__generic<T : __BuiltinFloatingPointType, let N : int>
+__glsl_extension(GL_ARB_derivative_control)
+__target_intrinsic(glsl, dFdyCoarse)
+vector<T,N> ddy_coarse(vector<T,N> x);
+
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>
+__glsl_extension(GL_ARB_derivative_control)
+__target_intrinsic(glsl, dFdyCoarse)
+matrix<T,N,M> ddy_coarse(matrix<T,N,M> x);
+
+__generic<T : __BuiltinFloatingPointType>
+__glsl_extension(GL_ARB_derivative_control)
+__target_intrinsic(glsl, dFdyFine)
+T ddy_fine(T x);
+
+__generic<T : __BuiltinFloatingPointType, let N : int>
+__glsl_extension(GL_ARB_derivative_control)
+__target_intrinsic(glsl, dFdyFine)
+vector<T,N> ddy_fine(vector<T,N> x);
+
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>
+__glsl_extension(GL_ARB_derivative_control)
+__target_intrinsic(glsl, dFdyFine)
+matrix<T,N,M> ddy_fine(matrix<T,N,M> x);
+
+
+// Radians to degrees
+__generic<T : __BuiltinFloatingPointType> T degrees(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> degrees(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> degrees(matrix<T,N,M> x);
+
+// Matrix determinant
+
+__generic<T : __BuiltinFloatingPointType, let N : int> T determinant(matrix<T,N,N> m);
+
+// Barrier for device memory
+void DeviceMemoryBarrier();
+void DeviceMemoryBarrierWithGroupSync();
+
+// Vector distance
+
+__generic<T : __BuiltinFloatingPointType, let N : int> T distance(vector<T,N> x, vector<T,N> y);
+
+// Vector dot product
+
+__generic<T : __BuiltinArithmeticType, let N : int> T dot(vector<T,N> x, vector<T,N> y);
+
+// Helper for computing distance terms for lighting (obsolete)
+
+__generic<T : __BuiltinFloatingPointType> vector<T,4> dst(vector<T,4> x, vector<T,4> y);
+
+// Error message
+
+// void errorf( string format, ... );
+
+// Attribute evaluation
+
+__generic<T : __BuiltinArithmeticType> T EvaluateAttributeAtCentroid(T x);
+__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> EvaluateAttributeAtCentroid(vector<T,N> x);
+__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> EvaluateAttributeAtCentroid(matrix<T,N,M> x);
+
+__generic<T : __BuiltinArithmeticType> T EvaluateAttributeAtSample(T x, uint sampleindex);
+__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> EvaluateAttributeAtSample(vector<T,N> x, uint sampleindex);
+__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> EvaluateAttributeAtSample(matrix<T,N,M> x, uint sampleindex);
+
+__generic<T : __BuiltinArithmeticType> T EvaluateAttributeSnapped(T x, int2 offset);
+__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> EvaluateAttributeSnapped(vector<T,N> x, int2 offset);
+__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> EvaluateAttributeSnapped(matrix<T,N,M> x, int2 offset);
+
+// Base-e exponent
+__generic<T : __BuiltinFloatingPointType> T exp(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> exp(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> exp(matrix<T,N,M> x);
+
+// Base-2 exponent
+__generic<T : __BuiltinFloatingPointType> T exp2(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> exp2(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> exp2(matrix<T,N,M> x);
+
+// Convert 16-bit float stored in low bits of integer
+float f16tof32(uint value);
+__generic<let N : int> vector<float,N> f16tof32(vector<uint,N> value);
+
+// Convert to 16-bit float stored in low bits of integer
+uint f32tof16(float value);
+__generic<let N : int> vector<uint,N> f32tof16(vector<float,N> value);
+
+// Flip surface normal to face forward, if needed
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> faceforward(vector<T,N> n, vector<T,N> i, vector<T,N> ng);
+
+// Find first set bit starting at high bit and working down
+__target_intrinsic(glsl,"findMSB")
+int firstbithigh(int value);
+
+__target_intrinsic(glsl,"findMSB")
+__generic<let N : int> vector<int,N> firstbithigh(vector<int,N> value);
+
+__target_intrinsic(glsl,"findMSB")
+uint firstbithigh(uint value);
+
+__target_intrinsic(glsl,"findMSB")
+__generic<let N : int> vector<uint,N> firstbithigh(vector<uint,N> value);
+
+// Find first set bit starting at low bit and working up
+__target_intrinsic(glsl,"findLSB")
+int firstbitlow(int value);
+
+__target_intrinsic(glsl,"findLSB")
+__generic<let N : int> vector<int,N> firstbitlow(vector<int,N> value);
+
+__target_intrinsic(glsl,"findLSB")
+uint firstbitlow(uint value);
+
+__target_intrinsic(glsl,"findLSB")
+__generic<let N : int> vector<uint,N> firstbitlow(vector<uint,N> value);
+
+// Floor (HLSL SM 1.0)
+__generic<T : __BuiltinFloatingPointType> T floor(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> floor(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> floor(matrix<T,N,M> x);
+
+// Fused multiply-add for doubles
+double fma(double a, double b, double c);
+__generic<let N : int> vector<double, N> fma(vector<double, N> a, vector<double, N> b, vector<double, N> c);
+__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);
+
+// Floating point remainder of x/y
+__generic<T : __BuiltinFloatingPointType> T fmod(T x, T y);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> fmod(vector<T,N> x, vector<T,N> y);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> fmod(matrix<T,N,M> x, matrix<T,N,M> y);
+
+// Fractional part
+__generic<T : __BuiltinFloatingPointType>
+__target_intrinsic(glsl, fract)
+T frac(T x);
+
+__generic<T : __BuiltinFloatingPointType, let N : int>
+__target_intrinsic(glsl, fract)
+vector<T,N> frac(vector<T,N> x);
+
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>
+__target_intrinsic(glsl, fract)
+matrix<T,N,M> frac(matrix<T,N,M> x);
+
+// Split float into mantissa and exponent
+__generic<T : __BuiltinFloatingPointType> T frexp(T x, out T exp);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> frexp(vector<T,N> x, out vector<T,N> exp);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> frexp(matrix<T,N,M> x, out matrix<T,N,M> exp);
+
+// Texture filter width
+__generic<T : __BuiltinFloatingPointType> T fwidth(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> fwidth(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> fwidth(matrix<T,N,M> x);
+
+// Get number of samples in render target
+uint GetRenderTargetSampleCount();
+
+// Get position of given sample
+float2 GetRenderTargetSamplePosition(int Index);
+
+// Group memory barrier
+__target_intrinsic(glsl, "groupMemoryBarrier")
+void GroupMemoryBarrier();
+
+// Note: the unmatched parentheses in the GLSL lowering are
+// to cancel out the parens that the emit logic uses, so that
+// we can emit this as if it were an expression.
+//
+// TODO: investigate whether we can just use "operator comma" here.
+__target_intrinsic(glsl, "groupMemoryBarrier()); (barrier()")
+void GroupMemoryBarrierWithGroupSync();
+
+// Atomics
+
+__target_intrinsic(glsl, "$atomicAdd($A, $1)")
+void InterlockedAdd(__ref int dest, int value);
+
+__target_intrinsic(glsl, "$atomicAdd($A, $1)")
+void InterlockedAdd(__ref uint dest, uint value);
+
+__target_intrinsic(glsl, "($2 = $atomicAdd($A, $1))")
+void InterlockedAdd(__ref int dest, int value, out int original_value);
+
+__target_intrinsic(glsl, "($2 = $atomicAdd($A, $1))")
+void InterlockedAdd(__ref uint dest, uint value, out uint original_value);
+
+__target_intrinsic(glsl, "$atomicAnd($A, $1)")
+void InterlockedAnd(__ref int dest, int value);
+
+__target_intrinsic(glsl, "$atomicAnd($A, $1)")
+void InterlockedAnd(__ref uint dest, uint value);
+
+__target_intrinsic(glsl, "($2 = $atomicAnd($A, $1))")
+void InterlockedAnd(__ref int dest, int value, out int original_value);
+
+__target_intrinsic(glsl, "($2 = $atomicAnd($A, $1))")
+void InterlockedAnd(__ref uint dest, uint value, out uint original_value);
+
+__target_intrinsic(glsl, "($3 = $atomicCompSwap($A, $1, $2))")
+void InterlockedCompareExchange(__ref int dest, int compare_value, int value, out int original_value);
+
+__target_intrinsic(glsl, "($3 = $atomicCompSwap($A, $1, $2))")
+void InterlockedCompareExchange(__ref uint dest, uint compare_value, uint value, out uint original_value);
+
+__target_intrinsic(glsl, "$atomicCompSwap($A, $1, $2)")
+void InterlockedCompareStore(__ref int dest, int compare_value, int value);
+
+__target_intrinsic(glsl, "$atomicCompSwap($A, $1, $2)")
+void InterlockedCompareStore(__ref uint dest, uint compare_value, uint value);
+
+__target_intrinsic(glsl, "$atomicExchange($A, $1)")
+void InterlockedExchange(__ref int dest, int value);
+
+__target_intrinsic(glsl, "$atomicExchange($A, $1)")
+void InterlockedExchange(__ref uint dest, uint value);
+
+__target_intrinsic(glsl, "($2 = $atomicExchange($A, $1))")
+void InterlockedExchange(__ref int dest, int value, out int original_value);
+
+__target_intrinsic(glsl, "($2 = $atomicExchange($A, $1))")
+void InterlockedExchange(__ref uint dest, uint value, out uint original_value);
+
+__target_intrinsic(glsl, "$atomicMax($A, $1)")
+void InterlockedMax(__ref int dest, int value);
+
+__target_intrinsic(glsl, "$atomicMax($A, $1)")
+void InterlockedMax(__ref uint dest, uint value);
+
+__target_intrinsic(glsl, "($2 = $atomicMax($A, $1))")
+void InterlockedMax(__ref int dest, int value, out int original_value);
+
+__target_intrinsic(glsl, "($2 = $atomicMax($A, $1))")
+void InterlockedMax(__ref uint dest, uint value, out uint original_value);
+
+__target_intrinsic(glsl, "$atomicMin($A, $1)")
+void InterlockedMin(in out int dest, int value);
+
+__target_intrinsic(glsl, "$atomicMin($A, $1)")
+void InterlockedMin(in out uint dest, uint value);
+
+__target_intrinsic(glsl, "($2 = $atomicMin($A, $1))")
+void InterlockedMin(in out int dest, int value, out int original_value);
+
+__target_intrinsic(glsl, "($2 = $atomicMin($A, $1))")
+void InterlockedMin(in out uint dest, uint value, out uint original_value);
+
+__target_intrinsic(glsl, "$atomicOr($A, $1)")
+void InterlockedOr(__ref int dest, int value);
+
+__target_intrinsic(glsl, "$atomicOr($A, $1)")
+void InterlockedOr(__ref uint dest, uint value);
+
+__target_intrinsic(glsl, "($2 = $atomicOr($A, $1))")
+void InterlockedOr(__ref int dest, int value, out int original_value);
+
+__target_intrinsic(glsl, "($2 = $atomicOr($A, $1))")
+void InterlockedOr(__ref uint dest, uint value, out uint original_value);
+
+__target_intrinsic(glsl, "$atomicXor($A, $1)")
+void InterlockedXor(__ref int dest, int value);
+
+__target_intrinsic(glsl, "$atomicXor($A, $1)")
+void InterlockedXor(__ref uint dest, uint value);
+
+__target_intrinsic(glsl, "($2 = $atomicXor($A, $1))")
+void InterlockedXor(__ref int dest, int value, out int original_value);
+
+__target_intrinsic(glsl, "($2 = $atomicXor($A, $1))")
+void InterlockedXor(__ref uint dest, uint value, out uint original_value);
+
+// Is floating-point value finite?
+__generic<T : __BuiltinFloatingPointType> bool isfinite(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<bool,N> isfinite(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<bool,N,M> isfinite(matrix<T,N,M> x);
+
+// Is floating-point value infinite?
+__generic<T : __BuiltinFloatingPointType> bool isinf(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<bool,N> isinf(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<bool,N,M> isinf(matrix<T,N,M> x);
+
+// Is floating-point value not-a-number?
+__generic<T : __BuiltinFloatingPointType> bool isnan(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<bool,N> isnan(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<bool,N,M> isnan(matrix<T,N,M> x);
+
+// Construct float from mantissa and exponent
+__generic<T : __BuiltinFloatingPointType> T ldexp(T x, T exp);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> ldexp(vector<T,N> x, vector<T,N> exp);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> ldexp(matrix<T,N,M> x, matrix<T,N,M> exp);
+
+// Vector length
+__generic<T : __BuiltinFloatingPointType, let N : int> T length(vector<T,N> x);
+
+// Linear interpolation
+__generic<T : __BuiltinFloatingPointType>
+__target_intrinsic(glsl, mix)
+T lerp(T x, T y, T s);
+
+__generic<T : __BuiltinFloatingPointType, let N : int>
+__target_intrinsic(glsl, mix)
+vector<T,N> lerp(vector<T,N> x, vector<T,N> y, vector<T,N> s);
+
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>
+__target_intrinsic(glsl, mix)
+matrix<T,N,M> lerp(matrix<T,N,M> x, matrix<T,N,M> y, matrix<T,N,M> s);
+
+// Legacy lighting function (obsolete)
+float4 lit(float n_dot_l, float n_dot_h, float m);
+
+// Base-e logarithm
+__generic<T : __BuiltinFloatingPointType> T log(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> log(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> log(matrix<T,N,M> x);
+
+// Base-10 logarithm
+__generic<T : __BuiltinFloatingPointType> T log10(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> log10(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> log10(matrix<T,N,M> x);
+
+// Base-2 logarithm
+__generic<T : __BuiltinFloatingPointType> T log2(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> log2(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> log2(matrix<T,N,M> x);
+
+// multiply-add
+__generic<T : __BuiltinArithmeticType> T mad(T mvalue, T avalue, T bvalue);
+__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> mad(vector<T,N> mvalue, vector<T,N> avalue, vector<T,N> bvalue);
+__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);
+
+// maximum
+__generic<T : __BuiltinArithmeticType> T max(T x, T y);
+__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> max(vector<T,N> x, vector<T,N> y);
+__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> max(matrix<T,N,M> x, matrix<T,N,M> y);
+
+// minimum
+__generic<T : __BuiltinArithmeticType> T min(T x, T y);
+__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> min(vector<T,N> x, vector<T,N> y);
+__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> min(matrix<T,N,M> x, matrix<T,N,M> y);
+
+// split into integer and fractional parts (both with same sign)
+__generic<T : __BuiltinFloatingPointType> T modf(T x, out T ip);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> modf(vector<T,N> x, out vector<T,N> ip);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> modf(matrix<T,N,M> x, out matrix<T,N,M> ip);
+
+// msad4 (whatever that is)
+uint4 msad4(uint reference, uint2 source, uint4 accum);
+
+// General inner products
+
+// scalar-scalar
+__generic<T : __BuiltinArithmeticType> T mul(T x, T y);
+
+// scalar-vector and vector-scalar
+__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> mul(vector<T,N> x, T y);
+__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> mul(T x, vector<T,N> y);
+
+// scalar-matrix and matrix-scalar
+__generic<T : __BuiltinArithmeticType, let N : int, let M :int> matrix<T,N,M> mul(matrix<T,N,M> x, T y);
+__generic<T : __BuiltinArithmeticType, let N : int, let M :int> matrix<T,N,M> mul(T x, matrix<T,N,M> y);
+
+// vector-vector (dot product)
+__generic<T : __BuiltinArithmeticType, let N : int> __intrinsic_op(dot) T mul(vector<T,N> x, vector<T,N> y);
+
+// vector-matrix
+__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);
+
+// matrix-vector
+__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);
+
+// matrix-matrix
+__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);
+
+// noise (deprecated)
+float noise(float x);
+__generic<let N : int> float noise(vector<float, N> x);
+
+/// Indicate that an index may be non-uniform at execution time.
+///
+/// Shader Model 5.1 and 6.x introduce support for dynamic indexing
+/// of arrays of resources, but place the restriction that *by default*
+/// the implementation can assume that any value used as an index into
+/// such arrays will be dynamically uniform across an entire `Draw` or `Dispatch`
+/// (when using instancing, the value must be uniform across all instances;
+/// it does not seem that the restriction extends to draws within a multi-draw).
+///
+/// In order to indicate to the implementation that it cannot make the
+/// uniformity assumption, a shader programmer is required to pass the index
+/// to the `NonUniformResourceIndex` function before using it as an index.
+/// The function superficially acts like an identity function.
+///
+/// Note: a future version of Slang may take responsibility for inserting calls
+/// to this function as necessary in output code, rather than make this
+/// the user's responsibility, so that the default behavior of the language
+/// is more semantically "correct."
+uint NonUniformResourceIndex(uint index);
+int NonUniformResourceIndex(int index);
+
+// Normalize a vector
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> normalize(vector<T,N> x);
+
+// Raise to a power
+__generic<T : __BuiltinFloatingPointType> T pow(T x, T y);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> pow(vector<T,N> x, vector<T,N> y);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> pow(matrix<T,N,M> x, matrix<T,N,M> y);
+
+// Output message
+
+// void printf( string format, ... );
+
+// Tessellation factor fixup routines
+
+void Process2DQuadTessFactorsAvg(
+ in float4 RawEdgeFactors,
+ in float2 InsideScale,
+ out float4 RoundedEdgeTessFactors,
+ out float2 RoundedInsideTessFactors,
+ out float2 UnroundedInsideTessFactors);
+
+void Process2DQuadTessFactorsMax(
+ in float4 RawEdgeFactors,
+ in float2 InsideScale,
+ out float4 RoundedEdgeTessFactors,
+ out float2 RoundedInsideTessFactors,
+ out float2 UnroundedInsideTessFactors);
+
+void Process2DQuadTessFactorsMin(
+ in float4 RawEdgeFactors,
+ in float2 InsideScale,
+ out float4 RoundedEdgeTessFactors,
+ out float2 RoundedInsideTessFactors,
+ out float2 UnroundedInsideTessFactors);
+
+void ProcessIsolineTessFactors(
+ in float RawDetailFactor,
+ in float RawDensityFactor,
+ out float RoundedDetailFactor,
+ out float RoundedDensityFactor);
+
+void ProcessQuadTessFactorsAvg(
+ in float4 RawEdgeFactors,
+ in float InsideScale,
+ out float4 RoundedEdgeTessFactors,
+ out float2 RoundedInsideTessFactors,
+ out float2 UnroundedInsideTessFactors);
+
+void ProcessQuadTessFactorsMax(
+ in float4 RawEdgeFactors,
+ in float InsideScale,
+ out float4 RoundedEdgeTessFactors,
+ out float2 RoundedInsideTessFactors,
+ out float2 UnroundedInsideTessFactors);
+
+void ProcessQuadTessFactorsMin(
+ in float4 RawEdgeFactors,
+ in float InsideScale,
+ out float4 RoundedEdgeTessFactors,
+ out float2 RoundedInsideTessFactors,
+ out float2 UnroundedInsideTessFactors);
+
+void ProcessTriTessFactorsAvg(
+ in float3 RawEdgeFactors,
+ in float InsideScale,
+ out float3 RoundedEdgeTessFactors,
+ out float RoundedInsideTessFactor,
+ out float UnroundedInsideTessFactor);
+
+void ProcessTriTessFactorsMax(
+ in float3 RawEdgeFactors,
+ in float InsideScale,
+ out float3 RoundedEdgeTessFactors,
+ out float RoundedInsideTessFactor,
+ out float UnroundedInsideTessFactor);
+
+void ProcessTriTessFactorsMin(
+ in float3 RawEdgeFactors,
+ in float InsideScale,
+ out float3 RoundedEdgeTessFactors,
+ out float RoundedInsideTessFactors,
+ out float UnroundedInsideTessFactors);
+
+// Degrees to radians
+__generic<T : __BuiltinFloatingPointType> T radians(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> radians(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> radians(matrix<T,N,M> x);
+
+// Approximate reciprocal
+__generic<T : __BuiltinFloatingPointType> T rcp(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> rcp(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> rcp(matrix<T,N,M> x);
+
+// Reflect incident vector across plane with given normal
+__generic<T : __BuiltinFloatingPointType, let N : int>
+vector<T,N> reflect(vector<T,N> i, vector<T,N> n);
+
+// Refract incident vector given surface normal and index of refraction
+__generic<T : __BuiltinFloatingPointType, let N : int>
+vector<T,N> refract(vector<T,N> i, vector<T,N> n, float eta);
+
+// Reverse order of bits
+__target_intrinsic(glsl, "bitfieldReverse")
+uint reversebits(uint value);
+
+__target_intrinsic(glsl, "bitfieldReverse")
+__generic<let N : int> vector<uint,N> reversebits(vector<uint,N> value);
+
+// Round-to-nearest
+__generic<T : __BuiltinFloatingPointType> T round(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> round(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> round(matrix<T,N,M> x);
+
+// Reciprocal of square root
+__generic<T : __BuiltinFloatingPointType> T rsqrt(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> rsqrt(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> rsqrt(matrix<T,N,M> x);
+
+// Clamp value to [0,1] range
+__generic<T : __BuiltinFloatingPointType>
+__target_intrinsic(glsl, "clamp($0, 0, 1)")
+T saturate(T x);
+
+__generic<T : __BuiltinFloatingPointType, let N : int>
+__target_intrinsic(glsl, "clamp($0, 0, 1)")
+vector<T,N> saturate(vector<T,N> x);
+
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>
+__target_intrinsic(glsl, "clamp($0, 0, 1)")
+matrix<T,N,M> saturate(matrix<T,N,M> x);
+
+__generic<T : __BuiltinFloatingPointType>
+__specialized_for_target(glsl)
+T saturate(T x)
+{
+ return clamp<T>(x, T(0), T(1));
+}
+
+__generic<T : __BuiltinFloatingPointType, let N : int>
+__specialized_for_target(glsl)
+vector<T,N> saturate(vector<T,N> x)
+{
+ return clamp<T,N>(x,
+ vector<T,N>(T(0)),
+ vector<T,N>(T(1)));
+}
+
+// HACK: need a helper to turn a scalar into a matrix,
+// because GLSL and HLSL disagree on the semantics of
+// constructing a matrix from a single scalar.
+__generic<T, let N : int, let M : int>
+matrix<T,N,M> __scalarToMatrix(T value);
+
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>
+__specialized_for_target(glsl)
+matrix<T,N,M> saturate(matrix<T,N,M> x)
+{
+ return clamp<T,N,M>(x,
+ __scalarToMatrix<T,N,M>(T(0)),
+ __scalarToMatrix<T,N,M>(T(1)));
+}
+
+
+// Extract sign of value
+__generic<T : __BuiltinSignedArithmeticType> int sign(T x);
+__generic<T : __BuiltinSignedArithmeticType, let N : int> vector<int,N> sign(vector<T,N> x);
+__generic<T : __BuiltinSignedArithmeticType, let N : int, let M : int> matrix<int,N,M> sign(matrix<T,N,M> x);
+
+
+// Sine
+__generic<T : __BuiltinFloatingPointType> T sin(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> sin(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> sin(matrix<T,N,M> x);
+
+// Sine and cosine
+__generic<T : __BuiltinFloatingPointType, let N : int> void sincos(T x, out T s, out T c);
+__generic<T : __BuiltinFloatingPointType, let N : int> void sincos(vector<T,N> x, out vector<T,N> s, out vector<T,N> c);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> void sincos(matrix<T,N,M> x, out matrix<T,N,M> s, out matrix<T,N,M> c);
+
+// Hyperbolic Sine
+__generic<T : __BuiltinFloatingPointType> T sinh(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> sinh(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> sinh(matrix<T,N,M> x);
+
+// Smooth step (Hermite interpolation)
+__generic<T : __BuiltinFloatingPointType> T smoothstep(T min, T max, T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> smoothstep(vector<T,N> min, vector<T,N> max, vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> smoothstep(matrix<T,N,M> min, matrix<T,N,M> max, matrix<T,N,M> x);
+
+// Square root
+__generic<T : __BuiltinFloatingPointType> T sqrt(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> sqrt(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> sqrt(matrix<T,N,M> x);
+
+// Step function
+__generic<T : __BuiltinFloatingPointType> T step(T y, T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> step(vector<T,N> y, vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> step(matrix<T,N,M> y, matrix<T,N,M> x);
+
+// Tangent
+__generic<T : __BuiltinFloatingPointType> T tan(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> tan(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> tan(matrix<T,N,M> x);
+
+// Hyperbolic tangent
+__generic<T : __BuiltinFloatingPointType> T tanh(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> tanh(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> tanh(matrix<T,N,M> x);
+
+// Legacy texture-fetch operations
+
+/*
+float4 tex1D(sampler1D s, float t);
+float4 tex1D(sampler1D s, float t, float ddx, float ddy);
+float4 tex1Dbias(sampler1D s, float4 t);
+float4 tex1Dgrad(sampler1D s, float t, float ddx, float ddy);
+float4 tex1Dlod(sampler1D s, float4 t);
+float4 tex1Dproj(sampler1D s, float4 t);
+
+float4 tex2D(sampler2D s, float2 t);
+float4 tex2D(sampler2D s, float2 t, float2 ddx, float2 ddy);
+float4 tex2Dbias(sampler2D s, float4 t);
+float4 tex2Dgrad(sampler2D s, float2 t, float2 ddx, float2 ddy);
+float4 tex2Dlod(sampler2D s, float4 t);
+float4 tex2Dproj(sampler2D s, float4 t);
+
+float4 tex3D(sampler3D s, float3 t);
+float4 tex3D(sampler3D s, float3 t, float3 ddx, float3 ddy);
+float4 tex3Dbias(sampler3D s, float4 t);
+float4 tex3Dgrad(sampler3D s, float3 t, float3 ddx, float3 ddy);
+float4 tex3Dlod(sampler3D s, float4 t);
+float4 tex3Dproj(sampler3D s, float4 t);
+
+float4 texCUBE(samplerCUBE s, float3 t);
+float4 texCUBE(samplerCUBE s, float3 t, float3 ddx, float3 ddy);
+float4 texCUBEbias(samplerCUBE s, float4 t);
+float4 texCUBEgrad(samplerCUBE s, float3 t, float3 ddx, float3 ddy);
+float4 texCUBElod(samplerCUBE s, float4 t);
+float4 texCUBEproj(samplerCUBE s, float4 t);
+*/
+
+// Matrix transpose
+__generic<T : __BuiltinType, let N : int, let M : int> matrix<T,M,N> transpose(matrix<T,N,M> x);
+
+// Truncate to integer
+__generic<T : __BuiltinFloatingPointType> T trunc(T x);
+__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> trunc(vector<T,N> x);
+__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> trunc(matrix<T,N,M> x);
+
+// Shader model 6.0 stuff
+
+uint GlobalOrderedCountIncrement(uint countToAppendForThisLane);
+
+__generic<T : __BuiltinType> T QuadReadLaneAt(T sourceValue, int quadLaneID);
+__generic<T : __BuiltinType, let N : int> vector<T,N> QuadReadLaneAt(vector<T,N> sourceValue, int quadLaneID);
+__generic<T : __BuiltinType, let N : int, let M : int> matrix<T,N,M> QuadReadLaneAt(matrix<T,N,M> sourceValue, int quadLaneID);
+
+__generic<T : __BuiltinType> T QuadSwapX(T localValue);
+__generic<T : __BuiltinType, let N : int> vector<T,N> QuadSwapX(vector<T,N> localValue);
+__generic<T : __BuiltinType, let N : int, let M : int> matrix<T,N,M> QuadSwapX(matrix<T,N,M> localValue);
+
+__generic<T : __BuiltinType> T QuadSwapY(T localValue);
+__generic<T : __BuiltinType, let N : int> vector<T,N> QuadSwapY(vector<T,N> localValue);
+__generic<T : __BuiltinType, let N : int, let M : int> matrix<T,N,M> QuadSwapY(matrix<T,N,M> localValue);
+
+__generic<T : __BuiltinIntegerType> T WaveAllBitAnd(T expr);
+__generic<T : __BuiltinIntegerType, let N : int> vector<T,N> WaveAllBitAnd(vector<T,N> expr);
+__generic<T : __BuiltinIntegerType, let N : int, let M : int> matrix<T,N,M> WaveAllBitAnd(matrix<T,N,M> expr);
+
+__generic<T : __BuiltinIntegerType> T WaveAllBitOr(T expr);
+__generic<T : __BuiltinIntegerType, let N : int> vector<T,N> WaveAllBitOr(vector<T,N> expr);
+__generic<T : __BuiltinIntegerType, let N : int, let M : int> matrix<T,N,M> WaveAllBitOr(matrix<T,N,M> expr);
+
+__generic<T : __BuiltinIntegerType> T WaveAllBitXor(T expr);
+__generic<T : __BuiltinIntegerType, let N : int> vector<T,N> WaveAllBitXor(vector<T,N> expr);
+__generic<T : __BuiltinIntegerType, let N : int, let M : int> matrix<T,N,M> WaveAllBitXor(matrix<T,N,M> expr);
+
+__generic<T : __BuiltinArithmeticType> T WaveAllMax(T expr);
+__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> WaveAllMax(vector<T,N> expr);
+__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> WaveAllMax(matrix<T,N,M> expr);
+
+__generic<T : __BuiltinArithmeticType> T WaveAllMin(T expr);
+__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> WaveAllMin(vector<T,N> expr);
+__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> WaveAllMin(matrix<T,N,M> expr);
+
+__generic<T : __BuiltinArithmeticType> T WaveAllProduct(T expr);
+__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> WaveAllProduct(vector<T,N> expr);
+__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> WaveAllProduct(matrix<T,N,M> expr);
+
+__generic<T : __BuiltinArithmeticType> T WaveAllSum(T expr);
+__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> WaveAllSum(vector<T,N> expr);
+__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> WaveAllSum(matrix<T,N,M> expr);
+
+bool WaveAllEqual(bool expr);
+bool WaveAllTrue(bool expr);
+bool WaveAnyTrue(bool expr);
+
+uint64_t WaveBallot(bool expr);
+
+uint WaveGetLaneCount();
+uint WaveGetLaneIndex();
+uint WaveGetOrderedIndex();
+
+bool WaveIsHelperLane();
+
+bool WaveOnce();
+
+__generic<T : __BuiltinArithmeticType> T WavePrefixProduct(T expr);
+__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> WavePrefixProduct(vector<T,N> expr);
+__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> WavePrefixProduct(matrix<T,N,M> expr);
+
+__generic<T : __BuiltinArithmeticType> T WavePrefixSum(T expr);
+__generic<T : __BuiltinArithmeticType, let N : int> vector<T,N> WavePrefixSum(vector<T,N> expr);
+__generic<T : __BuiltinArithmeticType, let N : int, let M : int> matrix<T,N,M> WavePrefixSum(matrix<T,N,M> expr);
+
+__generic<T : __BuiltinType> T WaveReadFirstLane(T expr);
+__generic<T : __BuiltinType, let N : int> vector<T,N> WaveReadFirstLane(vector<T,N> expr);
+__generic<T : __BuiltinType, let N : int, let M : int> matrix<T,N,M> WaveReadFirstLane(matrix<T,N,M> expr);
+
+__generic<T : __BuiltinType> T WaveReadLaneAt(T expr, int laneIndex);
+__generic<T : __BuiltinType, let N : int> vector<T,N> WaveReadLaneAt(vector<T,N> expr, int laneIndex);
+__generic<T : __BuiltinType, let N : int, let M : int> matrix<T,N,M> WaveReadLaneAt(matrix<T,N,M> expr, int laneIndex);
+
+// `typedef`s to help with the fact that HLSL has been sorta-kinda case insensitive at various points
+typedef Texture2D texture2D;
+
+${{{{
+// Component-wise multiplication ops
+for(auto op : binaryOps)
+{
+ switch (op.opCode)
+ {
+ default:
+ continue;
+
+ case kIROp_Mul:
+ case kIRPseudoOp_MulAssign:
+ break;
+ }
+
+ for (auto type : kBaseTypes)
+ {
+ if ((type.flags & op.flags) == 0)
+ continue;
+
+ char const* leftType = type.name;
+ char const* rightType = leftType;
+ char const* resultType = leftType;
+
+ char const* leftQual = "";
+ if(op.flags & ASSIGNMENT) leftQual = "in out ";
+
+ 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";
+ }
+}
+
+//
+
+// 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 flavor = TextureFlavor::create(TextureFlavor::Shape::ShapeBuffer, kBaseBufferAccessLevels[aa].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";
+
+ sb << "__glsl_extension(GL_EXT_samplerless_texture_functions)";
+ sb << "__target_intrinsic(glsl, \"texelFetch($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, \"texelFetch($0, int($1))$z\") get;\n";
+
+ if (kBaseBufferAccessLevels[aa].access != SLANG_RESOURCE_ACCESS_READ)
+ {
+ sb << "ref;\n";
+ }
+
+ sb << "}\n";
+
+ sb << "};\n";
+}
+}}}}
+
+
+// DirectX Raytracing (DXR) Support
+//
+// The following is based on the experimental DXR SDK v0.09.01.
+//
+// Numbering follows the sections in the "D3D12 Raytracing Functional Spec" v0.09 (2018-03-12)
+//
+
+// 10.1.1 - Ray Flags
+
+typedef uint RAY_FLAG;
+
+static const RAY_FLAG RAY_FLAG_NONE = 0x00;
+static const RAY_FLAG RAY_FLAG_FORCE_OPAQUE = 0x01;
+static const RAY_FLAG RAY_FLAG_FORCE_NON_OPAQUE = 0x02;
+static const RAY_FLAG RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH = 0x04;
+static const RAY_FLAG RAY_FLAG_SKIP_CLOSEST_HIT_SHADER = 0x08;
+static const RAY_FLAG RAY_FLAG_CULL_BACK_FACING_TRIANGLES = 0x10;
+static const RAY_FLAG RAY_FLAG_CULL_FRONT_FACING_TRIANGLES = 0x20;
+static const RAY_FLAG RAY_FLAG_CULL_OPAQUE = 0x40;
+static const RAY_FLAG RAY_FLAG_CULL_NON_OPAQUE = 0x80;
+
+// 10.1.2 - Ray Description Structure
+
+__builtin
+__magic_type(RayDescType)
+__intrinsic_type($(kIROp_RayDescType))
+struct RayDesc
+{
+ __target_intrinsic(hlsl, Origin)
+ float3 Origin;
+
+ __target_intrinsic(hlsl, TMin)
+ float TMin;
+
+ __target_intrinsic(hlsl, Direction)
+ float3 Direction;
+
+ __target_intrinsic(hlsl, TMax)
+ float TMax;
+};
+
+// 10.1.3 - Ray Acceleration Structure
+
+__builtin
+__magic_type(RaytracingAccelerationStructureType)
+__intrinsic_type($(kIROp_RaytracingAccelerationStructureType))
+struct RaytracingAccelerationStructure {};
+
+// 10.1.4 - Subobject Definitions
+
+// TODO: We may decide to support these, but their reliance on C++ implicit
+// constructor call syntax (`SomeType someVar(arg0, arg1);`) makes them
+// annoying for the current Slang parsing strategy, and using global variables
+// for this stuff comes across as a kludge rather than the best possible design.
+
+// 10.1.5 - Intersection Attributes Structure
+
+__builtin
+__magic_type(BuiltInTriangleIntersectionAttributesType)
+__intrinsic_type($(kIROp_BuiltInTriangleIntersectionAttributesType))
+struct BuiltInTriangleIntersectionAttributes
+{
+ __target_intrinsic(hlsl, barycentrics)
+ float2 barycentrics;
+};
+
+// 10.2 Shaders
+
+// Right now new shader stages need to be added directly to the compiler
+// implementation, rather than being something that can be declared in the stdlib.
+
+// 10.3 - Intrinsics
+
+// 10.3.1
+void CallShader<param_t>(uint ShaderIndex, inout param_t Parameter);
+
+// 10.3.2
+void TraceRay<payload_t>(
+ RaytracingAccelerationStructure AccelerationStructure,
+ uint RayFlags,
+ uint InstanceInclusionMask,
+ uint RayContributionToHitGroupIndex,
+ uint MultiplierForGeometryContributionToHitGroupIndex,
+ uint MissShaderIndex,
+ RayDesc Ray,
+ inout payload_t Payload);
+
+// 10.3.3
+bool ReportHit<attr_t>(float THit, uint HitKind, attr_t Attributes);
+
+// 10.3.4
+void IgnoreHit();
+
+// 10.3.5
+void AcceptHitAndEndSearch();
+
+// 10.4 - System Values and Special Semantics
+
+// TODO: Many of these functions need to be restricted so that
+// they can only be accessed from specific stages.
+
+// 10.4.1 - Ray Dispatch System Values
+uint3 DispatchRaysIndex();
+uint3 DispatchRaysDimensions();
+
+// 10.4.2 - Ray System Values
+float3 WorldRayOrigin();
+float3 WorldRayDirection();
+float RayTMin();
+float RayTCurrent();
+uint RayFlags();
+
+// 10.4.3 - Primitive/Object Space System Values
+uint InstanceIndex();
+uint InstanceID();
+uint PrimitiveIndex();
+float3 ObjectRayOrigin();
+float3 ObjectRayDirection();
+
+float3x4 ObjectToWorld3x4();
+float4x3 ObjectToWorld4x3();
+float3x4 WorldToObject3x4();
+float4x3 WorldToObject4x3();
+// Note: The provisional DXR spec included these unadorned
+// `ObjectToWorld()` and `WorldToObject()` functions, so
+// we will forward them to the new names as a convience
+// for users who are porting their code.
+//
+// TODO: Should we provide a deprecation warning on these
+// declarations, so that users can know they aren't coding
+// against the final spec?
+//
+float3x4 ObjectToWorld() { return ObjectToWorld3x4(); }
+float3x4 WorldToObject() { return WorldToObject3x4(); }
+
+// 10.4.4 - Hit Specific System values
+uint HitKind();
diff --git a/source/slang/hlsl.meta.slang.h b/source/slang/hlsl.meta.slang.h index 54aa2710d..21a9305f8 100644 --- a/source/slang/hlsl.meta.slang.h +++ b/source/slang/hlsl.meta.slang.h @@ -1436,8 +1436,8 @@ 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("uint2 DispatchRaysIndex();\n") -SLANG_RAW("uint2 DispatchRaysDimensions();\n") +SLANG_RAW("uint3 DispatchRaysIndex();\n") +SLANG_RAW("uint3 DispatchRaysDimensions();\n") SLANG_RAW("\n") SLANG_RAW("// 10.4.2 - Ray System Values\n") SLANG_RAW("float3 WorldRayOrigin();\n") @@ -1452,8 +1452,23 @@ SLANG_RAW("uint InstanceID();\n") SLANG_RAW("uint PrimitiveIndex();\n") SLANG_RAW("float3 ObjectRayOrigin();\n") SLANG_RAW("float3 ObjectRayDirection();\n") -SLANG_RAW("float3x4 ObjectToWorld();\n") -SLANG_RAW("float3x4 WorldToObject();\n") +SLANG_RAW("\n") +SLANG_RAW("float3x4 ObjectToWorld3x4();\n") +SLANG_RAW("float4x3 ObjectToWorld4x3();\n") +SLANG_RAW("float3x4 WorldToObject3x4();\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("uint HitKind();\n") |
