1use std::fmt;
2
3#[derive(Debug)]
5pub enum Error {
6 RequestAdapter(wgpu::RequestAdapterError),
7 RequestDevice(wgpu::RequestDeviceError),
8 BufferMap(wgpu::BufferAsyncError),
9 DevicePoll(wgpu::PollError),
10 ReadbackChannelClosed,
11 TimestampQueriesUnsupported,
12 ElementCountTooLarge {
13 count: u64,
14 },
15 RadixElementCountLimitExceeded {
16 count: u32,
17 limit: u32,
18 },
19 SizeOverflow,
20 BufferLimitExceeded {
21 requested: u64,
22 limit: u64,
23 },
24 BufferTooSmall {
25 name: &'static str,
26 required: u64,
27 actual: u64,
28 },
29 MissingBufferUsage {
30 name: &'static str,
31 required: wgpu::BufferUsages,
32 actual: wgpu::BufferUsages,
33 },
34}
35
36impl fmt::Display for Error {
37 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
38 match self {
39 Self::RequestAdapter(error) => write!(f, "failed to request a GPU adapter: {error}"),
40 Self::RequestDevice(error) => write!(f, "failed to request a GPU device: {error}"),
41 Self::BufferMap(error) => write!(f, "failed to map a GPU readback buffer: {error}"),
42 Self::DevicePoll(error) => write!(f, "failed while waiting for GPU work: {error}"),
43 Self::ReadbackChannelClosed => {
44 f.write_str("GPU readback completed without reporting its mapping result")
45 }
46 Self::TimestampQueriesUnsupported => {
47 f.write_str("the selected GPU adapter does not support timestamp queries")
48 }
49 Self::ElementCountTooLarge { count } => {
50 write!(f, "element count {count} exceeds the supported u32 range")
51 }
52 Self::RadixElementCountLimitExceeded { count, limit } => write!(
53 f,
54 "element count {count} exceeds the optimized radix-sort limit of {limit}"
55 ),
56 Self::SizeOverflow => f.write_str("buffer size calculation overflowed"),
57 Self::BufferLimitExceeded { requested, limit } => write!(
58 f,
59 "requested GPU buffer size {requested} exceeds the device limit {limit}"
60 ),
61 Self::BufferTooSmall {
62 name,
63 required,
64 actual,
65 } => write!(
66 f,
67 "{name} buffer is too small: requires {required} bytes, has {actual} bytes"
68 ),
69 Self::MissingBufferUsage {
70 name,
71 required,
72 actual,
73 } => write!(
74 f,
75 "{name} buffer is missing usage {required:?}; actual usage is {actual:?}"
76 ),
77 }
78 }
79}
80
81impl std::error::Error for Error {}
82
83impl From<wgpu::RequestAdapterError> for Error {
84 fn from(error: wgpu::RequestAdapterError) -> Self {
85 Self::RequestAdapter(error)
86 }
87}
88
89impl From<wgpu::RequestDeviceError> for Error {
90 fn from(error: wgpu::RequestDeviceError) -> Self {
91 Self::RequestDevice(error)
92 }
93}
94
95impl From<wgpu::BufferAsyncError> for Error {
96 fn from(error: wgpu::BufferAsyncError) -> Self {
97 Self::BufferMap(error)
98 }
99}
100
101impl From<wgpu::PollError> for Error {
102 fn from(error: wgpu::PollError) -> Self {
103 Self::DevicePoll(error)
104 }
105}