summaryrefslogtreecommitdiffstats
path: root/source/slang
diff options
context:
space:
mode:
authorAnders Leino <aleino@nvidia.com>2024-09-19 11:56:47 +0300
committerGitHub <noreply@github.com>2024-09-19 11:56:47 +0300
commitfe71eafcb6e11a420ab537f257e6b8971d31d9de (patch)
treef07a9ef36e3ae44603ba866614d4a0219c7eaf05 /source/slang
parentc6b702c86ecb3ccd16a95fb3a0048da9ea362337 (diff)
Add WGSL intrinsics for synchronization (#5114)
This closes issue #5085.
Diffstat (limited to 'source/slang')
-rw-r--r--source/slang/hlsl.meta.slang18
-rw-r--r--source/slang/slang-capabilities.capdef4
2 files changed, 16 insertions, 6 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang
index 7a7fd8ff0..64bb6376d 100644
--- a/source/slang/hlsl.meta.slang
+++ b/source/slang/hlsl.meta.slang
@@ -5775,7 +5775,7 @@ bool all(matrix<T,N,M> x)
// Barrier for writes to all memory spaces (HLSL SM 5.0)
__glsl_extension(GL_KHR_memory_scope_semantics)
-[require(cuda_glsl_hlsl_metal_spirv, memorybarrier)]
+[require(cuda_glsl_hlsl_metal_spirv_wgsl, memorybarrier)]
void AllMemoryBarrier()
{
__target_switch
@@ -5788,12 +5788,13 @@ void AllMemoryBarrier()
{
OpMemoryBarrier Device AcquireRelease|UniformMemory|WorkgroupMemory|ImageMemory;
};
+ case wgsl: __intrinsic_asm "storageBarrier(); textureBarrier(); workgroupBarrier();";
}
}
// Thread-group sync and barrier for writes to all memory spaces (HLSL SM 5.0)
__glsl_extension(GL_KHR_memory_scope_semantics)
-[require(cuda_glsl_hlsl_metal_spirv, memorybarrier)]
+[require(cuda_glsl_hlsl_metal_spirv_wgsl, memorybarrier)]
void AllMemoryBarrierWithGroupSync()
{
__target_switch
@@ -5806,6 +5807,7 @@ void AllMemoryBarrierWithGroupSync()
{
OpControlBarrier Workgroup Device AcquireRelease|UniformMemory|WorkgroupMemory|ImageMemory;
};
+ case wgsl: __intrinsic_asm "storageBarrier(); textureBarrier(); workgroupBarrier();";
}
}
@@ -7540,7 +7542,7 @@ T determinant(matrix<T,N,N> m)
// Barrier for device memory
__glsl_extension(GL_KHR_memory_scope_semantics)
-[require(cuda_glsl_hlsl_metal_spirv, memorybarrier)]
+[require(cuda_glsl_hlsl_metal_spirv_wgsl, memorybarrier)]
void DeviceMemoryBarrier()
{
__target_switch
@@ -7553,11 +7555,12 @@ void DeviceMemoryBarrier()
{
OpMemoryBarrier Device AcquireRelease|UniformMemory|ImageMemory;
};
+ case wgsl: __intrinsic_asm "storageBarrier(); textureBarrier(); workgroupBarrier();";
}
}
__glsl_extension(GL_KHR_memory_scope_semantics)
-[require(cuda_glsl_hlsl_metal_spirv, memorybarrier)]
+[require(cuda_glsl_hlsl_metal_spirv_wgsl, memorybarrier)]
void DeviceMemoryBarrierWithGroupSync()
{
__target_switch
@@ -7570,6 +7573,7 @@ void DeviceMemoryBarrierWithGroupSync()
{
OpControlBarrier Workgroup Device AcquireRelease|UniformMemory|ImageMemory;
};
+ case wgsl: __intrinsic_asm "storageBarrier(); textureBarrier(); workgroupBarrier();";
}
}
@@ -8932,7 +8936,7 @@ float2 GetRenderTargetSamplePosition(int Index)
// Group memory barrier
__glsl_extension(GL_KHR_memory_scope_semantics)
-[require(cuda_glsl_hlsl_metal_spirv, memorybarrier)]
+[require(cuda_glsl_hlsl_metal_spirv_wgsl, memorybarrier)]
void GroupMemoryBarrier()
{
__target_switch
@@ -8946,6 +8950,7 @@ void GroupMemoryBarrier()
{
OpMemoryBarrier Workgroup AcquireRelease|WorkgroupMemory
};
+ case wgsl: __intrinsic_asm "workgroupBarrier";
}
}
@@ -8967,7 +8972,7 @@ void __subgroupBarrier()
}
__glsl_extension(GL_KHR_memory_scope_semantics)
-[require(cuda_glsl_hlsl_metal_spirv, memorybarrier)]
+[require(cuda_glsl_hlsl_metal_spirv_wgsl, memorybarrier)]
void GroupMemoryBarrierWithGroupSync()
{
__target_switch
@@ -8981,6 +8986,7 @@ void GroupMemoryBarrierWithGroupSync()
{
OpControlBarrier Workgroup Workgroup AcquireRelease|WorkgroupMemory
};
+ case wgsl: __intrinsic_asm "workgroupBarrier";
}
}
diff --git a/source/slang/slang-capabilities.capdef b/source/slang/slang-capabilities.capdef
index 96f5996a0..42a7db213 100644
--- a/source/slang/slang-capabilities.capdef
+++ b/source/slang/slang-capabilities.capdef
@@ -322,6 +322,10 @@ alias cuda_glsl_hlsl_spirv = cuda | glsl | hlsl | spirv;
/// [Compound]
alias cuda_glsl_hlsl_metal_spirv = cuda | glsl | hlsl | metal | spirv;
+/// CUDA, GLSL, HLSL, Metal, SPIRV and WGSL code-gen targets
+/// [Compound]
+alias cuda_glsl_hlsl_metal_spirv_wgsl = cuda | glsl | hlsl | metal | spirv | wgsl;
+
/// CUDA, GLSL, and SPIRV code-gen targets
/// [Compound]
alias cuda_glsl_spirv = cuda | glsl | spirv;