ash_bootstrap/
error.rs

1use ash::vk;
2use thiserror::Error;
3
4#[derive(Debug, Error)]
5pub enum Error {
6    #[error("Instance error: {0}")]
7    Instance(#[from] InstanceError),
8    #[error("Physical device error: {0}")]
9    PhysicalDevice(#[from] PhysicalDeviceError),
10    #[error("Queue error: {0}")]
11    Queue(#[from] QueueError),
12    #[error("Swapchain error: {0}")]
13    Swapchain(#[from] SwapchainError),
14    #[error("Ash loading error: {0}")]
15    AshLoading(#[from] ash::LoadingError),
16    #[error("Vulkan error: {0}")]
17    Vulkan(#[from] ash::vk::Result),
18    #[error(transparent)]
19    Other(#[from] anyhow::Error),
20}
21
22#[derive(Debug, PartialOrd, PartialEq, Eq, Ord, Error)]
23pub enum InstanceError {
24    #[error("Vulkan unavailable")]
25    VulkanUnavailable,
26    #[error("Vulkan version {0} unavailable")]
27    VulkanVersionUnavailable(String),
28    #[error("Vulkan 1.1 unavailable")]
29    VulkanVersion11Unavailable,
30    #[error("Vulkan 1.2 unavailable")]
31    VulkanVersion12Unavailable,
32    #[error("Vulkan 1.3 unavailable")]
33    VulkanVersion13Unavailable,
34    // TODO: uncomment when https://github.com/ash-rs/ash/pull/951 lands
35    // VulkanVersion14Unavailable
36    #[error("Failed to create instance")]
37    FailedCreateInstance,
38    #[error("Failed to create debug messenger")]
39    FailedCreateDebugMessenger,
40    #[error("Failed to find requested layers: {0:#?}")]
41    RequestedLayersNotPresent(Vec<String>),
42    #[error("Failed to find requested extensions: {0:#?}")]
43    RequestedExtensionsNotPresent(Vec<String>),
44    #[error("Failed to find windowing extensions: {0:#?}")]
45    WindowingExtensionsNotPresent(Vec<String>),
46}
47
48#[derive(Debug, PartialOrd, PartialEq, Eq, Ord, Error)]
49pub enum PhysicalDeviceError {
50    #[error("No surface provided")]
51    NoSurfaceProvided,
52    #[error("Failed to enumerate physical devices")]
53    FailedToEnumeratePhysicalDevices,
54    #[error("No physical devices found")]
55    NoPhysicalDevicesFound,
56    #[error("No suitable device")]
57    NoSuitableDevice,
58}
59
60#[derive(Debug, PartialOrd, PartialEq, Eq, Ord, Error)]
61pub enum QueueError {
62    #[error("Present unavailable")]
63    PresentUnavailable,
64    #[error("Graphics unavailable")]
65    GraphicsUnavailable,
66    #[error("Compute unavailable")]
67    ComputeUnavailable,
68    #[error("Transfer unavailable")]
69    TransferUnavailable,
70    #[error("Queue index out of bounds")]
71    QueueIndexOutOfBounds,
72    #[error("Invalid queue family index")]
73    InvalidQueueFamilyIndex,
74}
75
76#[derive(Debug, PartialEq, Eq)]
77pub struct FormatError {
78    pub available: Vec<vk::SurfaceFormatKHR>,
79    pub desired: Vec<vk::SurfaceFormatKHR>,
80}
81
82#[derive(Debug, PartialEq, Eq, Error)]
83pub enum SwapchainError {
84    #[error("Surface handle not provided")]
85    SurfaceHandleNotProvided,
86    #[error("Failed query surface support details")]
87    FailedQuerySurfaceSupportDetails,
88    #[error("Failed to create swapchain")]
89    FailedCreateSwapchain,
90    #[error("Failed to get swapchain images")]
91    FailedGetSwapchainImages,
92    #[error("Failed to create swapchain image views")]
93    FailedCreateSwapchainImageViews,
94    #[error("Required min image count too low")]
95    RequiredMinImageCountTooLow,
96    #[error("Required usage not supported")]
97    RequiredUsageNotSupported,
98    #[error("No suitable desired format")]
99    NoSuitableDesiredFormat(FormatError),
100}
101
102pub type Result<T> = std::result::Result<T, Error>;