diff options
| -rw-r--r-- | source/slang/hlsl.meta.slang | 117 | ||||
| -rw-r--r-- | source/slang/slang-capabilities.capdef | 9 | ||||
| -rw-r--r-- | source/slang/slang-emit-wgsl.cpp | 18 | ||||
| -rw-r--r-- | source/slang/slang-emit-wgsl.h | 7 |
4 files changed, 113 insertions, 38 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index 2df66c1f7..0fd40b9d8 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -5710,7 +5710,7 @@ bool all(T x) __generic<T : __BuiltinType, let N : int> [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl)] bool all(vector<T,N> x) { if(N == 1) @@ -5747,6 +5747,8 @@ bool all(vector<T,N> x) OpAll $$bool result %castResult }; } + case wgsl: + __intrinsic_asm "all"; default: bool result = true; for(int i = 0; i < N; ++i) @@ -5849,7 +5851,7 @@ bool any(T x) __generic<T : __BuiltinType, let N : int> [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl)] bool any(vector<T, N> x) { if(N == 1) @@ -5886,6 +5888,8 @@ bool any(vector<T, N> x) OpAny $$bool result %castResult }; } + case wgsl: + __intrinsic_asm "any"; default: bool result = false; for(int i = 0; i < N; ++i) @@ -5948,7 +5952,7 @@ double2 asdouble(uint2 lowbits, uint2 highbits) // Reinterpret bits as a float (HLSL SM 4.0) [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_4_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_4_0)] float asfloat(int x) { __target_switch @@ -5961,11 +5965,12 @@ float asfloat(int x) case spirv: return spirv_asm { OpBitcast $$float result $x }; + case wgsl: __intrinsic_asm "bitcast<$TR>($0)"; } } [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_4_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_4_0)] float asfloat(uint x) { __target_switch @@ -5978,12 +5983,13 @@ float asfloat(uint x) case spirv: return spirv_asm { OpBitcast $$float result $x }; + case wgsl: __intrinsic_asm "bitcast<$TR>($0)"; } } __generic<let N : int> [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_4_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_4_0)] vector<float, N> asfloat(vector< int, N> x) { __target_switch @@ -5994,6 +6000,7 @@ vector<float, N> asfloat(vector< int, N> x) case spirv: return spirv_asm { OpBitcast $$vector<float, N> result $x }; + case wgsl: __intrinsic_asm "bitcast<$TR>($0)"; default: VECTOR_MAP_UNARY(float, N, asfloat, x); } @@ -6001,7 +6008,7 @@ vector<float, N> asfloat(vector< int, N> x) __generic<let N : int> [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_4_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_4_0)] vector<float,N> asfloat(vector<uint,N> x) { __target_switch @@ -6012,6 +6019,7 @@ vector<float,N> asfloat(vector<uint,N> x) case spirv: return spirv_asm { OpBitcast $$vector<float,N> result $x }; + case wgsl: __intrinsic_asm "bitcast<$TR>($0)"; default: VECTOR_MAP_UNARY(float, N, asfloat, x); } @@ -6176,7 +6184,7 @@ int asint(float x) } [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_4_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_4_0)] int asint(uint x) { __target_switch @@ -6189,12 +6197,13 @@ int asint(uint x) case spirv: return spirv_asm { OpBitcast $$int result $x }; + case wgsl: __intrinsic_asm "bitcast<$TR>($0)"; } } __generic<let N : int> [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_4_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_4_0)] vector<int, N> asint(vector<float, N> x) { __target_switch @@ -6205,6 +6214,7 @@ vector<int, N> asint(vector<float, N> x) case spirv: return spirv_asm { OpBitcast $$vector<int, N> result $x }; + case wgsl: __intrinsic_asm "bitcast<$TR>($0)"; default: VECTOR_MAP_UNARY(int, N, asint, x); } @@ -6212,7 +6222,7 @@ vector<int, N> asint(vector<float, N> x) __generic<let N : int> [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_4_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_4_0)] vector<int, N> asint(vector<uint, N> x) { if(N == 1) @@ -6225,6 +6235,7 @@ vector<int, N> asint(vector<uint, N> x) case spirv: return spirv_asm { OpBitcast $$vector<int, N> result $x }; + case wgsl: __intrinsic_asm "bitcast<$TR>($0)"; default: VECTOR_MAP_UNARY(int, N, asint, x); } @@ -6320,7 +6331,7 @@ uint asuint(float x) } [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_4_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_4_0)] uint asuint(int x) { __target_switch @@ -6333,12 +6344,13 @@ uint asuint(int x) case spirv: return spirv_asm { OpBitcast $$uint result $x }; + case wgsl: __intrinsic_asm "bitcast<$TR>($0)"; } } __generic<let N : int> [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_4_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_4_0)] vector<uint,N> asuint(vector<float,N> x) { __target_switch @@ -6351,12 +6363,13 @@ vector<uint,N> asuint(vector<float,N> x) }; default: VECTOR_MAP_UNARY(uint, N, asuint, x); + case wgsl: __intrinsic_asm "bitcast<$TR>($0)"; } } __generic<let N : int> [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_4_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_4_0)] vector<uint, N> asuint(vector<int, N> x) { if(N == 1) @@ -6369,6 +6382,7 @@ vector<uint, N> asuint(vector<int, N> x) case spirv: return spirv_asm { OpBitcast $$vector<uint, N> result $x }; + case wgsl: __intrinsic_asm "bitcast<$TR>($0)"; default: VECTOR_MAP_UNARY(uint, N, asuint, x); } @@ -7188,7 +7202,7 @@ vector<T,N> cospi(vector<T,N> x) // Population count [__readNone] [ForceInline] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_5_0)] uint countbits(uint value) { __target_switch @@ -7204,13 +7218,15 @@ uint countbits(uint value) __intrinsic_asm "$P_countbits($0)"; case spirv: return spirv_asm {OpBitCount $$uint result $value}; + case wgsl: + __intrinsic_asm "countOneBits"; } } __generic <let N : int> [__readNone] [ForceInline] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_5_0)] vector<uint, N> countbits(vector<uint, N> value) { __target_switch @@ -7223,6 +7239,8 @@ vector<uint, N> countbits(vector<uint, N> value) __intrinsic_asm "popcount"; case spirv: return spirv_asm {OpBitCount $$vector<uint, N> result $value}; + case wgsl: + __intrinsic_asm "countOneBits"; default: VECTOR_MAP_UNARY(uint, N, countbits, value); } @@ -7275,12 +7293,13 @@ vector<T, 3> cross(vector<T, 3> left, vector<T, 3> right) // Convert encoded color [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, sm_4_0_version)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, sm_4_0_version)] int4 D3DCOLORtoUBYTE4(float4 color) { __target_switch { case hlsl: __intrinsic_asm "D3DCOLORtoUBYTE4"; + case wgsl: __intrinsic_asm "bitcast<vec4i>(pack4x8unorm($0)).zyxw"; default: let scaled = color.zyxw * 255.001999f; return int4(scaled); @@ -7294,7 +7313,7 @@ for (auto xOrY : diffDimensions) { }}}} __generic<T : __BuiltinFloatingPointType> [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, fragmentprocessing)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, fragmentprocessing)] T dd$(xOrY)(T x) { __requireComputeDerivative(); @@ -7310,12 +7329,14 @@ T dd$(xOrY)(T x) __intrinsic_asm "dfd$(xOrY)"; case spirv: return spirv_asm {OpDPd$(xOrY) $$T result $x}; + case wgsl: + __intrinsic_asm "dpd$(xOrY)"; } } __generic<T : __BuiltinFloatingPointType, let N : int> [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, fragmentprocessing)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, fragmentprocessing)] vector<T, N> dd$(xOrY)(vector<T, N> x) { __requireComputeDerivative(); @@ -7331,12 +7352,14 @@ vector<T, N> dd$(xOrY)(vector<T, N> x) __intrinsic_asm "dfd$(xOrY)"; case spirv: return spirv_asm {OpDPd$(xOrY) $$vector<T, N> result $x}; + case wgsl: + __intrinsic_asm "dpd$(xOrY)"; } } __generic<T : __BuiltinFloatingPointType, let N : int, let M : int> [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, fragmentprocessing)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, fragmentprocessing)] matrix<T, N, M> dd$(xOrY)(matrix<T, N, M> x) { __requireComputeDerivative(); @@ -7448,7 +7471,7 @@ ${{{{ __generic<T : __BuiltinFloatingPointType> [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl)] T degrees(T x) { __target_switch @@ -7458,6 +7481,7 @@ T degrees(T x) case spirv: return spirv_asm { OpExtInst $$T result glsl450 Degrees $x }; + case wgsl: __intrinsic_asm "degrees"; default: return x * (T(180) / T.getPi()); } @@ -8030,7 +8054,7 @@ vector<T,N> exp10(vector<T,N> x) __glsl_version(420) __cuda_sm_version(6.0) [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_5_0)] float f16tof32(uint value) { __target_switch @@ -8048,12 +8072,13 @@ float f16tof32(uint value) result:$$float = OpFConvert %half }; } + case wgsl: __intrinsic_asm "unpack2x16float($0).x"; } } __generic<let N : int> [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_5_0)] vector<float, N> f16tof32(vector<uint, N> value) { __target_switch @@ -8078,7 +8103,7 @@ vector<float, N> f16tof32(vector<uint, N> value) __glsl_version(420) __cuda_sm_version(6.0) [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_5_0)] uint f32tof16(float value) { __target_switch @@ -8096,12 +8121,13 @@ uint f32tof16(float value) result:$$uint = OpUConvert %lowBits }; } + case wgsl: __intrinsic_asm "pack2x16float(vec2f($0,0.0))"; } } __generic<let N : int> [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_5_0)] vector<uint, N> f32tof16(vector<float, N> value) { __target_switch @@ -8127,7 +8153,7 @@ vector<uint, N> f32tof16(vector<float, N> value) __glsl_version(420) [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_5_0)] float f16tof32(float16_t value) { __target_switch @@ -8143,12 +8169,13 @@ float f16tof32(float16_t value) result:$$float = OpFConvert $value }; } + case wgsl: __intrinsic_asm "f32($0)"; } } __generic<let N : int> [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_5_0)] vector<float, N> f16tof32(vector<float16_t, N> value) { __target_switch @@ -8167,7 +8194,7 @@ vector<float, N> f16tof32(vector<float16_t, N> value) // Convert to float16_t __glsl_version(420) [__readNone] -[require(cuda_glsl_metal_spirv, shader5_sm_5_0)] +[require(cuda_glsl_metal_spirv_wgsl, shader5_sm_5_0)] float16_t f32tof16_(float value) { __target_switch @@ -8178,12 +8205,13 @@ float16_t f32tof16_(float value) case spirv: return spirv_asm { OpFConvert $$float16_t result $value }; + case wgsl: __intrinsic_asm "f16($0)"; } } __generic<let N : int> [__readNone] -[require(cuda_glsl_metal_spirv, shader5_sm_5_0)] +[require(cuda_glsl_metal_spirv_wgsl, shader5_sm_5_0)] vector<float16_t, N> f32tof16_(vector<float, N> value) { __target_switch @@ -8203,7 +8231,7 @@ vector<float16_t, N> f32tof16_(vector<float, N> value) // Flip surface normal to face forward, if needed __generic<T : __BuiltinFloatingPointType, let N : int> [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, sm_4_0_version)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, sm_4_0_version)] vector<T,N> faceforward(vector<T,N> n, vector<T,N> i, vector<T,N> ng) { __target_switch @@ -8214,6 +8242,7 @@ vector<T,N> faceforward(vector<T,N> n, vector<T,N> i, vector<T,N> ng) case spirv: return spirv_asm { OpExtInst $$vector<T,N> result glsl450 FaceForward $n $i $ng }; + case wgsl: __intrinsic_asm "faceForward"; default: return dot(ng, i) < T(0.0f) ? n : -n; } @@ -8221,7 +8250,7 @@ vector<T,N> faceforward(vector<T,N> n, vector<T,N> i, vector<T,N> ng) // Find first set bit starting at high bit and working down [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_5_0)] int firstbithigh(int value) { __target_switch @@ -8234,12 +8263,13 @@ int firstbithigh(int value) case spirv: return spirv_asm { OpExtInst $$int result glsl450 FindSMsb $value }; + case wgsl: __intrinsic_asm "firstLeadingBit"; } } __generic<let N : int> [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_5_0)] vector<int, N> firstbithigh(vector<int, N> value) { __target_switch @@ -8250,13 +8280,14 @@ vector<int, N> firstbithigh(vector<int, N> value) case spirv: return spirv_asm { OpExtInst $$vector<int, N> result glsl450 FindSMsb $value }; + case wgsl: __intrinsic_asm "firstLeadingBit"; default: VECTOR_MAP_UNARY(int, N, firstbithigh, value); } } [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_5_0)] uint firstbithigh(uint value) { __target_switch @@ -8269,12 +8300,13 @@ uint firstbithigh(uint value) case spirv: return spirv_asm { OpExtInst $$uint result glsl450 FindUMsb $value }; + case wgsl: __intrinsic_asm "firstLeadingBit"; } } __generic<let N : int> [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_5_0)] vector<uint,N> firstbithigh(vector<uint,N> value) { __target_switch @@ -8285,6 +8317,7 @@ vector<uint,N> firstbithigh(vector<uint,N> value) case spirv: return spirv_asm { OpExtInst $$vector<uint,N> result glsl450 FindUMsb $value }; + case wgsl: __intrinsic_asm "firstLeadingBit"; default: VECTOR_MAP_UNARY(uint, N, firstbithigh, value); } @@ -8292,7 +8325,7 @@ vector<uint,N> firstbithigh(vector<uint,N> value) // Find first set bit starting at low bit and working up [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_5_0)] int firstbitlow(int value) { __target_switch @@ -8305,12 +8338,13 @@ int firstbitlow(int value) case spirv: return spirv_asm { OpExtInst $$int result glsl450 FindILsb $value }; + case wgsl: __intrinsic_asm "firstTrailingBit"; } } __generic<let N : int> [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_5_0)] vector<int,N> firstbitlow(vector<int,N> value) { __target_switch @@ -8321,13 +8355,14 @@ vector<int,N> firstbitlow(vector<int,N> value) case spirv: return spirv_asm { OpExtInst $$vector<int,N> result glsl450 FindILsb $value }; + case wgsl: __intrinsic_asm "firstTrailingBit"; default: VECTOR_MAP_UNARY(int, N, firstbitlow, value); } } [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_5_0)] uint firstbitlow(uint value) { __target_switch @@ -8340,12 +8375,13 @@ uint firstbitlow(uint value) case spirv: return spirv_asm { OpExtInst $$uint result glsl450 FindILsb $value }; + case wgsl: __intrinsic_asm "firstTrailingBit"; } } __generic<let N : int> [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, shader5_sm_5_0)] vector<uint,N> firstbitlow(vector<uint,N> value) { __target_switch @@ -8356,6 +8392,7 @@ vector<uint,N> firstbitlow(vector<uint,N> value) case spirv: return spirv_asm { OpExtInst $$vector<uint,N> result glsl450 FindILsb $value }; + case wgsl: __intrinsic_asm "firstTrailingBit"; default: VECTOR_MAP_UNARY(uint, N, firstbitlow, value); } @@ -8707,7 +8744,7 @@ matrix<T, N, M> frexp(matrix<T, N, M> x, out matrix<int, N, M, L> exp) // Texture filter width __generic<T : __BuiltinFloatingPointType> [__readNone] -[require(glsl_hlsl_metal_spirv, fragmentprocessing)] +[require(glsl_hlsl_metal_spirv_wgsl, fragmentprocessing)] T fwidth(T x) { __requireComputeDerivative(); @@ -8724,12 +8761,14 @@ T fwidth(T x) { OpFwidth $$T result $x; }; + case wgsl: + __intrinsic_asm "fwidth($0)"; } } __generic<T : __BuiltinFloatingPointType, let N : int> [__readNone] -[require(glsl_hlsl_spirv, fragmentprocessing)] +[require(glsl_hlsl_spirv_wgsl, fragmentprocessing)] vector<T, N> fwidth(vector<T, N> x) { __requireComputeDerivative(); @@ -8744,6 +8783,8 @@ vector<T, N> fwidth(vector<T, N> x) { OpFwidth $$vector<T, N> result $x; }; + case wgsl: + __intrinsic_asm "fwidth($0)"; } } diff --git a/source/slang/slang-capabilities.capdef b/source/slang/slang-capabilities.capdef index 3e17b3d19..96f5996a0 100644 --- a/source/slang/slang-capabilities.capdef +++ b/source/slang/slang-capabilities.capdef @@ -330,6 +330,10 @@ alias cuda_glsl_spirv = cuda | glsl | spirv; /// [Compound] alias cuda_glsl_metal_spirv = cuda | glsl | metal | spirv; +/// CUDA, GLSL, Metal, SPIRV and WGSL code-gen targets +/// [Compound] +alias cuda_glsl_metal_spirv_wgsl = cuda | glsl | metal | spirv | wgsl; + /// CUDA, and HLSL code-gen targets /// [Compound] alias cuda_hlsl = cuda | hlsl; @@ -342,6 +346,10 @@ alias cuda_hlsl_spirv = cuda | hlsl | spirv; /// [Compound] alias glsl_hlsl_spirv = glsl | hlsl | spirv; +/// GLSL, HLSL, SPIRV and WGSL code-gen targets +/// [Compound] +alias glsl_hlsl_spirv_wgsl = glsl | hlsl | spirv | wgsl; + /// GLSL, HLSL, Metal, and SPIRV code-gen targets /// [Compound] alias glsl_hlsl_metal_spirv = glsl | hlsl | metal | spirv; @@ -1705,6 +1713,7 @@ alias fragmentprocessing = fragment + _sm_5_0 | fragment + metal | fragment + cpp | fragment + cuda + | fragment + wgsl ; /// Capabilities required to use fragment derivative operations (with GLSL derivativecontrol) /// [Compound] diff --git a/source/slang/slang-emit-wgsl.cpp b/source/slang/slang-emit-wgsl.cpp index 0a4cca407..40d8ace91 100644 --- a/source/slang/slang-emit-wgsl.cpp +++ b/source/slang/slang-emit-wgsl.cpp @@ -1002,4 +1002,22 @@ void WGSLSourceEmitter::emitFrontMatterImpl(TargetRequest* /* targetReq */) } } +void WGSLSourceEmitter::emitIntrinsicCallExprImpl( + IRCall* inst, + UnownedStringSlice intrinsicDefinition, + IRInst* intrinsicInst, + EmitOpInfo const& inOuterPrec + ) +{ + // The f16 constructor is generated for f32tof16 + if (intrinsicDefinition.startsWith("f16")) + { + m_f16ExtensionEnabled = true; + } + + CLikeSourceEmitter::emitIntrinsicCallExprImpl( + inst, intrinsicDefinition, intrinsicInst, inOuterPrec + ); +} + } // namespace Slang diff --git a/source/slang/slang-emit-wgsl.h b/source/slang/slang-emit-wgsl.h index dacd11c3d..d3cf19d91 100644 --- a/source/slang/slang-emit-wgsl.h +++ b/source/slang/slang-emit-wgsl.h @@ -53,6 +53,13 @@ public: IRInst* inst, const EmitOpInfo& outerPrec ) SLANG_OVERRIDE; + virtual void emitIntrinsicCallExprImpl( + IRCall* inst, + UnownedStringSlice intrinsicDefinition, + IRInst* intrinsicInst, + EmitOpInfo const& inOuterPrec + ) SLANG_OVERRIDE; + void emit(const AddressSpace addressSpace); private: |
