1pub use opencl_sys::{
18 CL_ACCELERATOR_TYPE_NOT_SUPPORTED_INTEL, CL_BUILD_PROGRAM_FAILURE, CL_CANCELLED_IMG,
19 CL_COMMAND_TERMINATED_ITSELF_WITH_FAILURE_ARM, CL_COMPILE_PROGRAM_FAILURE,
20 CL_COMPILER_NOT_AVAILABLE, CL_CONTEXT_TERMINATED_KHR, CL_DEVICE_NOT_AVAILABLE,
21 CL_DEVICE_NOT_FOUND, CL_DEVICE_PARTITION_FAILED, CL_DEVICE_PARTITION_FAILED_EXT,
22 CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST, CL_IMAGE_FORMAT_MISMATCH,
23 CL_IMAGE_FORMAT_NOT_SUPPORTED, CL_INCOMPATIBLE_COMMAND_QUEUE_KHR,
24 CL_INVALID_ACCELERATOR_DESCRIPTOR_INTEL, CL_INVALID_ACCELERATOR_INTEL,
25 CL_INVALID_ACCELERATOR_TYPE_INTEL, CL_INVALID_ARG_INDEX, CL_INVALID_ARG_SIZE,
26 CL_INVALID_ARG_VALUE, CL_INVALID_BINARY, CL_INVALID_BUFFER_SIZE, CL_INVALID_BUILD_OPTIONS,
27 CL_INVALID_COMMAND_BUFFER_KHR, CL_INVALID_COMMAND_QUEUE, CL_INVALID_COMPILER_OPTIONS,
28 CL_INVALID_CONTEXT, CL_INVALID_DEVICE, CL_INVALID_DEVICE_PARTITION_COUNT,
29 CL_INVALID_DEVICE_QUEUE, CL_INVALID_DEVICE_TYPE, CL_INVALID_EVENT, CL_INVALID_EVENT_WAIT_LIST,
30 CL_INVALID_GL_OBJECT, CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR, CL_INVALID_GLOBAL_OFFSET,
31 CL_INVALID_GLOBAL_WORK_SIZE, CL_INVALID_HOST_PTR, CL_INVALID_IMAGE_DESCRIPTOR,
32 CL_INVALID_IMAGE_FORMAT_DESCRIPTOR, CL_INVALID_IMAGE_SIZE, CL_INVALID_KERNEL,
33 CL_INVALID_KERNEL_ARGS, CL_INVALID_KERNEL_DEFINITION, CL_INVALID_KERNEL_NAME,
34 CL_INVALID_LINKER_OPTIONS, CL_INVALID_MEM_OBJECT, CL_INVALID_MIP_LEVEL, CL_INVALID_OPERATION,
35 CL_INVALID_PARTITION_COUNT_EXT, CL_INVALID_PARTITION_NAME_EXT, CL_INVALID_PIPE_SIZE,
36 CL_INVALID_PLATFORM, CL_INVALID_PROGRAM, CL_INVALID_PROGRAM_EXECUTABLE, CL_INVALID_PROPERTY,
37 CL_INVALID_QUEUE_PROPERTIES, CL_INVALID_SAMPLER, CL_INVALID_SEMAPHORE_KHR, CL_INVALID_SPEC_ID,
38 CL_INVALID_SYNC_POINT_WAIT_LIST_KHR, CL_INVALID_VALUE, CL_INVALID_WORK_DIMENSION,
39 CL_INVALID_WORK_GROUP_SIZE, CL_INVALID_WORK_ITEM_SIZE, CL_KERNEL_ARG_INFO_NOT_AVAILABLE,
40 CL_LINK_PROGRAM_FAILURE, CL_LINKER_NOT_AVAILABLE, CL_MAP_FAILURE,
41 CL_MAX_SIZE_RESTRICTION_EXCEEDED, CL_MEM_COPY_OVERLAP, CL_MEM_OBJECT_ALLOCATION_FAILURE,
42 CL_MISALIGNED_SUB_BUFFER_OFFSET, CL_OUT_OF_HOST_MEMORY, CL_OUT_OF_RESOURCES,
43 CL_PLATFORM_NOT_FOUND_KHR, CL_PROFILING_INFO_NOT_AVAILABLE, CL_SUCCESS, cl_int,
44};
45
46pub use opencl_sys::cl_d3d11::{
47 CL_D3D11_RESOURCE_ALREADY_ACQUIRED_KHR, CL_D3D11_RESOURCE_NOT_ACQUIRED_KHR,
48 CL_INVALID_D3D11_DEVICE_KHR, CL_INVALID_D3D11_RESOURCE_KHR,
49};
50pub use opencl_sys::cl_dx9_media_sharing::{
51 CL_DX9_MEDIA_SURFACE_ALREADY_ACQUIRED_KHR, CL_DX9_MEDIA_SURFACE_NOT_ACQUIRED_KHR,
52 CL_INVALID_DX9_MEDIA_ADAPTER_KHR, CL_INVALID_DX9_MEDIA_SURFACE_KHR,
53};
54pub use opencl_sys::cl_egl::{CL_EGL_RESOURCE_NOT_ACQUIRED_KHR, CL_INVALID_EGL_OBJECT_KHR};
55use std::fmt;
56use thiserror::Error;
57
58pub const DLOPEN_RUNTIME_LOAD_FAILED: cl_int = -2000;
59pub const DLOPEN_FUNCTION_NOT_AVAILABLE: cl_int = -2001;
60
61#[must_use]
62pub const fn error_text(error_code: cl_int) -> &'static str {
63 match error_code {
64 CL_SUCCESS => "CL_SUCCESS",
65 CL_DEVICE_NOT_FOUND => "CL_DEVICE_NOT_FOUND",
66 CL_DEVICE_NOT_AVAILABLE => "CL_DEVICE_NOT_AVAILABLE",
67 CL_COMPILER_NOT_AVAILABLE => "CL_COMPILER_NOT_AVAILABLE",
68 CL_MEM_OBJECT_ALLOCATION_FAILURE => "CL_MEM_OBJECT_ALLOCATION_FAILURE",
69 CL_OUT_OF_RESOURCES => "CL_OUT_OF_RESOURCES",
70 CL_OUT_OF_HOST_MEMORY => "CL_OUT_OF_HOST_MEMORY",
71 CL_PROFILING_INFO_NOT_AVAILABLE => "CL_PROFILING_INFO_NOT_AVAILABLE",
72 CL_MEM_COPY_OVERLAP => "CL_MEM_COPY_OVERLAP",
73 CL_IMAGE_FORMAT_MISMATCH => "CL_IMAGE_FORMAT_MISMATCH",
74 CL_IMAGE_FORMAT_NOT_SUPPORTED => "CL_IMAGE_FORMAT_NOT_SUPPORTED",
75 CL_BUILD_PROGRAM_FAILURE => "CL_BUILD_PROGRAM_FAILURE",
76 CL_MAP_FAILURE => "CL_MAP_FAILURE",
77 CL_MISALIGNED_SUB_BUFFER_OFFSET => "CL_MISALIGNED_SUB_BUFFER_OFFSET",
78 CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST => {
79 "CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST"
80 }
81 CL_COMPILE_PROGRAM_FAILURE => "CL_COMPILE_PROGRAM_FAILURE",
82 CL_LINKER_NOT_AVAILABLE => "CL_LINKER_NOT_AVAILABLE",
83 CL_LINK_PROGRAM_FAILURE => "CL_LINK_PROGRAM_FAILURE",
84 CL_DEVICE_PARTITION_FAILED => "CL_DEVICE_PARTITION_FAILED",
85 CL_KERNEL_ARG_INFO_NOT_AVAILABLE => "CL_KERNEL_ARG_INFO_NOT_AVAILABLE",
86
87 CL_INVALID_VALUE => "CL_INVALID_VALUE",
88 CL_INVALID_DEVICE_TYPE => "CL_INVALID_DEVICE_TYPE",
89 CL_INVALID_PLATFORM => "CL_INVALID_PLATFORM",
90 CL_INVALID_DEVICE => "CL_INVALID_DEVICE",
91 CL_INVALID_CONTEXT => "CL_INVALID_CONTEXT",
92 CL_INVALID_QUEUE_PROPERTIES => "CL_INVALID_QUEUE_PROPERTIES",
93 CL_INVALID_COMMAND_QUEUE => "CL_INVALID_COMMAND_QUEUE",
94 CL_INVALID_HOST_PTR => "CL_INVALID_HOST_PTR",
95 CL_INVALID_MEM_OBJECT => "CL_INVALID_MEM_OBJECT",
96 CL_INVALID_IMAGE_FORMAT_DESCRIPTOR => "CL_INVALID_IMAGE_FORMAT_DESCRIPTOR",
97 CL_INVALID_IMAGE_SIZE => "CL_INVALID_IMAGE_SIZE",
98 CL_INVALID_SAMPLER => "CL_INVALID_SAMPLER",
99 CL_INVALID_BINARY => "CL_INVALID_BINARY",
100 CL_INVALID_BUILD_OPTIONS => "CL_INVALID_BUILD_OPTIONS",
101 CL_INVALID_PROGRAM => "CL_INVALID_PROGRAM",
102 CL_INVALID_PROGRAM_EXECUTABLE => "CL_INVALID_PROGRAM_EXECUTABLE",
103 CL_INVALID_KERNEL_NAME => "CL_INVALID_KERNEL_NAME",
104 CL_INVALID_KERNEL_DEFINITION => "CL_INVALID_KERNEL_DEFINITION",
105 CL_INVALID_KERNEL => "CL_INVALID_KERNEL",
106 CL_INVALID_ARG_INDEX => "CL_INVALID_ARG_INDEX",
107 CL_INVALID_ARG_VALUE => "CL_INVALID_ARG_VALUE",
108 CL_INVALID_ARG_SIZE => "CL_INVALID_ARG_SIZE",
109 CL_INVALID_KERNEL_ARGS => "CL_INVALID_KERNEL_ARGS",
110 CL_INVALID_WORK_DIMENSION => "CL_INVALID_WORK_DIMENSION",
111 CL_INVALID_WORK_GROUP_SIZE => "CL_INVALID_WORK_GROUP_SIZE",
112 CL_INVALID_WORK_ITEM_SIZE => "CL_INVALID_WORK_ITEM_SIZE",
113 CL_INVALID_GLOBAL_OFFSET => "CL_INVALID_GLOBAL_OFFSET",
114 CL_INVALID_EVENT_WAIT_LIST => "CL_INVALID_EVENT_WAIT_LIST",
115 CL_INVALID_EVENT => "CL_INVALID_EVENT",
116 CL_INVALID_OPERATION => "CL_INVALID_OPERATION",
117 CL_INVALID_GL_OBJECT => "CL_INVALID_GL_OBJECT",
118 CL_INVALID_BUFFER_SIZE => "CL_INVALID_BUFFER_SIZE",
119 CL_INVALID_MIP_LEVEL => "CL_INVALID_MIP_LEVEL",
120 CL_INVALID_GLOBAL_WORK_SIZE => "CL_INVALID_GLOBAL_WORK_SIZE",
121 CL_INVALID_PROPERTY => "CL_INVALID_PROPERTY",
122 CL_INVALID_IMAGE_DESCRIPTOR => "CL_INVALID_IMAGE_DESCRIPTOR",
123 CL_INVALID_COMPILER_OPTIONS => "CL_INVALID_COMPILER_OPTIONS",
124 CL_INVALID_LINKER_OPTIONS => "CL_INVALID_LINKER_OPTIONS",
125 CL_INVALID_DEVICE_PARTITION_COUNT => "CL_INVALID_DEVICE_PARTITION_COUNT",
126 CL_INVALID_PIPE_SIZE => "CL_INVALID_PIPE_SIZE",
127 CL_INVALID_DEVICE_QUEUE => "CL_INVALID_DEVICE_QUEUE",
128 CL_INVALID_SPEC_ID => "CL_INVALID_SPEC_ID",
129 CL_MAX_SIZE_RESTRICTION_EXCEEDED => "CL_MAX_SIZE_RESTRICTION_EXCEEDED",
130
131 CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR => "CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR",
132 CL_PLATFORM_NOT_FOUND_KHR => "CL_PLATFORM_NOT_FOUND_KHR",
133
134 CL_INVALID_D3D11_DEVICE_KHR => "CL_INVALID_D3D11_DEVICE_KHR",
135 CL_INVALID_D3D11_RESOURCE_KHR => "CL_INVALID_D3D11_RESOURCE_KHR",
136 CL_D3D11_RESOURCE_ALREADY_ACQUIRED_KHR => "CL_D3D11_RESOURCE_ALREADY_ACQUIRED_KHR",
137 CL_D3D11_RESOURCE_NOT_ACQUIRED_KHR => "CL_D3D11_RESOURCE_NOT_ACQUIRED_KHR",
138
139 CL_INVALID_DX9_MEDIA_ADAPTER_KHR => "CL_INVALID_DX9_MEDIA_ADAPTER_KHR",
140 CL_INVALID_DX9_MEDIA_SURFACE_KHR => "CL_INVALID_DX9_MEDIA_SURFACE_KHR",
141 CL_DX9_MEDIA_SURFACE_ALREADY_ACQUIRED_KHR => "CL_DX9_MEDIA_SURFACE_ALREADY_ACQUIRED_KHR",
142 CL_DX9_MEDIA_SURFACE_NOT_ACQUIRED_KHR => "CL_DX9_MEDIA_SURFACE_NOT_ACQUIRED_KHR",
143
144 CL_DEVICE_PARTITION_FAILED_EXT => "CL_DEVICE_PARTITION_FAILED_EXT",
145 CL_INVALID_PARTITION_COUNT_EXT => "CL_INVALID_PARTITION_COUNT_EXT",
146 CL_INVALID_PARTITION_NAME_EXT => "CL_INVALID_PARTITION_NAME_EXT",
147
148 CL_EGL_RESOURCE_NOT_ACQUIRED_KHR => "CL_EGL_RESOURCE_NOT_ACQUIRED_KHR",
149 CL_INVALID_EGL_OBJECT_KHR => "CL_INVALID_EGL_OBJECT_KHR",
150
151 CL_INVALID_ACCELERATOR_INTEL => "CL_INVALID_ACCELERATOR_INTEL",
152 CL_INVALID_ACCELERATOR_TYPE_INTEL => "CL_INVALID_ACCELERATOR_TYPE_INTEL",
153 CL_INVALID_ACCELERATOR_DESCRIPTOR_INTEL => "CL_INVALID_ACCELERATOR_DESCRIPTOR_INTEL",
154 CL_ACCELERATOR_TYPE_NOT_SUPPORTED_INTEL => "CL_ACCELERATOR_TYPE_NOT_SUPPORTED_INTEL",
155
156 CL_COMMAND_TERMINATED_ITSELF_WITH_FAILURE_ARM => {
157 "CL_COMMAND_TERMINATED_ITSELF_WITH_FAILURE_ARM"
158 }
159
160 CL_CONTEXT_TERMINATED_KHR => "CL_CONTEXT_TERMINATED_KHR",
161 CL_INVALID_SEMAPHORE_KHR => "CL_INVALID_SEMAPHORE_KHR",
162
163 CL_INVALID_COMMAND_BUFFER_KHR => "CL_INVALID_COMMAND_BUFFER_KHR",
164 CL_INVALID_SYNC_POINT_WAIT_LIST_KHR => "CL_INVALID_SYNC_POINT_WAIT_LIST_KHR",
165 CL_INCOMPATIBLE_COMMAND_QUEUE_KHR => "CL_INCOMPATIBLE_COMMAND_QUEUE_KHR",
166 CL_CANCELLED_IMG => "CL_CANCELLED_IMG",
167
168 #[cfg(feature = "dynamic")]
169 DLOPEN_RUNTIME_LOAD_FAILED => "DLOPEN_RUNTIME_LOAD_FAILED",
170 #[cfg(feature = "dynamic")]
171 DLOPEN_FUNCTION_NOT_AVAILABLE => "DLOPEN_FUNCTION_NOT_AVAILABLE",
172
173 _ => "UNKNOWN_ERROR",
174 }
175}
176
177#[derive(Debug, Error)]
178pub struct ClError(pub cl_int);
180
181impl From<cl_int> for ClError {
183 fn from(error: cl_int) -> Self {
184 Self(error)
185 }
186}
187
188impl From<ClError> for &str {
190 fn from(error: ClError) -> Self {
191 error_text(error.0)
192 }
193}
194
195impl From<ClError> for String {
197 fn from(error: ClError) -> Self {
198 Self::from(error_text(error.0))
199 }
200}
201
202impl fmt::Display for ClError {
204 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
205 write!(f, "{}", error_text(self.0))
206 }
207}
208
209#[cfg(test)]
210mod tests {
211 use super::*;
212
213 #[test]
214 fn test_error_text() {
215 let cl_success_text = error_text(CL_SUCCESS);
216 assert_eq!("CL_SUCCESS", cl_success_text);
217
218 let cl_device_not_found_text = error_text(CL_DEVICE_NOT_FOUND);
219 assert_eq!("CL_DEVICE_NOT_FOUND", cl_device_not_found_text);
220
221 let cl_max_size_restriction_exceeded_text = error_text(CL_MAX_SIZE_RESTRICTION_EXCEEDED);
222 assert_eq!(
223 "CL_MAX_SIZE_RESTRICTION_EXCEEDED",
224 cl_max_size_restriction_exceeded_text
225 );
226
227 let cl_platform_not_found_khr_text = error_text(CL_PLATFORM_NOT_FOUND_KHR);
228 assert_eq!("CL_PLATFORM_NOT_FOUND_KHR", cl_platform_not_found_khr_text);
229
230 let unknown_error_text = error_text(CL_MAX_SIZE_RESTRICTION_EXCEEDED - 1);
231 assert_eq!("UNKNOWN_ERROR", unknown_error_text);
232 }
233
234 #[test]
235 fn test_error_type() {
236 let cl_success_text = error_text(CL_SUCCESS);
237 assert_eq!("CL_SUCCESS", cl_success_text);
238
239 let error_01: ClError = From::from(CL_DEVICE_NOT_FOUND);
240 println!("CL_DEVICE_NOT_FOUND: {:?}", error_01);
241 println!("CL_DEVICE_NOT_FOUND: {}", error_01);
242 println!("CL_DEVICE_NOT_FOUND: {}", String::from(error_01));
243
244 let error_30: ClError = From::from(CL_INVALID_VALUE);
245 println!("CL_INVALID_VALUE: {:?}", error_30);
246 println!("CL_INVALID_VALUE: {}", error_30);
247 let error_30_str: &str = error_30.into();
248 println!("CL_INVALID_VALUE: {}", error_30_str);
249
250 let error_72: ClError = From::from(CL_MAX_SIZE_RESTRICTION_EXCEEDED);
251 println!("CL_MAX_SIZE_RESTRICTION_EXCEEDED: {:?}", error_72);
252 println!("CL_MAX_SIZE_RESTRICTION_EXCEEDED: {}", error_72);
253 println!(
254 "CL_MAX_SIZE_RESTRICTION_EXCEEDED: {}",
255 String::from(error_72)
256 );
257
258 let error_unknown: ClError = From::from(CL_MAX_SIZE_RESTRICTION_EXCEEDED - 1);
259 println!("UNKNOWN_ERROR: {:?}", error_unknown);
260 println!("UNKNOWN_ERROR: {}", error_unknown);
261 println!("UNKNOWN_ERROR: {}", String::from(error_unknown));
262 }
263}