From 14137cbd2ddd7deebcdf8cc85c30d534bec8e40b Mon Sep 17 00:00:00 2001 From: Tim Foley Date: Thu, 7 Sep 2017 14:35:07 -0700 Subject: Initial work on boilerplate code generator The goal here is to get the Slang "standard library" code out of string literals and into something a bit more like an actual code file. This is handled by having a `slang-generate` tool that can translate a "template" file that mixes raw Slang code (or any language we want to generate...) with generation logic that is implemented in C++ (currently). This work isn't final by any stretch of the imagination, but it moves a lot of code and not merging it ASAP will complicate other changes. My expectation is that the generator tool will be beefed up on an as-needed basis, to get our stdlib code working. Similarly, the stdlib code does not really take advantage of the new approach as much as it could. That is something we can clean up along the way as we do modifications of the stdlib. --- source/slang/hlsl.meta.slang.cpp | 1066 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 1066 insertions(+) create mode 100644 source/slang/hlsl.meta.slang.cpp (limited to 'source/slang/hlsl.meta.slang.cpp') diff --git a/source/slang/hlsl.meta.slang.cpp b/source/slang/hlsl.meta.slang.cpp new file mode 100644 index 000000000..e9e2277e6 --- /dev/null +++ b/source/slang/hlsl.meta.slang.cpp @@ -0,0 +1,1066 @@ +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 __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 __magic_type(HLSLRWStructuredBufferType) 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 << " __intrinsic_op __subscript(uint index) -> T { get; set; }\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 << ""; -- cgit v1.2.3