// Slang HLSL compatibility library typedef uint UINT; __generic __magic_type(HLSLAppendStructuredBufferType) struct AppendStructuredBuffer { __intrinsic_op void Append(T value); __intrinsic_op void GetDimensions( out uint numStructs, out uint stride); }; __magic_type(HLSLByteAddressBufferType) struct ByteAddressBuffer { __intrinsic_op void GetDimensions( out uint dim); __intrinsic_op uint Load(int location); __intrinsic_op uint Load(int location, out uint status); __intrinsic_op uint2 Load2(int location); __intrinsic_op uint2 Load2(int location, out uint status); __intrinsic_op uint3 Load3(int location); __intrinsic_op uint3 Load3(int location, out uint status); __intrinsic_op uint4 Load4(int location); __intrinsic_op uint4 Load4(int location, out uint status); }; __generic __magic_type(HLSLStructuredBufferType) __intrinsic_type(${{ // TODO: we really need a simple way to write an "expression splice" sb << kIROp_structuredBufferType; }}) struct StructuredBuffer { __intrinsic_op void GetDimensions( out uint numStructs, out uint stride); __intrinsic_op T Load(int location); __intrinsic_op T Load(int location, out uint status); __intrinsic_op(bufferLoad) __subscript(uint index) -> T; }; __generic __magic_type(HLSLConsumeStructuredBufferType) struct ConsumeStructuredBuffer { __intrinsic_op T Consume(); __intrinsic_op void GetDimensions( out uint numStructs, out uint stride); }; __generic __magic_type(HLSLInputPatchType) struct InputPatch { __intrinsic_op __subscript(uint index) -> T; }; __generic __magic_type(HLSLOutputPatchType) struct OutputPatch { __intrinsic_op __subscript(uint index) -> T { set; } }; __magic_type(HLSLRWByteAddressBufferType) struct RWByteAddressBuffer { // Note(tfoley): supports alll operations from `ByteAddressBuffer` // TODO(tfoley): can this be made a sub-type? __intrinsic_op void GetDimensions( out uint dim); __intrinsic_op uint Load(int location); __intrinsic_op uint Load(int location, out uint status); __intrinsic_op uint2 Load2(int location); __intrinsic_op uint2 Load2(int location, out uint status); __intrinsic_op uint3 Load3(int location); __intrinsic_op uint3 Load3(int location, out uint status); __intrinsic_op uint4 Load4(int location); __intrinsic_op uint4 Load4(int location, out uint status); // Added operations: __intrinsic_op void InterlockedAdd( UINT dest, UINT value, out UINT original_value); __intrinsic_op void InterlockedAdd( UINT dest, UINT value); __intrinsic_op void InterlockedAnd( UINT dest, UINT value, out UINT original_value); __intrinsic_op void InterlockedAnd( UINT dest, UINT value); __intrinsic_op void InterlockedCompareExchange( UINT dest, UINT compare_value, UINT value, out UINT original_value); __intrinsic_op void InterlockedCompareExchange( UINT dest, UINT compare_value, UINT value); __intrinsic_op void InterlockedCompareStore( UINT dest, UINT compare_value, UINT value); __intrinsic_op void InterlockedCompareStore( UINT dest, UINT compare_value); __intrinsic_op void InterlockedExchange( UINT dest, UINT value, out UINT original_value); __intrinsic_op void InterlockedExchange( UINT dest, UINT value); __intrinsic_op void InterlockedMax( UINT dest, UINT value, out UINT original_value); __intrinsic_op void InterlockedMax( UINT dest, UINT value); __intrinsic_op void InterlockedMin( UINT dest, UINT value, out UINT original_value); __intrinsic_op void InterlockedMin( UINT dest, UINT value); __intrinsic_op void InterlockedOr( UINT dest, UINT value, out UINT original_value); __intrinsic_op void InterlockedOr( UINT dest, UINT value); __intrinsic_op void InterlockedXor( UINT dest, UINT value, out UINT original_value); __intrinsic_op void InterlockedXor( UINT dest, UINT value); __intrinsic_op void Store( uint address, uint value); __intrinsic_op void Store2( uint address, uint2 value); __intrinsic_op void Store3( uint address, uint3 value); __intrinsic_op void Store4( uint address, uint4 value); }; __generic __magic_type(HLSLRWStructuredBufferType) __intrinsic_type(${{ // TODO: we really need a simple way to write an "expression splice" sb << kIROp_readWriteStructuredBufferType; }}) struct RWStructuredBuffer { __intrinsic_op uint DecrementCounter(); __intrinsic_op void GetDimensions( out uint numStructs, out uint stride); __intrinsic_op uint IncrementCounter(); __intrinsic_op T Load(int location); __intrinsic_op T Load(int location, out uint status); __intrinsic_op __subscript(uint index) -> T { __intrinsic_op(bufferLoad) get; __intrinsic_op(bufferStore) set; } }; __generic __magic_type(HLSLPointStreamType) struct PointStream { void Append(T value); void RestartStrip(); }; __generic __magic_type(HLSLLineStreamType) struct LineStream { void Append(T value); void RestartStrip(); }; __generic __magic_type(HLSLTriangleStreamType) struct TriangleStream { void Append(T value); 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) __intrinsic_op void abort(); // Absolute value (HLSL SM 1.0) __generic __intrinsic_op T abs(T x); __generic __intrinsic_op vector abs(vector x); __generic __intrinsic_op matrix abs(matrix x); // Inverse cosine (HLSL SM 1.0) __generic __intrinsic_op T acos(T x); __generic __intrinsic_op vector acos(vector x); __generic __intrinsic_op matrix acos(matrix x); // Test if all components are non-zero (HLSL SM 1.0) __generic __intrinsic_op T all(T x); __generic __intrinsic_op vector all(vector x); __generic __intrinsic_op matrix all(matrix x); // Barrier for writes to all memory spaces (HLSL SM 5.0) __intrinsic_op void AllMemoryBarrier(); // Thread-group sync and barrier for writes to all memory spaces (HLSL SM 5.0) __intrinsic_op void AllMemoryBarrierWithGroupSync(); // Test if any components is non-zero (HLSL SM 1.0) __generic __intrinsic_op T any(T x); __generic __intrinsic_op vector any(vector x); __generic __intrinsic_op matrix any(matrix x); // Reinterpret bits as a double (HLSL SM 5.0) __intrinsic_op double asdouble(uint lowbits, uint highbits); // Reinterpret bits as a float (HLSL SM 4.0) __intrinsic_op float asfloat( int x); __intrinsic_op float asfloat(uint x); __generic __intrinsic_op vector asfloat(vector< int,N> x); __generic __intrinsic_op vector asfloat(vector x); __generic __intrinsic_op matrix asfloat(matrix< int,N,M> x); __generic __intrinsic_op matrix asfloat(matrix x); // Inverse sine (HLSL SM 1.0) __generic __intrinsic_op T asin(T x); __generic __intrinsic_op vector asin(vector x); __generic __intrinsic_op matrix asin(matrix x); // Reinterpret bits as an int (HLSL SM 4.0) __intrinsic_op int asint(float x); __intrinsic_op int asint(uint x); __generic __intrinsic_op vector asint(vector x); __generic __intrinsic_op vector asint(vector x); __generic __intrinsic_op matrix asint(matrix x); __generic __intrinsic_op matrix asint(matrix x); // Reinterpret bits of double as a uint (HLSL SM 5.0) __intrinsic_op void asuint(double value, out uint lowbits, out uint highbits); // Reinterpret bits as a uint (HLSL SM 4.0) __intrinsic_op uint asuint(float x); __intrinsic_op uint asuint(int x); __generic __intrinsic_op vector asuint(vector x); __generic __intrinsic_op vector asuint(vector x); __generic __intrinsic_op matrix asuint(matrix x); __generic __intrinsic_op matrix asuint(matrix x); // Inverse tangent (HLSL SM 1.0) __generic __intrinsic_op T atan(T x); __generic __intrinsic_op vector atan(vector x); __generic __intrinsic_op matrix atan(matrix x); __generic __target_intrinsic(glsl,"atan($0,$1)") __intrinsic_op T atan2(T y, T x); __generic __target_intrinsic(glsl,"atan($0,$1)") __intrinsic_op vector atan2(vector y, vector x); __generic __target_intrinsic(glsl,"atan($0,$1)") __intrinsic_op matrix atan2(matrix y, matrix x); // Ceiling (HLSL SM 1.0) __generic __intrinsic_op T ceil(T x); __generic __intrinsic_op vector ceil(vector x); __generic __intrinsic_op matrix ceil(matrix x); // Check access status to tiled resource __intrinsic_op bool CheckAccessFullyMapped(uint status); // Clamp (HLSL SM 1.0) __generic T clamp(T x, T min, T max); __generic vector clamp(vector x, vector min, vector max); __generic matrix clamp(matrix x, matrix min, matrix max); // Clip (discard) fragment conditionally __generic __intrinsic_op void clip(T x); __generic __intrinsic_op void clip(vector x); __generic __intrinsic_op void clip(matrix x); // Cosine __generic T cos(T x); __generic vector cos(vector x); __generic matrix cos(matrix x); // Hyperbolic cosine __generic __intrinsic_op T cosh(T x); __generic __intrinsic_op vector cosh(vector x); __generic __intrinsic_op matrix cosh(matrix x); // Population count __intrinsic_op uint countbits(uint value); // Cross product __generic __intrinsic_op vector cross(vector x, vector y); // Convert encoded color __intrinsic_op int4 D3DCOLORtoUBYTE4(float4 x); // Partial-difference derivatives __generic __target_intrinsic(glsl, dFdx) __intrinsic_op T ddx(T x); __generic __target_intrinsic(glsl, dFdx) __intrinsic_op vector ddx(vector x); __generic __target_intrinsic(glsl, dFdx) __intrinsic_op matrix ddx(matrix x); __generic __glsl_extension(GL_ARB_derivative_control) __target_intrinsic(glsl, dFdxCoarse) __intrinsic_op T ddx_coarse(T x); __generic __glsl_extension(GL_ARB_derivative_control) __target_intrinsic(glsl, dFdxCoarse) __intrinsic_op vector ddx_coarse(vector x); __generic __glsl_extension(GL_ARB_derivative_control) __target_intrinsic(glsl, dFdxCoarse) __intrinsic_op matrix ddx_coarse(matrix x); __generic __glsl_extension(GL_ARB_derivative_control) __target_intrinsic(glsl, dFdxFine) __intrinsic_op T ddx_fine(T x); __generic __glsl_extension(GL_ARB_derivative_control) __target_intrinsic(glsl, dFdxFine) __intrinsic_op vector ddx_fine(vector x); __generic __glsl_extension(GL_ARB_derivative_control) __target_intrinsic(glsl, dFdxFine) __intrinsic_op matrix ddx_fine(matrix x); __generic __target_intrinsic(glsl, dFdy) __intrinsic_op T ddy(T x); __generic __target_intrinsic(glsl, dFdy) __intrinsic_op vector ddy(vector x); __generic __target_intrinsic(glsl, dFdy) __intrinsic_op matrix ddy(matrix x); __generic __glsl_extension(GL_ARB_derivative_control) __target_intrinsic(glsl, dFdyCoarse) __intrinsic_op T ddy_coarse(T x); __generic __glsl_extension(GL_ARB_derivative_control) __target_intrinsic(glsl, dFdyCoarse) __intrinsic_op vector ddy_coarse(vector x); __generic __glsl_extension(GL_ARB_derivative_control) __target_intrinsic(glsl, dFdyCoarse) __intrinsic_op matrix ddy_coarse(matrix x); __generic __glsl_extension(GL_ARB_derivative_control) __target_intrinsic(glsl, dFdyFine) __intrinsic_op T ddy_fine(T x); __generic __glsl_extension(GL_ARB_derivative_control) __target_intrinsic(glsl, dFdyFine) __intrinsic_op vector ddy_fine(vector x); __generic __glsl_extension(GL_ARB_derivative_control) __target_intrinsic(glsl, dFdyFine) __intrinsic_op matrix ddy_fine(matrix x); // Radians to degrees __generic __intrinsic_op T degrees(T x); __generic __intrinsic_op vector degrees(vector x); __generic __intrinsic_op matrix degrees(matrix x); // Matrix determinant __generic __intrinsic_op T determinant(matrix m); // Barrier for device memory __intrinsic_op void DeviceMemoryBarrier(); __intrinsic_op void DeviceMemoryBarrierWithGroupSync(); // Vector distance __generic __intrinsic_op T distance(vector x, vector y); // Vector dot product __generic __intrinsic_op T dot(vector x, vector y); // Helper for computing distance terms for lighting (obsolete) __generic __intrinsic_op vector dst(vector x, vector y); // Error message // __intrinsic_op void errorf( string format, ... ); // Attribute evaluation __generic __intrinsic_op T EvaluateAttributeAtCentroid(T x); __generic __intrinsic_op vector EvaluateAttributeAtCentroid(vector x); __generic __intrinsic_op matrix EvaluateAttributeAtCentroid(matrix x); __generic __intrinsic_op T EvaluateAttributeAtSample(T x, uint sampleindex); __generic __intrinsic_op vector EvaluateAttributeAtSample(vector x, uint sampleindex); __generic __intrinsic_op matrix EvaluateAttributeAtSample(matrix x, uint sampleindex); __generic __intrinsic_op T EvaluateAttributeSnapped(T x, int2 offset); __generic __intrinsic_op vector EvaluateAttributeSnapped(vector x, int2 offset); __generic __intrinsic_op matrix EvaluateAttributeSnapped(matrix x, int2 offset); // Base-e exponent __generic __intrinsic_op T exp(T x); __generic __intrinsic_op vector exp(vector x); __generic __intrinsic_op matrix exp(matrix x); // Base-2 exponent __generic __intrinsic_op T exp2(T x); __generic __intrinsic_op vector exp2(vector x); __generic __intrinsic_op matrix exp2(matrix x); // Convert 16-bit float stored in low bits of integer __intrinsic_op float f16tof32(uint value); __generic __intrinsic_op vector f16tof32(vector value); // Convert to 16-bit float stored in low bits of integer __intrinsic_op uint f32tof16(float value); __generic __intrinsic_op vector f32tof16(vector value); // Flip surface normal to face forward, if needed __generic __intrinsic_op vector faceforward(vector n, vector i, vector ng); // Find first set bit starting at high bit and working down __intrinsic_op int firstbithigh(int value); __generic __intrinsic_op vector firstbithigh(vector value); __intrinsic_op uint firstbithigh(uint value); __generic __intrinsic_op vector firstbithigh(vector value); // Find first set bit starting at low bit and working up __intrinsic_op int firstbitlow(int value); __generic __intrinsic_op vector firstbitlow(vector value); __intrinsic_op uint firstbitlow(uint value); __generic __intrinsic_op vector firstbitlow(vector value); // Floor (HLSL SM 1.0) __generic __intrinsic_op T floor(T x); __generic __intrinsic_op vector floor(vector x); __generic __intrinsic_op matrix floor(matrix x); // Fused multiply-add for doubles __intrinsic_op double fma(double a, double b, double c); __generic __intrinsic_op vector fma(vector a, vector b, vector c); __generic __intrinsic_op matrix fma(matrix a, matrix b, matrix c); // Floating point remainder of x/y __generic __intrinsic_op T fmod(T x, T y); __generic __intrinsic_op vector fmod(vector x, vector y); __generic __intrinsic_op matrix fmod(matrix x, matrix y); // Fractional part __generic __target_intrinsic(glsl, fract) __intrinsic_op T frac(T x); __generic __target_intrinsic(glsl, fract) __intrinsic_op vector frac(vector x); __generic __target_intrinsic(glsl, fract) __intrinsic_op matrix frac(matrix x); // Split float into mantissa and exponent __generic __intrinsic_op T frexp(T x, out T exp); __generic __intrinsic_op vector frexp(vector x, out vector exp); __generic __intrinsic_op matrix frexp(matrix x, out matrix exp); // Texture filter width __generic __intrinsic_op T fwidth(T x); __generic __intrinsic_op vector fwidth(vector x); __generic __intrinsic_op matrix fwidth(matrix x); // Get number of samples in render target __intrinsic_op uint GetRenderTargetSampleCount(); // Get position of given sample __intrinsic_op float2 GetRenderTargetSamplePosition(int Index); // Group memory barrier __intrinsic_op void GroupMemoryBarrier(); __intrinsic_op void GroupMemoryBarrierWithGroupSync(); // Atomics __intrinsic_op void InterlockedAdd(in out int dest, int value, out int original_value); __intrinsic_op void InterlockedAdd(in out uint dest, uint value, out uint original_value); __intrinsic_op void InterlockedAnd(in out int dest, int value, out int original_value); __intrinsic_op void InterlockedAnd(in out uint dest, uint value, out uint original_value); __intrinsic_op void InterlockedCompareExchange(in out int dest, int compare_value, int value, out int original_value); __intrinsic_op void InterlockedCompareExchange(in out uint dest, uint compare_value, uint value, out uint original_value); __intrinsic_op void InterlockedCompareStore(in out int dest, int compare_value, int value); __intrinsic_op void InterlockedCompareStore(in out uint dest, uint compare_value, uint value); __intrinsic_op void InterlockedExchange(in out int dest, int value, out int original_value); __intrinsic_op void InterlockedExchange(in out uint dest, uint value, out uint original_value); __intrinsic_op void InterlockedMax(in out int dest, int value, out int original_value); __intrinsic_op void InterlockedMax(in out uint dest, uint value, out uint original_value); __intrinsic_op void InterlockedMin(in out int dest, int value, out int original_value); __intrinsic_op void InterlockedMin(in out uint dest, uint value, out uint original_value); __intrinsic_op void InterlockedOr(in out int dest, int value, out int original_value); __intrinsic_op void InterlockedOr(in out uint dest, uint value, out uint original_value); __intrinsic_op void InterlockedXor(in out int dest, int value, out int original_value); __intrinsic_op void InterlockedXor(in out uint dest, uint value, out uint original_value); // Is floating-point value finite? __generic __intrinsic_op bool isfinite(T x); __generic __intrinsic_op vector isfinite(vector x); __generic __intrinsic_op matrix isfinite(matrix x); // Is floating-point value infinite? __generic __intrinsic_op bool isinf(T x); __generic __intrinsic_op vector isinf(vector x); __generic __intrinsic_op matrix isinf(matrix x); // Is floating-point value not-a-number? __generic __intrinsic_op bool isnan(T x); __generic __intrinsic_op vector isnan(vector x); __generic __intrinsic_op matrix isnan(matrix x); // Construct float from mantissa and exponent __generic __intrinsic_op T ldexp(T x, T exp); __generic __intrinsic_op vector ldexp(vector x, vector exp); __generic __intrinsic_op matrix ldexp(matrix x, matrix exp); // Vector length __generic __intrinsic_op T length(vector x); // Linear interpolation __generic __target_intrinsic(glsl, mix) __intrinsic_op T lerp(T x, T y, T s); __generic __target_intrinsic(glsl, mix) __intrinsic_op vector lerp(vector x, vector y, vector s); __generic __target_intrinsic(glsl, mix) __intrinsic_op matrix lerp(matrix x, matrix y, matrix s); // Legacy lighting function (obsolete) __intrinsic_op float4 lit(float n_dot_l, float n_dot_h, float m); // Base-e logarithm __generic __intrinsic_op T log(T x); __generic __intrinsic_op vector log(vector x); __generic __intrinsic_op matrix log(matrix x); // Base-10 logarithm __generic __intrinsic_op T log10(T x); __generic __intrinsic_op vector log10(vector x); __generic __intrinsic_op matrix log10(matrix x); // Base-2 logarithm __generic __intrinsic_op T log2(T x); __generic __intrinsic_op vector log2(vector x); __generic __intrinsic_op matrix log2(matrix x); // multiply-add __generic __intrinsic_op T mad(T mvalue, T avalue, T bvalue); __generic __intrinsic_op vector mad(vector mvalue, vector avalue, vector bvalue); __generic __intrinsic_op matrix mad(matrix mvalue, matrix avalue, matrix bvalue); // maximum __generic __intrinsic_op T max(T x, T y); __generic __intrinsic_op vector max(vector x, vector y); __generic __intrinsic_op matrix max(matrix x, matrix y); // minimum __generic __intrinsic_op T min(T x, T y); __generic __intrinsic_op vector min(vector x, vector y); __generic __intrinsic_op matrix min(matrix x, matrix y); // split into integer and fractional parts (both with same sign) __generic __intrinsic_op T modf(T x, out T ip); __generic __intrinsic_op vector modf(vector x, out vector ip); __generic __intrinsic_op matrix modf(matrix x, out matrix ip); // msad4 (whatever that is) __intrinsic_op uint4 msad4(uint reference, uint2 source, uint4 accum); // General inner products // scalar-scalar __generic __intrinsic_op T mul(T x, T y); // scalar-vector and vector-scalar __generic __intrinsic_op vector mul(vector x, T y); __generic __intrinsic_op vector mul(T x, vector y); // scalar-matrix and matrix-scalar __generic __intrinsic_op matrix mul(matrix x, T y); __generic __intrinsic_op matrix mul(T x, matrix y); // vector-vector (dot product) __generic __intrinsic_op(dot) T mul(vector x, vector y); // vector-matrix __generic __intrinsic_op(mulVectorMatrix) vector mul(vector x, matrix y); // matrix-vector __generic __intrinsic_op(mulMatrixVector) vector mul(matrix x, vector y); // matrix-matrix __generic __intrinsic_op(mulMatrixMatrix) matrix mul(matrix x, matrix y); // noise (deprecated) __intrinsic_op float noise(float x); __generic __intrinsic_op float noise(vector x); // Normalize a vector __generic __intrinsic_op vector normalize(vector x); // Raise to a power __generic __intrinsic_op T pow(T x, T y); __generic __intrinsic_op vector pow(vector x, vector y); __generic __intrinsic_op matrix pow(matrix x, matrix y); // Output message // __intrinsic_op void printf( string format, ... ); // Tessellation factor fixup routines __intrinsic_op void Process2DQuadTessFactorsAvg( in float4 RawEdgeFactors, in float2 InsideScale, out float4 RoundedEdgeTessFactors, out float2 RoundedInsideTessFactors, out float2 UnroundedInsideTessFactors); __intrinsic_op void Process2DQuadTessFactorsMax( in float4 RawEdgeFactors, in float2 InsideScale, out float4 RoundedEdgeTessFactors, out float2 RoundedInsideTessFactors, out float2 UnroundedInsideTessFactors); __intrinsic_op void Process2DQuadTessFactorsMin( in float4 RawEdgeFactors, in float2 InsideScale, out float4 RoundedEdgeTessFactors, out float2 RoundedInsideTessFactors, out float2 UnroundedInsideTessFactors); __intrinsic_op void ProcessIsolineTessFactors( in float RawDetailFactor, in float RawDensityFactor, out float RoundedDetailFactor, out float RoundedDensityFactor); __intrinsic_op void ProcessQuadTessFactorsAvg( in float4 RawEdgeFactors, in float InsideScale, out float4 RoundedEdgeTessFactors, out float2 RoundedInsideTessFactors, out float2 UnroundedInsideTessFactors); __intrinsic_op void ProcessQuadTessFactorsMax( in float4 RawEdgeFactors, in float InsideScale, out float4 RoundedEdgeTessFactors, out float2 RoundedInsideTessFactors, out float2 UnroundedInsideTessFactors); __intrinsic_op void ProcessQuadTessFactorsMin( in float4 RawEdgeFactors, in float InsideScale, out float4 RoundedEdgeTessFactors, out float2 RoundedInsideTessFactors, out float2 UnroundedInsideTessFactors); __intrinsic_op void ProcessTriTessFactorsAvg( in float3 RawEdgeFactors, in float InsideScale, out float3 RoundedEdgeTessFactors, out float RoundedInsideTessFactor, out float UnroundedInsideTessFactor); __intrinsic_op void ProcessTriTessFactorsMax( in float3 RawEdgeFactors, in float InsideScale, out float3 RoundedEdgeTessFactors, out float RoundedInsideTessFactor, out float UnroundedInsideTessFactor); __intrinsic_op void ProcessTriTessFactorsMin( in float3 RawEdgeFactors, in float InsideScale, out float3 RoundedEdgeTessFactors, out float RoundedInsideTessFactors, out float UnroundedInsideTessFactors); // Degrees to radians __generic __intrinsic_op T radians(T x); __generic __intrinsic_op vector radians(vector x); __generic __intrinsic_op matrix radians(matrix x); // Approximate reciprocal __generic __intrinsic_op T rcp(T x); __generic __intrinsic_op vector rcp(vector x); __generic __intrinsic_op matrix rcp(matrix x); // Reflect incident vector across plane with given normal __generic __intrinsic_op vector reflect(vector i, vector n); // Refract incident vector given surface normal and index of refraction __generic __intrinsic_op vector refract(vector i, vector n, float eta); // Reverse order of bits __intrinsic_op uint reversebits(uint value); __generic vector reversebits(vector value); // Round-to-nearest __generic __intrinsic_op T round(T x); __generic __intrinsic_op vector round(vector x); __generic __intrinsic_op matrix round(matrix x); // Reciprocal of square root __generic __intrinsic_op T rsqrt(T x); __generic __intrinsic_op vector rsqrt(vector x); __generic __intrinsic_op matrix rsqrt(matrix x); // Clamp value to [0,1] range __generic __target_intrinsic(glsl, "clamp($0, 0, 1)") T saturate(T x); __generic __target_intrinsic(glsl, "clamp($0, 0, 1)") vector saturate(vector x); __generic __target_intrinsic(glsl, "clamp($0, 0, 1)") matrix saturate(matrix x); __generic __specialized_for_target(glsl) T saturate(T x) { return clamp(x, T(0), T(1)); } __generic __specialized_for_target(glsl) vector saturate(vector x) { return clamp(x, vector(T(0)), vector(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 matrix __scalarToMatrix(T value); __generic __specialized_for_target(glsl) matrix saturate(matrix x) { return clamp(x, __scalarToMatrix(T(0)), __scalarToMatrix(T(1))); } // Extract sign of value __generic __intrinsic_op int sign(T x); __generic __intrinsic_op vector sign(vector x); __generic __intrinsic_op matrix sign(matrix x); // Sine __generic T sin(T x); __generic vector sin(vector x); __generic matrix sin(matrix x); // Sine and cosine __generic __intrinsic_op void sincos(T x, out T s, out T c); __generic __intrinsic_op void sincos(vector x, out vector s, out vector c); __generic __intrinsic_op void sincos(matrix x, out matrix s, out matrix c); // Hyperbolic Sine __generic __intrinsic_op T sinh(T x); __generic __intrinsic_op vector sinh(vector x); __generic __intrinsic_op matrix sinh(matrix x); // Smooth step (Hermite interpolation) __generic __intrinsic_op T smoothstep(T min, T max, T x); __generic __intrinsic_op vector smoothstep(vector min, vector max, vector x); __generic __intrinsic_op matrix smoothstep(matrix min, matrix max, matrix x); // Square root __generic __intrinsic_op T sqrt(T x); __generic __intrinsic_op vector sqrt(vector x); __generic __intrinsic_op matrix sqrt(matrix x); // Step function __generic __intrinsic_op T step(T y, T x); __generic __intrinsic_op vector step(vector y, vector x); __generic __intrinsic_op matrix step(matrix y, matrix x); // Tangent __generic __intrinsic_op T tan(T x); __generic __intrinsic_op vector tan(vector x); __generic __intrinsic_op matrix tan(matrix x); // Hyperbolic tangent __generic __intrinsic_op T tanh(T x); __generic __intrinsic_op vector tanh(vector x); __generic __intrinsic_op matrix tanh(matrix x); // Legacy texture-fetch operations /* __intrinsic_op float4 tex1D(sampler1D s, float t); __intrinsic_op float4 tex1D(sampler1D s, float t, float ddx, float ddy); __intrinsic_op float4 tex1Dbias(sampler1D s, float4 t); __intrinsic_op float4 tex1Dgrad(sampler1D s, float t, float ddx, float ddy); __intrinsic_op float4 tex1Dlod(sampler1D s, float4 t); __intrinsic_op float4 tex1Dproj(sampler1D s, float4 t); __intrinsic_op float4 tex2D(sampler2D s, float2 t); __intrinsic_op float4 tex2D(sampler2D s, float2 t, float2 ddx, float2 ddy); __intrinsic_op float4 tex2Dbias(sampler2D s, float4 t); __intrinsic_op float4 tex2Dgrad(sampler2D s, float2 t, float2 ddx, float2 ddy); __intrinsic_op float4 tex2Dlod(sampler2D s, float4 t); __intrinsic_op float4 tex2Dproj(sampler2D s, float4 t); __intrinsic_op float4 tex3D(sampler3D s, float3 t); __intrinsic_op float4 tex3D(sampler3D s, float3 t, float3 ddx, float3 ddy); __intrinsic_op float4 tex3Dbias(sampler3D s, float4 t); __intrinsic_op float4 tex3Dgrad(sampler3D s, float3 t, float3 ddx, float3 ddy); __intrinsic_op float4 tex3Dlod(sampler3D s, float4 t); __intrinsic_op float4 tex3Dproj(sampler3D s, float4 t); __intrinsic_op float4 texCUBE(samplerCUBE s, float3 t); __intrinsic_op float4 texCUBE(samplerCUBE s, float3 t, float3 ddx, float3 ddy); __intrinsic_op float4 texCUBEbias(samplerCUBE s, float4 t); __intrinsic_op float4 texCUBEgrad(samplerCUBE s, float3 t, float3 ddx, float3 ddy); __intrinsic_op float4 texCUBElod(samplerCUBE s, float4 t); __intrinsic_op float4 texCUBEproj(samplerCUBE s, float4 t); */ // Matrix transpose __generic __intrinsic_op matrix transpose(matrix x); // Truncate to integer __generic __intrinsic_op T trunc(T x); __generic __intrinsic_op vector trunc(vector x); __generic __intrinsic_op matrix trunc(matrix x); // Shader model 6.0 stuff __intrinsic_op uint GlobalOrderedCountIncrement(uint countToAppendForThisLane); __generic __intrinsic_op T QuadReadLaneAt(T sourceValue, int quadLaneID); __generic __intrinsic_op vector QuadReadLaneAt(vector sourceValue, int quadLaneID); __generic __intrinsic_op matrix QuadReadLaneAt(matrix sourceValue, int quadLaneID); __generic __intrinsic_op T QuadSwapX(T localValue); __generic __intrinsic_op vector QuadSwapX(vector localValue); __generic __intrinsic_op matrix QuadSwapX(matrix localValue); __generic __intrinsic_op T QuadSwapY(T localValue); __generic __intrinsic_op vector QuadSwapY(vector localValue); __generic __intrinsic_op matrix QuadSwapY(matrix localValue); __generic __intrinsic_op T WaveAllBitAnd(T expr); __generic __intrinsic_op vector WaveAllBitAnd(vector expr); __generic __intrinsic_op matrix WaveAllBitAnd(matrix expr); __generic __intrinsic_op T WaveAllBitOr(T expr); __generic __intrinsic_op vector WaveAllBitOr(vector expr); __generic __intrinsic_op matrix WaveAllBitOr(matrix expr); __generic __intrinsic_op T WaveAllBitXor(T expr); __generic __intrinsic_op vector WaveAllBitXor(vector expr); __generic __intrinsic_op matrix WaveAllBitXor(matrix expr); __generic __intrinsic_op T WaveAllMax(T expr); __generic __intrinsic_op vector WaveAllMax(vector expr); __generic __intrinsic_op matrix WaveAllMax(matrix expr); __generic __intrinsic_op T WaveAllMin(T expr); __generic __intrinsic_op vector WaveAllMin(vector expr); __generic __intrinsic_op matrix WaveAllMin(matrix expr); __generic __intrinsic_op T WaveAllProduct(T expr); __generic __intrinsic_op vector WaveAllProduct(vector expr); __generic __intrinsic_op matrix WaveAllProduct(matrix expr); __generic __intrinsic_op T WaveAllSum(T expr); __generic __intrinsic_op vector WaveAllSum(vector expr); __generic __intrinsic_op matrix WaveAllSum(matrix expr); __intrinsic_op bool WaveAllEqual(bool expr); __intrinsic_op bool WaveAllTrue(bool expr); __intrinsic_op bool WaveAnyTrue(bool expr); uint64_t WaveBallot(bool expr); uint WaveGetLaneCount(); uint WaveGetLaneIndex(); uint WaveGetOrderedIndex(); bool WaveIsHelperLane(); bool WaveOnce(); __generic __intrinsic_op T WavePrefixProduct(T expr); __generic __intrinsic_op vector WavePrefixProduct(vector expr); __generic __intrinsic_op matrix WavePrefixProduct(matrix expr); __generic __intrinsic_op T WavePrefixSum(T expr); __generic __intrinsic_op vector WavePrefixSum(vector expr); __generic __intrinsic_op matrix WavePrefixSum(matrix expr); __generic __intrinsic_op T WaveReadFirstLane(T expr); __generic __intrinsic_op vector WaveReadFirstLane(vector expr); __generic __intrinsic_op matrix WaveReadFirstLane(matrix expr); __generic __intrinsic_op T WaveReadLaneAt(T expr, int laneIndex); __generic __intrinsic_op vector WaveReadLaneAt(vector expr, int laneIndex); __generic __intrinsic_op matrix WaveReadLaneAt(matrix 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 "; 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) { sb << "__generic __magic_type(Texture, "; sb << ResourceType::makeFlavor(ResourceType::Shape::ShapeBuffer, kBaseBufferAccessLevels[aa].access); sb << ") struct "; sb << kBaseBufferAccessLevels[aa].name; sb << "Buffer {\n"; sb << "__intrinsic_op void GetDimensions(out uint dim);\n"; sb << "__target_intrinsic(glsl, \"texelFetch($$P, $0)$$z\")\n"; sb << "__intrinsic_op T Load(int location);\n"; sb << "__intrinsic_op T Load(int location, out uint status);\n"; sb << "__target_intrinsic(glsl, \"texelFetch($$P, int($0))$$z\")\n"; sb << "__intrinsic_op __subscript(uint index) -> T"; if (kBaseBufferAccessLevels[aa].access != SLANG_RESOURCE_ACCESS_READ) { sb << " { get; set; }\n"; } else { sb << ";\n"; } sb << "};\n"; } }}}}