From 067795689035e97c27239da48ed5c61b26e88301 Mon Sep 17 00:00:00 2001 From: Jay Kwak <82421531+jkwak-work@users.noreply.github.com> Date: Thu, 19 Sep 2024 17:30:04 -0700 Subject: Re-enable slang-test for WGSL (#5120) My previous commit disabled the WGSL test by a mistake. This commit fixes the mistake and run the slang-test for WGSL tests. frexp and modf were still not working for the vector types. --- source/slang/hlsl.meta.slang | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) (limited to 'source') diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index 64bb6376d..7b3113fce 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 +} -- cgit v1.2.3