From 7fb99a83db524a8e7c3469fd3276842f6bedfd91 Mon Sep 17 00:00:00 2001 From: Anders Leino Date: Wed, 18 Sep 2024 15:02:41 +0300 Subject: [PATCH] Add WGSL intrinsics for synchronization This closes issue #5085. --- source/slang/hlsl.meta.slang | 18 ++++++++++++------ source/slang/slang-capabilities.capdef | 4 ++++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index 7a7fd8ff06..64bb6376d3 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -5775,7 +5775,7 @@ bool all(matrix 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 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 96f5996a0c..42a7db2133 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;