diff options
| author | Yong He <yonghe@outlook.com> | 2024-05-08 20:23:38 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-05-08 20:23:38 -0700 |
| commit | 756ce3d91faf80b6a3e6a695d0dec3968048c11e (patch) | |
| tree | 6e46aa958fe9fff509861888aa8c17e234eb509b /source/slang/hlsl.meta.slang | |
| parent | 708345d16a877ac164171439cf9b4ea825b78d23 (diff) | |
Fix legalization of `kIROp_GetLegalizedSPIRVGlobalParamAddr`. (#4141)
Diffstat (limited to 'source/slang/hlsl.meta.slang')
| -rw-r--r-- | source/slang/hlsl.meta.slang | 49 |
1 files changed, 47 insertions, 2 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index 6b3c5db59..b3e323bfc 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -7432,11 +7432,22 @@ void InterlockedAdd(__ref uint dest, uint value, out uint original_value) } [ForceInline] +[require(cuda_glsl_hlsl_spirv, atomic_glsl_hlsl_cuda)] void InterlockedAdd(__ref int64_t dest, int64_t value) { __target_switch { case hlsl: __intrinsic_asm "InterlockedAdd"; + case cuda: __intrinsic_asm "atomicAdd((uint64_t*)$0, $1)"; + case glsl: + __requireGLSLExtension("GL_EXT_shader_atomic_int64"); + __intrinsic_asm "$atomicAdd($A, $1)"; + case spirv: + spirv_asm + { + OpCapability Int64Atomics; + result:$$int64_t = OpAtomicIAdd &dest Device None $value; + }; } } @@ -7446,27 +7457,61 @@ void InterlockedAdd(__ref int64_t dest, int64_t value, out int64_t original_v __target_switch { case hlsl: __intrinsic_asm "InterlockedAdd"; + case cuda: __intrinsic_asm "atomicAdd((uint64_t*)$0, $1)"; + case glsl: + __requireGLSLExtension("GL_EXT_shader_atomic_int64"); + __intrinsic_asm "$atomicAdd($A, $1)"; + case spirv: + spirv_asm + { + OpCapability Int64Atomics; + %origin:$$int64_t = OpAtomicIAdd &dest Device None $value; + OpStore &original_value %origin + }; } } [ForceInline] -void InterlockedAdd(__ref uint64_t dest, uint64_t value) +[require(cuda_glsl_hlsl_spirv, atomic_glsl_hlsl_cuda)] +void InterlockedAdd(__ref uint64_t dest, uint64_t value) { __target_switch { case hlsl: __intrinsic_asm "InterlockedAdd"; + case cuda: __intrinsic_asm "atomicAdd($0, $1)"; + case glsl: + __requireGLSLExtension("GL_EXT_shader_atomic_int64"); + __intrinsic_asm "$atomicAdd($A, $1)"; + case spirv: + spirv_asm + { + OpCapability Int64Atomics; + result:$$uint64_t = OpAtomicIAdd &dest Device None $value; + }; } } [ForceInline] -void InterlockedAdd(__ref uint64_t dest, uint64_t value, out uint64_t original_value) +void InterlockedAdd(__ref uint64_t dest, uint64_t value, out uint64_t original_value) { __target_switch { case hlsl: __intrinsic_asm "InterlockedAdd"; + case cuda: __intrinsic_asm "atomicAdd($0, $1)"; + case glsl: + __requireGLSLExtension("GL_EXT_shader_atomic_int64"); + __intrinsic_asm "$atomicAdd($A, $1)"; + case spirv: + spirv_asm + { + OpCapability Int64Atomics; + %origin:$$uint64_t = OpAtomicIAdd &dest Device None $value; + OpStore &original_value %origin + }; } } + __glsl_version(430) [require(cuda_glsl_hlsl_spirv, atomic_glsl_hlsl_cuda)] void InterlockedAnd(__ref int dest, int value) |
