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    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}