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