From 74f2f47cb63b02638270beecd20acea1a0f5665e Mon Sep 17 00:00:00 2001 From: Tim Foley Date: Wed, 27 Sep 2017 11:17:39 -0700 Subject: First attempt at a Linux build (#193) * First attempt at a Linux build - Fix up places where C++ idioms were written assuming lenient behavior of Microsoft's compiler - Add a few more alternatives for platform-specific behavior where Windows was the only platform accounted for. - Add a basic Makefile that can at least invoke our build, even if it isn't going good dependency tracking, etc. - Build `libslang.so` and `slangc` that depends on it, using a relative `RPATH` to make the binary portable (I hope) - Add an initial `.travis.yml` to see if we can trigger their build process. * Fixup: const bug in `List::Sort` I'm not clear why this gets picked up by the gcc *and* clang that Travis uses, but not the (newer) gcc I'm using on Ubuntu here, but I'm hoping it is just some missing `const` qualifiers. * Fixup: reorder specialization of "class info" Clang complains about things being specialized after being instantiated (implicilty), and I hope it is just the fact that I generate the class info for the roots of the hierarchy after the other cases. We'll see. * Fixup: add `platform.cpp` to unified/lumped build * Fixup: Windows uses `FreeLibrary` and not `UnloadLibrary` * Fixup: fix Windows project file to include new source file This obviously points to the fact that we are going to need to be generating these files sooner or later. --- source/slang/hlsl.meta.slang.cpp | 1089 -------------------------------------- 1 file changed, 1089 deletions(-) delete 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 deleted file mode 100644 index 49254ac60..000000000 --- a/source/slang/hlsl.meta.slang.cpp +++ /dev/null @@ -1,1089 +0,0 @@ -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\n"; -sb << "__magic_type(HLSLStructuredBufferType)\n"; -sb << "__intrinsic_type("; - - // TODO: we really need a simple way to write an "expression splice" - sb << kIROp_structuredBufferType; -sb << ")\n"; -sb << "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 << ""; -- cgit v1.2.3