From 53dd5928c35d5a5cb1f7d2a563348fd1fa87d672 Mon Sep 17 00:00:00 2001 From: kaizhangNV <149626564+kaizhangNV@users.noreply.github.com> Date: Tue, 5 Nov 2024 07:32:49 -0600 Subject: Fixing the wrong implementation of some math intrinsic (#5491) * Fixing the wrong implementation of some math intrinsic Close the issue #5282 The root cause of the issue is that log10 is not supported in wgsl. So add the implementation. Also ldexp in wgsl doesn't support float type exponent, so fix the implementation of the intrinsic. * re-enable the tests --- source/slang/hlsl.meta.slang | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'source') diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index 525b666ab..6ac0b7fb9 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -9498,7 +9498,8 @@ T ldexp(T x, T exp) __target_switch { case hlsl: __intrinsic_asm "ldexp"; - case wgsl: __intrinsic_asm "ldexp"; + // In WGSL spec, ldexp can only take integer as the exponent. + case wgsl: __intrinsic_asm "($0 * exp2($1))"; default: return x * exp2(exp); } @@ -9512,7 +9513,8 @@ vector ldexp(vector x, vector exp) __target_switch { case hlsl: __intrinsic_asm "ldexp"; - case wgsl: __intrinsic_asm "ldexp"; + // In WGSL spec, ldexp can only take integer as the exponent. + case wgsl: __intrinsic_asm "($0 * exp2($1))"; default: return x * exp2(exp); } @@ -9737,13 +9739,14 @@ matrix log(matrix x) /// @category math __generic [__readNone] -[require(cpp_cuda_glsl_hlsl_metal_spirv, sm_4_0_version)] +[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, sm_4_0_version)] T log10(T x) { __target_switch { case hlsl: __intrinsic_asm "log10"; case metal: __intrinsic_asm "log10"; + case wgsl: __intrinsic_asm "(log( $0 ) * $S0( 0.43429448190325182765112891891661) )"; case glsl: __intrinsic_asm "(log( $0 ) * $S0( 0.43429448190325182765112891891661) )"; case cuda: __intrinsic_asm "$P_log10($0)"; case cpp: __intrinsic_asm "$P_log10($0)"; @@ -9760,13 +9763,14 @@ T log10(T x) __generic [__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 log10(vector x) { __target_switch { case hlsl: __intrinsic_asm "log10"; case metal: __intrinsic_asm "log10"; + case wgsl: __intrinsic_asm "(log( $0 ) * $S0(0.43429448190325182765112891891661) )"; case glsl: __intrinsic_asm "(log( $0 ) * $S0(0.43429448190325182765112891891661) )"; case spirv: { -- cgit v1.2.3