1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
#[derive(Clone, Copy, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub enum OCLErrorKind {
    GetPlatformIDs,
    GetDeviceIDs,
    InvalidDeviceIdx,
    GetDeviceInfo,
    CreateContext,
    CreateCommandQueue,
    WaitForEvents,
    EnqueueReadBuffer,
    EnqueueWriteBuffer,
    EnqueueCopyBuffer,
    EnqueueNDRangeKernel,
    CreateBuffer,
    DeviceNotFound,
    DeviceNotAvailable,
    CompilerNotAvailable,
    MemObjectAllocationFailure,
    OutOfResources,
    OutOfHostMemory,
    ProfilingInfoNotAvailable,
    MemCopyOverlap,
    ImageFormatMismatch,
    ImageFormatNotSupported,
    BuildProgramFailures,
    MapFailure,
    MisalignedSubBufferOffset,
    ExecStatusErrorForEventsInWaitList,
    CompileProgramFailure,
    LinkerNotAvailable,
    LinkProgramFailure,
    DevicePartitionFailed,
    KernelArgInfoNotAvailable,
    InvalidValue,
    InvalidDeviceType,
    InvalidPlatform,
    InvalidDevice,
    InvalidContext,
    InvalidQueueProperties,
    InvalidCommandQueue,
    InvalidHostPtr,
    InvalidMemObject,
    InvalidImageFormatDescriptor,
    InvalidImageSize,
    InvalidSampler,
    InvalidBinary,
    InvalidBuildOptions,
    InvalidProgram,
    InvalidProgramExecutable,
    InvalidKernelName,
    InvalidKernelDefintion,
    InvalidKernel,
    InvalidArgIndex,
    InvalidArgValue,
    InvalidArgSize,
    InvalidKernelArgs,
    InvalidWorkDimension,
    InvalidWorkGroupSize,
    InvalidWorkItemSize,
    InvalidGlobalOffset,
    InvalidEventWaitList,
    InvalidEvent,
    InvalidOperation,
    InvalidGlObject,
    InvalidBufferSize,
    InvalidMIPLevel,
    InvalidGlobalWorkSize,
    InvalidProperty,
    InvalidImageDescriptor,
    InvalidCompilerOptions,
    InvalidLinkerOptions,
    InvalidDevicePartitionCount,
    InvalidPipeSize,
    InvalidDeviceQueue,
    PlatformNotFoundKHR,
    Unknown,
}

impl OCLErrorKind {
    pub fn from_value(value: i32) -> OCLErrorKind {
        match value {
            -1 => OCLErrorKind::DeviceNotFound,
            -2 => OCLErrorKind::DeviceNotAvailable,
            -3 => OCLErrorKind::CompilerNotAvailable,
            -4 => OCLErrorKind::MemObjectAllocationFailure,
            -5 => OCLErrorKind::OutOfResources,
            -6 => OCLErrorKind::OutOfHostMemory,
            -7 => OCLErrorKind::ProfilingInfoNotAvailable,
            -8 => OCLErrorKind::MemCopyOverlap,
            -9 => OCLErrorKind::ImageFormatMismatch,
            -10 => OCLErrorKind::ImageFormatNotSupported,
            -11 => OCLErrorKind::BuildProgramFailures,
            -12 => OCLErrorKind::MapFailure,
            -13 => OCLErrorKind::MisalignedSubBufferOffset,
            -14 => OCLErrorKind::ExecStatusErrorForEventsInWaitList,
            -15 => OCLErrorKind::CompileProgramFailure,
            -16 => OCLErrorKind::LinkerNotAvailable,
            -17 => OCLErrorKind::LinkProgramFailure,
            -18 => OCLErrorKind::DevicePartitionFailed,
            -19 => OCLErrorKind::KernelArgInfoNotAvailable,
            -30 => OCLErrorKind::InvalidValue,
            -31 => OCLErrorKind::InvalidDeviceType,
            -32 => OCLErrorKind::InvalidPlatform,
            -33 => OCLErrorKind::InvalidDevice,
            -34 => OCLErrorKind::InvalidContext,
            -35 => OCLErrorKind::InvalidQueueProperties,
            -36 => OCLErrorKind::InvalidCommandQueue,
            -37 => OCLErrorKind::InvalidHostPtr,
            -38 => OCLErrorKind::InvalidMemObject,
            -39 => OCLErrorKind::InvalidImageFormatDescriptor,
            -40 => OCLErrorKind::InvalidImageSize,
            -41 => OCLErrorKind::InvalidSampler,
            -42 => OCLErrorKind::InvalidBinary,
            -43 => OCLErrorKind::InvalidBuildOptions,
            -44 => OCLErrorKind::InvalidProgram,
            -45 => OCLErrorKind::InvalidProgramExecutable,
            -46 => OCLErrorKind::InvalidKernelName,
            -47 => OCLErrorKind::InvalidKernelDefintion,
            -48 => OCLErrorKind::InvalidKernel,
            -49 => OCLErrorKind::InvalidArgIndex,
            -50 => OCLErrorKind::InvalidArgValue,
            -51 => OCLErrorKind::InvalidArgSize,
            -52 => OCLErrorKind::InvalidKernelArgs,
            -53 => OCLErrorKind::InvalidWorkDimension,
            -54 => OCLErrorKind::InvalidWorkGroupSize,
            -55 => OCLErrorKind::InvalidWorkItemSize,
            -56 => OCLErrorKind::InvalidGlobalOffset,
            -57 => OCLErrorKind::InvalidEventWaitList,
            -58 => OCLErrorKind::InvalidEvent,
            -59 => OCLErrorKind::InvalidOperation,
            -60 => OCLErrorKind::InvalidGlObject,
            -61 => OCLErrorKind::InvalidBufferSize,
            -62 => OCLErrorKind::InvalidMIPLevel,
            -63 => OCLErrorKind::InvalidGlobalWorkSize,
            -64 => OCLErrorKind::InvalidProperty,
            -65 => OCLErrorKind::InvalidImageDescriptor,
            -66 => OCLErrorKind::InvalidCompilerOptions,
            -67 => OCLErrorKind::InvalidLinkerOptions,
            -68 => OCLErrorKind::InvalidDevicePartitionCount,
            -69 => OCLErrorKind::InvalidPipeSize,
            -70 => OCLErrorKind::InvalidDeviceQueue,
            -1001 => OCLErrorKind::PlatformNotFoundKHR,
            _ => OCLErrorKind::Unknown,
        }
    }
}

impl OCLErrorKind {
    pub fn as_str(&self) -> &'static str {
        match self {
            OCLErrorKind::Unknown => "Unkwown OpenCL Error",
            OCLErrorKind::GetPlatformIDs => "",
            OCLErrorKind::GetDeviceIDs => "",
            OCLErrorKind::InvalidDeviceIdx => {
                "Invalid device idx, specific OpenCL device not found"
            }
            OCLErrorKind::GetDeviceInfo => "",
            OCLErrorKind::CreateContext => "",
            OCLErrorKind::CreateCommandQueue => "",
            OCLErrorKind::WaitForEvents => "",
            OCLErrorKind::EnqueueReadBuffer => "",
            OCLErrorKind::EnqueueWriteBuffer => "",
            OCLErrorKind::EnqueueCopyBuffer => "",
            OCLErrorKind::EnqueueNDRangeKernel => "",
            OCLErrorKind::CreateBuffer => "",
            OCLErrorKind::DeviceNotFound => "(-1 DeviceNotFound) No OpenCL device found",
            OCLErrorKind::DeviceNotAvailable => {
                "(-2 DeviceNotAvailAble) OpenCL device is currently not available"
            }
            OCLErrorKind::CompilerNotAvailable => {
                "(-3 CompilerNotAvailable) Compiler is not available"
            }
            OCLErrorKind::MemObjectAllocationFailure => {
                "(-4 MemObjectAllocationFailure) Memory for buffer object could not be allocated"
            }
            OCLErrorKind::OutOfResources => {
                "(-5 OutOfResources) Allocation of resources failed on the OpenCL device"
            }
            OCLErrorKind::OutOfHostMemory => {
                "(-6 OutOfHostMemory) Allocation of resources failed on the host device"
            }
            OCLErrorKind::ProfilingInfoNotAvailable => "(-7 ProfilingInfoNotAvailable)",
            OCLErrorKind::MemCopyOverlap => "(-8 MemCopyOverlap)",
            OCLErrorKind::ImageFormatMismatch => "(-9 ImageFormatMismatch)",
            OCLErrorKind::ImageFormatNotSupported => "(-10 ImageFormatNotSupported)",
            OCLErrorKind::BuildProgramFailures => "(-11 BuildProgramFailures)",
            OCLErrorKind::MapFailure => "(-12 MapFailure)",
            OCLErrorKind::MisalignedSubBufferOffset => "(-13 MisalignedSubBufferOffset)",
            OCLErrorKind::ExecStatusErrorForEventsInWaitList => {
                "(-14 ExecStatusErrorForEventsInWaitList)"
            }
            OCLErrorKind::CompileProgramFailure => "(-15 CompileProgramFailure)",
            OCLErrorKind::LinkerNotAvailable => "(-16 LinkerNotAvailable)",
            OCLErrorKind::LinkProgramFailure => "(-17 LinkProgramFailure)",
            OCLErrorKind::DevicePartitionFailed => "(-18 DevicePartitionFailed)",
            OCLErrorKind::KernelArgInfoNotAvailable => "(-19 KernelArgInfoNotAvailable)",
            OCLErrorKind::InvalidValue => "(-30 InvalidValue)",
            OCLErrorKind::InvalidDeviceType => "(-31 InvalidDeviceType)",
            OCLErrorKind::InvalidPlatform => "(-32 InvalidPlatform)",
            OCLErrorKind::InvalidDevice => "(-33 InvalidDevice)",
            OCLErrorKind::InvalidContext => "(-34 InvalidContext)",
            OCLErrorKind::InvalidQueueProperties => "(-35 InvalidQueueProperties)",
            OCLErrorKind::InvalidCommandQueue => "(-36 InvalidCommandQueue)",
            OCLErrorKind::InvalidHostPtr => "(-37 InvalidHostPtr)",
            OCLErrorKind::InvalidMemObject => "(-38 InvalidMemObject)",
            OCLErrorKind::InvalidImageFormatDescriptor => "(-39 InvalidImageFormatDescriptor)",
            OCLErrorKind::InvalidImageSize => "(-40 InvalidImageSize)",
            OCLErrorKind::InvalidSampler => "(-41 InvalidSampler)",
            OCLErrorKind::InvalidBinary => "(-42 InvalidBinary)",
            OCLErrorKind::InvalidBuildOptions => "(-43 InvalidBuildOptions)",
            OCLErrorKind::InvalidProgram => "(-44 InvalidProgram)",
            OCLErrorKind::InvalidProgramExecutable => "(-45 InvalidProgramExecutable)",
            OCLErrorKind::InvalidKernelName => "(-46 InvalidKernelName)",
            OCLErrorKind::InvalidKernelDefintion => "(-47 InvalidKernelDefinition)",
            OCLErrorKind::InvalidKernel => "(-48 InvalidKernel)",
            OCLErrorKind::InvalidArgIndex => "(-49 InvalidArgIndex)",
            OCLErrorKind::InvalidArgValue => "(-50 InvalidArgValue)",
            OCLErrorKind::InvalidArgSize => "(-51 InvalidArgSize)",
            OCLErrorKind::InvalidKernelArgs => "(-52 InvalidKernelArgs) Invalid kernel args",
            OCLErrorKind::InvalidWorkDimension => "(-53 InvalidWorkDimension)",
            OCLErrorKind::InvalidWorkGroupSize => "(-54 InvalidWorkGroupSize)",
            OCLErrorKind::InvalidWorkItemSize => "(-55 InvalidWorkItemSize)",
            OCLErrorKind::InvalidGlobalOffset => "(-56 InvalidGlobalOffset)",
            OCLErrorKind::InvalidEventWaitList => "(-57 InvalidEventWaitList)",
            OCLErrorKind::InvalidEvent => "(-58 InvalidEvent)",
            OCLErrorKind::InvalidOperation => "(-59 InvalidOperation)",
            OCLErrorKind::InvalidGlObject => "(-60 InvalidGlObject)",
            OCLErrorKind::InvalidBufferSize => "(-61 InvalidBufferSize)",
            OCLErrorKind::InvalidMIPLevel => "(-62 InvalidMIPLevel)",
            OCLErrorKind::InvalidGlobalWorkSize => "(-63 InvalidGlobalWorkSize)",
            OCLErrorKind::InvalidProperty => "(-64 InvalidProperty)",
            OCLErrorKind::InvalidImageDescriptor => "(-65 InvalidImageDescriptor)",
            OCLErrorKind::InvalidCompilerOptions => "(-66 InvalidCompilerOptions)",
            OCLErrorKind::InvalidLinkerOptions => "(-67 InvalidLinkerOptions)",
            OCLErrorKind::InvalidDevicePartitionCount => "(-68 InvalidDevicePartitionCount)",
            OCLErrorKind::InvalidPipeSize => "(-69 InvalidPipeSize)",
            OCLErrorKind::InvalidDeviceQueue => "(-70 InvalidDeviceQueue)",
            OCLErrorKind::PlatformNotFoundKHR => "(-1001 PlatformNotFoundKHR)",
        }
    }
}

impl core::fmt::Debug for OCLErrorKind {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{}", self.as_str())?;
        Ok(())
    }
}

impl core::fmt::Display for OCLErrorKind {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{}", self.as_str())?;
        Ok(())
    }
}

impl std::error::Error for OCLErrorKind {}