use briny::traits::{InteriorImmutable, RawConvert, StableLayout, Unaligned};
use core::convert::TryFrom;
use core::sync::atomic::{AtomicU8, Ordering};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
#[repr(u8)]
pub enum Backend {
#[default]
Cpu = 0,
Wgpu,
Cuda,
}
unsafe impl StableLayout for Backend {}
unsafe impl RawConvert for Backend {}
unsafe impl Unaligned for Backend {}
unsafe impl InteriorImmutable for Backend {}
impl TryFrom<u8> for Backend {
type Error = ();
fn try_from(value: u8) -> Result<Self, Self::Error> {
match value {
0 => Ok(Self::Cpu),
1 => Ok(Self::Wgpu),
2 => Ok(Self::Cuda),
_ => Err(()),
}
}
}
#[cfg(target_has_atomic = "8")]
static GLOBAL_DEFAULT_BACKEND: AtomicU8 = AtomicU8::new(Backend::Cpu as u8);
#[cfg(not(target_has_atomic = "8"))]
static mut UNSAFE_GLOBAL_BACKEND: u8 = Backend::Cpu as u8;
pub fn set_backend(b: Backend) {
#[cfg(not(target_has_atomic = "8"))]
unsafe {
UNSAFE_GLOBAL_BACKEND = b as u8;
}
#[cfg(target_has_atomic = "8")]
GLOBAL_DEFAULT_BACKEND.store(b as u8, Ordering::Release);
}
pub fn get_backend() -> Backend {
#[cfg(not(target_has_atomic = "8"))]
{
Backend::try_from(unsafe { UNSAFE_GLOBAL_BACKEND }).unwrap_or_default()
}
#[cfg(target_has_atomic = "8")]
Backend::try_from(GLOBAL_DEFAULT_BACKEND.load(Ordering::Acquire)).unwrap_or_default()
}