diff options
| author | Yong He <yonghe@outlook.com> | 2024-02-01 13:26:03 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-01 13:26:03 -0800 |
| commit | f370947c63bca707b9cfde7b18e67298f5fbace3 (patch) | |
| tree | 1180cdb722529c8157f673fc68a2d45f00b5e827 /tests | |
| parent | a2d2018a8be41aecd2c1810db8556e0c07595fb9 (diff) | |
FP16 atomics for RWByteAddresBuffer, fp32 atomics for images. (#3536)
* FP16 atomics for RWByteAddresBuffer, fp32 atomics for images.
* Fix spelling.
* Add overload.
* Fix test failures.
---------
Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'tests')
3 files changed, 71 insertions, 7 deletions
diff --git a/tests/hlsl-intrinsic/byte-address-buffer/byte-address-half-atomics.slang b/tests/hlsl-intrinsic/byte-address-buffer/byte-address-half-atomics.slang new file mode 100644 index 000000000..a89c7c3fa --- /dev/null +++ b/tests/hlsl-intrinsic/byte-address-buffer/byte-address-half-atomics.slang @@ -0,0 +1,34 @@ +// byte-address-half-atomics.slang +// test the atomics on half types. + +// Disabled because our current driver doesn't support half atomics yet. +//DISABLED_TEST(compute, vulkan):COMPARE_COMPUTE(filecheck-buffer=CHECK): -vk -compute -profile cs_6_2 -render-features half -shaderobj + +//TEST:SIMPLE(filecheck=SPIRV):-target spirv -entry computeMain -stage compute +//TEST:SIMPLE(filecheck=SPIRV):-target spirv -entry computeMain -stage compute -emit-spirv-directly + +//TEST_INPUT:set tmpBuffer = ubuffer(data=[0 0 0 0], stride=4) +RWByteAddressBuffer tmpBuffer; + +//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer<float> outputBuffer; + +[numthreads(1, 1, 1)] +void computeMain(int3 dispatchThreadID : SV_DispatchThreadID) +{ + half originalValue; + + // SPIRV: OpAtomicFAddEXT + + tmpBuffer.InterlockedAddF16(0, 1.0h, originalValue); + tmpBuffer.InterlockedAddF16(2, 2.0h, originalValue); + + half2 v = tmpBuffer.Load<half2>(0); + + // CHECK: 1.0 + outputBuffer[0] = v.x; + // CHECK: 2.0 + outputBuffer[1] = v.y; + // CHECK: 0.0 + outputBuffer[3] = originalValue; +} diff --git a/tests/hlsl-intrinsic/texture/float-atomics.slang b/tests/hlsl-intrinsic/texture/float-atomics.slang new file mode 100644 index 000000000..4e7405f3d --- /dev/null +++ b/tests/hlsl-intrinsic/texture/float-atomics.slang @@ -0,0 +1,35 @@ +// gather-texture2darray.slang + +//TEST(compute, vulkan):COMPARE_COMPUTE(filecheck-buffer=CHECK):-vk -compute -shaderobj -output-using-type -emit-spirv-directly -render-feature hardware-device +//TEST(compute):SIMPLE(filecheck=HLSL):-target hlsl -profile cs_6_6 -entry computeMain + +// Test atomics on a RWTexture2D<float>. + +//TEST_INPUT: set t = RWTexture2D(format=R32_FLOAT, size=4, content = zero, mipMaps = 1) +[format("r32f")] +RWTexture2D<float> t; + +//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer +RWStructuredBuffer<float> outputBuffer; + +[shader("compute")] +[numthreads(1, 1, 1)] +void computeMain(uint3 tid : SV_DispatchThreadID) +{ + float originalValue; + // HLSL: {{.*}}originalValue{{.*}} = NvInterlockedAddFp32({{.*}}t{{.*}}, {{.*}}, {{.*}}1.0{{.*}}); + // HLSL: {{.*}}originalValue{{.*}} = NvInterlockedAddFp32({{.*}}t{{.*}}, {{.*}}, {{.*}}2.0{{.*}}); + // HLSL: {{.*}}originalValue{{.*}} = NvInterlockedAddFp32({{.*}}t{{.*}}, {{.*}}, {{.*}}3.0{{.*}}); + t.InterlockedAddF32(uint2(0, 0), 1.0, originalValue); + t.InterlockedAddF32(uint2(1, 0), 2.0, originalValue); + t.InterlockedAddF32(uint2(1, 1), 3.0, originalValue); + // CHECK: 1.0 + outputBuffer[0] = t[uint2(0, 0)]; + // CHECK: 2.0 + outputBuffer[1] = t[uint2(1, 0)]; + // CHECK: 3.0 + outputBuffer[2] = t[uint2(1, 1)]; + // CHECK: 0.0 + outputBuffer[3] = originalValue; + +} diff --git a/tests/language-feature/spirv-asm/too-many-operands.slang b/tests/language-feature/spirv-asm/too-many-operands.slang index 38cd456ad..15c86d4e6 100644 --- a/tests/language-feature/spirv-asm/too-many-operands.slang +++ b/tests/language-feature/spirv-asm/too-many-operands.slang @@ -15,12 +15,7 @@ void foo(const int constParam) %b %c %d - %e - // CHECK: too-many-operands.slang([[#@LINE-1]]): warning {{.*}}: too many operands for OpLoad (expected max 4), did you forget a semicolon? - %f; - - %r : $$int = OpIAdd %r %r // oops, I forgot the semicolon - OpNop - // CHECK: too-many-operands.slang([[#@LINE-1]]): warning {{.*}}: too many operands for OpIAdd (expected max 4), did you forget a semicolon? + // CHECK: too-many-operands.slang([[#@LINE+1]]): warning {{.*}}: too many operands for OpLoad + %r : $$int = OpIAdd %r %r }; } |
