cl3/
error_codes.rs

1// Copyright (c) 2020-2024 Via Technology Ltd.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//    http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15//! `OpenCL` API Error Codes.
16
17pub 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)]
178/// `ClError` is a newtype around the `OpenCL` `cl_int` error number
179pub struct ClError(pub cl_int);
180
181/// Implement the From trait
182impl From<cl_int> for ClError {
183    fn from(error: cl_int) -> Self {
184        Self(error)
185    }
186}
187
188/// Implement the From trait for &str
189impl From<ClError> for &str {
190    fn from(error: ClError) -> Self {
191        error_text(error.0)
192    }
193}
194
195/// Implement the From trait for String
196impl From<ClError> for String {
197    fn from(error: ClError) -> Self {
198        Self::from(error_text(error.0))
199    }
200}
201
202/// Implement the Display trait
203impl 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}