#![allow(unused)] use winit::error as werror; use vulkanalia::{bytecode::BytecodeError, loader::LoaderError, prelude::v1_0::*}; pub(super) enum MainError { NotSupported(werror::NotSupportedError), Os(werror::OsError), Event(werror::EventLoopError), Code(i32), LibLoadError(String), BoxLoadError(Box), ValidationNotSupported, Suitability(SuitabilityError), NoDevice, NoExtension, InsufficientSwapchainSupport, InvalidBytecode(usize), AllocBytecode, } impl std::fmt::Debug for MainError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Self::Code(code) => write!(f, "{:?}", vk::ErrorCode::from_raw(*code)), Self::NotSupported(e) => write!(f, "{e:?}"), Self::Os(e) => write!(f, "{e:?}"), Self::Event(e) => write!(f, "{e:?}"), Self::BoxLoadError(e) => write!(f, "{e:?}"), Self::LibLoadError(e) => write!(f, "{e:?}"), Self::ValidationNotSupported => write!(f, "ValidationNotSupported"), Self::Suitability(e) => write!(f, "suitability: {e:?}"), Self::NoDevice => write!(f, "No suitable device is found"), Self::NoExtension => write!(f, "Some required device extension is not supported"), Self::InsufficientSwapchainSupport => { write!(f, "The swapchain support is insufficient.") } Self::InvalidBytecode(len) => write!( f, "The length of the SPIRV byte code should be a multiple of four, but got {len}" ), Self::AllocBytecode => write!(f, "Failed to allocate space to store SPIRV byte codes"), } } } impl std::fmt::Display for MainError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { MainError::Event(e) => write!(f, "Event loop error: {e}"), MainError::NotSupported(not) => write!(f, "Not supported: {not}"), MainError::Os(e) => write!(f, "Oeration system: {e}"), MainError::Code(code) => write!(f, "{}", vk::ErrorCode::from_raw(*code)), MainError::BoxLoadError(e) => write!(f, "Boxed loading error: {e}"), MainError::LibLoadError(e) => write!(f, "Library loading error: {e}"), MainError::ValidationNotSupported => write!( f, "The validation layers are requested but are not available." ), MainError::Suitability(e) => write!(f, "Suitability error: {e}"), MainError::NoDevice => write!(f, "No suitable device is found"), MainError::NoExtension => write!(f, "Some required device extension is not supported"), MainError::InsufficientSwapchainSupport => { write!(f, "The swapchain support is insufficient.") } MainError::InvalidBytecode(len) => write!( f, "The length of the SPIRV byte code should be a multiple of four, but got {len}" ), MainError::AllocBytecode => { write!(f, "Failed to allocate space to store SPIRV byte codes") } } } } impl std::error::Error for MainError {} impl From for MainError { fn from(value: werror::OsError) -> Self { MainError::Os(value) } } impl From for MainError { fn from(value: werror::NotSupportedError) -> Self { MainError::NotSupported(value) } } impl From for MainError { fn from(value: werror::EventLoopError) -> Self { MainError::Event(value) } } impl From for MainError { fn from(value: vk::ErrorCode) -> Self { MainError::Code(value.as_raw()) } } impl From> for MainError { fn from(value: Box) -> Self { MainError::BoxLoadError(value) } } impl From for MainError { fn from(value: BytecodeError) -> Self { match value { BytecodeError::Alloc => Self::AllocBytecode, BytecodeError::Length(len) => Self::InvalidBytecode(len), } } } #[derive(Debug)] pub(super) enum SuitabilityError { NoQueuefamily, } impl std::fmt::Display for SuitabilityError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { SuitabilityError::NoQueuefamily => write!(f, "missing required queue families"), } } } impl std::error::Error for SuitabilityError {}