#[cfg(target_arch = "spirv")]
use core::arch::asm;
#[spirv_std_macros::gpu_only]
#[doc(alias = "OpControlBarrier")]
#[inline]
pub unsafe fn control_barrier<
const EXECUTION: u32, const MEMORY: u32, const SEMANTICS: u32, >() {
asm! {
"%u32 = OpTypeInt 32 0",
"%execution = OpConstant %u32 {execution}",
"%memory = OpConstant %u32 {memory}",
"%semantics = OpConstant %u32 {semantics}",
"OpControlBarrier %execution %memory %semantics",
execution = const EXECUTION,
memory = const MEMORY,
semantics = const SEMANTICS,
}
}
#[spirv_std_macros::gpu_only]
#[doc(alias = "OpMemoryBarrier")]
#[inline]
pub unsafe fn memory_barrier<
const MEMORY: u32, const SEMANTICS: u32, >() {
asm! {
"%u32 = OpTypeInt 32 0",
"%memory = OpConstant %u32 {memory}",
"%semantics = OpConstant %u32 {semantics}",
"OpMemoryBarrier %memory %semantics",
memory = const MEMORY,
semantics = const SEMANTICS,
}
}
#[spirv_std_macros::gpu_only]
#[inline]
pub unsafe fn workgroup_memory_barrier() {
memory_barrier::<
{ crate::memory::Scope::Workgroup as u32 },
{
crate::memory::Semantics::WORKGROUP_MEMORY.bits()
| crate::memory::Semantics::ACQUIRE_RELEASE.bits()
},
>();
}
#[spirv_std_macros::gpu_only]
#[inline]
pub unsafe fn workgroup_memory_barrier_with_group_sync() {
control_barrier::<
{ crate::memory::Scope::Workgroup as u32 },
{ crate::memory::Scope::Workgroup as u32 },
{
crate::memory::Semantics::WORKGROUP_MEMORY.bits()
| crate::memory::Semantics::ACQUIRE_RELEASE.bits()
},
>();
}
#[spirv_std_macros::gpu_only]
#[inline]
pub unsafe fn device_memory_barrier() {
memory_barrier::<
{ crate::memory::Scope::Device as u32 },
{
crate::memory::Semantics::IMAGE_MEMORY.bits()
| crate::memory::Semantics::UNIFORM_MEMORY.bits()
| crate::memory::Semantics::ACQUIRE_RELEASE.bits()
},
>();
}
#[spirv_std_macros::gpu_only]
#[inline]
pub unsafe fn device_memory_barrier_with_group_sync() {
control_barrier::<
{ crate::memory::Scope::Workgroup as u32 },
{ crate::memory::Scope::Device as u32 },
{
crate::memory::Semantics::IMAGE_MEMORY.bits()
| crate::memory::Semantics::UNIFORM_MEMORY.bits()
| crate::memory::Semantics::ACQUIRE_RELEASE.bits()
},
>();
}
#[spirv_std_macros::gpu_only]
#[inline]
pub unsafe fn all_memory_barrier() {
memory_barrier::<
{ crate::memory::Scope::Device as u32 },
{
crate::memory::Semantics::WORKGROUP_MEMORY.bits()
| crate::memory::Semantics::IMAGE_MEMORY.bits()
| crate::memory::Semantics::UNIFORM_MEMORY.bits()
| crate::memory::Semantics::ACQUIRE_RELEASE.bits()
},
>();
}
#[spirv_std_macros::gpu_only]
#[inline]
pub unsafe fn all_memory_barrier_with_group_sync() {
control_barrier::<
{ crate::memory::Scope::Workgroup as u32 },
{ crate::memory::Scope::Device as u32 },
{
crate::memory::Semantics::WORKGROUP_MEMORY.bits()
| crate::memory::Semantics::IMAGE_MEMORY.bits()
| crate::memory::Semantics::UNIFORM_MEMORY.bits()
| crate::memory::Semantics::ACQUIRE_RELEASE.bits()
},
>();
}