#[derive(Debug, Clone)]
pub enum GpuError {
DriverLibraryUnavailable { reason: String },
DriverSymbolMissing { reason: String },
DriverCallFailed { reason: String },
CalibrationFailed { reason: String },
NotYetImplemented { reason: String },
}
impl std::fmt::Display for GpuError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
GpuError::DriverLibraryUnavailable { reason }
| GpuError::DriverSymbolMissing { reason }
| GpuError::DriverCallFailed { reason }
| GpuError::CalibrationFailed { reason }
| GpuError::NotYetImplemented { reason } => f.write_str(reason),
}
}
}
impl std::error::Error for GpuError {}
impl From<GpuError> for String {
#[inline]
fn from(err: GpuError) -> String {
err.to_string()
}
}
#[macro_export]
macro_rules! gpu_err {
($($arg:tt)*) => {
$crate::gpu::error::GpuError::DriverCallFailed { reason: ::std::format!($($arg)*) }
};
}
#[macro_export]
macro_rules! gpu_bail {
($($arg:tt)*) => {
return ::std::result::Result::Err($crate::gpu_err!($($arg)*))
};
}
#[cfg(target_os = "linux")]
pub trait GpuResultExt<T> {
fn gpu_ctx(self, prefix: &str) -> Result<T, GpuError>;
fn gpu_ctx_with<F>(self, f: F) -> Result<T, GpuError>
where
F: FnOnce(&dyn std::fmt::Display) -> String;
}
#[cfg(target_os = "linux")]
impl<T, E: std::fmt::Display> GpuResultExt<T> for Result<T, E> {
#[inline]
fn gpu_ctx(self, prefix: &str) -> Result<T, GpuError> {
self.map_err(|err| GpuError::DriverCallFailed {
reason: format!("{prefix}: {err}"),
})
}
#[inline]
fn gpu_ctx_with<F>(self, f: F) -> Result<T, GpuError>
where
F: FnOnce(&dyn std::fmt::Display) -> String,
{
self.map_err(|err| GpuError::DriverCallFailed { reason: f(&err) })
}
}