diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index 64bb6376d3..7b3113fceb 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -8686,6 +8686,7 @@ vector fract(vector x) // Split float into mantissa and exponent __generic [__readNone] +[ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, sm_4_0_version)] T frexp(T x, out int exp) { @@ -8708,14 +8709,16 @@ T frexp(T x, out int exp) __generic [__readNone] +[ForceInline] [require(wgsl)] void __wgsl_frexp(T x, out T fract, out int exp) { - __intrinsic_asm "{ var s = frexp($0); $1 = s.fract; $2 = s.exp; }"; + __intrinsic_asm "{ var s = frexp($0); (*($1)) = s.fract; (*($2)) = s.exp; }"; } __generic [__readNone] +[ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, sm_4_0_version)] vector frexp(vector x, out vector exp) { @@ -8727,13 +8730,27 @@ vector frexp(vector x, out vector exp) case spirv: return spirv_asm { result:$$vector = OpExtInst glsl450 Frexp $x &exp }; + case wgsl: + vector fract; + __wgsl_frexp(x, fract, exp); + return fract; default: VECTOR_MAP_BINARY(T, N, frexp, x, exp); } } +__generic +[__readNone] +[ForceInline] +[require(wgsl)] +void __wgsl_frexp(vector x, out vector fract, out vector exp) +{ + __intrinsic_asm "{ var s = frexp($0); (*($1)) = s.fract; (*($2)) = s.exp; }"; +} + __generic [__readNone] +[ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, sm_4_0_version)] matrix frexp(matrix x, out matrix exp) { @@ -11099,6 +11116,7 @@ vector fmedian3(vector x, vector y, vector z) // split into integer and fractional parts (both with same sign) __generic [__readNone] +[ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, sm_4_0_version)] T modf(T x, out T ip) { @@ -11121,14 +11139,16 @@ T modf(T x, out T ip) __generic [__readNone] +[ForceInline] [require(wgsl)] void __wgsl_modf(T x, out T fract, out T whole) { - __intrinsic_asm "{ var s = modf($0); $1 = s.fract; $2 = s.whole; }"; + __intrinsic_asm "{ var s = modf($0); (*($1)) = s.fract; (*($2)) = s.whole; }"; } __generic [__readNone] +[ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, sm_4_0_version)] vector modf(vector x, out vector ip) { @@ -11140,13 +11160,27 @@ vector modf(vector x, out vector ip) case spirv: return spirv_asm { result:$$vector = OpExtInst glsl450 Modf $x &ip }; + case wgsl: + vector fract; + __wgsl_modf(x, fract, ip); + return fract; default: VECTOR_MAP_BINARY(T, N, modf, x, ip); } } +__generic +[__readNone] +[ForceInline] +[require(wgsl)] +void __wgsl_modf(vector x, out vector fract, out vector whole) +{ + __intrinsic_asm "{ var s = modf($0); (*($1)) = s.fract; (*($2)) = s.whole; }"; +} + __generic [__readNone] +[ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, sm_4_0_version)] matrix modf(matrix x, out matrix ip) { @@ -20624,4 +20658,4 @@ extension RWStructuredBuffer : IRWArray extension RasterizerOrderedStructuredBuffer : IRWArray { int getCount() { uint count; uint stride; this.GetDimensions(count, stride); return count; } -} \ No newline at end of file +} diff --git a/tools/slang-test/slang-test-main.cpp b/tools/slang-test/slang-test-main.cpp index cac694f777..47a87ddc21 100644 --- a/tools/slang-test/slang-test-main.cpp +++ b/tools/slang-test/slang-test-main.cpp @@ -968,6 +968,7 @@ static PassThroughFlags _getPassThroughFlagsForTarget(SlangCompileTarget target) case SLANG_HOST_CPP_SOURCE: case SLANG_CUDA_SOURCE: case SLANG_METAL: + case SLANG_WGSL: { return 0; } @@ -993,11 +994,6 @@ static PassThroughFlags _getPassThroughFlagsForTarget(SlangCompileTarget target) return PassThroughFlag::Metal; } - case SLANG_WGSL: - { - return PassThroughFlag::WGSL; - } - case SLANG_SHADER_HOST_CALLABLE: case SLANG_HOST_HOST_CALLABLE: