diff options
| author | kaizhangNV <149626564+kaizhangNV@users.noreply.github.com> | 2024-11-05 07:32:49 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-11-05 21:32:49 +0800 |
| commit | 53dd5928c35d5a5cb1f7d2a563348fd1fa87d672 (patch) | |
| tree | 861ecbb07d61ed85c4e9d9e0e5387eb386560b3e /source | |
| parent | 7c2ff54758d26b73074fd14143ecd843ba685e0d (diff) | |
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
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/hlsl.meta.slang | 12 |
1 files changed, 8 insertions, 4 deletions
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<T, N> ldexp(vector<T, N> x, vector<T, N> 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<T, N, M> log(matrix<T, N, M> x) /// @category math __generic<T : __BuiltinFloatingPointType> [__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<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> log10(vector<T,N> 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: { |
