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