summaryrefslogtreecommitdiff
path: root/source/slang/hlsl.meta.slang
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-05-08 20:23:38 -0700
committerGitHub <noreply@github.com>2024-05-08 20:23:38 -0700
commit756ce3d91faf80b6a3e6a695d0dec3968048c11e (patch)
tree6e46aa958fe9fff509861888aa8c17e234eb509b /source/slang/hlsl.meta.slang
parent708345d16a877ac164171439cf9b4ea825b78d23 (diff)
Fix legalization of `kIROp_GetLegalizedSPIRVGlobalParamAddr`. (#4141)
Diffstat (limited to 'source/slang/hlsl.meta.slang')
-rw-r--r--source/slang/hlsl.meta.slang49
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)