Skip to main content

wgpu_primitives/
error.rs

1use std::fmt;
2
3/// Errors returned while preparing or executing a GPU algorithm.
4#[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}