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 #[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>;