use thiserror::Error;
pub type AccelResult<T> = Result<T, AccelError>;
#[derive(Debug, Error)]
pub enum AccelError {
#[error("Vulkan initialization failed: {0}")]
VulkanInit(String),
#[error("No suitable GPU device found")]
NoDevice,
#[error("Device selection failed: {0}")]
DeviceSelection(String),
#[error("Buffer allocation failed: {0}")]
BufferAllocation(String),
#[error("Buffer upload to GPU failed: {0}")]
BufferUpload(String),
#[error("Buffer download from GPU failed: {0}")]
BufferDownload(String),
#[error("Shader compilation failed: {0}")]
ShaderCompilation(String),
#[error("Compute pipeline creation failed: {0}")]
PipelineCreation(String),
#[error("Command buffer creation failed: {0}")]
CommandBuffer(String),
#[error("Compute dispatch failed: {0}")]
Dispatch(String),
#[error("GPU synchronization error: {0}")]
Synchronization(String),
#[error("Invalid dimensions: {0}")]
InvalidDimensions(String),
#[error("Invalid pixel format: {0}")]
InvalidFormat(String),
#[error("Unsupported operation: {0}")]
Unsupported(String),
#[error("Buffer size mismatch: expected {expected}, got {actual}")]
BufferSizeMismatch {
expected: usize,
actual: usize,
},
#[error("Memory mapping failed: {0}")]
MemoryMap(String),
#[error("Out of GPU memory")]
OutOfMemory,
#[error("Vulkan error: {0}")]
Vulkan(String),
#[error("Core error: {0}")]
Core(#[from] oximedia_core::OxiError),
}
impl From<vulkano::Validated<vulkano::VulkanError>> for AccelError {
fn from(err: vulkano::Validated<vulkano::VulkanError>) -> Self {
AccelError::Vulkan(format!("{err:?}"))
}
}
impl From<vulkano::VulkanError> for AccelError {
fn from(err: vulkano::VulkanError) -> Self {
AccelError::Vulkan(format!("{err:?}"))
}
}
impl From<vulkano::sync::HostAccessError> for AccelError {
fn from(err: vulkano::sync::HostAccessError) -> Self {
AccelError::Synchronization(format!("{err:?}"))
}
}