use crate::model::{DeviceId, DynamicSample, ProcessSample, StaticInfo};
#[derive(Debug)]
pub enum BackendError {
Unavailable(String),
DeviceNotFound(DeviceId),
}
impl std::fmt::Display for BackendError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
BackendError::Unavailable(why) => write!(f, "unavailable: {why}"),
BackendError::DeviceNotFound(id) => write!(f, "device not found: {id}"),
}
}
}
impl std::error::Error for BackendError {}
pub trait GpuBackend: Send {
fn name(&self) -> &'static str;
fn devices(&mut self) -> Vec<DeviceId>;
fn static_info(&mut self, dev: &DeviceId) -> Result<StaticInfo, BackendError>;
fn refresh_dynamic(&mut self, dev: &DeviceId) -> Result<DynamicSample, BackendError>;
fn refresh_processes(&mut self, dev: &DeviceId) -> Result<Vec<ProcessSample>, BackendError>;
}
pub fn all_backends(force_mock: bool) -> Vec<Box<dyn GpuBackend>> {
if force_mock {
return vec![Box::new(crate::mock::MockBackend::new())];
}
let mut backends: Vec<Box<dyn GpuBackend>> = Vec::new();
#[cfg(all(feature = "nvidia", any(target_os = "linux", target_os = "windows")))]
match crate::nvidia::NvidiaBackend::init() {
Ok(b) => backends.push(Box::new(b)),
Err(e) => eprintln!("gpuviewer: nvidia backend skipped: {e}"),
}
#[cfg(target_os = "linux")]
match crate::amd::AmdBackend::init() {
Ok(b) => backends.push(Box::new(b)),
Err(e) => eprintln!("gpuviewer: amd backend skipped: {e}"),
}
#[cfg(target_os = "linux")]
match crate::intel::IntelBackend::init() {
Ok(b) => backends.push(Box::new(b)),
Err(e) => eprintln!("gpuviewer: intel backend skipped: {e}"),
}
#[cfg(all(feature = "wddm", target_os = "windows"))]
match crate::wddm::WddmBackend::init() {
Ok(b) => backends.push(Box::new(b)),
Err(e) => eprintln!("gpuviewer: wddm backend skipped: {e}"),
}
#[cfg(all(feature = "apple", target_os = "macos"))]
match crate::apple::AppleBackend::init() {
Ok(b) => backends.push(Box::new(b)),
Err(e) => eprintln!("gpuviewer: apple backend skipped: {e}"),
}
if backends.is_empty() {
backends.push(Box::new(crate::mock::MockBackend::new()));
}
backends
}