pub use wgpu::Backend;
pub trait GraphicsApi: Send + Sync + core::fmt::Debug + Default + Clone + 'static {
fn backend() -> Backend;
}
#[derive(Default, Debug, Clone)]
pub struct Vulkan;
#[derive(Default, Debug, Clone)]
pub struct Metal;
#[derive(Default, Debug, Clone)]
pub struct OpenGl;
#[derive(Default, Debug, Clone)]
pub struct Dx12;
#[derive(Default, Debug, Clone)]
pub struct WebGpu;
#[derive(Default, Debug, Clone)]
pub struct AutoGraphicsApi;
impl GraphicsApi for Vulkan {
fn backend() -> Backend {
Backend::Vulkan
}
}
impl GraphicsApi for Metal {
fn backend() -> Backend {
Backend::Metal
}
}
impl GraphicsApi for OpenGl {
fn backend() -> Backend {
Backend::Gl
}
}
impl GraphicsApi for Dx12 {
fn backend() -> Backend {
Backend::Dx12
}
}
impl GraphicsApi for WebGpu {
fn backend() -> Backend {
Backend::BrowserWebGpu
}
}
impl GraphicsApi for AutoGraphicsApi {
fn backend() -> Backend {
#[cfg(feature = "std")]
#[cfg(test)]
if let Ok(backend_str) = std::env::var("AUTO_GRAPHICS_BACKEND") {
match backend_str.to_lowercase().as_str() {
"metal" => return Backend::Metal,
"vulkan" => return Backend::Vulkan,
"dx12" => return Backend::Dx12,
"opengl" => return Backend::Gl,
"webgpu" => return Backend::BrowserWebGpu,
_ => {
eprintln!(
"Invalid graphics backend specified in GRAPHICS_BACKEND environment \
variable"
);
std::process::exit(1);
}
}
}
cfg_if::cfg_if! {
if #[cfg(target_family = "wasm")] {
Backend::BrowserWebGpu
} else if #[cfg(target_os = "macos")] {
Backend::Metal
} else {
Backend::Vulkan
}
}
}
}