pub trait GraphicsApi: Send + Sync + core::fmt::Debug + Default + Clone + 'static {
fn backend() -> wgpu::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() -> wgpu::Backend {
wgpu::Backend::Vulkan
}
}
impl GraphicsApi for Metal {
fn backend() -> wgpu::Backend {
wgpu::Backend::Metal
}
}
impl GraphicsApi for OpenGl {
fn backend() -> wgpu::Backend {
wgpu::Backend::Gl
}
}
impl GraphicsApi for Dx12 {
fn backend() -> wgpu::Backend {
wgpu::Backend::Dx12
}
}
impl GraphicsApi for WebGpu {
fn backend() -> wgpu::Backend {
wgpu::Backend::BrowserWebGpu
}
}
impl GraphicsApi for AutoGraphicsApi {
fn backend() -> wgpu::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 wgpu::Backend::Metal,
"vulkan" => return wgpu::Backend::Vulkan,
"dx12" => return wgpu::Backend::Dx12,
"opengl" => return wgpu::Backend::Gl,
"webgpu" => return wgpu::Backend::BrowserWebGpu,
_ => {
eprintln!(
"Invalid graphics backend specified in GRAPHICS_BACKEND environment \
variable"
);
std::process::exit(1);
}
}
}
#[cfg(target_os = "macos")]
return wgpu::Backend::Metal;
#[cfg(not(target_os = "macos"))]
return wgpu::Backend::Vulkan;
}
}