From ad3539574f52634c51523cfec1747e7565ad8876 Mon Sep 17 00:00:00 2001 From: Tim Foley Date: Wed, 6 Sep 2017 14:56:28 -0700 Subject: Replace old notion of "intrinsic" operations The code previously had an enumerated type for "intrinsic" operations, and allowed functions to be marked `__intrinsic_op(...)` to indicate the operation they map to. The nature of the IR meant that each of these intrinsic ops had to have a corresponding IR opcode, but the `enum` types weren't the same. This change cleans things up a bit by deciding that the `__intrinsic_op(...)` modifier names an actual IR opcode, and so the `IntrinsicOp` enum is gone. The biggest source of complexity here is that there are certain operations that need to be "intrinsic"-ish for the purposes of the current AST-based translation path, because we need them to round-trip from source to AST and back. Right now this is being handled by defining a bunch of "pseudo-ops" which can be used in the `__intrinsic_op` modifier, but which are *not* meant to be represented in the IR. Currently I don't actually handle this during IR generation. In the long run, once we are using IR for everything that needs cross-compilation, we should be able to eliminate the pseudo-ops in favor of just having these be ordinary (inline) functions defined in the stdlib (e.g., the `+=` operator can just have a direct definition). There was a second category of modifier that gets a little caught up in this, which is the `__intrinsic` modifier, which got used in two ways: 1. A function marked `__intrinsic(glsl, ...)` had what I call a "target intrinsic" modifier, which specified how to lower it for a specific target (e.g., GLSL). 2. A function just marked `__intrinsic` was supposed to be a marker for "this function shouldn't be emitted in the output, because the implementation is expected to be provided" The latter category of function should really be an `__intrinsic_op`, so I translated all those uses. I added a tiny bit of sugar so that `__intrinsic_op` without an explicit opcode will look up an opcode based on the name of the function being called, so that an operation like `sin` can automatically be plumbed through to an equivalent IR op. (The first category is a stopgap for the AST-based cross-compilation, and will hopefully be replaced by something better as we get the IR-based path working). Getting the switch from `__intrinsic` to `__intrinsic_op` working required shuffling around some code in `emit.cpp` that handles looking up those modifiers and emitting builtin operations appropriately during cross-compilation. Depending on where we go with things, a possible extension of this approach is to allow multiple operands to `__intrinsic_op` so that the first specifies the opcode, and then the rest are literal arguments to specify "sub-ops." This could help us handle stuff like texture-fetch operations without an explosion in the number of opcodes. I still need to think about whether this is a good idea or not. --- source/slang/slang-stdlib.cpp | 1048 ++++++++++++++++++++--------------------- 1 file changed, 521 insertions(+), 527 deletions(-) (limited to 'source/slang/slang-stdlib.cpp') diff --git a/source/slang/slang-stdlib.cpp b/source/slang/slang-stdlib.cpp index afcca4d7f..4d5fd6f87 100644 --- a/source/slang/slang-stdlib.cpp +++ b/source/slang/slang-stdlib.cpp @@ -31,8 +31,8 @@ interface __BuiltinFloatingPointType : __BuiltinRealType, __BuiltinSignedArithme __generic __intrinsic_op(Sequence) U operator,(T left, U right); -__generic __intrinsic_op(Select) T operator?:(bool condition, T ifTrue, T ifFalse); -__generic __intrinsic_op(Select) vector operator?:(vector condition, vector ifTrue, vector ifFalse); +__generic __intrinsic_op(select) T operator?:(bool condition, T ifTrue, T ifFalse); +__generic __intrinsic_op(select) vector operator?:(vector condition, vector ifTrue, vector ifFalse); )=" }; @@ -44,60 +44,60 @@ typedef uint UINT; __generic __magic_type(HLSLAppendStructuredBufferType) struct AppendStructuredBuffer { - __intrinsic void Append(T value); + __intrinsic_op void Append(T value); - __intrinsic void GetDimensions( + __intrinsic_op void GetDimensions( out uint numStructs, out uint stride); }; __magic_type(HLSLByteAddressBufferType) struct ByteAddressBuffer { - __intrinsic void GetDimensions( + __intrinsic_op void GetDimensions( out uint dim); - __intrinsic uint Load(int location); - __intrinsic uint Load(int location, out uint status); + __intrinsic_op uint Load(int location); + __intrinsic_op uint Load(int location, out uint status); - __intrinsic uint2 Load2(int location); - __intrinsic uint2 Load2(int location, out uint status); + __intrinsic_op uint2 Load2(int location); + __intrinsic_op uint2 Load2(int location, out uint status); - __intrinsic uint3 Load3(int location); - __intrinsic uint3 Load3(int location, out uint status); + __intrinsic_op uint3 Load3(int location); + __intrinsic_op uint3 Load3(int location, out uint status); - __intrinsic uint4 Load4(int location); - __intrinsic uint4 Load4(int location, out uint status); + __intrinsic_op uint4 Load4(int location); + __intrinsic_op uint4 Load4(int location, out uint status); }; __generic __magic_type(HLSLStructuredBufferType) struct StructuredBuffer { - __intrinsic void GetDimensions( + __intrinsic_op void GetDimensions( out uint numStructs, out uint stride); - __intrinsic T Load(int location); - __intrinsic T Load(int location, out uint status); + __intrinsic_op T Load(int location); + __intrinsic_op T Load(int location, out uint status); - __intrinsic __subscript(uint index) -> T; + __intrinsic_op __subscript(uint index) -> T; }; __generic __magic_type(HLSLConsumeStructuredBufferType) struct ConsumeStructuredBuffer { - __intrinsic T Consume(); + __intrinsic_op T Consume(); - __intrinsic void GetDimensions( + __intrinsic_op void GetDimensions( out uint numStructs, out uint stride); }; __generic __magic_type(HLSLInputPatchType) struct InputPatch { - __intrinsic __subscript(uint index) -> T; + __intrinsic_op __subscript(uint index) -> T; }; __generic __magic_type(HLSLOutputPatchType) struct OutputPatch { - __intrinsic __subscript(uint index) -> T { set; } + __intrinsic_op __subscript(uint index) -> T { set; } }; __magic_type(HLSLRWByteAddressBufferType) struct RWByteAddressBuffer @@ -105,128 +105,128 @@ __magic_type(HLSLRWByteAddressBufferType) struct RWByteAddressBuffer // Note(tfoley): supports alll operations from `ByteAddressBuffer` // TODO(tfoley): can this be made a sub-type? - __intrinsic void GetDimensions( + __intrinsic_op void GetDimensions( out uint dim); - __intrinsic uint Load(int location); - __intrinsic uint Load(int location, out uint status); + __intrinsic_op uint Load(int location); + __intrinsic_op uint Load(int location, out uint status); - __intrinsic uint2 Load2(int location); - __intrinsic uint2 Load2(int location, out uint status); + __intrinsic_op uint2 Load2(int location); + __intrinsic_op uint2 Load2(int location, out uint status); - __intrinsic uint3 Load3(int location); - __intrinsic uint3 Load3(int location, out uint status); + __intrinsic_op uint3 Load3(int location); + __intrinsic_op uint3 Load3(int location, out uint status); - __intrinsic uint4 Load4(int location); - __intrinsic uint4 Load4(int location, out uint status); + __intrinsic_op uint4 Load4(int location); + __intrinsic_op uint4 Load4(int location, out uint status); // Added operations: - __intrinsic void InterlockedAdd( + __intrinsic_op void InterlockedAdd( UINT dest, UINT value, out UINT original_value); - __intrinsic void InterlockedAdd( + __intrinsic_op void InterlockedAdd( UINT dest, UINT value); - __intrinsic void InterlockedAnd( + __intrinsic_op void InterlockedAnd( UINT dest, UINT value, out UINT original_value); - __intrinsic void InterlockedAnd( + __intrinsic_op void InterlockedAnd( UINT dest, UINT value); - __intrinsic void InterlockedCompareExchange( + __intrinsic_op void InterlockedCompareExchange( UINT dest, UINT compare_value, UINT value, out UINT original_value); - __intrinsic void InterlockedCompareExchange( + __intrinsic_op void InterlockedCompareExchange( UINT dest, UINT compare_value, UINT value); - __intrinsic void InterlockedCompareStore( + __intrinsic_op void InterlockedCompareStore( UINT dest, UINT compare_value, UINT value); - __intrinsic void InterlockedCompareStore( + __intrinsic_op void InterlockedCompareStore( UINT dest, UINT compare_value); - __intrinsic void InterlockedExchange( + __intrinsic_op void InterlockedExchange( UINT dest, UINT value, out UINT original_value); - __intrinsic void InterlockedExchange( + __intrinsic_op void InterlockedExchange( UINT dest, UINT value); - __intrinsic void InterlockedMax( + __intrinsic_op void InterlockedMax( UINT dest, UINT value, out UINT original_value); - __intrinsic void InterlockedMax( + __intrinsic_op void InterlockedMax( UINT dest, UINT value); - __intrinsic void InterlockedMin( + __intrinsic_op void InterlockedMin( UINT dest, UINT value, out UINT original_value); - __intrinsic void InterlockedMin( + __intrinsic_op void InterlockedMin( UINT dest, UINT value); - __intrinsic void InterlockedOr( + __intrinsic_op void InterlockedOr( UINT dest, UINT value, out UINT original_value); - __intrinsic void InterlockedOr( + __intrinsic_op void InterlockedOr( UINT dest, UINT value); - __intrinsic void InterlockedXor( + __intrinsic_op void InterlockedXor( UINT dest, UINT value, out UINT original_value); - __intrinsic void InterlockedXor( + __intrinsic_op void InterlockedXor( UINT dest, UINT value); - __intrinsic void Store( + __intrinsic_op void Store( uint address, uint value); - __intrinsic void Store2( + __intrinsic_op void Store2( uint address, uint2 value); - __intrinsic void Store3( + __intrinsic_op void Store3( uint address, uint3 value); - __intrinsic void Store4( + __intrinsic_op void Store4( uint address, uint4 value); }; __generic __magic_type(HLSLRWStructuredBufferType) struct RWStructuredBuffer { - __intrinsic uint DecrementCounter(); + __intrinsic_op uint DecrementCounter(); - __intrinsic void GetDimensions( + __intrinsic_op void GetDimensions( out uint numStructs, out uint stride); - __intrinsic void IncrementCounter(); + __intrinsic_op void IncrementCounter(); - __intrinsic T Load(int location); - __intrinsic T Load(int location, out uint status); + __intrinsic_op T Load(int location); + __intrinsic_op T Load(int location, out uint status); - __intrinsic __subscript(uint index) -> T { get; set; } + __intrinsic_op __subscript(uint index) -> T { get; set; } }; __generic __magic_type(HLSLPointStreamType) struct PointStream @@ -252,566 +252,566 @@ __generic __magic_type(HLSLTriangleStreamType) struct TriangleStream // Note(tfoley): Trying to systematically add all the HLSL builtins // Try to terminate the current draw or dispatch call (HLSL SM 4.0) -__intrinsic void abort(); +__intrinsic_op void abort(); // Absolute value (HLSL SM 1.0) -__generic __intrinsic T abs(T x); -__generic __intrinsic vector abs(vector x); -__generic __intrinsic matrix abs(matrix x); +__generic __intrinsic_op T abs(T x); +__generic __intrinsic_op vector abs(vector x); +__generic __intrinsic_op matrix abs(matrix x); // Inverse cosine (HLSL SM 1.0) -__generic __intrinsic T acos(T x); -__generic __intrinsic vector acos(vector x); -__generic __intrinsic matrix acos(matrix x); +__generic __intrinsic_op T acos(T x); +__generic __intrinsic_op vector acos(vector x); +__generic __intrinsic_op matrix acos(matrix x); // Test if all components are non-zero (HLSL SM 1.0) -__generic __intrinsic T all(T x); -__generic __intrinsic vector all(vector x); -__generic __intrinsic matrix all(matrix x); +__generic __intrinsic_op T all(T x); +__generic __intrinsic_op vector all(vector x); +__generic __intrinsic_op matrix all(matrix x); // Barrier for writes to all memory spaces (HLSL SM 5.0) -__intrinsic void AllMemoryBarrier(); +__intrinsic_op void AllMemoryBarrier(); // Thread-group sync and barrier for writes to all memory spaces (HLSL SM 5.0) -__intrinsic void AllMemoryBarrierWithGroupSync(); +__intrinsic_op void AllMemoryBarrierWithGroupSync(); // Test if any components is non-zero (HLSL SM 1.0) -__generic __intrinsic T any(T x); -__generic __intrinsic vector any(vector x); -__generic __intrinsic matrix any(matrix x); +__generic __intrinsic_op T any(T x); +__generic __intrinsic_op vector any(vector x); +__generic __intrinsic_op matrix any(matrix x); // Reinterpret bits as a double (HLSL SM 5.0) -__intrinsic double asdouble(uint lowbits, uint highbits); +__intrinsic_op double asdouble(uint lowbits, uint highbits); // Reinterpret bits as a float (HLSL SM 4.0) -__intrinsic float asfloat( int x); -__intrinsic float asfloat(uint x); -__generic __intrinsic vector asfloat(vector< int,N> x); -__generic __intrinsic vector asfloat(vector x); -__generic __intrinsic matrix asfloat(matrix< int,N,M> x); -__generic __intrinsic matrix asfloat(matrix x); +__intrinsic_op float asfloat( int x); +__intrinsic_op float asfloat(uint x); +__generic __intrinsic_op vector asfloat(vector< int,N> x); +__generic __intrinsic_op vector asfloat(vector x); +__generic __intrinsic_op matrix asfloat(matrix< int,N,M> x); +__generic __intrinsic_op matrix asfloat(matrix x); // Inverse sine (HLSL SM 1.0) -__generic __intrinsic T asin(T x); -__generic __intrinsic vector asin(vector x); -__generic __intrinsic matrix asin(matrix x); +__generic __intrinsic_op T asin(T x); +__generic __intrinsic_op vector asin(vector x); +__generic __intrinsic_op matrix asin(matrix x); // Reinterpret bits as an int (HLSL SM 4.0) -__intrinsic int asint(float x); -__intrinsic int asint(uint x); -__generic __intrinsic vector asint(vector x); -__generic __intrinsic vector asint(vector x); -__generic __intrinsic matrix asint(matrix x); -__generic __intrinsic matrix asint(matrix x); +__intrinsic_op int asint(float x); +__intrinsic_op int asint(uint x); +__generic __intrinsic_op vector asint(vector x); +__generic __intrinsic_op vector asint(vector x); +__generic __intrinsic_op matrix asint(matrix x); +__generic __intrinsic_op matrix asint(matrix x); // Reinterpret bits of double as a uint (HLSL SM 5.0) -__intrinsic void asuint(double value, out uint lowbits, out uint highbits); +__intrinsic_op void asuint(double value, out uint lowbits, out uint highbits); // Reinterpret bits as a uint (HLSL SM 4.0) -__intrinsic uint asuint(float x); -__intrinsic uint asuint(int x); -__generic __intrinsic vector asuint(vector x); -__generic __intrinsic vector asuint(vector x); -__generic __intrinsic matrix asuint(matrix x); -__generic __intrinsic matrix asuint(matrix x); +__intrinsic_op uint asuint(float x); +__intrinsic_op uint asuint(int x); +__generic __intrinsic_op vector asuint(vector x); +__generic __intrinsic_op vector asuint(vector x); +__generic __intrinsic_op matrix asuint(matrix x); +__generic __intrinsic_op matrix asuint(matrix x); // Inverse tangent (HLSL SM 1.0) -__generic __intrinsic T atan(T x); -__generic __intrinsic vector atan(vector x); -__generic __intrinsic matrix atan(matrix x); +__generic __intrinsic_op T atan(T x); +__generic __intrinsic_op vector atan(vector x); +__generic __intrinsic_op matrix atan(matrix x); __generic -__intrinsic(glsl,"atan($0,$1)") -__intrinsic +__target_intrinsic(glsl,"atan($0,$1)") +__intrinsic_op T atan2(T y, T x); __generic -__intrinsic(glsl,"atan($0,$1)") -__intrinsic +__target_intrinsic(glsl,"atan($0,$1)") +__intrinsic_op vector atan2(vector y, vector x); __generic -__intrinsic(glsl,"atan($0,$1)") -__intrinsic +__target_intrinsic(glsl,"atan($0,$1)") +__intrinsic_op matrix atan2(matrix y, matrix x); // Ceiling (HLSL SM 1.0) -__generic __intrinsic T ceil(T x); -__generic __intrinsic vector ceil(vector x); -__generic __intrinsic matrix ceil(matrix x); +__generic __intrinsic_op T ceil(T x); +__generic __intrinsic_op vector ceil(vector x); +__generic __intrinsic_op matrix ceil(matrix x); // Check access status to tiled resource -__intrinsic bool CheckAccessFullyMapped(uint status); +__intrinsic_op bool CheckAccessFullyMapped(uint status); // Clamp (HLSL SM 1.0) -__generic __intrinsic T clamp(T x, T min, T max); -__generic __intrinsic vector clamp(vector x, vector min, vector max); -__generic __intrinsic matrix clamp(matrix x, matrix min, matrix max); +__generic __intrinsic_op T clamp(T x, T min, T max); +__generic __intrinsic_op vector clamp(vector x, vector min, vector max); +__generic __intrinsic_op matrix clamp(matrix x, matrix min, matrix max); // Clip (discard) fragment conditionally -__generic __intrinsic void clip(T x); -__generic __intrinsic void clip(vector x); -__generic __intrinsic void clip(matrix x); +__generic __intrinsic_op void clip(T x); +__generic __intrinsic_op void clip(vector x); +__generic __intrinsic_op void clip(matrix x); // Cosine -__generic __intrinsic T cos(T x); -__generic __intrinsic vector cos(vector x); -__generic __intrinsic matrix cos(matrix x); +__generic __intrinsic_op T cos(T x); +__generic __intrinsic_op vector cos(vector x); +__generic __intrinsic_op matrix cos(matrix x); // Hyperbolic cosine -__generic __intrinsic T cosh(T x); -__generic __intrinsic vector cosh(vector x); -__generic __intrinsic matrix cosh(matrix x); +__generic __intrinsic_op T cosh(T x); +__generic __intrinsic_op vector cosh(vector x); +__generic __intrinsic_op matrix cosh(matrix x); // Population count -__intrinsic uint countbits(uint value); +__intrinsic_op uint countbits(uint value); // Cross product -__generic __intrinsic vector cross(vector x, vector y); +__generic __intrinsic_op vector cross(vector x, vector y); // Convert encoded color -__intrinsic int4 D3DCOLORtoUBYTE4(float4 x); +__intrinsic_op int4 D3DCOLORtoUBYTE4(float4 x); // Partial-difference derivatives __generic -__intrinsic(glsl, dFdx) -__intrinsic +__target_intrinsic(glsl, dFdx) +__intrinsic_op T ddx(T x); __generic -__intrinsic(glsl, dFdx) -__intrinsic +__target_intrinsic(glsl, dFdx) +__intrinsic_op vector ddx(vector x); __generic -__intrinsic(glsl, dFdx) -__intrinsic +__target_intrinsic(glsl, dFdx) +__intrinsic_op matrix ddx(matrix x); __generic __glsl_extension(GL_ARB_derivative_control) -__intrinsic(glsl, dFdxCoarse) -__intrinsic +__target_intrinsic(glsl, dFdxCoarse) +__intrinsic_op T ddx_coarse(T x); __generic __glsl_extension(GL_ARB_derivative_control) -__intrinsic(glsl, dFdxCoarse) -__intrinsic +__target_intrinsic(glsl, dFdxCoarse) +__intrinsic_op vector ddx_coarse(vector x); __generic __glsl_extension(GL_ARB_derivative_control) -__intrinsic(glsl, dFdxCoarse) -__intrinsic +__target_intrinsic(glsl, dFdxCoarse) +__intrinsic_op matrix ddx_coarse(matrix x); __generic __glsl_extension(GL_ARB_derivative_control) -__intrinsic(glsl, dFdxFine) -__intrinsic +__target_intrinsic(glsl, dFdxFine) +__intrinsic_op T ddx_fine(T x); __generic __glsl_extension(GL_ARB_derivative_control) -__intrinsic(glsl, dFdxFine) -__intrinsic +__target_intrinsic(glsl, dFdxFine) +__intrinsic_op vector ddx_fine(vector x); __generic __glsl_extension(GL_ARB_derivative_control) -__intrinsic(glsl, dFdxFine) -__intrinsic +__target_intrinsic(glsl, dFdxFine) +__intrinsic_op matrix ddx_fine(matrix x); __generic -__intrinsic(glsl, dFdy) -__intrinsic +__target_intrinsic(glsl, dFdy) +__intrinsic_op T ddy(T x); __generic -__intrinsic(glsl, dFdy) -__intrinsic +__target_intrinsic(glsl, dFdy) +__intrinsic_op vector ddy(vector x); __generic -__intrinsic(glsl, dFdy) -__intrinsic +__target_intrinsic(glsl, dFdy) +__intrinsic_op matrix ddy(matrix x); __generic __glsl_extension(GL_ARB_derivative_control) -__intrinsic(glsl, dFdyCoarse) -__intrinsic +__target_intrinsic(glsl, dFdyCoarse) +__intrinsic_op T ddy_coarse(T x); __generic __glsl_extension(GL_ARB_derivative_control) -__intrinsic(glsl, dFdyCoarse) -__intrinsic +__target_intrinsic(glsl, dFdyCoarse) +__intrinsic_op vector ddy_coarse(vector x); __generic __glsl_extension(GL_ARB_derivative_control) -__intrinsic(glsl, dFdyCoarse) -__intrinsic +__target_intrinsic(glsl, dFdyCoarse) +__intrinsic_op matrix ddy_coarse(matrix x); __generic __glsl_extension(GL_ARB_derivative_control) -__intrinsic(glsl, dFdyFine) -__intrinsic +__target_intrinsic(glsl, dFdyFine) +__intrinsic_op T ddy_fine(T x); __generic __glsl_extension(GL_ARB_derivative_control) -__intrinsic(glsl, dFdyFine) -__intrinsic +__target_intrinsic(glsl, dFdyFine) +__intrinsic_op vector ddy_fine(vector x); __generic __glsl_extension(GL_ARB_derivative_control) -__intrinsic(glsl, dFdyFine) -__intrinsic +__target_intrinsic(glsl, dFdyFine) +__intrinsic_op matrix ddy_fine(matrix x); // Radians to degrees -__generic __intrinsic T degrees(T x); -__generic __intrinsic vector degrees(vector x); -__generic __intrinsic matrix degrees(matrix x); +__generic __intrinsic_op T degrees(T x); +__generic __intrinsic_op vector degrees(vector x); +__generic __intrinsic_op matrix degrees(matrix x); // Matrix determinant -__generic __intrinsic T determinant(matrix m); +__generic __intrinsic_op T determinant(matrix m); // Barrier for device memory -__intrinsic void DeviceMemoryBarrier(); -__intrinsic void DeviceMemoryBarrierWithGroupSync(); +__intrinsic_op void DeviceMemoryBarrier(); +__intrinsic_op void DeviceMemoryBarrierWithGroupSync(); // Vector distance -__generic __intrinsic T distance(vector x, vector y); +__generic __intrinsic_op T distance(vector x, vector y); // Vector dot product -__generic __intrinsic T dot(vector x, vector y); +__generic __intrinsic_op T dot(vector x, vector y); // Helper for computing distance terms for lighting (obsolete) -__generic __intrinsic vector dst(vector x, vector y); +__generic __intrinsic_op vector dst(vector x, vector y); // Error message -// __intrinsic void errorf( string format, ... ); +// __intrinsic_op void errorf( string format, ... ); // Attribute evaluation -__generic __intrinsic T EvaluateAttributeAtCentroid(T x); -__generic __intrinsic vector EvaluateAttributeAtCentroid(vector x); -__generic __intrinsic matrix EvaluateAttributeAtCentroid(matrix x); +__generic __intrinsic_op T EvaluateAttributeAtCentroid(T x); +__generic __intrinsic_op vector EvaluateAttributeAtCentroid(vector x); +__generic __intrinsic_op matrix EvaluateAttributeAtCentroid(matrix x); -__generic __intrinsic T EvaluateAttributeAtSample(T x, uint sampleindex); -__generic __intrinsic vector EvaluateAttributeAtSample(vector x, uint sampleindex); -__generic __intrinsic matrix EvaluateAttributeAtSample(matrix x, uint sampleindex); +__generic __intrinsic_op T EvaluateAttributeAtSample(T x, uint sampleindex); +__generic __intrinsic_op vector EvaluateAttributeAtSample(vector x, uint sampleindex); +__generic __intrinsic_op matrix EvaluateAttributeAtSample(matrix x, uint sampleindex); -__generic __intrinsic T EvaluateAttributeSnapped(T x, int2 offset); -__generic __intrinsic vector EvaluateAttributeSnapped(vector x, int2 offset); -__generic __intrinsic matrix EvaluateAttributeSnapped(matrix x, int2 offset); +__generic __intrinsic_op T EvaluateAttributeSnapped(T x, int2 offset); +__generic __intrinsic_op vector EvaluateAttributeSnapped(vector x, int2 offset); +__generic __intrinsic_op matrix EvaluateAttributeSnapped(matrix x, int2 offset); // Base-e exponent -__generic __intrinsic T exp(T x); -__generic __intrinsic vector exp(vector x); -__generic __intrinsic matrix exp(matrix x); +__generic __intrinsic_op T exp(T x); +__generic __intrinsic_op vector exp(vector x); +__generic __intrinsic_op matrix exp(matrix x); // Base-2 exponent -__generic __intrinsic T exp2(T x); -__generic __intrinsic vector exp2(vector x); -__generic __intrinsic matrix exp2(matrix x); +__generic __intrinsic_op T exp2(T x); +__generic __intrinsic_op vector exp2(vector x); +__generic __intrinsic_op matrix exp2(matrix x); // Convert 16-bit float stored in low bits of integer -__intrinsic float f16tof32(uint value); -__generic __intrinsic vector f16tof32(vector value); +__intrinsic_op float f16tof32(uint value); +__generic __intrinsic_op vector f16tof32(vector value); // Convert to 16-bit float stored in low bits of integer -__intrinsic uint f32tof16(float value); -__generic __intrinsic vector f32tof16(vector value); +__intrinsic_op uint f32tof16(float value); +__generic __intrinsic_op vector f32tof16(vector value); // Flip surface normal to face forward, if needed -__generic __intrinsic vector faceforward(vector n, vector i, vector ng); +__generic __intrinsic_op vector faceforward(vector n, vector i, vector ng); // Find first set bit starting at high bit and working down -__intrinsic int firstbithigh(int value); -__generic __intrinsic vector firstbithigh(vector value); +__intrinsic_op int firstbithigh(int value); +__generic __intrinsic_op vector firstbithigh(vector value); -__intrinsic uint firstbithigh(uint value); -__generic __intrinsic vector firstbithigh(vector value); +__intrinsic_op uint firstbithigh(uint value); +__generic __intrinsic_op vector firstbithigh(vector value); // Find first set bit starting at low bit and working up -__intrinsic int firstbitlow(int value); -__generic __intrinsic vector firstbitlow(vector value); +__intrinsic_op int firstbitlow(int value); +__generic __intrinsic_op vector firstbitlow(vector value); -__intrinsic uint firstbitlow(uint value); -__generic __intrinsic vector firstbitlow(vector value); +__intrinsic_op uint firstbitlow(uint value); +__generic __intrinsic_op vector firstbitlow(vector value); // Floor (HLSL SM 1.0) -__generic __intrinsic T floor(T x); -__generic __intrinsic vector floor(vector x); -__generic __intrinsic matrix floor(matrix x); +__generic __intrinsic_op T floor(T x); +__generic __intrinsic_op vector floor(vector x); +__generic __intrinsic_op matrix floor(matrix x); // Fused multiply-add for doubles -__intrinsic double fma(double a, double b, double c); -__generic __intrinsic vector fma(vector a, vector b, vector c); -__generic __intrinsic matrix fma(matrix a, matrix b, matrix c); +__intrinsic_op double fma(double a, double b, double c); +__generic __intrinsic_op vector fma(vector a, vector b, vector c); +__generic __intrinsic_op matrix fma(matrix a, matrix b, matrix c); // Floating point remainder of x/y -__generic __intrinsic T fmod(T x, T y); -__generic __intrinsic vector fmod(vector x, vector y); -__generic __intrinsic matrix fmod(matrix x, matrix y); +__generic __intrinsic_op T fmod(T x, T y); +__generic __intrinsic_op vector fmod(vector x, vector y); +__generic __intrinsic_op matrix fmod(matrix x, matrix y); // Fractional part __generic -__intrinsic(glsl, fract) -__intrinsic +__target_intrinsic(glsl, fract) +__intrinsic_op T frac(T x); __generic -__intrinsic(glsl, fract) -__intrinsic +__target_intrinsic(glsl, fract) +__intrinsic_op vector frac(vector x); __generic -__intrinsic(glsl, fract) -__intrinsic +__target_intrinsic(glsl, fract) +__intrinsic_op matrix frac(matrix x); // Split float into mantissa and exponent -__generic __intrinsic T frexp(T x, out T exp); -__generic __intrinsic vector frexp(vector x, out vector exp); -__generic __intrinsic matrix frexp(matrix x, out matrix exp); +__generic __intrinsic_op T frexp(T x, out T exp); +__generic __intrinsic_op vector frexp(vector x, out vector exp); +__generic __intrinsic_op matrix frexp(matrix x, out matrix exp); // Texture filter width -__generic __intrinsic T fwidth(T x); -__generic __intrinsic vector fwidth(vector x); -__generic __intrinsic matrix fwidth(matrix x); +__generic __intrinsic_op T fwidth(T x); +__generic __intrinsic_op vector fwidth(vector x); +__generic __intrinsic_op matrix fwidth(matrix x); )=", R"=( // Get number of samples in render target -__intrinsic uint GetRenderTargetSampleCount(); +__intrinsic_op uint GetRenderTargetSampleCount(); // Get position of given sample -__intrinsic float2 GetRenderTargetSamplePosition(int Index); +__intrinsic_op float2 GetRenderTargetSamplePosition(int Index); // Group memory barrier -__intrinsic void GroupMemoryBarrier(); -__intrinsic void GroupMemoryBarrierWithGroupSync(); +__intrinsic_op void GroupMemoryBarrier(); +__intrinsic_op void GroupMemoryBarrierWithGroupSync(); // Atomics -__intrinsic void InterlockedAdd(in out int dest, int value, out int original_value); -__intrinsic void InterlockedAdd(in out uint dest, uint value, out uint original_value); +__intrinsic_op void InterlockedAdd(in out int dest, int value, out int original_value); +__intrinsic_op void InterlockedAdd(in out uint dest, uint value, out uint original_value); -__intrinsic void InterlockedAnd(in out int dest, int value, out int original_value); -__intrinsic void InterlockedAnd(in out uint dest, uint value, out uint original_value); +__intrinsic_op void InterlockedAnd(in out int dest, int value, out int original_value); +__intrinsic_op void InterlockedAnd(in out uint dest, uint value, out uint original_value); -__intrinsic void InterlockedCompareExchange(in out int dest, int compare_value, int value, out int original_value); -__intrinsic void InterlockedCompareExchange(in out uint dest, uint compare_value, uint value, out uint original_value); +__intrinsic_op void InterlockedCompareExchange(in out int dest, int compare_value, int value, out int original_value); +__intrinsic_op void InterlockedCompareExchange(in out uint dest, uint compare_value, uint value, out uint original_value); -__intrinsic void InterlockedCompareStore(in out int dest, int compare_value, int value); -__intrinsic void InterlockedCompareStore(in out uint dest, uint compare_value, uint value); +__intrinsic_op void InterlockedCompareStore(in out int dest, int compare_value, int value); +__intrinsic_op void InterlockedCompareStore(in out uint dest, uint compare_value, uint value); -__intrinsic void InterlockedExchange(in out int dest, int value, out int original_value); -__intrinsic void InterlockedExchange(in out uint dest, uint value, out uint original_value); +__intrinsic_op void InterlockedExchange(in out int dest, int value, out int original_value); +__intrinsic_op void InterlockedExchange(in out uint dest, uint value, out uint original_value); -__intrinsic void InterlockedMax(in out int dest, int value, out int original_value); -__intrinsic void InterlockedMax(in out uint dest, uint value, out uint original_value); +__intrinsic_op void InterlockedMax(in out int dest, int value, out int original_value); +__intrinsic_op void InterlockedMax(in out uint dest, uint value, out uint original_value); -__intrinsic void InterlockedMin(in out int dest, int value, out int original_value); -__intrinsic void InterlockedMin(in out uint dest, uint value, out uint original_value); +__intrinsic_op void InterlockedMin(in out int dest, int value, out int original_value); +__intrinsic_op void InterlockedMin(in out uint dest, uint value, out uint original_value); -__intrinsic void InterlockedOr(in out int dest, int value, out int original_value); -__intrinsic void InterlockedOr(in out uint dest, uint value, out uint original_value); +__intrinsic_op void InterlockedOr(in out int dest, int value, out int original_value); +__intrinsic_op void InterlockedOr(in out uint dest, uint value, out uint original_value); -__intrinsic void InterlockedXor(in out int dest, int value, out int original_value); -__intrinsic void InterlockedXor(in out uint dest, uint value, out uint original_value); +__intrinsic_op void InterlockedXor(in out int dest, int value, out int original_value); +__intrinsic_op void InterlockedXor(in out uint dest, uint value, out uint original_value); // Is floating-point value finite? -__generic __intrinsic bool isfinite(T x); -__generic __intrinsic vector isfinite(vector x); -__generic __intrinsic matrix isfinite(matrix x); +__generic __intrinsic_op bool isfinite(T x); +__generic __intrinsic_op vector isfinite(vector x); +__generic __intrinsic_op matrix isfinite(matrix x); // Is floating-point value infinite? -__generic __intrinsic bool isinf(T x); -__generic __intrinsic vector isinf(vector x); -__generic __intrinsic matrix isinf(matrix x); +__generic __intrinsic_op bool isinf(T x); +__generic __intrinsic_op vector isinf(vector x); +__generic __intrinsic_op matrix isinf(matrix x); // Is floating-point value not-a-number? -__generic __intrinsic bool isnan(T x); -__generic __intrinsic vector isnan(vector x); -__generic __intrinsic matrix isnan(matrix x); +__generic __intrinsic_op bool isnan(T x); +__generic __intrinsic_op vector isnan(vector x); +__generic __intrinsic_op matrix isnan(matrix x); // Construct float from mantissa and exponent -__generic __intrinsic T ldexp(T x, T exp); -__generic __intrinsic vector ldexp(vector x, vector exp); -__generic __intrinsic matrix ldexp(matrix x, matrix exp); +__generic __intrinsic_op T ldexp(T x, T exp); +__generic __intrinsic_op vector ldexp(vector x, vector exp); +__generic __intrinsic_op matrix ldexp(matrix x, matrix exp); // Vector length -__generic __intrinsic T length(vector x); +__generic __intrinsic_op T length(vector x); // Linear interpolation __generic -__intrinsic(glsl, mix) -__intrinsic +__target_intrinsic(glsl, mix) +__intrinsic_op T lerp(T x, T y, T s); __generic -__intrinsic(glsl, mix) -__intrinsic +__target_intrinsic(glsl, mix) +__intrinsic_op vector lerp(vector x, vector y, vector s); __generic -__intrinsic(glsl, mix) -__intrinsic +__target_intrinsic(glsl, mix) +__intrinsic_op matrix lerp(matrix x, matrix y, matrix s); // Legacy lighting function (obsolete) -__intrinsic float4 lit(float n_dot_l, float n_dot_h, float m); +__intrinsic_op float4 lit(float n_dot_l, float n_dot_h, float m); // Base-e logarithm -__generic __intrinsic T log(T x); -__generic __intrinsic vector log(vector x); -__generic __intrinsic matrix log(matrix x); +__generic __intrinsic_op T log(T x); +__generic __intrinsic_op vector log(vector x); +__generic __intrinsic_op matrix log(matrix x); // Base-10 logarithm -__generic __intrinsic T log10(T x); -__generic __intrinsic vector log10(vector x); -__generic __intrinsic matrix log10(matrix x); +__generic __intrinsic_op T log10(T x); +__generic __intrinsic_op vector log10(vector x); +__generic __intrinsic_op matrix log10(matrix x); // Base-2 logarithm -__generic __intrinsic T log2(T x); -__generic __intrinsic vector log2(vector x); -__generic __intrinsic matrix log2(matrix x); +__generic __intrinsic_op T log2(T x); +__generic __intrinsic_op vector log2(vector x); +__generic __intrinsic_op matrix log2(matrix x); // multiply-add -__generic __intrinsic T mad(T mvalue, T avalue, T bvalue); -__generic __intrinsic vector mad(vector mvalue, vector avalue, vector bvalue); -__generic __intrinsic matrix mad(matrix mvalue, matrix avalue, matrix bvalue); +__generic __intrinsic_op T mad(T mvalue, T avalue, T bvalue); +__generic __intrinsic_op vector mad(vector mvalue, vector avalue, vector bvalue); +__generic __intrinsic_op matrix mad(matrix mvalue, matrix avalue, matrix bvalue); // maximum -__generic __intrinsic T max(T x, T y); -__generic __intrinsic vector max(vector x, vector y); -__generic __intrinsic matrix max(matrix x, matrix y); +__generic __intrinsic_op T max(T x, T y); +__generic __intrinsic_op vector max(vector x, vector y); +__generic __intrinsic_op matrix max(matrix x, matrix y); // minimum -__generic __intrinsic T min(T x, T y); -__generic __intrinsic vector min(vector x, vector y); -__generic __intrinsic matrix min(matrix x, matrix y); +__generic __intrinsic_op T min(T x, T y); +__generic __intrinsic_op vector min(vector x, vector y); +__generic __intrinsic_op matrix min(matrix x, matrix y); // split into integer and fractional parts (both with same sign) -__generic __intrinsic T modf(T x, out T ip); -__generic __intrinsic vector modf(vector x, out vector ip); -__generic __intrinsic matrix modf(matrix x, out matrix ip); +__generic __intrinsic_op T modf(T x, out T ip); +__generic __intrinsic_op vector modf(vector x, out vector ip); +__generic __intrinsic_op matrix modf(matrix x, out matrix ip); // msad4 (whatever that is) -__intrinsic uint4 msad4(uint reference, uint2 source, uint4 accum); +__intrinsic_op uint4 msad4(uint reference, uint2 source, uint4 accum); // General inner products // scalar-scalar -__generic __intrinsic_op(Mul_Scalar_Scalar) T mul(T x, T y); +__generic __intrinsic_op T mul(T x, T y); // scalar-vector and vector-scalar -__generic __intrinsic_op(Mul_Vector_Scalar) vector mul(vector x, T y); -__generic __intrinsic_op(Mul_Scalar_Vector) vector mul(T x, vector y); +__generic __intrinsic_op vector mul(vector x, T y); +__generic __intrinsic_op vector mul(T x, vector y); // scalar-matrix and matrix-scalar -__generic __intrinsic_op(Mul_Matrix_Scalar) matrix mul(matrix x, T y); -__generic __intrinsic_op(Mul_Scalar_Matrix) matrix mul(T x, matrix y); +__generic __intrinsic_op matrix mul(matrix x, T y); +__generic __intrinsic_op matrix mul(T x, matrix y); // vector-vector (dot product) -__generic __intrinsic_op(InnerProduct_Vector_Vector) T mul(vector x, vector y); +__generic __intrinsic_op(dot) T mul(vector x, vector y); // vector-matrix -__generic __intrinsic_op(InnerProduct_Vector_Matrix) vector mul(vector x, matrix y); +__generic __intrinsic_op(mulVectorMatrix) vector mul(vector x, matrix y); // matrix-vector -__generic __intrinsic_op(InnerProduct_Matrix_Vector) vector mul(matrix x, vector y); +__generic __intrinsic_op(mulMatrixVector) vector mul(matrix x, vector y); // matrix-matrix -__generic __intrinsic_op(InnerProduct_Matrix_Matrix) matrix mul(matrix x, matrix y); +__generic __intrinsic_op(mulMatrixMatrix) matrix mul(matrix x, matrix y); // noise (deprecated) -__intrinsic float noise(float x); -__generic __intrinsic float noise(vector x); +__intrinsic_op float noise(float x); +__generic __intrinsic_op float noise(vector x); // Normalize a vector -__generic __intrinsic vector normalize(vector x); +__generic __intrinsic_op vector normalize(vector x); // Raise to a power -__generic __intrinsic T pow(T x, T y); -__generic __intrinsic vector pow(vector x, vector y); -__generic __intrinsic matrix pow(matrix x, matrix y); +__generic __intrinsic_op T pow(T x, T y); +__generic __intrinsic_op vector pow(vector x, vector y); +__generic __intrinsic_op matrix pow(matrix x, matrix y); // Output message -// __intrinsic void printf( string format, ... ); +// __intrinsic_op void printf( string format, ... ); // Tessellation factor fixup routines -__intrinsic void Process2DQuadTessFactorsAvg( +__intrinsic_op void Process2DQuadTessFactorsAvg( in float4 RawEdgeFactors, in float2 InsideScale, out float4 RoundedEdgeTessFactors, out float2 RoundedInsideTessFactors, out float2 UnroundedInsideTessFactors); -__intrinsic void Process2DQuadTessFactorsMax( +__intrinsic_op void Process2DQuadTessFactorsMax( in float4 RawEdgeFactors, in float2 InsideScale, out float4 RoundedEdgeTessFactors, out float2 RoundedInsideTessFactors, out float2 UnroundedInsideTessFactors); -__intrinsic void Process2DQuadTessFactorsMin( +__intrinsic_op void Process2DQuadTessFactorsMin( in float4 RawEdgeFactors, in float2 InsideScale, out float4 RoundedEdgeTessFactors, out float2 RoundedInsideTessFactors, out float2 UnroundedInsideTessFactors); -__intrinsic void ProcessIsolineTessFactors( +__intrinsic_op void ProcessIsolineTessFactors( in float RawDetailFactor, in float RawDensityFactor, out float RoundedDetailFactor, out float RoundedDensityFactor); -__intrinsic void ProcessQuadTessFactorsAvg( +__intrinsic_op void ProcessQuadTessFactorsAvg( in float4 RawEdgeFactors, in float InsideScale, out float4 RoundedEdgeTessFactors, out float2 RoundedInsideTessFactors, out float2 UnroundedInsideTessFactors); -__intrinsic void ProcessQuadTessFactorsMax( +__intrinsic_op void ProcessQuadTessFactorsMax( in float4 RawEdgeFactors, in float InsideScale, out float4 RoundedEdgeTessFactors, out float2 RoundedInsideTessFactors, out float2 UnroundedInsideTessFactors); -__intrinsic void ProcessQuadTessFactorsMin( +__intrinsic_op void ProcessQuadTessFactorsMin( in float4 RawEdgeFactors, in float InsideScale, out float4 RoundedEdgeTessFactors, out float2 RoundedInsideTessFactors, out float2 UnroundedInsideTessFactors); -__intrinsic void ProcessTriTessFactorsAvg( +__intrinsic_op void ProcessTriTessFactorsAvg( in float3 RawEdgeFactors, in float InsideScale, out float3 RoundedEdgeTessFactors, out float RoundedInsideTessFactor, out float UnroundedInsideTessFactor); -__intrinsic void ProcessTriTessFactorsMax( +__intrinsic_op void ProcessTriTessFactorsMax( in float3 RawEdgeFactors, in float InsideScale, out float3 RoundedEdgeTessFactors, out float RoundedInsideTessFactor, out float UnroundedInsideTessFactor); -__intrinsic void ProcessTriTessFactorsMin( +__intrinsic_op void ProcessTriTessFactorsMin( in float3 RawEdgeFactors, in float InsideScale, out float3 RoundedEdgeTessFactors, @@ -819,191 +819,191 @@ __intrinsic void ProcessTriTessFactorsMin( out float UnroundedInsideTessFactors); // Degrees to radians -__generic __intrinsic T radians(T x); -__generic __intrinsic vector radians(vector x); -__generic __intrinsic matrix radians(matrix x); +__generic __intrinsic_op T radians(T x); +__generic __intrinsic_op vector radians(vector x); +__generic __intrinsic_op matrix radians(matrix x); // Approximate reciprocal -__generic __intrinsic T rcp(T x); -__generic __intrinsic vector rcp(vector x); -__generic __intrinsic matrix rcp(matrix x); +__generic __intrinsic_op T rcp(T x); +__generic __intrinsic_op vector rcp(vector x); +__generic __intrinsic_op matrix rcp(matrix x); // Reflect incident vector across plane with given normal __generic -__intrinsic +__intrinsic_op vector reflect(vector i, vector n); // Refract incident vector given surface normal and index of refraction __generic -__intrinsic +__intrinsic_op vector refract(vector i, vector n, float eta); // Reverse order of bits -__intrinsic uint reversebits(uint value); +__intrinsic_op uint reversebits(uint value); __generic vector reversebits(vector value); // Round-to-nearest -__generic __intrinsic T round(T x); -__generic __intrinsic vector round(vector x); -__generic __intrinsic matrix round(matrix x); +__generic __intrinsic_op T round(T x); +__generic __intrinsic_op vector round(vector x); +__generic __intrinsic_op matrix round(matrix x); // Reciprocal of square root -__generic __intrinsic T rsqrt(T x); -__generic __intrinsic vector rsqrt(vector x); -__generic __intrinsic matrix rsqrt(matrix x); +__generic __intrinsic_op T rsqrt(T x); +__generic __intrinsic_op vector rsqrt(vector x); +__generic __intrinsic_op matrix rsqrt(matrix x); // Clamp value to [0,1] range __generic -__intrinsic(glsl, "clamp($0, 0, 1)") __intrinsic +__target_intrinsic(glsl, "clamp($0, 0, 1)") __intrinsic_op T saturate(T x); __generic -__intrinsic(glsl, "clamp($0, 0, 1)") __intrinsic +__target_intrinsic(glsl, "clamp($0, 0, 1)") __intrinsic_op vector saturate(vector x); __generic -__intrinsic(glsl, "clamp($0, 0, 1)") __intrinsic +__target_intrinsic(glsl, "clamp($0, 0, 1)") __intrinsic_op matrix saturate(matrix x); // Extract sign of value -__generic __intrinsic int sign(T x); -__generic __intrinsic vector sign(vector x); -__generic __intrinsic matrix sign(matrix x); +__generic __intrinsic_op int sign(T x); +__generic __intrinsic_op vector sign(vector x); +__generic __intrinsic_op matrix sign(matrix x); )=", R"=( // Sine -__generic __intrinsic T sin(T x); -__generic __intrinsic vector sin(vector x); -__generic __intrinsic matrix sin(matrix x); +__generic __intrinsic_op T sin(T x); +__generic __intrinsic_op vector sin(vector x); +__generic __intrinsic_op matrix sin(matrix x); // Sine and cosine -__generic __intrinsic void sincos(T x, out T s, out T c); -__generic __intrinsic void sincos(vector x, out vector s, out vector c); -__generic __intrinsic void sincos(matrix x, out matrix s, out matrix c); +__generic __intrinsic_op void sincos(T x, out T s, out T c); +__generic __intrinsic_op void sincos(vector x, out vector s, out vector c); +__generic __intrinsic_op void sincos(matrix x, out matrix s, out matrix c); // Hyperbolic Sine -__generic __intrinsic T sinh(T x); -__generic __intrinsic vector sinh(vector x); -__generic __intrinsic matrix sinh(matrix x); +__generic __intrinsic_op T sinh(T x); +__generic __intrinsic_op vector sinh(vector x); +__generic __intrinsic_op matrix sinh(matrix x); // Smooth step (Hermite interpolation) -__generic __intrinsic T smoothstep(T min, T max, T x); -__generic __intrinsic vector smoothstep(vector min, vector max, vector x); -__generic __intrinsic matrix smoothstep(matrix min, matrix max, matrix x); +__generic __intrinsic_op T smoothstep(T min, T max, T x); +__generic __intrinsic_op vector smoothstep(vector min, vector max, vector x); +__generic __intrinsic_op matrix smoothstep(matrix min, matrix max, matrix x); // Square root -__generic __intrinsic T sqrt(T x); -__generic __intrinsic vector sqrt(vector x); -__generic __intrinsic matrix sqrt(matrix x); +__generic __intrinsic_op T sqrt(T x); +__generic __intrinsic_op vector sqrt(vector x); +__generic __intrinsic_op matrix sqrt(matrix x); // Step function -__generic __intrinsic T step(T y, T x); -__generic __intrinsic vector step(vector y, vector x); -__generic __intrinsic matrix step(matrix y, matrix x); +__generic __intrinsic_op T step(T y, T x); +__generic __intrinsic_op vector step(vector y, vector x); +__generic __intrinsic_op matrix step(matrix y, matrix x); // Tangent -__generic __intrinsic T tan(T x); -__generic __intrinsic vector tan(vector x); -__generic __intrinsic matrix tan(matrix x); +__generic __intrinsic_op T tan(T x); +__generic __intrinsic_op vector tan(vector x); +__generic __intrinsic_op matrix tan(matrix x); // Hyperbolic tangent -__generic __intrinsic T tanh(T x); -__generic __intrinsic vector tanh(vector x); -__generic __intrinsic matrix tanh(matrix x); +__generic __intrinsic_op T tanh(T x); +__generic __intrinsic_op vector tanh(vector x); +__generic __intrinsic_op matrix tanh(matrix x); // Legacy texture-fetch operations /* -__intrinsic float4 tex1D(sampler1D s, float t); -__intrinsic float4 tex1D(sampler1D s, float t, float ddx, float ddy); -__intrinsic float4 tex1Dbias(sampler1D s, float4 t); -__intrinsic float4 tex1Dgrad(sampler1D s, float t, float ddx, float ddy); -__intrinsic float4 tex1Dlod(sampler1D s, float4 t); -__intrinsic float4 tex1Dproj(sampler1D s, float4 t); - -__intrinsic float4 tex2D(sampler2D s, float2 t); -__intrinsic float4 tex2D(sampler2D s, float2 t, float2 ddx, float2 ddy); -__intrinsic float4 tex2Dbias(sampler2D s, float4 t); -__intrinsic float4 tex2Dgrad(sampler2D s, float2 t, float2 ddx, float2 ddy); -__intrinsic float4 tex2Dlod(sampler2D s, float4 t); -__intrinsic float4 tex2Dproj(sampler2D s, float4 t); - -__intrinsic float4 tex3D(sampler3D s, float3 t); -__intrinsic float4 tex3D(sampler3D s, float3 t, float3 ddx, float3 ddy); -__intrinsic float4 tex3Dbias(sampler3D s, float4 t); -__intrinsic float4 tex3Dgrad(sampler3D s, float3 t, float3 ddx, float3 ddy); -__intrinsic float4 tex3Dlod(sampler3D s, float4 t); -__intrinsic float4 tex3Dproj(sampler3D s, float4 t); - -__intrinsic float4 texCUBE(samplerCUBE s, float3 t); -__intrinsic float4 texCUBE(samplerCUBE s, float3 t, float3 ddx, float3 ddy); -__intrinsic float4 texCUBEbias(samplerCUBE s, float4 t); -__intrinsic float4 texCUBEgrad(samplerCUBE s, float3 t, float3 ddx, float3 ddy); -__intrinsic float4 texCUBElod(samplerCUBE s, float4 t); -__intrinsic float4 texCUBEproj(samplerCUBE s, float4 t); +__intrinsic_op float4 tex1D(sampler1D s, float t); +__intrinsic_op float4 tex1D(sampler1D s, float t, float ddx, float ddy); +__intrinsic_op float4 tex1Dbias(sampler1D s, float4 t); +__intrinsic_op float4 tex1Dgrad(sampler1D s, float t, float ddx, float ddy); +__intrinsic_op float4 tex1Dlod(sampler1D s, float4 t); +__intrinsic_op float4 tex1Dproj(sampler1D s, float4 t); + +__intrinsic_op float4 tex2D(sampler2D s, float2 t); +__intrinsic_op float4 tex2D(sampler2D s, float2 t, float2 ddx, float2 ddy); +__intrinsic_op float4 tex2Dbias(sampler2D s, float4 t); +__intrinsic_op float4 tex2Dgrad(sampler2D s, float2 t, float2 ddx, float2 ddy); +__intrinsic_op float4 tex2Dlod(sampler2D s, float4 t); +__intrinsic_op float4 tex2Dproj(sampler2D s, float4 t); + +__intrinsic_op float4 tex3D(sampler3D s, float3 t); +__intrinsic_op float4 tex3D(sampler3D s, float3 t, float3 ddx, float3 ddy); +__intrinsic_op float4 tex3Dbias(sampler3D s, float4 t); +__intrinsic_op float4 tex3Dgrad(sampler3D s, float3 t, float3 ddx, float3 ddy); +__intrinsic_op float4 tex3Dlod(sampler3D s, float4 t); +__intrinsic_op float4 tex3Dproj(sampler3D s, float4 t); + +__intrinsic_op float4 texCUBE(samplerCUBE s, float3 t); +__intrinsic_op float4 texCUBE(samplerCUBE s, float3 t, float3 ddx, float3 ddy); +__intrinsic_op float4 texCUBEbias(samplerCUBE s, float4 t); +__intrinsic_op float4 texCUBEgrad(samplerCUBE s, float3 t, float3 ddx, float3 ddy); +__intrinsic_op float4 texCUBElod(samplerCUBE s, float4 t); +__intrinsic_op float4 texCUBEproj(samplerCUBE s, float4 t); */ // Matrix transpose -__generic __intrinsic matrix transpose(matrix x); +__generic __intrinsic_op matrix transpose(matrix x); // Truncate to integer -__generic __intrinsic T trunc(T x); -__generic __intrinsic vector trunc(vector x); -__generic __intrinsic matrix trunc(matrix x); +__generic __intrinsic_op T trunc(T x); +__generic __intrinsic_op vector trunc(vector x); +__generic __intrinsic_op matrix trunc(matrix x); )=", R"=( // Shader model 6.0 stuff -__intrinsic uint GlobalOrderedCountIncrement(uint countToAppendForThisLane); +__intrinsic_op uint GlobalOrderedCountIncrement(uint countToAppendForThisLane); -__generic __intrinsic T QuadReadLaneAt(T sourceValue, int quadLaneID); -__generic __intrinsic vector QuadReadLaneAt(vector sourceValue, int quadLaneID); -__generic __intrinsic matrix QuadReadLaneAt(matrix sourceValue, int quadLaneID); +__generic __intrinsic_op T QuadReadLaneAt(T sourceValue, int quadLaneID); +__generic __intrinsic_op vector QuadReadLaneAt(vector sourceValue, int quadLaneID); +__generic __intrinsic_op matrix QuadReadLaneAt(matrix sourceValue, int quadLaneID); -__generic __intrinsic T QuadSwapX(T localValue); -__generic __intrinsic vector QuadSwapX(vector localValue); -__generic __intrinsic matrix QuadSwapX(matrix localValue); +__generic __intrinsic_op T QuadSwapX(T localValue); +__generic __intrinsic_op vector QuadSwapX(vector localValue); +__generic __intrinsic_op matrix QuadSwapX(matrix localValue); -__generic __intrinsic T QuadSwapY(T localValue); -__generic __intrinsic vector QuadSwapY(vector localValue); -__generic __intrinsic matrix QuadSwapY(matrix localValue); +__generic __intrinsic_op T QuadSwapY(T localValue); +__generic __intrinsic_op vector QuadSwapY(vector localValue); +__generic __intrinsic_op matrix QuadSwapY(matrix localValue); -__generic __intrinsic T WaveAllBitAnd(T expr); -__generic __intrinsic vector WaveAllBitAnd(vector expr); -__generic __intrinsic matrix WaveAllBitAnd(matrix expr); +__generic __intrinsic_op T WaveAllBitAnd(T expr); +__generic __intrinsic_op vector WaveAllBitAnd(vector expr); +__generic __intrinsic_op matrix WaveAllBitAnd(matrix expr); -__generic __intrinsic T WaveAllBitOr(T expr); -__generic __intrinsic vector WaveAllBitOr(vector expr); -__generic __intrinsic matrix WaveAllBitOr(matrix expr); +__generic __intrinsic_op T WaveAllBitOr(T expr); +__generic __intrinsic_op vector WaveAllBitOr(vector expr); +__generic __intrinsic_op matrix WaveAllBitOr(matrix expr); -__generic __intrinsic T WaveAllBitXor(T expr); -__generic __intrinsic vector WaveAllBitXor(vector expr); -__generic __intrinsic matrix WaveAllBitXor(matrix expr); +__generic __intrinsic_op T WaveAllBitXor(T expr); +__generic __intrinsic_op vector WaveAllBitXor(vector expr); +__generic __intrinsic_op matrix WaveAllBitXor(matrix expr); -__generic __intrinsic T WaveAllMax(T expr); -__generic __intrinsic vector WaveAllMax(vector expr); -__generic __intrinsic matrix WaveAllMax(matrix expr); +__generic __intrinsic_op T WaveAllMax(T expr); +__generic __intrinsic_op vector WaveAllMax(vector expr); +__generic __intrinsic_op matrix WaveAllMax(matrix expr); -__generic __intrinsic T WaveAllMin(T expr); -__generic __intrinsic vector WaveAllMin(vector expr); -__generic __intrinsic matrix WaveAllMin(matrix expr); +__generic __intrinsic_op T WaveAllMin(T expr); +__generic __intrinsic_op vector WaveAllMin(vector expr); +__generic __intrinsic_op matrix WaveAllMin(matrix expr); -__generic __intrinsic T WaveAllProduct(T expr); -__generic __intrinsic vector WaveAllProduct(vector expr); -__generic __intrinsic matrix WaveAllProduct(matrix expr); +__generic __intrinsic_op T WaveAllProduct(T expr); +__generic __intrinsic_op vector WaveAllProduct(vector expr); +__generic __intrinsic_op matrix WaveAllProduct(matrix expr); -__generic __intrinsic T WaveAllSum(T expr); -__generic __intrinsic vector WaveAllSum(vector expr); -__generic __intrinsic matrix WaveAllSum(matrix expr); +__generic __intrinsic_op T WaveAllSum(T expr); +__generic __intrinsic_op vector WaveAllSum(vector expr); +__generic __intrinsic_op matrix WaveAllSum(matrix expr); -__intrinsic bool WaveAllEqual(bool expr); -__intrinsic bool WaveAllTrue(bool expr); -__intrinsic bool WaveAnyTrue(bool expr); +__intrinsic_op bool WaveAllEqual(bool expr); +__intrinsic_op bool WaveAllTrue(bool expr); +__intrinsic_op bool WaveAnyTrue(bool expr); uint64_t WaveBallot(bool expr); @@ -1015,21 +1015,21 @@ bool WaveIsHelperLane(); bool WaveOnce(); -__generic __intrinsic T WavePrefixProduct(T expr); -__generic __intrinsic vector WavePrefixProduct(vector expr); -__generic __intrinsic matrix WavePrefixProduct(matrix expr); +__generic __intrinsic_op T WavePrefixProduct(T expr); +__generic __intrinsic_op vector WavePrefixProduct(vector expr); +__generic __intrinsic_op matrix WavePrefixProduct(matrix expr); -__generic __intrinsic T WavePrefixSum(T expr); -__generic __intrinsic vector WavePrefixSum(vector expr); -__generic __intrinsic matrix WavePrefixSum(matrix expr); +__generic __intrinsic_op T WavePrefixSum(T expr); +__generic __intrinsic_op vector WavePrefixSum(vector expr); +__generic __intrinsic_op matrix WavePrefixSum(matrix expr); -__generic __intrinsic T WaveReadFirstLane(T expr); -__generic __intrinsic vector WaveReadFirstLane(vector expr); -__generic __intrinsic matrix WaveReadFirstLane(matrix expr); +__generic __intrinsic_op T WaveReadFirstLane(T expr); +__generic __intrinsic_op vector WaveReadFirstLane(vector expr); +__generic __intrinsic_op matrix WaveReadFirstLane(matrix expr); -__generic __intrinsic T WaveReadLaneAt(T expr, int laneIndex); -__generic __intrinsic vector WaveReadLaneAt(vector expr, int laneIndex); -__generic __intrinsic matrix WaveReadLaneAt(matrix expr, int laneIndex); +__generic __intrinsic_op T WaveReadLaneAt(T expr, int laneIndex); +__generic __intrinsic_op vector WaveReadLaneAt(vector expr, int laneIndex); +__generic __intrinsic_op matrix WaveReadLaneAt(matrix expr, int laneIndex); )=", R"=( @@ -1226,54 +1226,48 @@ namespace Slang } } - struct OpInfo { IntrinsicOp opCode; char const* opName; unsigned flags; }; + struct OpInfo { int32_t opCode; char const* opName; unsigned flags; }; static const OpInfo unaryOps[] = { - { IntrinsicOp::Pos, "+", ARITHMETIC_MASK }, - { IntrinsicOp::Neg, "-", ARITHMETIC_MASK }, - { IntrinsicOp::Not, "!", ANY_MASK }, - { IntrinsicOp::BitNot, "~", INT_MASK }, - { IntrinsicOp::PreInc, "++", ARITHMETIC_MASK | ASSIGNMENT }, - { IntrinsicOp::PreDec, "--", ARITHMETIC_MASK | ASSIGNMENT }, - { IntrinsicOp::PostInc, "++", ARITHMETIC_MASK | ASSIGNMENT | POSTFIX }, - { IntrinsicOp::PostDec, "--", ARITHMETIC_MASK | ASSIGNMENT | POSTFIX }, + { kIRPseudoOp_Pos, "+", ARITHMETIC_MASK }, + { kIROp_Neg, "-", ARITHMETIC_MASK }, + { kIROp_Not, "!", ANY_MASK }, + { kIRPseudoOp_BitNot, "~", INT_MASK }, + { kIRPseudoOp_PreInc, "++", ARITHMETIC_MASK | ASSIGNMENT }, + { kIRPseudoOp_PreDec, "--", ARITHMETIC_MASK | ASSIGNMENT }, + { kIRPseudoOp_PostInc, "++", ARITHMETIC_MASK | ASSIGNMENT | POSTFIX }, + { kIRPseudoOp_PostDec, "--", ARITHMETIC_MASK | ASSIGNMENT | POSTFIX }, }; static const OpInfo binaryOps[] = { - { IntrinsicOp::Add, "+", ARITHMETIC_MASK }, - { IntrinsicOp::Sub, "-", ARITHMETIC_MASK }, - { IntrinsicOp::Mul, "*", ARITHMETIC_MASK }, - { IntrinsicOp::Div, "/", ARITHMETIC_MASK }, - { IntrinsicOp::Mod, "%", INT_MASK }, - - { IntrinsicOp::And, "&&", LOGICAL_MASK }, - { IntrinsicOp::Or, "||", LOGICAL_MASK }, - - { IntrinsicOp::BitAnd, "&", LOGICAL_MASK }, - { IntrinsicOp::BitOr, "|", LOGICAL_MASK }, - { IntrinsicOp::BitXor, "^", LOGICAL_MASK }, - - { IntrinsicOp::Lsh, "<<", INT_MASK }, - { IntrinsicOp::Rsh, ">>", INT_MASK }, - - { IntrinsicOp::Eql, "==", ANY_MASK | COMPARISON }, - { IntrinsicOp::Neq, "!=", ANY_MASK | COMPARISON }, - - { IntrinsicOp::Greater, ">", ARITHMETIC_MASK | COMPARISON }, - { IntrinsicOp::Less, "<", ARITHMETIC_MASK | COMPARISON }, - { IntrinsicOp::Geq, ">=", ARITHMETIC_MASK | COMPARISON }, - { IntrinsicOp::Leq, "<=", ARITHMETIC_MASK | COMPARISON }, - - { IntrinsicOp::AddAssign, "+=", ASSIGNMENT | ARITHMETIC_MASK }, - { IntrinsicOp::SubAssign, "-=", ASSIGNMENT | ARITHMETIC_MASK }, - { IntrinsicOp::MulAssign, "*=", ASSIGNMENT | ARITHMETIC_MASK }, - { IntrinsicOp::DivAssign, "/=", ASSIGNMENT | ARITHMETIC_MASK }, - { IntrinsicOp::ModAssign, "%=", ASSIGNMENT | ARITHMETIC_MASK }, - { IntrinsicOp::AndAssign, "&=", ASSIGNMENT | LOGICAL_MASK }, - { IntrinsicOp::OrAssign, "|=", ASSIGNMENT | LOGICAL_MASK }, - { IntrinsicOp::XorAssign, "^=", ASSIGNMENT | LOGICAL_MASK }, - { IntrinsicOp::LshAssign, "<<=", ASSIGNMENT | INT_MASK }, - { IntrinsicOp::RshAssign, ">>=", ASSIGNMENT | INT_MASK }, + { kIROp_Add, "+", ARITHMETIC_MASK }, + { kIROp_Sub, "-", ARITHMETIC_MASK }, + { kIROp_Mul, "*", ARITHMETIC_MASK }, + { kIROp_Div, "/", ARITHMETIC_MASK }, + { kIROp_Mod, "%", INT_MASK }, + { kIROp_And, "&&", LOGICAL_MASK }, + { kIROp_Or, "||", LOGICAL_MASK }, + { kIROp_BitAnd, "&", LOGICAL_MASK }, + { kIROp_BitOr, "|", LOGICAL_MASK }, + { kIROp_BitXor, "^", LOGICAL_MASK }, + { kIROp_Lsh, "<<", INT_MASK }, + { kIROp_Rsh, ">>", INT_MASK }, + { kIROp_Eql, "==", ANY_MASK | COMPARISON }, + { kIROp_Neq, "!=", ANY_MASK | COMPARISON }, + { kIROp_Greater, ">", ARITHMETIC_MASK | COMPARISON }, + { kIROp_Less, "<", ARITHMETIC_MASK | COMPARISON }, + { kIROp_Geq, ">=", ARITHMETIC_MASK | COMPARISON }, + { kIROp_Leq, "<=", ARITHMETIC_MASK | COMPARISON }, + { kIRPseudoOp_AddAssign, "+=", ASSIGNMENT | ARITHMETIC_MASK }, + { kIRPseudoOp_SubAssign, "-=", ASSIGNMENT | ARITHMETIC_MASK }, + { kIRPseudoOp_MulAssign, "*=", ASSIGNMENT | ARITHMETIC_MASK }, + { kIRPseudoOp_DivAssign, "/=", ASSIGNMENT | ARITHMETIC_MASK }, + { kIRPseudoOp_ModAssign, "%=", ASSIGNMENT | ARITHMETIC_MASK }, + { kIRPseudoOp_AndAssign, "&=", ASSIGNMENT | LOGICAL_MASK }, + { kIRPseudoOp_OrAssign, "|=", ASSIGNMENT | LOGICAL_MASK }, + { kIRPseudoOp_XorAssign, "^=", ASSIGNMENT | LOGICAL_MASK }, + { kIRPseudoOp_LshAssign, "<<=", ASSIGNMENT | INT_MASK }, + { kIRPseudoOp_RshAssign, ">>=", ASSIGNMENT | INT_MASK }, }; String Session::getCoreLibraryCode() @@ -1623,7 +1617,7 @@ namespace Slang { { sb << "__glsl_version(450)\n"; - sb << "__intrinsic(glsl, \"("; + sb << "__target_intrinsic(glsl, \"("; int aa = 0; String lodStr = "0"; @@ -1679,7 +1673,7 @@ namespace Slang sb << ")\")\n"; - sb << "__intrinsic\n"; + sb << "__intrinsic_op\n"; } @@ -1748,13 +1742,13 @@ namespace Slang if (isMultisample) { - sb << "__intrinsic(glsl, \"texelFetch($P, $0, $1)\")\n"; + sb << "__target_intrinsic(glsl, \"texelFetch($P, $0, $1)\")\n"; } else { - sb << "__intrinsic(glsl, \"texelFetch($P, ($0)." << kGLSLLoadCoordsSwizzle[loadCoordCount] << ", ($0)." << kGLSLLoadLODSwizzle[loadCoordCount] << ")\")\n"; + sb << "__target_intrinsic(glsl, \"texelFetch($P, ($0)." << kGLSLLoadCoordsSwizzle[loadCoordCount] << ", ($0)." << kGLSLLoadLODSwizzle[loadCoordCount] << ")\")\n"; } - sb << "__intrinsic\n"; + sb << "__intrinsic_op\n"; sb << "T Load("; sb << "int" << loadCoordCount << " location"; if(isMultisample) @@ -1765,13 +1759,13 @@ namespace Slang if (isMultisample) { - sb << "__intrinsic(glsl, \"texelFetchOffset($P, $0, $1, $2)\")\n"; + sb << "__target_intrinsic(glsl, \"texelFetchOffset($P, $0, $1, $2)\")\n"; } else { - sb << "__intrinsic(glsl, \"texelFetch($P, ($0)." << kGLSLLoadCoordsSwizzle[loadCoordCount] << ", ($0)." << kGLSLLoadLODSwizzle[loadCoordCount] << ", $1)\")\n"; + sb << "__target_intrinsic(glsl, \"texelFetch($P, ($0)." << kGLSLLoadCoordsSwizzle[loadCoordCount] << ", ($0)." << kGLSLLoadLODSwizzle[loadCoordCount] << ", $1)\")\n"; } - sb << "__intrinsic\n"; + sb << "__intrinsic_op\n"; sb << "T Load("; sb << "int" << loadCoordCount << " location"; if(isMultisample) @@ -1796,26 +1790,26 @@ namespace Slang if(baseShape != TextureType::ShapeCube) { // subscript operator - sb << "__intrinsic __subscript(uint" << kBaseTextureTypes[tt].coordCount + isArray << " location) -> T;\n"; + sb << "__intrinsic_op __subscript(uint" << kBaseTextureTypes[tt].coordCount + isArray << " location) -> T;\n"; } if( !isMultisample ) { // `Sample()` - sb << "__intrinsic(glsl, \"texture($p, $1)\")\n"; + sb << "__target_intrinsic(glsl, \"texture($p, $1)\")\n"; // TODO: only enable if IR is being used? - sb << "__intrinsic_op(sample_t_s_u)\n"; + sb << "__intrinsic_op(sample)\n"; - sb << "__intrinsic\n"; + sb << "__intrinsic_op\n"; sb << "T Sample(SamplerState s, "; sb << "float" << kBaseTextureTypes[tt].coordCount + isArray << " location);\n"; if( baseShape != TextureType::ShapeCube ) { - sb << "__intrinsic(glsl, \"textureOffset($p, $1, $2)\")\n"; - sb << "__intrinsic\n"; + sb << "__target_intrinsic(glsl, \"textureOffset($p, $1, $2)\")\n"; + sb << "__intrinsic_op\n"; sb << "T Sample(SamplerState s, "; sb << "float" << kBaseTextureTypes[tt].coordCount + isArray << " location, "; sb << "int" << kBaseTextureTypes[tt].coordCount << " offset);\n"; @@ -1839,15 +1833,15 @@ namespace Slang // `SampleBias()` - sb << "__intrinsic(glsl, \"texture($p, $1, $2)\")\n"; - sb << "__intrinsic\n"; + sb << "__target_intrinsic(glsl, \"texture($p, $1, $2)\")\n"; + sb << "__intrinsic_op\n"; sb << "T SampleBias(SamplerState s, "; sb << "float" << kBaseTextureTypes[tt].coordCount + isArray << " location, float bias);\n"; if( baseShape != TextureType::ShapeCube ) { - sb << "__intrinsic(glsl, \"textureOffset($p, $1, $2, $3)\")\n"; - sb << "__intrinsic\n"; + sb << "__target_intrinsic(glsl, \"textureOffset($p, $1, $2, $3)\")\n"; + sb << "__intrinsic_op\n"; sb << "T SampleBias(SamplerState s, "; sb << "float" << kBaseTextureTypes[tt].coordCount + isArray << " location, float bias, "; sb << "int" << kBaseTextureTypes[tt].coordCount << " offset);\n"; @@ -1868,7 +1862,7 @@ namespace Slang if (extCoordCount < 3) extCoordCount = 3; - sb << "__intrinsic(glsl, \"textureLod($p, "; + sb << "__target_intrinsic(glsl, \"textureLod($p, "; sb << "vec" << extCoordCount << "($1,"; for (int ii = arrCoordCount; ii < extCoordCount - 1; ++ii) @@ -1886,7 +1880,7 @@ namespace Slang if (extCoordCount < 3) extCoordCount = 3; - sb << "__intrinsic(glsl, \"textureGrad($p, "; + sb << "__target_intrinsic(glsl, \"textureGrad($p, "; sb << "vec" << extCoordCount << "($1,"; for (int ii = arrCoordCount; ii < extCoordCount - 1; ++ii) @@ -1900,7 +1894,7 @@ namespace Slang sb << ", vec" << baseCoordCount << "(0.0)"; sb << ")\")\n"; } - sb << "__intrinsic\n"; + sb << "__intrinsic_op\n"; sb << "T SampleCmpLevelZero(SamplerComparisonState s, "; sb << "float" << kBaseTextureTypes[tt].coordCount + isArray << " location, "; sb << "float compareValue"; @@ -1927,8 +1921,8 @@ namespace Slang } - sb << "__intrinsic(glsl, \"textureGrad($p, $1, $2, $3)\")\n"; - sb << "__intrinsic\n"; + sb << "__target_intrinsic(glsl, \"textureGrad($p, $1, $2, $3)\")\n"; + sb << "__intrinsic_op(sampleGrad)\n"; sb << "T SampleGrad(SamplerState s, "; sb << "float" << kBaseTextureTypes[tt].coordCount + isArray << " location, "; sb << "float" << kBaseTextureTypes[tt].coordCount << " gradX, "; @@ -1937,8 +1931,8 @@ namespace Slang if( baseShape != TextureType::ShapeCube ) { - sb << "__intrinsic(glsl, \"textureGradOffset($p, $1, $2, $3, $4)\")\n"; - sb << "__intrinsic\n"; + sb << "__target_intrinsic(glsl, \"textureGradOffset($p, $1, $2, $3, $4)\")\n"; + sb << "__intrinsic_op(sampleGrad)\n"; sb << "T SampleGrad(SamplerState s, "; sb << "float" << kBaseTextureTypes[tt].coordCount + isArray << " location, "; sb << "float" << kBaseTextureTypes[tt].coordCount << " gradX, "; @@ -1948,16 +1942,16 @@ namespace Slang // `SampleLevel` - sb << "__intrinsic(glsl, \"textureLod($p, $1, $2)\")\n"; - sb << "__intrinsic\n"; + sb << "__target_intrinsic(glsl, \"textureLod($p, $1, $2)\")\n"; + sb << "__intrinsic_op\n"; sb << "T SampleLevel(SamplerState s, "; sb << "float" << kBaseTextureTypes[tt].coordCount + isArray << " location, "; sb << "float level);\n"; if( baseShape != TextureType::ShapeCube ) { - sb << "__intrinsic(glsl, \"textureLodOffset($p, $1, $2, $3)\")\n"; - sb << "__intrinsic\n"; + sb << "__target_intrinsic(glsl, \"textureLodOffset($p, $1, $2, $3)\")\n"; + sb << "__intrinsic_op\n"; sb << "T SampleLevel(SamplerState s, "; sb << "float" << kBaseTextureTypes[tt].coordCount + isArray << " location, "; sb << "float level, "; @@ -2024,14 +2018,14 @@ namespace Slang EMIT_LINE_DIRECTIVE(); - sb << "__intrinsic(glsl, \"textureGather($p, $1, " << componentIndex << ")\")\n"; - sb << "__intrinsic\n"; + sb << "__target_intrinsic(glsl, \"textureGather($p, $1, " << componentIndex << ")\")\n"; + sb << "__intrinsic_op\n"; sb << "vector Gather" << componentName << "(SamplerState s, "; sb << "float" << kBaseTextureTypes[tt].coordCount << " location);\n"; EMIT_LINE_DIRECTIVE(); - sb << "__intrinsic(glsl, \"textureGatherOffset($p, $1, $2, " << componentIndex << ")\")\n"; - sb << "__intrinsic\n"; + sb << "__target_intrinsic(glsl, \"textureGatherOffset($p, $1, $2, " << componentIndex << ")\")\n"; + sb << "__intrinsic_op\n"; sb << "vector Gather" << componentName << "(SamplerState s, "; sb << "float" << kBaseTextureTypes[tt].coordCount << " location, "; sb << "int" << kBaseTextureTypes[tt].coordCount << " offset);\n"; @@ -2043,8 +2037,8 @@ namespace Slang sb << "out uint status);\n"; EMIT_LINE_DIRECTIVE(); - sb << "__intrinsic(glsl, \"textureGatherOffsets($p, $1, int" << kBaseTextureTypes[tt].coordCount << "[]($2, $3, $4, $5), " << componentIndex << ")\")\n"; - sb << "__intrinsic\n"; + sb << "__target_intrinsic(glsl, \"textureGatherOffsets($p, $1, int" << kBaseTextureTypes[tt].coordCount << "[]($2, $3, $4, $5), " << componentIndex << ")\")\n"; + sb << "__intrinsic_op\n"; sb << "vector Gather" << componentName << "(SamplerState s, "; sb << "float" << kBaseTextureTypes[tt].coordCount << " location, "; sb << "int" << kBaseTextureTypes[tt].coordCount << " offset1, "; @@ -2126,8 +2120,8 @@ namespace Slang // skip matrix-matrix multiply operations here, so that GLSL doesn't see them switch (op.opCode) { - case IntrinsicOp::Mul: - case IntrinsicOp::MulAssign: + case kIROp_Mul: + case kIRPseudoOp_MulAssign: break; default: @@ -2188,8 +2182,8 @@ namespace Slang default: continue; - case IntrinsicOp::Mul: - case IntrinsicOp::MulAssign: + case kIROp_Mul: + case kIRPseudoOp_MulAssign: break; } @@ -2233,15 +2227,15 @@ namespace Slang sb << kBaseBufferAccessLevels[aa].name; sb << "Buffer {\n"; - sb << "__intrinsic void GetDimensions(out uint dim);\n"; + sb << "__intrinsic_op void GetDimensions(out uint dim);\n"; - sb << "__intrinsic(glsl, \"texelFetch($P, $0)$z\")\n"; - sb << "__intrinsic T Load(int location);\n"; + sb << "__target_intrinsic(glsl, \"texelFetch($P, $0)$z\")\n"; + sb << "__intrinsic_op T Load(int location);\n"; - sb << "__intrinsic T Load(int location, out uint status);\n"; + sb << "__intrinsic_op T Load(int location, out uint status);\n"; - sb << "__intrinsic(glsl, \"texelFetch($P, int($0))$z\")\n"; - sb << "__intrinsic __subscript(uint index) -> T"; + 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) { @@ -2310,24 +2304,24 @@ namespace Slang // Multiplication operations for vectors + matrices // scalar-vector and vector-scalar - sb << "__generic __intrinsic_op(Mul) vector operator*(vector x, T y);\n"; - sb << "__generic __intrinsic_op(Mul) vector operator*(T x, vector y);\n"; + sb << "__generic __intrinsic_op(mul) vector operator*(vector x, T y);\n"; + sb << "__generic __intrinsic_op(mul) vector operator*(T x, vector y);\n"; // scalar-matrix and matrix-scalar - sb << "__generic __intrinsic_op(Mul) matrix operator*(matrix x, T y);\n"; - sb << "__generic __intrinsic_op(Mul) matrix operator*(T x, matrix y);\n"; + sb << "__generic __intrinsic_op(mul) matrix operator*(matrix x, T y);\n"; + sb << "__generic __intrinsic_op(mul) matrix operator*(T x, matrix y);\n"; // vector-vector (dot product) - sb << "__generic __intrinsic_op(Mul) T operator*(vector x, vector y);\n"; + sb << "__generic __intrinsic_op(dot) T operator*(vector x, vector y);\n"; // vector-matrix - sb << "__generic __intrinsic_op(Mul) vector operator*(vector x, matrix y);\n"; + sb << "__generic __intrinsic_op(mulVectorMatrix) vector operator*(vector x, matrix y);\n"; // matrix-vector - sb << "__generic __intrinsic_op(Mul) vector operator*(matrix x, vector y);\n"; + sb << "__generic __intrinsic_op(mulMatrixVector) vector operator*(matrix x, vector y);\n"; // matrix-matrix - sb << "__generic __intrinsic_op(Mul) matrix operator*(matrix x, matrix y);\n"; + sb << "__generic __intrinsic_op(mulMatrixMatrix) matrix operator*(matrix x, matrix y);\n"; -- cgit v1.2.3