summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnders Leino <aleino@nvidia.com>2024-11-20 10:41:03 +0200
committerGitHub <noreply@github.com>2024-11-20 10:41:03 +0200
commited123a9ca901cdffdeeb61b761eeb8c199a70d04 (patch)
tree86c51a27812e58f25786a68b5fd4eb0e93529235
parent1e7f5418c293d3a9ca91ae4648ca2d522ec2ebe7 (diff)
WGSL: Support isnan, isinf, etc.. (#5609)
-rw-r--r--source/slang/hlsl.meta.slang22
-rw-r--r--tests/expected-failure-github.txt1
-rw-r--r--tests/hlsl-intrinsic/classify-float.slang1
3 files changed, 13 insertions, 11 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang
index 395ea5012..7dd97a436 100644
--- a/source/slang/hlsl.meta.slang
+++ b/source/slang/hlsl.meta.slang
@@ -9445,7 +9445,7 @@ void InterlockedCompareStoreFloatBitwise<T:IAtomicable>(__ref T dest, T compar
/// @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)]
bool isfinite(T x)
{
__target_switch
@@ -9463,7 +9463,7 @@ bool isfinite(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<bool, N> isfinite(vector<T, N> x)
{
__target_switch
@@ -9481,7 +9481,7 @@ vector<bool, N> isfinite(vector<T, N> x)
__generic<T : __BuiltinFloatingPointType, let N : int, let M : 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)]
matrix<bool, N, M> isfinite(matrix<T, N, M> x)
{
__target_switch
@@ -9498,7 +9498,7 @@ matrix<bool, N, M> isfinite(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)]
bool isinf(T x)
{
__target_switch
@@ -9512,12 +9512,14 @@ bool isinf(T x)
__intrinsic_asm "$P_isinf($0)";
case spirv:
return spirv_asm { result:$$bool = OpIsInf $x};
+ case wgsl:
+ __intrinsic_asm "($0 > 0x1.fffffep+127f) || ($0 < -0x1.fffffep+127f)";
}
}
__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<bool, N> isinf(vector<T, N> x)
{
__target_switch
@@ -9535,7 +9537,7 @@ vector<bool, N> isinf(vector<T, N> x)
__generic<T : __BuiltinFloatingPointType, let N : int, let M : 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)]
matrix<bool, N, M> isinf(matrix<T, N, M> x)
{
__target_switch
@@ -9552,7 +9554,7 @@ matrix<bool, N, M> isinf(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)]
bool isnan(T x)
{
__target_switch
@@ -9566,12 +9568,14 @@ bool isnan(T x)
__intrinsic_asm "$P_isnan($0)";
case spirv:
return spirv_asm { result:$$bool = OpIsNan $x};
+ case wgsl:
+ __intrinsic_asm "$0 != $0";
}
}
__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<bool, N> isnan(vector<T, N> x)
{
__target_switch
@@ -9589,7 +9593,7 @@ vector<bool, N> isnan(vector<T, N> x)
__generic<T : __BuiltinFloatingPointType, let N : int, let M : 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)]
matrix<bool, N, M> isnan(matrix<T, N, M> x)
{
__target_switch
diff --git a/tests/expected-failure-github.txt b/tests/expected-failure-github.txt
index 117a0372a..5d345b9e4 100644
--- a/tests/expected-failure-github.txt
+++ b/tests/expected-failure-github.txt
@@ -32,7 +32,6 @@ tests/compute/texture-simple (wgpu)
tests/compute/transcendental-double (wgpu)
tests/hlsl-intrinsic/byte-address-buffer/byte-address-struct.slang.5 syn (wgpu)
tests/hlsl-intrinsic/classify-double.slang.6 syn (wgpu)
-tests/hlsl-intrinsic/classify-float.slang.5 syn (wgpu)
tests/hlsl-intrinsic/matrix-float.slang.6 syn (wgpu)
tests/hlsl-intrinsic/matrix-int.slang.6 syn (wgpu)
tests/hlsl-intrinsic/scalar-double-simple.slang.7 syn (wgpu)
diff --git a/tests/hlsl-intrinsic/classify-float.slang b/tests/hlsl-intrinsic/classify-float.slang
index 0ca5918cd..ca7c5a8c7 100644
--- a/tests/hlsl-intrinsic/classify-float.slang
+++ b/tests/hlsl-intrinsic/classify-float.slang
@@ -3,7 +3,6 @@
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -shaderobj
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj
-//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu
// inf, -inf, nan, finite
//TEST_INPUT:ubuffer(data=[ 0x7f800000 0xff800000 0x7fffffff 1 ], stride=4):name inputBuffer